@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 +28 -23
- package/index.json +47 -36
- package/instruments.json +55 -8
- package/package.json +2 -2
- package/schema.json +27 -1
- package/templates/battery.json +131 -72
- package/templates/construction.json +142 -90
- package/templates/{chemicals.json → detergents.json} +6382 -8351
- package/templates/electronics.json +635 -386
- package/templates/fmcg.json +79 -40
- package/templates/furniture.json +340 -160
- package/templates/jewelry.json +1175 -52
- package/templates/packaging.json +205 -117
- package/templates/paints-coatings.json +9205 -0
- package/templates/steel.json +83 -43
- package/templates/textile.json +116 -67
- package/templates/toys.json +33 -22
- package/templates/tyres.json +401 -267
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
|
|
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)
|
|
12
12
|
[](https://www.npmjs.com/package/@tracepass/dpp-schemas)
|
|
13
|
-
[](#whats-in-here)
|
|
14
|
+
[](#whats-in-here)
|
|
15
15
|
[](#no-build-step)
|
|
16
16
|
[](./schema.json)
|
|
17
17
|
|
|
@@ -39,28 +39,31 @@ this repository contains.
|
|
|
39
39
|
|
|
40
40
|
## What's in here
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
|
|
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
|
-
| `
|
|
49
|
-
| `
|
|
50
|
-
| `electronics` | 167 |
|
|
51
|
-
| `fmcg` | 42 |
|
|
52
|
-
| `furniture` | 79 |
|
|
53
|
-
| `jewelry` |
|
|
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 |
|
|
57
|
-
| `toys` | 28 | 14 |
|
|
58
|
-
| `tyres` | 95 |
|
|
59
|
-
|
|
60
|
-
Battery
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
|
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.**
|
|
122
|
-
`
|
|
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
|
|
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":
|
|
10
|
-
"fields":
|
|
11
|
-
"requiredFields":
|
|
12
|
-
"anticipatedFields":
|
|
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":
|
|
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":
|
|
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":
|
|
88
|
-
"anticipatedFieldCount":
|
|
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":
|
|
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":
|
|
121
|
-
"requiredFieldCount":
|
|
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":
|
|
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": "
|
|
193
|
-
"number": "(EU)
|
|
194
|
-
"effectiveDate": "2030-
|
|
195
|
-
"
|
|
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":
|
|
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
|
|
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.
|
|
4
|
-
"description": "Machine-readable field specifications for EU Digital Product Passports (ESPR)
|
|
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
|
}
|