@tracepass/dpp-schemas 1.9.0 → 1.10.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 -21
- package/index.json +17 -17
- package/instruments.json +15 -0
- package/package.json +5 -4
- package/schema.json +46 -28
- package/templates/battery.json +1007 -440
- package/templates/construction.json +106 -21
- package/templates/detergents.json +400 -148
- package/templates/electronics.json +99 -21
- package/templates/fmcg.json +246 -42
- package/templates/furniture.json +67 -17
- package/templates/jewelry.json +55 -11
- package/templates/packaging.json +110 -34
- package/templates/steel.json +192 -75
- package/templates/textile.json +89 -23
- package/templates/toys.json +2247 -487
- package/templates/tyres.json +29 -11
package/README.md
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
[](./LICENSE)
|
|
12
12
|
[](https://www.npmjs.com/package/@tracepass/dpp-schemas)
|
|
13
|
-
[](#whats-in-here)
|
|
14
14
|
[](#whats-in-here)
|
|
15
15
|
[](#no-build-step)
|
|
16
16
|
[](./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. **
|
|
43
|
-
|
|
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 |
|
|
48
|
-
| `construction` | 49 |
|
|
49
|
-
| `detergents` |
|
|
50
|
-
| `electronics` | 160 |
|
|
51
|
-
| `fmcg` | 42 |
|
|
52
|
-
| `furniture` | 79 |
|
|
53
|
-
| `jewelry` | 53 |
|
|
54
|
-
| `packaging` | 64 |
|
|
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 |
|
|
55
57
|
| `paints-coatings` | 65 | 0 | Directive 2004/42/EC |
|
|
56
|
-
| `steel` | 84 |
|
|
57
|
-
| `textile` | 60 |
|
|
58
|
-
| `toys` |
|
|
59
|
-
| `tyres` | 93 |
|
|
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,11 +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.
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
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.
|
|
199
206
|
|
|
200
207
|
**`label`** is provided in the 24 official EU languages, because ESPR Article 8 requires
|
|
201
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":
|
|
11
|
-
"requiredFields":
|
|
12
|
-
"anticipatedFields":
|
|
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":
|
|
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":
|
|
37
|
+
"requiredFieldCount": 0,
|
|
38
38
|
"anticipatedFieldCount": 0,
|
|
39
39
|
"regulation": {
|
|
40
40
|
"name": "Construction Products Regulation",
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
"label": "Detergents & Surfactants",
|
|
52
52
|
"file": "templates/detergents.json",
|
|
53
53
|
"version": 1,
|
|
54
|
-
"fieldCount":
|
|
54
|
+
"fieldCount": 76,
|
|
55
55
|
"requiredFieldCount": 12,
|
|
56
56
|
"anticipatedFieldCount": 10,
|
|
57
57
|
"regulation": {
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
"file": "templates/electronics.json",
|
|
69
69
|
"version": 2,
|
|
70
70
|
"fieldCount": 160,
|
|
71
|
-
"requiredFieldCount":
|
|
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":
|
|
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":
|
|
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":
|
|
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":
|
|
143
|
+
"requiredFieldCount": 0,
|
|
144
144
|
"anticipatedFieldCount": 29,
|
|
145
145
|
"regulation": {
|
|
146
146
|
"name": "Packaging and Packaging Waste Regulation",
|
|
@@ -174,7 +174,7 @@
|
|
|
174
174
|
"file": "templates/steel.json",
|
|
175
175
|
"version": 2,
|
|
176
176
|
"fieldCount": 84,
|
|
177
|
-
"requiredFieldCount":
|
|
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":
|
|
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":
|
|
213
|
-
"requiredFieldCount":
|
|
214
|
-
"anticipatedFieldCount":
|
|
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":
|
|
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.
|
|
4
|
-
"description": "Machine-readable field specifications for EU Digital Product Passports (ESPR) — 13 product categories,
|
|
3
|
+
"version": "1.10.1",
|
|
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",
|
|
@@ -46,9 +46,10 @@
|
|
|
46
46
|
"validate": "python3 -c \"import json,glob,sys;from jsonschema import Draft202012Validator as V;v=V(json.load(open('schema.json')));bad=0\nfor p in sorted(glob.glob('templates/*.json')):\n e=list(v.iter_errors(json.load(open(p))));bad+=bool(e);print(('FAIL' if e else 'ok '),p)\n [print(' ',str(x.absolute_path),x.message[:120]) for x in e[:3]]\nsys.exit(1 if bad else 0)\"",
|
|
47
47
|
"build:index": "node scripts/build-index.mjs",
|
|
48
48
|
"check:index": "node scripts/build-index.mjs --check",
|
|
49
|
-
"check": "npm run validate && npm run check:index && npm run check:standards && npm run check:locales && npm run check:audit",
|
|
49
|
+
"check": "npm run validate && npm run check:index && npm run check:standards && npm run check:locales && npm run check:audit && npm run test:audit",
|
|
50
50
|
"check:standards": "node scripts/check-standards.mjs",
|
|
51
51
|
"check:locales": "node scripts/check-locales.mjs",
|
|
52
|
-
"check:audit": "node audit/audit.mjs"
|
|
52
|
+
"check:audit": "node audit/audit.mjs",
|
|
53
|
+
"test:audit": "node --test audit/self-test.mjs"
|
|
53
54
|
}
|
|
54
55
|
}
|
package/schema.json
CHANGED
|
@@ -535,34 +535,52 @@
|
|
|
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
537
|
},
|
|
538
|
-
"
|
|
539
|
-
"type":
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
"
|
|
551
|
-
"
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
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
|
+
}
|
|
566
584
|
}
|
|
567
585
|
}
|
|
568
586
|
}
|