@tracepass/dpp-schemas 0.5.1 → 1.0.1

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
@@ -6,12 +6,12 @@
6
6
 
7
7
  # EU Digital Product Passport — Field Specifications
8
8
 
9
- **Machine-readable field specs for 12 product categories, with every field traced to the article of EU law that mandates it.**
9
+ **Machine-readable field specs for 13 product categories, with every field traced to the article of EU law that mandates it.**
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-937-informational)](#whats-in-here)
14
- [![Categories](https://img.shields.io/badge/categories-12-informational)](#whats-in-here)
13
+ [![Fields](https://img.shields.io/badge/fields-1004-informational)](#whats-in-here)
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)
17
17
 
@@ -39,28 +39,31 @@ this repository contains.
39
39
 
40
40
  ## What's in here
41
41
 
42
- Twelve JSON files, one per product category. **937 fields in total. 302 are required by an instrument in force;
43
- 198 are anticipated under a rule that has not yet been adopted.**
42
+ Thirteen JSON files, one per product category. **1,004 fields in total. 190 are required by
43
+ an instrument in force; 214 are anticipated under a rule that has not yet been adopted.**
44
44
 
45
45
  | Category | Fields | Required | Instrument |
46
46
  |---|---:|---:|---|
47
47
  | `battery` | 119 | 54 | Regulation (EU) 2023/1542 |
48
- | `chemicals` | 96 | 28 | ESPR (EU) 2024/1781 |
49
- | `construction` | 49 | 43 | CPR (EU) 2024/3110 |
50
- | `electronics` | 167 | 20 | ESPR (EU) 2024/1781 |
51
- | `fmcg` | 42 | 11 | ESPR (EU) 2024/1781 |
52
- | `furniture` | 79 | 27 | ESPR (EU) 2024/1781 |
53
- | `jewelry` | 52 | 12 | ESPR (EU) 2024/1781 |
48
+ | `construction` | 49 | 4 | CPR (EU) 2024/3110 |
49
+ | `detergents` | 87 | 28 | Regulation (EU) 2026/405 |
50
+ | `electronics` | 167 | 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
54
  | `packaging` | 66 | 9 | PPWR (EU) 2025/40 |
55
+ | `paints-coatings` | 75 | 25 | Directive 2004/42/EC |
55
56
  | `steel` | 84 | 29 | ESPR (EU) 2024/1781 |
56
- | `textile` | 60 | 12 | ESPR (EU) 2024/1781 |
57
- | `toys` | 28 | 14 | ESPR (EU) 2024/1781 |
58
- | `tyres` | 95 | 43 | ESPR (EU) 2024/1781 |
59
-
60
- Battery is the only category whose obligation is already in force Regulation (EU)
61
- 2023/1542 Art. 77 applies from 18 February 2027, rather than awaiting a delegated
62
- act. That is why its `required` count is the highest of the twelve. It is not the
63
- case that every battery field is required: the template also carries fields that are
57
+ | `textile` | 60 | 5 | ESPR (EU) 2024/1781 |
58
+ | `toys` | 28 | 14 | Regulation (EU) 2025/2509 |
59
+ | `tyres` | 95 | 2 | ESPR (EU) 2024/1781 |
60
+
61
+ Battery carries the most required fields because Regulation (EU) 2023/1542 Art. 77 sets a
62
+ real statutory date 18 February 2027 rather than awaiting a delegated act. The other
63
+ categories with dated obligations are `detergents`, `toys` and `paints-coatings`; the
64
+ remaining nine await an ESPR delegated act and so carry mostly `anticipated` fields.
65
+
66
+ It is not the case that every battery field is required: the template also carries fields that are
64
67
  `anticipated` (pending the carbon-footprint and due-diligence implementing acts) and
65
68
  fields that apply only to some battery sub-categories via `validation.requiredBy`.
66
69
 
@@ -115,11 +118,13 @@ in from 2027, so `packaging` carries `2027`, not `2026-08-12`.
115
118
  Read both dates with their precision marker. `datePrecision` / `mandatoryDatePrecision`
116
119
  are `"day"` or `"year"`; absent means `"day"`:
117
120
 
118
- - **`"day"`** — a real statutory date. Battery is `2027-02-18`, set by ESPR Article 77.
121
+ - **`"day"`** — a real statutory date. Battery is `2027-02-18`, set by Regulation (EU)
122
+ 2023/1542 Article 77.
119
123
  - **`"year"`** — only the year is known, because the governing delegated or implementing
120
124
  act is not yet adopted. The day and month are filler. **Do not render these as a
121
- deadline.** Eleven of the twelve categories are currently `"year"`; only battery is
122
- `"day"`.
125
+ deadline.** Nine of the thirteen categories are currently `"year"`. The four with a real
126
+ statutory date are `battery` (2027-02-18), `detergents` (2029-09-23), `toys`
127
+ (2030-08-01), and `paints-coatings` (2010-01-01, an instrument long in force).
123
128
 
124
129
  ```python
125
130
  r = template["regulation"]
@@ -186,7 +191,7 @@ npm install @tracepass/dpp-schemas
186
191
  ## Validating the specs themselves
187
192
 
188
193
  [`schema.json`](./schema.json) is a JSON Schema (Draft 2020-12) describing the template
189
- format. All 12 templates validate against it — which is how the format stays honest.
194
+ format. All 13 templates validate against it — which is how the format stays honest.
190
195
 
191
196
  ```bash
192
197
  pip install jsonschema
package/index.json CHANGED
@@ -6,10 +6,10 @@
6
6
  "url": "https://www.tracepass.eu"
7
7
  },
8
8
  "totals": {
9
- "categories": 12,
10
- "fields": 939,
11
- "requiredFields": 302,
12
- "anticipatedFields": 200
9
+ "categories": 13,
10
+ "fields": 1004,
11
+ "requiredFields": 190,
12
+ "anticipatedFields": 214
13
13
  },
14
14
  "categories": [
15
15
  {
@@ -27,30 +27,13 @@
27
27
  "mandatoryDate": "2027-02-18"
28
28
  }
29
29
  },
30
- {
31
- "category": "chemicals",
32
- "label": "Chemicals & Paints",
33
- "file": "templates/chemicals.json",
34
- "version": 2,
35
- "fieldCount": 98,
36
- "requiredFieldCount": 28,
37
- "anticipatedFieldCount": 17,
38
- "regulation": {
39
- "name": "EU ESPR - Chemicals",
40
- "number": "(EU) 2024/1781",
41
- "effectiveDate": "2029-09-01",
42
- "datePrecision": "year",
43
- "mandatoryDate": "2029-09-01",
44
- "mandatoryDatePrecision": "year"
45
- }
46
- },
47
30
  {
48
31
  "category": "construction",
49
32
  "label": "Construction Materials",
50
33
  "file": "templates/construction.json",
51
34
  "version": 2,
52
35
  "fieldCount": 49,
53
- "requiredFieldCount": 43,
36
+ "requiredFieldCount": 4,
54
37
  "anticipatedFieldCount": 0,
55
38
  "regulation": {
56
39
  "name": "Construction Products Regulation",
@@ -61,13 +44,28 @@
61
44
  "mandatoryDatePrecision": "year"
62
45
  }
63
46
  },
47
+ {
48
+ "category": "detergents",
49
+ "label": "Detergents & Surfactants",
50
+ "file": "templates/detergents.json",
51
+ "version": 1,
52
+ "fieldCount": 87,
53
+ "requiredFieldCount": 28,
54
+ "anticipatedFieldCount": 17,
55
+ "regulation": {
56
+ "name": "Detergents Regulation",
57
+ "number": "(EU) 2026/405",
58
+ "effectiveDate": "2029-09-23",
59
+ "mandatoryDate": "2029-09-23"
60
+ }
61
+ },
64
62
  {
65
63
  "category": "electronics",
66
64
  "label": "Electronics",
67
65
  "file": "templates/electronics.json",
68
66
  "version": 2,
69
67
  "fieldCount": 167,
70
- "requiredFieldCount": 20,
68
+ "requiredFieldCount": 4,
71
69
  "anticipatedFieldCount": 20,
72
70
  "regulation": {
73
71
  "name": "EU ESPR - Electronics",
@@ -84,8 +82,8 @@
84
82
  "file": "templates/fmcg.json",
85
83
  "version": 2,
86
84
  "fieldCount": 42,
87
- "requiredFieldCount": 11,
88
- "anticipatedFieldCount": 4,
85
+ "requiredFieldCount": 9,
86
+ "anticipatedFieldCount": 6,
89
87
  "regulation": {
90
88
  "name": "EU ESPR - FMCG",
91
89
  "number": "(EU) 2024/1781",
@@ -101,7 +99,7 @@
101
99
  "file": "templates/furniture.json",
102
100
  "version": 2,
103
101
  "fieldCount": 79,
104
- "requiredFieldCount": 27,
102
+ "requiredFieldCount": 4,
105
103
  "anticipatedFieldCount": 26,
106
104
  "regulation": {
107
105
  "name": "EU ESPR - Furniture",
@@ -117,8 +115,8 @@
117
115
  "label": "Jewelry & Precious Metals",
118
116
  "file": "templates/jewelry.json",
119
117
  "version": 2,
120
- "fieldCount": 52,
121
- "requiredFieldCount": 12,
118
+ "fieldCount": 53,
119
+ "requiredFieldCount": 3,
122
120
  "anticipatedFieldCount": 10,
123
121
  "regulation": {
124
122
  "name": "EU ESPR - Jewelry",
@@ -146,6 +144,21 @@
146
144
  "mandatoryDatePrecision": "year"
147
145
  }
148
146
  },
147
+ {
148
+ "category": "paints-coatings",
149
+ "label": "Paints & Coatings",
150
+ "file": "templates/paints-coatings.json",
151
+ "version": 1,
152
+ "fieldCount": 75,
153
+ "requiredFieldCount": 25,
154
+ "anticipatedFieldCount": 12,
155
+ "regulation": {
156
+ "name": "Decopaint Directive",
157
+ "number": "2004/42/EC",
158
+ "effectiveDate": "2010-01-01",
159
+ "mandatoryDate": "2010-01-01"
160
+ }
161
+ },
149
162
  {
150
163
  "category": "steel",
151
164
  "label": "Iron, Steel & Aluminium",
@@ -169,7 +182,7 @@
169
182
  "file": "templates/textile.json",
170
183
  "version": 2,
171
184
  "fieldCount": 60,
172
- "requiredFieldCount": 12,
185
+ "requiredFieldCount": 5,
173
186
  "anticipatedFieldCount": 32,
174
187
  "regulation": {
175
188
  "name": "EU ESPR - Textiles",
@@ -189,12 +202,10 @@
189
202
  "requiredFieldCount": 14,
190
203
  "anticipatedFieldCount": 8,
191
204
  "regulation": {
192
- "name": "EU ESPR - Toys",
193
- "number": "(EU) 2024/1781",
194
- "effectiveDate": "2030-01-01",
195
- "datePrecision": "year",
196
- "mandatoryDate": "2030-01-01",
197
- "mandatoryDatePrecision": "year"
205
+ "name": "Toy Safety Regulation",
206
+ "number": "(EU) 2025/2509",
207
+ "effectiveDate": "2030-08-01",
208
+ "mandatoryDate": "2030-08-01"
198
209
  }
199
210
  },
200
211
  {
@@ -203,7 +214,7 @@
203
214
  "file": "templates/tyres.json",
204
215
  "version": 2,
205
216
  "fieldCount": 95,
206
- "requiredFieldCount": 43,
217
+ "requiredFieldCount": 2,
207
218
  "anticipatedFieldCount": 27,
208
219
  "regulation": {
209
220
  "name": "EU ESPR - Tyres",
package/instruments.json CHANGED
@@ -124,7 +124,9 @@
124
124
  "title": "Regulation (EU) 2025/2509 on the safety of toys",
125
125
  "eli": "http://data.europa.eu/eli/reg/2025/2509/oj",
126
126
  "createsDpp": true,
127
- "note": "In force 1 Jan 2026, applies ~2030. This — not ESPR — is the source of the toy passport."
127
+ "note": "In force 1 Jan 2026 for the notified-body articles (28-44, 49-55); the Regulation applies from 1 Aug 2030. The toy DPP REPLACES the EU declaration of conformity under Directive 2009/48/EC. This — not ESPR — is the source of the toy passport. The Directive remains the operative product-requirement instrument until then and creates no passport.",
128
+ "dppMandatoryFrom": "2030-08-01",
129
+ "dppProvision": "Art. 20 (DPP) — applies with the Regulation from 1 Aug 2030"
128
130
  },
129
131
  "32011R1007": {
130
132
  "kind": "legislation",
@@ -223,13 +225,6 @@
223
225
  "eli": "http://data.europa.eu/eli/reg/2018/848/oj",
224
226
  "createsDpp": false
225
227
  },
226
- "32009R0661": {
227
- "kind": "legislation",
228
- "shortName": "General Safety Regulation (vehicles)",
229
- "title": "Regulation (EC) 661/2009 concerning type-approval requirements for the general safety of motor vehicles",
230
- "eli": "http://data.europa.eu/eli/reg/2009/661/oj",
231
- "createsDpp": false
232
- },
233
228
  "32004R0648": {
234
229
  "kind": "legislation",
235
230
  "shortName": "Detergents Regulation (2004)",
@@ -259,6 +254,58 @@
259
254
  "eli": "http://data.europa.eu/eli/reg/2023/1670/oj",
260
255
  "createsDpp": false,
261
256
  "note": "Under the OLD Ecodesign Directive 2009/125/EC, not ESPR. Real durability/repairability/spare-parts obligations for smartphones and tablets, but no Digital Product Passport."
257
+ },
258
+ "32019R0424": {
259
+ "kind": "legislation",
260
+ "shortName": "Server & Data Storage Ecodesign",
261
+ "title": "Commission Regulation (EU) 2019/424 laying down ecodesign requirements for servers and data storage products",
262
+ "eli": "http://data.europa.eu/eli/reg/2019/424/oj",
263
+ "createsDpp": false,
264
+ "note": "Adopted under the repealed Directive 2009/125/EC and KEPT IN FORCE by ESPR Art. 79 until repealed or replaced by an ESPR delegated act. Source of the PSU efficiency load points (10/20/50/100 % of rated output), power factor, idle-state power and server product-type parameters. Not a passport instrument."
265
+ },
266
+ "32013R0952": {
267
+ "kind": "legislation",
268
+ "shortName": "Union Customs Code",
269
+ "title": "Regulation (EU) No 952/2013 laying down the Union Customs Code",
270
+ "eli": "http://data.europa.eu/eli/reg/2013/952/oj",
271
+ "createsDpp": false,
272
+ "note": "Source of non-preferential origin rules (Arts. 59-63) — the basis for a country-of-origin field. Not a passport instrument."
273
+ },
274
+ "31987R2658": {
275
+ "kind": "legislation",
276
+ "shortName": "Combined Nomenclature",
277
+ "title": "Council Regulation (EEC) No 2658/87 on the tariff and statistical nomenclature and on the Common Customs Tariff",
278
+ "eli": "http://data.europa.eu/eli/reg/1987/2658/oj",
279
+ "createsDpp": false,
280
+ "note": "Annex I is the CN/TARIC commodity-code list. Both ESPR Art. 8(a) and Detergents Annex VI Part A(f) require the commodity code by reference to it. Not a passport instrument."
281
+ },
282
+ "32019R2144": {
283
+ "kind": "legislation",
284
+ "shortName": "General Safety Regulation (vehicles)",
285
+ "title": "Regulation (EU) 2019/2144 on type-approval requirements for the general safety of motor vehicles",
286
+ "eli": "http://data.europa.eu/eli/reg/2019/2144/oj",
287
+ "createsDpp": false
288
+ },
289
+ "32017R1369": {
290
+ "kind": "legislation",
291
+ "shortName": "Energy Labelling Regulation",
292
+ "title": "Regulation (EU) 2017/1369 setting a framework for energy labelling",
293
+ "eli": "http://data.europa.eu/eli/reg/2017/1369/oj",
294
+ "createsDpp": false
295
+ },
296
+ "32024R1252": {
297
+ "kind": "legislation",
298
+ "shortName": "Critical Raw Materials Act",
299
+ "title": "Regulation (EU) 2024/1252 establishing a framework for ensuring a secure and sustainable supply of critical raw materials",
300
+ "eli": "http://data.europa.eu/eli/reg/2024/1252/oj",
301
+ "createsDpp": false
302
+ },
303
+ "32014L0045": {
304
+ "kind": "legislation",
305
+ "shortName": "Roadworthiness Testing Directive",
306
+ "title": "Directive 2014/45/EU on periodic roadworthiness tests for motor vehicles and their trailers",
307
+ "eli": "http://data.europa.eu/eli/dir/2014/45/oj",
308
+ "createsDpp": false
262
309
  }
263
310
  },
264
311
  "nonLegislative": {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tracepass/dpp-schemas",
3
- "version": "0.5.1",
4
- "description": "Machine-readable field specifications for EU Digital Product Passports (ESPR) \u2014 12 product categories, 939 fields, each traced to the article of EU law that mandates it. Pure JSON, no dependencies.",
3
+ "version": "1.0.1",
4
+ "description": "Machine-readable field specifications for EU Digital Product Passports (ESPR) 13 product categories, 1004 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
@@ -544,7 +544,33 @@
544
544
  }
545
545
  }
546
546
  }
547
- }
547
+ },
548
+ "allOf": [
549
+ {
550
+ "$comment": "Options and dataType must agree. Options on a non-enum field are inert: they render in the CSV template and the picker while nothing validates against them. toys.recyclabilityAssessment shipped for several releases with a full enumOptions set and dataType 'object' — this schema passed it every time, and only the platform's own enum-integrity test caught it.",
551
+ "if": {
552
+ "properties": {
553
+ "enumOptions": {
554
+ "type": "array",
555
+ "minItems": 1
556
+ }
557
+ },
558
+ "required": [
559
+ "enumOptions"
560
+ ]
561
+ },
562
+ "then": {
563
+ "properties": {
564
+ "dataType": {
565
+ "enum": [
566
+ "enum",
567
+ "multi_enum"
568
+ ]
569
+ }
570
+ }
571
+ }
572
+ }
573
+ ]
548
574
  }
549
575
  }
550
576
  }