@bsv/dpp-profiles 0.3.0-beta.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.
Files changed (96) hide show
  1. package/LICENSE +58 -0
  2. package/README.md +64 -0
  3. package/dist/applicability.d.ts +96 -0
  4. package/dist/applicability.d.ts.map +1 -0
  5. package/dist/applicability.js +181 -0
  6. package/dist/applicability.js.map +1 -0
  7. package/dist/combinations.d.ts +30 -0
  8. package/dist/combinations.d.ts.map +1 -0
  9. package/dist/combinations.js +103 -0
  10. package/dist/combinations.js.map +1 -0
  11. package/dist/evidence-shapes.d.ts +198 -0
  12. package/dist/evidence-shapes.d.ts.map +1 -0
  13. package/dist/evidence-shapes.js +123 -0
  14. package/dist/evidence-shapes.js.map +1 -0
  15. package/dist/gs1-epc-binary.d.ts +81 -0
  16. package/dist/gs1-epc-binary.d.ts.map +1 -0
  17. package/dist/gs1-epc-binary.js +252 -0
  18. package/dist/gs1-epc-binary.js.map +1 -0
  19. package/dist/gs1-resolution.d.ts +392 -0
  20. package/dist/gs1-resolution.d.ts.map +1 -0
  21. package/dist/gs1-resolution.js +696 -0
  22. package/dist/gs1-resolution.js.map +1 -0
  23. package/dist/identifiers.d.ts +57 -0
  24. package/dist/identifiers.d.ts.map +1 -0
  25. package/dist/identifiers.js +117 -0
  26. package/dist/identifiers.js.map +1 -0
  27. package/dist/index.d.ts +235 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +124 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/manifest-v2.d.ts +87 -0
  32. package/dist/manifest-v2.d.ts.map +1 -0
  33. package/dist/manifest-v2.js +31 -0
  34. package/dist/manifest-v2.js.map +1 -0
  35. package/dist/mapping.d.ts +84 -0
  36. package/dist/mapping.d.ts.map +1 -0
  37. package/dist/mapping.js +88 -0
  38. package/dist/mapping.js.map +1 -0
  39. package/dist/projections.d.ts +233 -0
  40. package/dist/projections.d.ts.map +1 -0
  41. package/dist/projections.js +466 -0
  42. package/dist/projections.js.map +1 -0
  43. package/frozen.json +42 -0
  44. package/generated/consumer/battery-v2.json +2248 -0
  45. package/generated/consumer/battery-v3.json +4354 -0
  46. package/generated/consumer/general-v1.json +9 -0
  47. package/generated/consumer/general-v2.json +714 -0
  48. package/generated/consumer/textile-v1.json +101 -0
  49. package/generated/consumer/textile-v2.json +1033 -0
  50. package/generated/consumer/textile-v3.json +2011 -0
  51. package/generated/index.json +86 -0
  52. package/generated/mapping/battery@2.md +116 -0
  53. package/generated/mapping/battery@3.md +130 -0
  54. package/generated/mapping/general@2.md +50 -0
  55. package/generated/mapping/textile@2.md +61 -0
  56. package/generated/mapping/textile@3.md +73 -0
  57. package/generated/payload-schema/battery@2.public.schema.json +609 -0
  58. package/generated/payload-schema/battery@2.restricted.schema.json +377 -0
  59. package/generated/payload-schema/battery@3.public.schema.json +1364 -0
  60. package/generated/payload-schema/battery@3.restricted.schema.json +1097 -0
  61. package/generated/payload-schema/general@1.public.schema.json +37 -0
  62. package/generated/payload-schema/general@1.restricted.schema.json +9 -0
  63. package/generated/payload-schema/general@2.public.schema.json +352 -0
  64. package/generated/payload-schema/general@2.restricted.schema.json +52 -0
  65. package/generated/payload-schema/textile@1.public.schema.json +82 -0
  66. package/generated/payload-schema/textile@1.restricted.schema.json +22 -0
  67. package/generated/payload-schema/textile@2.public.schema.json +464 -0
  68. package/generated/payload-schema/textile@2.restricted.schema.json +78 -0
  69. package/generated/payload-schema/textile@3.public.schema.json +1299 -0
  70. package/generated/payload-schema/textile@3.restricted.schema.json +78 -0
  71. package/manifests/battery@2.json +4047 -0
  72. package/manifests/battery@3.json +6164 -0
  73. package/manifests/exchange/untp-0.7.0-jose@1.json +191 -0
  74. package/manifests/exchange/vc-di-ecdsa-rdfc-2019@1.json +74 -0
  75. package/manifests/exchange/vsc-draft-compat@0.1.0.json +64 -0
  76. package/manifests/general@1.json +148 -0
  77. package/manifests/general@2.json +1266 -0
  78. package/manifests/interoperability/epcis-json@1.json +69 -0
  79. package/manifests/interoperability/epcis-vsc@1.json +64 -0
  80. package/manifests/interoperability/gs1-digital-link@1.json +71 -0
  81. package/manifests/operator/federated-operators@1.json +54 -0
  82. package/manifests/operator/single-operator@1.json +52 -0
  83. package/manifests/textile@1.json +383 -0
  84. package/manifests/textile@2.json +1682 -0
  85. package/manifests/textile@3.json +2763 -0
  86. package/package.json +59 -0
  87. package/schemas/exchange-profile.schema.json +134 -0
  88. package/schemas/gs1/NOTICE.md +11 -0
  89. package/schemas/gs1/resolver-description-file-schema-1.2.0.json +124 -0
  90. package/schemas/gs1/resolver-linkset-context-1.2.1.jsonld +39 -0
  91. package/schemas/gs1/resolver-linkset-schema-1.2.1.json +96 -0
  92. package/schemas/interoperability-profile.schema.json +347 -0
  93. package/schemas/operator-profile.schema.json +108 -0
  94. package/schemas/product-identity.schema.json +45 -0
  95. package/schemas/profile-manifest-v2.schema.json +1087 -0
  96. package/schemas/profile-manifest.schema.json +291 -0
@@ -0,0 +1,1299 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "urn:bsv:dpp:profile:textile@3:payload-public",
4
+ "title": "Textile passport (textile@3), public payload",
5
+ "description": "textile@3: the public payload carried on chain in field 10. JSON Schema validity is one check; obligation under a condition (needs-review), units, provenance and legal applicability are separate checks.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "properties": {
9
+ "notice": {
10
+ "type": "string",
11
+ "minLength": 1,
12
+ "description": "The sample marker a demonstration record carries first; never product data."
13
+ },
14
+ "profile": {
15
+ "const": "textile",
16
+ "description": "The profile identifier the payload declares."
17
+ },
18
+ "profile_version": {
19
+ "const": 3,
20
+ "description": "The profile version the payload declares; a reader decodes under it and never under a newer one."
21
+ },
22
+ "object_did": {
23
+ "type": "string",
24
+ "minLength": 1,
25
+ "description": "An optional physical-object DID carried in the public payload; carrying it does not implement physical binding."
26
+ },
27
+ "dataCarrier": {
28
+ "type": "string",
29
+ "minLength": 1,
30
+ "description": "The data-carrier identifier (chip UID) the lookup service indexes beside the passport identifier."
31
+ },
32
+ "name": {
33
+ "type": "string",
34
+ "minLength": 1,
35
+ "title": "Product name",
36
+ "description": "required; ESPR Annex III(a); the passport has to say what the product is"
37
+ },
38
+ "category": {
39
+ "type": "string",
40
+ "minLength": 1,
41
+ "title": "Kind of product",
42
+ "description": "required; ESPR Art. 4; the parameters that apply depend on what the product is"
43
+ },
44
+ "modelIdentifier": {
45
+ "type": "string",
46
+ "minLength": 1,
47
+ "maxLength": 64,
48
+ "title": "Model or style reference",
49
+ "description": "required; ESPR Annex III(b): the unique product identifier is model-level"
50
+ },
51
+ "batch": {
52
+ "type": "string",
53
+ "minLength": 1,
54
+ "maxLength": 64,
55
+ "title": "Batch",
56
+ "description": "required; ESPR Annex III(b); Reg. 1007/2011 traceability of a labelled lot"
57
+ },
58
+ "gtin": {
59
+ "type": "string",
60
+ "minLength": 1,
61
+ "pattern": "^\\d{8}$|^\\d{12,14}$",
62
+ "title": "Article number (GTIN)",
63
+ "description": "recommended; ESPR Annex III(c): commodity and trade item codes where they exist"
64
+ },
65
+ "manufacturer": {
66
+ "type": "string",
67
+ "minLength": 1,
68
+ "title": "Brand name",
69
+ "description": "required; ESPR Annex III(e); Reg. 1007/2011 Art. 15 identifies the responsible operator"
70
+ },
71
+ "manufacturerContact": {
72
+ "type": "string",
73
+ "minLength": 1,
74
+ "title": "Brand contact",
75
+ "description": "required; ESPR Annex III(e): the operator has to be reachable, not merely named"
76
+ },
77
+ "operatorId": {
78
+ "type": "string",
79
+ "title": "EU operator identifier",
80
+ "description": "recommended; ESPR Annex III(e)"
81
+ },
82
+ "manufacturingPlace": {
83
+ "type": "object",
84
+ "additionalProperties": false,
85
+ "properties": {
86
+ "city": {
87
+ "type": "string",
88
+ "minLength": 1
89
+ },
90
+ "country": {
91
+ "type": "string",
92
+ "pattern": "^[A-Z]{2}$"
93
+ }
94
+ },
95
+ "required": [
96
+ "city",
97
+ "country"
98
+ ],
99
+ "title": "Where it was made",
100
+ "description": "required; Reg. 1007/2011 Art. 16 read with the Union Customs Code origin rules"
101
+ },
102
+ "made": {
103
+ "type": "string",
104
+ "pattern": "^\\d{4}-(0[1-9]|1[0-2])$",
105
+ "title": "Made",
106
+ "description": "recommended; ESPR Annex I(a): a durability claim is meaningless without a start date"
107
+ },
108
+ "colour": {
109
+ "type": "string",
110
+ "minLength": 1,
111
+ "maxLength": 60,
112
+ "title": "Colour",
113
+ "description": "recommended; Nothing requires this. It identifies the item to the person holding it."
114
+ },
115
+ "size": {
116
+ "type": "string",
117
+ "minLength": 1,
118
+ "maxLength": 32,
119
+ "title": "Size",
120
+ "description": "recommended; Nothing requires this. It is what makes a passport match the garment in hand."
121
+ },
122
+ "weight": {
123
+ "type": "number",
124
+ "minimum": 1,
125
+ "maximum": 50000,
126
+ "multipleOf": 1,
127
+ "title": "Weight",
128
+ "description": "recommended; ESPR Annex I(l): resource use, and the basis of every per-mass figure below"
129
+ },
130
+ "fibres": {
131
+ "type": "array",
132
+ "items": {
133
+ "type": "object",
134
+ "additionalProperties": false,
135
+ "properties": {
136
+ "fibre": {
137
+ "type": "string",
138
+ "minLength": 1
139
+ },
140
+ "percent": {
141
+ "type": "number",
142
+ "minimum": 0,
143
+ "maximum": 100
144
+ },
145
+ "source": {
146
+ "enum": [
147
+ "preConsumer",
148
+ "postConsumer",
149
+ "virgin"
150
+ ]
151
+ }
152
+ },
153
+ "required": [
154
+ "fibre",
155
+ "percent"
156
+ ]
157
+ },
158
+ "title": "Fibre composition",
159
+ "description": "required; Reg. (EU) 1007/2011 Art. 5, 9 and 14: binding today, by weight, in descending order"
160
+ },
161
+ "nonTextileParts": {
162
+ "type": "string",
163
+ "minLength": 1,
164
+ "maxLength": 200,
165
+ "title": "Non-textile parts of animal origin",
166
+ "description": "required; Reg. (EU) 1007/2011 Art. 12: mandatory where such parts are present; applicability needs-review"
167
+ },
168
+ "recycledContent": {
169
+ "type": "number",
170
+ "minimum": 0,
171
+ "maximum": 100,
172
+ "title": "Recycled content",
173
+ "description": "recommended; ESPR Annex I(g): recycled content is a named parameter; the threshold waits on the act"
174
+ },
175
+ "biobasedContent": {
176
+ "type": "number",
177
+ "minimum": 0,
178
+ "maximum": 100,
179
+ "title": "Bio-based content",
180
+ "description": "optional; Nothing requires this. Declared where a brand can substantiate it."
181
+ },
182
+ "trims": {
183
+ "type": "array",
184
+ "items": {
185
+ "type": "object",
186
+ "additionalProperties": false,
187
+ "properties": {
188
+ "part": {
189
+ "type": "string",
190
+ "minLength": 1
191
+ },
192
+ "material": {
193
+ "type": "string",
194
+ "minLength": 1
195
+ },
196
+ "origin": {
197
+ "type": "string",
198
+ "pattern": "^[A-Z]{2}$"
199
+ }
200
+ },
201
+ "required": [
202
+ "part",
203
+ "material"
204
+ ]
205
+ },
206
+ "title": "Trims and hardware",
207
+ "description": "recommended; ESPR Annex I(d) and (n): what separates for repair, and what separates for recycling"
208
+ },
209
+ "substancesOfConcern": {
210
+ "type": "array",
211
+ "items": {
212
+ "type": "object",
213
+ "additionalProperties": false,
214
+ "properties": {
215
+ "substance": {
216
+ "type": "string",
217
+ "minLength": 1
218
+ },
219
+ "casNumber": {
220
+ "type": "string",
221
+ "minLength": 1,
222
+ "pattern": "^\\d{2,7}-\\d{2}-\\d$"
223
+ },
224
+ "concentration": {
225
+ "type": "number",
226
+ "minimum": 0,
227
+ "maximum": 100
228
+ },
229
+ "location": {
230
+ "type": "string",
231
+ "minLength": 1
232
+ }
233
+ },
234
+ "required": [
235
+ "substance"
236
+ ]
237
+ },
238
+ "title": "Substances of concern",
239
+ "description": "required; ESPR Art. 7(5): substances of concern must be traceable through the passport; applicability needs-review"
240
+ },
241
+ "substanceStatement": {
242
+ "type": "string",
243
+ "minLength": 1,
244
+ "maxLength": 400,
245
+ "title": "What that means for you",
246
+ "description": "recommended; ESPR Art. 9(2)(b): passport information shall be complete and comprehensible"
247
+ },
248
+ "microplasticRelease": {
249
+ "type": "string",
250
+ "title": "Microplastic release",
251
+ "description": "optional; ESPR Annex I(k); the method is not yet fixed"
252
+ },
253
+ "care": {
254
+ "type": "array",
255
+ "uniqueItems": true,
256
+ "items": {
257
+ "enum": [
258
+ "wash30",
259
+ "wash40",
260
+ "wash60",
261
+ "handWash",
262
+ "noWash",
263
+ "noBleach",
264
+ "tumbleLow",
265
+ "noTumble",
266
+ "ironLow",
267
+ "ironMedium",
268
+ "noIron",
269
+ "dryClean",
270
+ "noDryClean"
271
+ ]
272
+ },
273
+ "title": "Care",
274
+ "description": "required; ISO 3758 care symbols; Dir. (EU) 2024/825 Art. 2 on durability information"
275
+ },
276
+ "careNote": {
277
+ "type": "string",
278
+ "minLength": 1,
279
+ "maxLength": 400,
280
+ "title": "How to make it last",
281
+ "description": "recommended; ESPR Annex I(a): extending lifetime is the parameter; this is how"
282
+ },
283
+ "expectedLifetime": {
284
+ "type": "integer",
285
+ "minimum": 1,
286
+ "maximum": 100,
287
+ "title": "Expected lifetime",
288
+ "description": "recommended; ESPR Annex I(a) and Dir. (EU) 2024/825: a durability claim must be substantiated"
289
+ },
290
+ "washCycles": {
291
+ "type": "integer",
292
+ "minimum": 1,
293
+ "maximum": 1000,
294
+ "title": "Tested to",
295
+ "description": "recommended; ESPR Annex I(b) reliability, tested per ISO 6330 domestic washing procedures"
296
+ },
297
+ "colourFastness": {
298
+ "type": "number",
299
+ "minimum": 1,
300
+ "maximum": 5,
301
+ "multipleOf": 0.5,
302
+ "title": "Colour fastness",
303
+ "description": "recommended; ESPR Annex I(b), graded 1-5 per the ISO 105 series"
304
+ },
305
+ "dimensionalStability": {
306
+ "type": "number",
307
+ "minimum": -20,
308
+ "maximum": 20,
309
+ "multipleOf": 0.5,
310
+ "title": "Dimensional change after washing",
311
+ "description": "recommended; ESPR Annex I(b), measured per ISO 5077"
312
+ },
313
+ "pillingResistance": {
314
+ "type": "number",
315
+ "minimum": 1,
316
+ "maximum": 5,
317
+ "multipleOf": 0.5,
318
+ "title": "Pilling resistance",
319
+ "description": "recommended; ESPR Annex I(b), graded 1-5 per ISO 12945"
320
+ },
321
+ "guarantee": {
322
+ "type": "integer",
323
+ "minimum": 0,
324
+ "maximum": 600,
325
+ "title": "Guarantee",
326
+ "description": "recommended; Dir. (EU) 2024/825: a commercial guarantee of durability must state its term"
327
+ },
328
+ "repairability": {
329
+ "type": "string",
330
+ "title": "Repairability",
331
+ "description": "recommended; ESPR Annex I(c) and Art. 7(2)(b)(iii)"
332
+ },
333
+ "spareParts": {
334
+ "type": "string",
335
+ "minLength": 1,
336
+ "maxLength": 300,
337
+ "title": "Spare parts",
338
+ "description": "recommended; ESPR Annex I(d): availability of spare parts is a named parameter"
339
+ },
340
+ "repairInstructions": {
341
+ "oneOf": [
342
+ {
343
+ "type": "string",
344
+ "format": "uri"
345
+ },
346
+ {
347
+ "type": "object"
348
+ }
349
+ ],
350
+ "title": "Repair instructions",
351
+ "description": "recommended; ESPR Annex I(e): access to repair information"
352
+ },
353
+ "repairServices": {
354
+ "type": "string",
355
+ "format": "uri",
356
+ "title": "Where to get it repaired",
357
+ "description": "recommended; Dir. (EU) 2024/825 recital 22: repair should be the visible option"
358
+ },
359
+ "carbonFootprint": {
360
+ "type": "number",
361
+ "minimum": 0,
362
+ "maximum": 10000,
363
+ "multipleOf": 0.01,
364
+ "title": "Carbon footprint",
365
+ "description": "recommended; ESPR Annex I(m), computed per the Apparel and Footwear PEFCR"
366
+ },
367
+ "carbonFootprintStudy": {
368
+ "oneOf": [
369
+ {
370
+ "type": "string",
371
+ "format": "uri"
372
+ },
373
+ {
374
+ "type": "object"
375
+ }
376
+ ],
377
+ "title": "The study behind the figure",
378
+ "description": "recommended; ESPR Art. 9(2)(b): a figure a reader cannot check is not information"
379
+ },
380
+ "footprintClass": {
381
+ "type": "string",
382
+ "title": "Environmental footprint class",
383
+ "description": "recommended; ESPR Art. 7(4)"
384
+ },
385
+ "waterUse": {
386
+ "type": "number",
387
+ "minimum": 0,
388
+ "maximum": 100000,
389
+ "multipleOf": 0.1,
390
+ "title": "Water use",
391
+ "description": "optional; ESPR Annex I(l): resource use. Declared where a brand has measured it."
392
+ },
393
+ "collection": {
394
+ "type": "string",
395
+ "minLength": 1,
396
+ "maxLength": 400,
397
+ "title": "Where to return it",
398
+ "description": "required; Waste Framework Directive: separate collection of textiles since 1 January 2025"
399
+ },
400
+ "recyclability": {
401
+ "type": "string",
402
+ "minLength": 1,
403
+ "maxLength": 400,
404
+ "title": "How it can be recycled",
405
+ "description": "recommended; ESPR Annex I(n): expected generation of waste materials"
406
+ },
407
+ "supplyChain": {
408
+ "type": "array",
409
+ "items": {
410
+ "type": "object",
411
+ "additionalProperties": false,
412
+ "properties": {
413
+ "stage": {
414
+ "enum": [
415
+ "fibre",
416
+ "spinning",
417
+ "weaving",
418
+ "dyeing",
419
+ "assembly"
420
+ ]
421
+ },
422
+ "country": {
423
+ "type": "string",
424
+ "pattern": "^[A-Z]{2}$"
425
+ },
426
+ "facility": {
427
+ "type": "string",
428
+ "minLength": 1
429
+ }
430
+ },
431
+ "required": [
432
+ "stage",
433
+ "country"
434
+ ]
435
+ },
436
+ "title": "Supply chain",
437
+ "description": "recommended; ESPR Annex III(f): unique facility identifiers, at the stages that have them"
438
+ },
439
+ "certifications": {
440
+ "type": "array",
441
+ "uniqueItems": true,
442
+ "items": {
443
+ "type": "string",
444
+ "minLength": 1
445
+ },
446
+ "title": "Independent certification",
447
+ "description": "recommended; Dir. (EU) 2024/825 Art. 2: a sustainability label needs a certification behind it"
448
+ },
449
+ "components": {
450
+ "type": "array",
451
+ "items": {
452
+ "type": "object",
453
+ "additionalProperties": false,
454
+ "properties": {
455
+ "component": {
456
+ "type": "string",
457
+ "minLength": 1
458
+ },
459
+ "role": {
460
+ "type": "string",
461
+ "minLength": 1
462
+ },
463
+ "massShare": {
464
+ "type": "number",
465
+ "minimum": 0,
466
+ "maximum": 100
467
+ }
468
+ },
469
+ "required": [
470
+ "component"
471
+ ]
472
+ },
473
+ "title": "Components",
474
+ "description": "recommended; ESPR Annex III and Annex I: composition and evidence at the level of the component the delegated act may name"
475
+ },
476
+ "componentFibres": {
477
+ "type": "array",
478
+ "items": {
479
+ "type": "object",
480
+ "additionalProperties": false,
481
+ "properties": {
482
+ "component": {
483
+ "type": "string",
484
+ "minLength": 1
485
+ },
486
+ "fibre": {
487
+ "type": "string",
488
+ "minLength": 1
489
+ },
490
+ "percent": {
491
+ "type": "number",
492
+ "minimum": 0,
493
+ "maximum": 100
494
+ },
495
+ "source": {
496
+ "enum": [
497
+ "preConsumer",
498
+ "postConsumer",
499
+ "virgin"
500
+ ]
501
+ }
502
+ },
503
+ "required": [
504
+ "component",
505
+ "fibre",
506
+ "percent"
507
+ ]
508
+ },
509
+ "title": "Fibre composition per component",
510
+ "description": "recommended; Regulation (EU) 1007/2011 Articles 5, 9 and 14 read per component; ESPR Annex I"
511
+ },
512
+ "recycledContentAssessment": {
513
+ "$ref": "#/$defs/measurement",
514
+ "title": "Recycled content, assessed",
515
+ "description": "optional; ESPR Annex I(g): recycled content with its method, basis and boundary"
516
+ },
517
+ "certificationEvidence": {
518
+ "type": "array",
519
+ "items": {
520
+ "$ref": "#/$defs/certification"
521
+ },
522
+ "title": "Certification evidence",
523
+ "description": "optional; Dir. (EU) 2024/825 Art. 2: the certification behind a sustainability label, as evidence"
524
+ },
525
+ "relatedDocuments": {
526
+ "type": "array",
527
+ "items": {
528
+ "$ref": "#/$defs/relatedDocument"
529
+ },
530
+ "title": "Related documents",
531
+ "description": "optional; none: documents a value points at, with their access policy and, where retained, their digest"
532
+ },
533
+ "microfibreReleaseAssessment": {
534
+ "$ref": "#/$defs/measurement",
535
+ "title": "Microfibre release, assessed",
536
+ "description": "optional; ESPR Annex I(k): microplastic and microfibre release, by a named method"
537
+ },
538
+ "repairabilityAssessment": {
539
+ "$ref": "#/$defs/measurement",
540
+ "title": "Repairability, assessed",
541
+ "description": "optional; ESPR Annex I(c) and Art. 7(2)(b)(iii): a repairability assessment under a named method"
542
+ },
543
+ "warrantyTerms": {
544
+ "$ref": "#/$defs/warrantyTerms",
545
+ "title": "Commercial guarantee terms",
546
+ "description": "optional; Dir. (EU) 2024/825: a commercial guarantee of durability states its term and what it counts from"
547
+ },
548
+ "careNoteLocalised": {
549
+ "$ref": "#/$defs/localisedText",
550
+ "title": "Care note, by language",
551
+ "description": "optional; ESPR Annex I(a): care information as the maker supplied it in each language"
552
+ },
553
+ "substanceStatementLocalised": {
554
+ "$ref": "#/$defs/localisedText",
555
+ "title": "Substance statement, by language",
556
+ "description": "optional; ESPR Art. 9(2)(b): the substance statement in each language it was supplied in"
557
+ },
558
+ "inapplicableFields": {
559
+ "type": "array",
560
+ "items": {
561
+ "type": "object",
562
+ "additionalProperties": false,
563
+ "properties": {
564
+ "field": {
565
+ "type": "string",
566
+ "minLength": 1
567
+ },
568
+ "reason": {
569
+ "type": "string",
570
+ "minLength": 1
571
+ },
572
+ "declaredBy": {
573
+ "type": "string",
574
+ "minLength": 1
575
+ }
576
+ },
577
+ "required": [
578
+ "field",
579
+ "reason"
580
+ ]
581
+ },
582
+ "title": "Declared inapplicable fields",
583
+ "description": "optional; none: the profile's own declaration by which a record says that a conditional field does not apply to it, with the reason"
584
+ }
585
+ },
586
+ "required": [
587
+ "batch",
588
+ "care",
589
+ "category",
590
+ "collection",
591
+ "fibres",
592
+ "manufacturer",
593
+ "manufacturerContact",
594
+ "manufacturingPlace",
595
+ "modelIdentifier",
596
+ "name",
597
+ "profile",
598
+ "profile_version"
599
+ ],
600
+ "$defs": {
601
+ "datePrecision": {
602
+ "enum": [
603
+ "day",
604
+ "month",
605
+ "year"
606
+ ],
607
+ "description": "How precise a date is. A month-precision date is written YYYY-MM and never given a day; a year-precision date is written YYYY."
608
+ },
609
+ "hex64": {
610
+ "type": "string",
611
+ "pattern": "^[0-9a-f]{64}$"
612
+ },
613
+ "dayDate": {
614
+ "type": "string",
615
+ "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$"
616
+ },
617
+ "monthDate": {
618
+ "type": "string",
619
+ "pattern": "^\\d{4}-(0[1-9]|1[0-2])$"
620
+ },
621
+ "yearDate": {
622
+ "type": "string",
623
+ "pattern": "^\\d{4}$"
624
+ },
625
+ "dateOrDateTime": {
626
+ "type": "string",
627
+ "pattern": "^\\d{4}(-(0[1-9]|1[0-2])(-(0[1-9]|[12]\\d|3[01])(T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|[+-]\\d{2}:\\d{2}))?)?)?$",
628
+ "description": "A year, a month, a day or an instant; the precision the shape declares says which is meant."
629
+ },
630
+ "preciseDate": {
631
+ "type": "object",
632
+ "additionalProperties": false,
633
+ "required": [
634
+ "date",
635
+ "precision"
636
+ ],
637
+ "properties": {
638
+ "date": {
639
+ "type": "string"
640
+ },
641
+ "precision": {
642
+ "$ref": "#/$defs/datePrecision"
643
+ }
644
+ },
645
+ "allOf": [
646
+ {
647
+ "if": {
648
+ "properties": {
649
+ "precision": {
650
+ "const": "day"
651
+ }
652
+ }
653
+ },
654
+ "then": {
655
+ "properties": {
656
+ "date": {
657
+ "$ref": "#/$defs/dayDate"
658
+ }
659
+ }
660
+ }
661
+ },
662
+ {
663
+ "if": {
664
+ "properties": {
665
+ "precision": {
666
+ "const": "month"
667
+ }
668
+ }
669
+ },
670
+ "then": {
671
+ "properties": {
672
+ "date": {
673
+ "$ref": "#/$defs/monthDate"
674
+ }
675
+ }
676
+ }
677
+ },
678
+ {
679
+ "if": {
680
+ "properties": {
681
+ "precision": {
682
+ "const": "year"
683
+ }
684
+ }
685
+ },
686
+ "then": {
687
+ "properties": {
688
+ "date": {
689
+ "$ref": "#/$defs/yearDate"
690
+ }
691
+ }
692
+ }
693
+ }
694
+ ]
695
+ },
696
+ "subjectRef": {
697
+ "type": "object",
698
+ "additionalProperties": false,
699
+ "required": [
700
+ "id",
701
+ "granularity"
702
+ ],
703
+ "properties": {
704
+ "id": {
705
+ "type": "string",
706
+ "minLength": 1,
707
+ "maxLength": 512
708
+ },
709
+ "granularity": {
710
+ "enum": [
711
+ "model",
712
+ "batch",
713
+ "item",
714
+ "component"
715
+ ]
716
+ },
717
+ "componentRef": {
718
+ "type": "string",
719
+ "minLength": 1,
720
+ "maxLength": 512,
721
+ "description": "The component this evidence covers, when the granularity is component; a component need not have a token."
722
+ }
723
+ }
724
+ },
725
+ "sourceRef": {
726
+ "type": "object",
727
+ "additionalProperties": false,
728
+ "required": [
729
+ "kind",
730
+ "id"
731
+ ],
732
+ "properties": {
733
+ "kind": {
734
+ "enum": [
735
+ "source-revision",
736
+ "credential",
737
+ "document"
738
+ ]
739
+ },
740
+ "id": {
741
+ "type": "string",
742
+ "minLength": 1
743
+ },
744
+ "revisionId": {
745
+ "type": "string",
746
+ "minLength": 1
747
+ },
748
+ "digest": {
749
+ "$ref": "#/$defs/hex64"
750
+ }
751
+ }
752
+ },
753
+ "relevantTime": {
754
+ "type": "object",
755
+ "additionalProperties": false,
756
+ "required": [
757
+ "precision"
758
+ ],
759
+ "properties": {
760
+ "at": {
761
+ "$ref": "#/$defs/dateOrDateTime"
762
+ },
763
+ "from": {
764
+ "$ref": "#/$defs/dateOrDateTime"
765
+ },
766
+ "until": {
767
+ "$ref": "#/$defs/dateOrDateTime"
768
+ },
769
+ "precision": {
770
+ "$ref": "#/$defs/datePrecision"
771
+ }
772
+ }
773
+ },
774
+ "claimEvidence": {
775
+ "type": "object",
776
+ "additionalProperties": false,
777
+ "required": [
778
+ "property",
779
+ "subject",
780
+ "source"
781
+ ],
782
+ "properties": {
783
+ "property": {
784
+ "type": "string",
785
+ "pattern": "^/",
786
+ "description": "The JSON pointer of the field the evidence is about."
787
+ },
788
+ "subject": {
789
+ "$ref": "#/$defs/subjectRef"
790
+ },
791
+ "source": {
792
+ "$ref": "#/$defs/sourceRef"
793
+ },
794
+ "reporter": {
795
+ "type": "string",
796
+ "minLength": 1,
797
+ "description": "Who reported the fact, when that is not the issuer of the source."
798
+ },
799
+ "issuer": {
800
+ "type": "string",
801
+ "minLength": 1
802
+ },
803
+ "relevantTime": {
804
+ "$ref": "#/$defs/relevantTime"
805
+ },
806
+ "reportRef": {
807
+ "type": "string",
808
+ "minLength": 1,
809
+ "description": "A verification report the evidence was evaluated in."
810
+ }
811
+ }
812
+ },
813
+ "certification": {
814
+ "type": "object",
815
+ "additionalProperties": false,
816
+ "required": [
817
+ "scheme",
818
+ "certificateId",
819
+ "issuer",
820
+ "subject",
821
+ "verification"
822
+ ],
823
+ "description": "A certificate as evidence. The scheme's homepage and the issuer's signature are inputs to a verification; only verification.status says what was established, and unknown is not a pass.",
824
+ "properties": {
825
+ "scheme": {
826
+ "type": "object",
827
+ "additionalProperties": false,
828
+ "required": [
829
+ "id",
830
+ "name"
831
+ ],
832
+ "properties": {
833
+ "id": {
834
+ "type": "string",
835
+ "minLength": 1
836
+ },
837
+ "name": {
838
+ "type": "string",
839
+ "minLength": 1
840
+ },
841
+ "version": {
842
+ "type": "string"
843
+ }
844
+ }
845
+ },
846
+ "certificateId": {
847
+ "type": "string",
848
+ "minLength": 1
849
+ },
850
+ "issuer": {
851
+ "type": "string",
852
+ "minLength": 1,
853
+ "description": "The certification body or issuer as named on the certificate."
854
+ },
855
+ "subject": {
856
+ "$ref": "#/$defs/subjectRef"
857
+ },
858
+ "validFrom": {
859
+ "$ref": "#/$defs/dateOrDateTime"
860
+ },
861
+ "validUntil": {
862
+ "$ref": "#/$defs/dateOrDateTime"
863
+ },
864
+ "precision": {
865
+ "$ref": "#/$defs/datePrecision"
866
+ },
867
+ "documentRef": {
868
+ "$ref": "#/$defs/relatedDocument"
869
+ },
870
+ "credentialRef": {
871
+ "type": "object",
872
+ "additionalProperties": false,
873
+ "required": [
874
+ "id"
875
+ ],
876
+ "properties": {
877
+ "id": {
878
+ "type": "string",
879
+ "minLength": 1
880
+ },
881
+ "digest": {
882
+ "$ref": "#/$defs/hex64"
883
+ }
884
+ }
885
+ },
886
+ "verification": {
887
+ "type": "object",
888
+ "additionalProperties": false,
889
+ "required": [
890
+ "status"
891
+ ],
892
+ "properties": {
893
+ "status": {
894
+ "enum": [
895
+ "verified",
896
+ "failed",
897
+ "unknown",
898
+ "not-checked"
899
+ ]
900
+ },
901
+ "checkedAt": {
902
+ "$ref": "#/$defs/dateOrDateTime"
903
+ },
904
+ "reportRef": {
905
+ "type": "string",
906
+ "minLength": 1
907
+ }
908
+ }
909
+ }
910
+ }
911
+ },
912
+ "quantity": {
913
+ "type": "object",
914
+ "additionalProperties": false,
915
+ "required": [
916
+ "value",
917
+ "unit"
918
+ ],
919
+ "properties": {
920
+ "value": {
921
+ "type": "number"
922
+ },
923
+ "unit": {
924
+ "type": "string",
925
+ "minLength": 1
926
+ }
927
+ }
928
+ },
929
+ "measurement": {
930
+ "type": "object",
931
+ "additionalProperties": false,
932
+ "required": [
933
+ "property",
934
+ "value",
935
+ "unit",
936
+ "subject"
937
+ ],
938
+ "description": "A measured or assessed value with the scope that makes it comparable: the unit, the basis (a fraction is not a percent), the functional unit or denominator, the method and its version, the boundary and conditions, when it was measured and for which subject. A value that is a string carries a basis, because a bare string cannot be compared.",
939
+ "properties": {
940
+ "property": {
941
+ "type": "string",
942
+ "minLength": 1
943
+ },
944
+ "value": {
945
+ "type": [
946
+ "number",
947
+ "string"
948
+ ]
949
+ },
950
+ "unit": {
951
+ "type": "string",
952
+ "minLength": 1
953
+ },
954
+ "basis": {
955
+ "$ref": "#/$defs/measurementBasis"
956
+ },
957
+ "functionalUnit": {
958
+ "type": "string",
959
+ "minLength": 1
960
+ },
961
+ "denominator": {
962
+ "$ref": "#/$defs/quantity"
963
+ },
964
+ "method": {
965
+ "type": "object",
966
+ "additionalProperties": false,
967
+ "required": [
968
+ "id"
969
+ ],
970
+ "properties": {
971
+ "id": {
972
+ "type": "string",
973
+ "minLength": 1
974
+ },
975
+ "version": {
976
+ "type": "string"
977
+ }
978
+ }
979
+ },
980
+ "boundary": {
981
+ "type": "string",
982
+ "minLength": 1
983
+ },
984
+ "conditions": {
985
+ "type": "string",
986
+ "minLength": 1
987
+ },
988
+ "measuredAt": {
989
+ "$ref": "#/$defs/preciseDate"
990
+ },
991
+ "effective": {
992
+ "type": "object",
993
+ "additionalProperties": false,
994
+ "properties": {
995
+ "from": {
996
+ "$ref": "#/$defs/dateOrDateTime"
997
+ },
998
+ "until": {
999
+ "$ref": "#/$defs/dateOrDateTime"
1000
+ }
1001
+ }
1002
+ },
1003
+ "subject": {
1004
+ "$ref": "#/$defs/subjectRef"
1005
+ },
1006
+ "evidence": {
1007
+ "type": "array",
1008
+ "items": {
1009
+ "$ref": "#/$defs/claimEvidence"
1010
+ }
1011
+ },
1012
+ "conversion": {
1013
+ "type": "object",
1014
+ "additionalProperties": false,
1015
+ "required": [
1016
+ "fromUnit",
1017
+ "toUnit",
1018
+ "rule",
1019
+ "explicit"
1020
+ ],
1021
+ "description": "Present only when the value was converted from its source unit under a stated rule; a converted value never loses its source unit.",
1022
+ "properties": {
1023
+ "fromUnit": {
1024
+ "type": "string",
1025
+ "minLength": 1
1026
+ },
1027
+ "toUnit": {
1028
+ "type": "string",
1029
+ "minLength": 1
1030
+ },
1031
+ "rule": {
1032
+ "type": "string",
1033
+ "minLength": 1
1034
+ },
1035
+ "explicit": {
1036
+ "const": true
1037
+ }
1038
+ }
1039
+ }
1040
+ },
1041
+ "allOf": [
1042
+ {
1043
+ "if": {
1044
+ "properties": {
1045
+ "value": {
1046
+ "type": "string"
1047
+ }
1048
+ }
1049
+ },
1050
+ "then": {
1051
+ "properties": {
1052
+ "basis": {
1053
+ "$ref": "#/$defs/measurementBasis"
1054
+ }
1055
+ },
1056
+ "required": [
1057
+ "basis"
1058
+ ]
1059
+ }
1060
+ }
1061
+ ]
1062
+ },
1063
+ "relatedDocument": {
1064
+ "type": "object",
1065
+ "additionalProperties": false,
1066
+ "required": [
1067
+ "ref",
1068
+ "purpose",
1069
+ "retained",
1070
+ "access"
1071
+ ],
1072
+ "description": "A document a value points at. A URL is where the document was seen, not a commitment to its content; only retained bytes carry a digest.",
1073
+ "properties": {
1074
+ "ref": {
1075
+ "type": "string",
1076
+ "minLength": 1
1077
+ },
1078
+ "purpose": {
1079
+ "type": "string",
1080
+ "minLength": 1
1081
+ },
1082
+ "url": {
1083
+ "type": "string",
1084
+ "format": "uri"
1085
+ },
1086
+ "mediaType": {
1087
+ "type": "string",
1088
+ "minLength": 1
1089
+ },
1090
+ "language": {
1091
+ "type": "string",
1092
+ "pattern": "^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})*$"
1093
+ },
1094
+ "revision": {
1095
+ "type": "string"
1096
+ },
1097
+ "date": {
1098
+ "$ref": "#/$defs/dateOrDateTime"
1099
+ },
1100
+ "precision": {
1101
+ "$ref": "#/$defs/datePrecision"
1102
+ },
1103
+ "digest": {
1104
+ "$ref": "#/$defs/hex64"
1105
+ },
1106
+ "byteLength": {
1107
+ "type": "integer",
1108
+ "minimum": 0
1109
+ },
1110
+ "retained": {
1111
+ "type": "boolean"
1112
+ },
1113
+ "access": {
1114
+ "enum": [
1115
+ "public",
1116
+ "owner",
1117
+ "legitimate",
1118
+ "authority"
1119
+ ]
1120
+ }
1121
+ },
1122
+ "allOf": [
1123
+ {
1124
+ "if": {
1125
+ "properties": {
1126
+ "retained": {
1127
+ "const": true
1128
+ }
1129
+ }
1130
+ },
1131
+ "then": {
1132
+ "properties": {
1133
+ "digest": {
1134
+ "$ref": "#/$defs/hex64"
1135
+ },
1136
+ "byteLength": {
1137
+ "type": "integer",
1138
+ "minimum": 0
1139
+ }
1140
+ },
1141
+ "required": [
1142
+ "digest",
1143
+ "byteLength"
1144
+ ]
1145
+ }
1146
+ }
1147
+ ]
1148
+ },
1149
+ "localisedText": {
1150
+ "type": "object",
1151
+ "additionalProperties": false,
1152
+ "required": [
1153
+ "values"
1154
+ ],
1155
+ "description": "Text in one or more languages as the source supplied it. A reader selects the exact tag, then the base language, then the declared default, and records which; it never rewrites a value as another language.",
1156
+ "properties": {
1157
+ "values": {
1158
+ "type": "array",
1159
+ "minItems": 1,
1160
+ "items": {
1161
+ "type": "object",
1162
+ "additionalProperties": false,
1163
+ "required": [
1164
+ "language",
1165
+ "text"
1166
+ ],
1167
+ "properties": {
1168
+ "language": {
1169
+ "type": "string",
1170
+ "pattern": "^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})*$"
1171
+ },
1172
+ "text": {
1173
+ "type": "string"
1174
+ }
1175
+ }
1176
+ }
1177
+ },
1178
+ "returnedLanguage": {
1179
+ "type": "string",
1180
+ "pattern": "^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})*$"
1181
+ },
1182
+ "selection": {
1183
+ "enum": [
1184
+ "exact",
1185
+ "base",
1186
+ "default"
1187
+ ]
1188
+ }
1189
+ }
1190
+ },
1191
+ "warrantyTerms": {
1192
+ "type": "object",
1193
+ "additionalProperties": false,
1194
+ "required": [
1195
+ "duration",
1196
+ "calendarRule"
1197
+ ],
1198
+ "description": "A model's warranty terms: a duration and the calendar rule that says what the duration counts from. Terms alone give no expiry.",
1199
+ "properties": {
1200
+ "duration": {
1201
+ "type": "object",
1202
+ "additionalProperties": false,
1203
+ "required": [
1204
+ "value",
1205
+ "unit"
1206
+ ],
1207
+ "properties": {
1208
+ "value": {
1209
+ "type": "integer",
1210
+ "minimum": 1
1211
+ },
1212
+ "unit": {
1213
+ "enum": [
1214
+ "months",
1215
+ "years"
1216
+ ]
1217
+ }
1218
+ }
1219
+ },
1220
+ "calendarRule": {
1221
+ "enum": [
1222
+ "purchase-date",
1223
+ "manufacture-date",
1224
+ "first-use"
1225
+ ]
1226
+ },
1227
+ "conditions": {
1228
+ "type": "string"
1229
+ }
1230
+ }
1231
+ },
1232
+ "warrantyExpiry": {
1233
+ "type": "object",
1234
+ "additionalProperties": false,
1235
+ "required": [
1236
+ "start",
1237
+ "terms",
1238
+ "derived"
1239
+ ],
1240
+ "description": "An item's derived warranty expiry: the evidenced start, the terms applied and the derived date at the precision the start permits. A month-precision start yields a month, never an invented day.",
1241
+ "properties": {
1242
+ "start": {
1243
+ "type": "object",
1244
+ "additionalProperties": false,
1245
+ "required": [
1246
+ "date",
1247
+ "precision",
1248
+ "evidenceRef"
1249
+ ],
1250
+ "properties": {
1251
+ "date": {
1252
+ "type": "string"
1253
+ },
1254
+ "precision": {
1255
+ "$ref": "#/$defs/datePrecision"
1256
+ },
1257
+ "evidenceRef": {
1258
+ "type": "string",
1259
+ "minLength": 1
1260
+ }
1261
+ }
1262
+ },
1263
+ "terms": {
1264
+ "$ref": "#/$defs/warrantyTerms"
1265
+ },
1266
+ "derived": {
1267
+ "type": "object",
1268
+ "additionalProperties": false,
1269
+ "required": [
1270
+ "date",
1271
+ "precision",
1272
+ "rule"
1273
+ ],
1274
+ "properties": {
1275
+ "date": {
1276
+ "type": "string"
1277
+ },
1278
+ "precision": {
1279
+ "$ref": "#/$defs/datePrecision"
1280
+ },
1281
+ "rule": {
1282
+ "type": "string",
1283
+ "minLength": 1
1284
+ }
1285
+ }
1286
+ }
1287
+ }
1288
+ },
1289
+ "measurementBasis": {
1290
+ "enum": [
1291
+ "fraction",
1292
+ "percent",
1293
+ "mass",
1294
+ "count",
1295
+ "per-functional-unit"
1296
+ ]
1297
+ }
1298
+ }
1299
+ }