@tracepass/dpp-identifiers 0.9.1 → 0.11.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
@@ -59,7 +59,7 @@ validateProductIdentifier(
59
59
  | `iso15459` | scheme 1 | Non-GS1 issuing agency. Agency code first char must be a letter |
60
60
  | `iec61406` | scheme 2 | https URL, ASCII-only, RFC 3986-valid |
61
61
  | `did` | scheme 3 | W3C DID Core syntax only; no method allow-list |
62
- | `doi` | scheme 5 | `10.<registrant>/<suffix>`; accepts `doi:` / `https://doi.org/` prefixes |
62
+ | `doi` | scheme 5 | `10.<registrant>/<suffix>`; accepts `doi:` / `https://doi.org/` prefixes. `granularity` (`model` \| `batch` \| `item`) is required: clause 5.6.2(b) |
63
63
 
64
64
  **Battery passports** accept only `gs1` and `iso15459`: Battery Regulation Art. 77(3)
65
65
  requires ISO/IEC 15459 until a delegated act replaces it with EN 18219.
@@ -79,15 +79,15 @@ validateOperatorIdentifier({ scheme: "iso6523", icd: "0199", value: "5493001KJTI
79
79
  // GLN (icd 0088) validated with GS1 mod-10
80
80
  validateOperatorIdentifier({ scheme: "iso6523", icd: "0088", value: "5412345000013" }).ok; // true
81
81
 
82
- // Facility — GLN only (EN 18219 scheme 7)
83
- validateFacilityIdentifier({ scheme: "gln", gln: "5412345000013" }).ok; // true
82
+ // Facility — the same four schemes as operators (EN 18219 clauses 6.2–6.5)
84
83
  validateFacilityIdentifier({ scheme: "gln", gln: "5412345000013", extension: "DOCK-1" }).ok; // true
84
+ validateFacilityIdentifier({ scheme: "did", did: "did:web:plant.example.com" }).ok; // true
85
85
  ```
86
86
 
87
87
  ## Build and parse resolver paths
88
88
 
89
89
  ```ts
90
- import { identifierToUri, identifierOwnUrl, parseResolverPath, identifierKey } from "@tracepass/dpp-identifiers";
90
+ import { identifierToUri, identifierOwnUrl, parseResolverPath, diQueryCandidateKeys, identifierKey } from "@tracepass/dpp-identifiers";
91
91
 
92
92
  const gs1 = { scheme: "gs1", gtin: "05449000000996", serialNumber: "SN-001" } as const;
93
93
 
@@ -99,8 +99,19 @@ identifierToUri(gs1, "id.example.com");
99
99
  parseResolverPath("/01/05449000000996/21/SN-001");
100
100
  // { scheme: "gs1", gtin: "05449000000996", serialNumber: "SN-001" }
101
101
 
102
+ // ISO/IEC 15459 → the ISO/IEC 18975 query form (EN 18219 Table B.12)
103
+ identifierToUri(
104
+ { scheme: "iso15459", issuingAgencyCode: "QC", primaryId: "ELMI12345", serial: "654321", raw: "QC/ELMI12345/654321" },
105
+ "id.example.com",
106
+ );
107
+ // "https://id.example.com/?.25P=QCELMI12345&.S=654321"
108
+
109
+ // A resolver splits .25P back into candidate keys (the agency code is 1–3 characters)
110
+ diQueryCandidateKeys("QCELMI12345", "654321");
111
+ // ["iso15459:Q:CELMI12345:654321", "iso15459:QC:ELMI12345:654321", "iso15459:QCE:LMI12345:654321"]
112
+
102
113
  // A DOI carries its own URL; no resolver needed
103
- identifierOwnUrl({ scheme: "doi", doi: "10.1234/my-passport" });
114
+ identifierOwnUrl({ scheme: "doi", doi: "10.1234/my-passport", granularity: "model" });
104
115
  // "https://doi.org/10.1234/my-passport"
105
116
 
106
117
  // Canonical key for deduplication
@@ -112,7 +123,9 @@ canonical URL (use `identifierOwnUrl` instead).
112
123
 
113
124
  ### `parseResolverPath` and consumer pre-emption
114
125
 
115
- `parseResolverPath` enforces the ISO/IEC 15459 agency-code shape: the first path segment
126
+ `parseResolverPath` also reads the older `/<AGENCY>/<primaryId>[/<serial>]` path, so a URL
127
+ already printed in that form keeps resolving. `identifierToUri` no longer emits it. It
128
+ enforces the ISO/IEC 15459 agency-code shape: the first path segment
116
129
  must be 1–3 uppercase chars matching `[A-Z][A-Z0-9]{0,2}`. This rejects common app routes:
117
130
 
118
131
  | Path | Result |
@@ -152,15 +165,15 @@ This package is pure TypeScript over plain objects. It imports only two sibling
152
165
  (`@tracepass/dpp-types` for types and `@tracepass/gs1-utils` for GTIN/GLN arithmetic),
153
166
  neither of which adds a third-party runtime dependency.
154
167
 
155
- ## Not yet modelled
168
+ ## Out of scope
156
169
 
157
- - **EN 18219 scheme 4** ("identification for products and product groups") — clause
158
- 5.4.2 onward is not yet publicly readable.
159
- - **DID method allow-list** — EN 18219 5.4.1 names did:web, did:ethr and did:ebsi as
160
- examples, not a closed list. Any DID Core syntax is accepted.
161
- - **ISO/IEC 18975 path form** for iso15459 resolver paths — 18975 is paywalled. The
162
- path emitted by `identifierToUri` is a TracePass resolver route, not a conformance
163
- claim against 18975.
170
+ - **EN 18219 scheme 4** (RAIN RFID and 2D codes) encodes the same ISO/IEC 15459
171
+ identifiers on a limited-capacity carrier. It is a data-carrier concern, not a separate
172
+ identifier type.
173
+ - **DID method allow-list.** Clause 5.4.2 requires DID Core only. did:web, did:ethr and
174
+ did:ebsi are a recommendation (5.4.3). Any DID Core syntax is accepted.
175
+ - **A DID as an operator identifier** also needs a verifiable credential from an
176
+ authorised company register (clause 6.4.2(b)). The validator checks the syntax only.
164
177
 
165
178
  ## License
166
179
 
package/dist/index.d.ts CHANGED
@@ -16,12 +16,20 @@
16
16
  *
17
17
  * validateFacilityIdentifier(id) — validate GLN facility identifiers.
18
18
  *
19
- * identifierToUri(id, resolverBase) — build a resolver URL (null for
20
- * iec61406/did/doi, which carry their own URL).
19
+ * identifierToUri(id, resolverBase) — build a resolver URL; iso15459 emits
20
+ * the ISO/IEC 18975 query form `?.25P=...[&.S=...]` per EN 18219 §5.2.2.
21
+ * Null for iec61406/did/doi, which carry their own URL.
21
22
  *
22
23
  * identifierOwnUrl(id) — the identifier's own canonical URL when it has one.
23
24
  *
24
- * parseResolverPath(path) — inverse of identifierToUri for gs1 and iso15459.
25
+ * parseDiQuery(queryString) — parse the ISO/IEC 18975 `?.25P=...[&.S=...]`
26
+ * query string back to `{ concatenated25P, serial? }`.
27
+ *
28
+ * diQueryCandidateKeys(concatenated25P, serial?) — generate up to 3 candidate
29
+ * `identifierKey` strings by trying IAC lengths 1, 2 and 3.
30
+ *
31
+ * parseResolverPath(path) — inverse of identifierToUri for gs1; also parses
32
+ * legacy iso15459 agency paths for backward compatibility.
25
33
  *
26
34
  * identifierKey(id) — a stable string key for deduplication.
27
35
  *
@@ -35,6 +43,6 @@ export { validateProductIdentifier } from "./product.js";
35
43
  export type { ValidationResult, ValidateProductOptions } from "./product.js";
36
44
  export { normalizeDoi } from "./product.js";
37
45
  export { validateOperatorIdentifier, validateFacilityIdentifier } from "./operator.js";
38
- export { identifierToUri, identifierOwnUrl, parseResolverPath, identifierKey, } from "./uri.js";
46
+ export { identifierToUri, identifierOwnUrl, parseResolverPath, parseDiQuery, diQueryCandidateKeys, identifierKey, } from "./uri.js";
39
47
  export { resolveProductIdentifier } from "./passport.js";
40
48
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,YAAY,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAEvF,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,GACd,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,YAAY,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAEvF,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,EACpB,aAAa,GACd,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC"}
package/dist/index.js CHANGED
@@ -16,12 +16,20 @@
16
16
  *
17
17
  * validateFacilityIdentifier(id) — validate GLN facility identifiers.
18
18
  *
19
- * identifierToUri(id, resolverBase) — build a resolver URL (null for
20
- * iec61406/did/doi, which carry their own URL).
19
+ * identifierToUri(id, resolverBase) — build a resolver URL; iso15459 emits
20
+ * the ISO/IEC 18975 query form `?.25P=...[&.S=...]` per EN 18219 §5.2.2.
21
+ * Null for iec61406/did/doi, which carry their own URL.
21
22
  *
22
23
  * identifierOwnUrl(id) — the identifier's own canonical URL when it has one.
23
24
  *
24
- * parseResolverPath(path) — inverse of identifierToUri for gs1 and iso15459.
25
+ * parseDiQuery(queryString) — parse the ISO/IEC 18975 `?.25P=...[&.S=...]`
26
+ * query string back to `{ concatenated25P, serial? }`.
27
+ *
28
+ * diQueryCandidateKeys(concatenated25P, serial?) — generate up to 3 candidate
29
+ * `identifierKey` strings by trying IAC lengths 1, 2 and 3.
30
+ *
31
+ * parseResolverPath(path) — inverse of identifierToUri for gs1; also parses
32
+ * legacy iso15459 agency paths for backward compatibility.
25
33
  *
26
34
  * identifierKey(id) — a stable string key for deduplication.
27
35
  *
@@ -34,6 +42,6 @@
34
42
  export { validateProductIdentifier } from "./product.js";
35
43
  export { normalizeDoi } from "./product.js";
36
44
  export { validateOperatorIdentifier, validateFacilityIdentifier } from "./operator.js";
37
- export { identifierToUri, identifierOwnUrl, parseResolverPath, identifierKey, } from "./uri.js";
45
+ export { identifierToUri, identifierOwnUrl, parseResolverPath, parseDiQuery, diQueryCandidateKeys, identifierKey, } from "./uri.js";
38
46
  export { resolveProductIdentifier } from "./passport.js";
39
47
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAEvF,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,GACd,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAEvF,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,EACpB,aAAa,GACd,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC"}
@@ -11,9 +11,11 @@
11
11
  * did: W3C DID Core syntax (method [a-z0-9]+, method-specific-id valid).
12
12
  * doi: prefix 10.<registrant>/<suffix>, accepts doi:/https://doi.org/ prefixes.
13
13
  *
14
- * validateFacilityIdentifier — EN 18219 scheme 7 (GLN only; no other heading
15
- * names facilities). The optional `extension` field identifies a sub-location
16
- * (GS1 SGLN extension component).
14
+ * validateFacilityIdentifier — EN 18219 §6.1–6.5: schemes 6 (ISO/IEC 6523),
15
+ * 7 (GLN via ISO/IEC 15418), 8 (DID) and 9 (DOI) all cover BOTH economic
16
+ * operators AND facilities. Reuses the operator validator for the shared
17
+ * schemes; the GLN scheme additionally accepts an `extension` component
18
+ * (a GS1 SGLN sub-location).
17
19
  */
18
20
  import type { OperatorIdentifier, FacilityIdentifier } from "@tracepass/dpp-types";
19
21
  import type { ValidationResult } from "./product.js";
@@ -23,11 +25,11 @@ import type { ValidationResult } from "./product.js";
23
25
  */
24
26
  export declare function validateOperatorIdentifier(id: OperatorIdentifier): ValidationResult<OperatorIdentifier>;
25
27
  /**
26
- * Validate a `FacilityIdentifier` against EN 18219 rules.
27
- * EN 18219 scheme 7 names GLN as the only facility scheme.
28
+ * Validate a `FacilityIdentifier` against EN 18219 §6.1–6.5 rules.
28
29
  *
29
- * The optional `extension` field is a sub-location identifier following the
30
- * GS1 SGLN extension component convention (non-empty when present).
30
+ * EN 18219 §6.1–6.5 specifies the same four schemes for facilities as for
31
+ * operators: ISO/IEC 6523, GLN/ISO 15418, DID, and DOI. All four are validated
32
+ * here. The GLN `extension` field is a GS1 SGLN sub-location component.
31
33
  */
32
34
  export declare function validateFacilityIdentifier(id: FacilityIdentifier): ValidationResult<FacilityIdentifier>;
33
35
  //# sourceMappingURL=operator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"operator.d.ts","sourceRoot":"","sources":["../src/operator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAEnF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAuIrD;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,EAAE,EAAE,kBAAkB,GACrB,gBAAgB,CAAC,kBAAkB,CAAC,CAyCtC;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,EAAE,EAAE,kBAAkB,GACrB,gBAAgB,CAAC,kBAAkB,CAAC,CAatC"}
1
+ {"version":3,"file":"operator.d.ts","sourceRoot":"","sources":["../src/operator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAEnF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAuIrD;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,EAAE,EAAE,kBAAkB,GACrB,gBAAgB,CAAC,kBAAkB,CAAC,CAyCtC;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,EAAE,EAAE,kBAAkB,GACrB,gBAAgB,CAAC,kBAAkB,CAAC,CAwCtC"}
package/dist/operator.js CHANGED
@@ -11,9 +11,11 @@
11
11
  * did: W3C DID Core syntax (method [a-z0-9]+, method-specific-id valid).
12
12
  * doi: prefix 10.<registrant>/<suffix>, accepts doi:/https://doi.org/ prefixes.
13
13
  *
14
- * validateFacilityIdentifier — EN 18219 scheme 7 (GLN only; no other heading
15
- * names facilities). The optional `extension` field identifies a sub-location
16
- * (GS1 SGLN extension component).
14
+ * validateFacilityIdentifier — EN 18219 §6.1–6.5: schemes 6 (ISO/IEC 6523),
15
+ * 7 (GLN via ISO/IEC 15418), 8 (DID) and 9 (DOI) all cover BOTH economic
16
+ * operators AND facilities. Reuses the operator validator for the shared
17
+ * schemes; the GLN scheme additionally accepts an `extension` component
18
+ * (a GS1 SGLN sub-location).
17
19
  */
18
20
  import { validateGln } from "@tracepass/gs1-utils";
19
21
  import { normalizeDoi } from "./product.js";
@@ -179,22 +181,49 @@ export function validateOperatorIdentifier(id) {
179
181
  }
180
182
  }
181
183
  /**
182
- * Validate a `FacilityIdentifier` against EN 18219 rules.
183
- * EN 18219 scheme 7 names GLN as the only facility scheme.
184
+ * Validate a `FacilityIdentifier` against EN 18219 §6.1–6.5 rules.
184
185
  *
185
- * The optional `extension` field is a sub-location identifier following the
186
- * GS1 SGLN extension component convention (non-empty when present).
186
+ * EN 18219 §6.1–6.5 specifies the same four schemes for facilities as for
187
+ * operators: ISO/IEC 6523, GLN/ISO 15418, DID, and DOI. All four are validated
188
+ * here. The GLN `extension` field is a GS1 SGLN sub-location component.
187
189
  */
188
190
  export function validateFacilityIdentifier(id) {
189
- const errors = [];
190
- if (!validateGln(id.gln)) {
191
- errors.push("gln must be a valid 13-digit GLN with a correct mod-10 check digit");
192
- }
193
- if (id.extension !== undefined && !id.extension) {
194
- errors.push("extension, when present, must not be empty");
191
+ switch (id.scheme) {
192
+ case "gln": {
193
+ const errors = [];
194
+ if (!validateGln(id.gln)) {
195
+ errors.push("gln must be a valid 13-digit GLN with a correct mod-10 check digit");
196
+ }
197
+ if (id.extension !== undefined && !id.extension) {
198
+ errors.push("extension, when present, must not be empty");
199
+ }
200
+ if (errors.length > 0)
201
+ return { ok: false, errors };
202
+ return { ok: true, value: id };
203
+ }
204
+ case "iso6523":
205
+ return validateIso6523(id.icd, id.value);
206
+ case "did": {
207
+ const didErrors = validateDidString(id.did);
208
+ if (didErrors.length > 0)
209
+ return { ok: false, errors: didErrors };
210
+ return { ok: true, value: id };
211
+ }
212
+ case "doi": {
213
+ const bare = normalizeDoi(id.doi);
214
+ if (!bare) {
215
+ return {
216
+ ok: false,
217
+ errors: [`doi '${id.doi}' must match 10.<4–9 registrant digits>/<suffix>`],
218
+ };
219
+ }
220
+ return { ok: true, value: { ...id, doi: bare } };
221
+ }
222
+ default: {
223
+ const _exhaustive = id;
224
+ void _exhaustive;
225
+ return { ok: false, errors: ["unknown facility identifier scheme"] };
226
+ }
195
227
  }
196
- if (errors.length > 0)
197
- return { ok: false, errors };
198
- return { ok: true, value: id };
199
228
  }
200
229
  //# sourceMappingURL=operator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"operator.js","sourceRoot":"","sources":["../src/operator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"operator.js","sourceRoot":"","sources":["../src/operator.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"product.d.ts","sourceRoot":"","sources":["../src/product.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EACV,iBAAiB,EAMlB,MAAM,sBAAsB,CAAC;AAG9B,2EAA2E;AAC3E,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAC1B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GACtB;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEpC,qDAAqD;AACrD,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAgGD;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkBzD;AAgJD;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CACvC,EAAE,EAAE,iBAAiB,EACrB,OAAO,GAAE,sBAA2B,GACnC,gBAAgB,CAAC,iBAAiB,CAAC,CA2BrC"}
1
+ {"version":3,"file":"product.d.ts","sourceRoot":"","sources":["../src/product.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EACV,iBAAiB,EAMlB,MAAM,sBAAsB,CAAC;AAG9B,2EAA2E;AAC3E,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAC1B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GACtB;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEpC,qDAAqD;AACrD,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAgGD;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkBzD;AA2JD;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CACvC,EAAE,EAAE,iBAAiB,EACrB,OAAO,GAAE,sBAA2B,GACnC,gBAAgB,CAAC,iBAAiB,CAAC,CA2BrC"}
package/dist/product.js CHANGED
@@ -252,6 +252,13 @@ function validateDoiId(id) {
252
252
  if (!bare) {
253
253
  errors.push(`doi '${id.doi}' must match 10.<4–9 registrant digits>/<suffix> per the DOI Handbook`);
254
254
  }
255
+ // EN 18219 §5.6.2(b): granularity declaration is required.
256
+ if (!id.granularity) {
257
+ errors.push("doi granularity is required — specify 'model', 'batch', or 'item' per EN 18219 §5.6.2(b)");
258
+ }
259
+ else if (!["model", "batch", "item"].includes(id.granularity)) {
260
+ errors.push(`doi granularity '${id.granularity}' is invalid — must be 'model', 'batch', or 'item'`);
261
+ }
255
262
  if (errors.length > 0)
256
263
  return { ok: false, errors };
257
264
  return { ok: true, value: { ...id, doi: bare } }; // eslint-disable-line @typescript-eslint/no-non-null-assertion
@@ -1 +1 @@
1
- {"version":3,"file":"product.js","sourceRoot":"","sources":["../src/product.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"product.js","sourceRoot":"","sources":["../src/product.ts"],"names":[],"mappings":"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"}
package/dist/uri.d.ts CHANGED
@@ -3,19 +3,24 @@
3
3
  *
4
4
  * identifierToUri — build a resolver URL from any ProductIdentifier.
5
5
  * gs1 → Digital Link path `/01/<gtin14>/21/<encoded-serial>`
6
- * iso15459 → `/<agency>/<encoded-primaryId>[/<encoded-serial>]`
6
+ * iso15459 → ISO/IEC 18975 query form `/?` `.25P=<encodeURIComponent(iac+primaryId)>[&.S=<encodeURIComponent(serial)>]`
7
+ * (EN 18219 §5.2.2 + Table B.12; the `.25P` DI concatenates IAC + CIN + product number
8
+ * with no separators; `.S` is the optional serial)
7
9
  * iec61406 / did / doi → null (they carry their own canonical URL)
8
10
  *
9
11
  * identifierOwnUrl — the identifier's own URL form, when it has one.
10
12
  * iec61406 → the Identification Link uri
11
- * doi → `https://doi.org/<doi>`
13
+ * doi → `https://doi.org/<doi>` (§5.6.2(c): lowercase `doi.org`)
12
14
  * did → null (resolution is method-specific; the DID itself is not a URL)
13
15
  * gs1/iso15459 → null (no URL intrinsic to the identifier; use identifierToUri)
14
16
  *
15
- * parseResolverPath — inverse of identifierToUri, for gs1 and iso15459 only.
17
+ * parseResolverPath — inverse of identifierToUri for GS1 only; also parses the
18
+ * legacy ISO/IEC 15459 agency path `/<AGENCY>/<primaryId>[/<serial>]` for
19
+ * backward compatibility with QR codes minted before the conformant query form.
20
+ *
16
21
  * Leading digits in the first path segment → GS1 AI path (AI 01 + AI 21).
17
- * A 1–3 char uppercase `[A-Z][A-Z0-9]{0,2}` first segment → ISO/IEC 15459 agency.
18
- * Otherwise → null (e.g. "/about/team", "/api/v1", lowercase-agency paths).
22
+ * A 1–3 char uppercase `[A-Z][A-Z0-9]{0,2}` first segment → ISO/IEC 15459 agency path (legacy alias).
23
+ * Otherwise → null.
19
24
  *
20
25
  * ⚠️ Consumers MUST match their own reserved app routes (/p, /api, /docs, …)
21
26
  * BEFORE delegating to parseResolverPath. A 1–3 char uppercase route (e.g. /P)
@@ -23,6 +28,15 @@
23
28
  * cannot tell them apart and will return a spurious iso15459 result. Pre-empt
24
29
  * all known app routes first, then call parseResolverPath for the remainder.
25
30
  *
31
+ * parseDiQuery — parse an ISO/IEC 18975 query string (from a `/?` `.25P=…&.S=…` URL)
32
+ * into `{ concatenated25P, serial? }`. Returns `null` when the query string does not
33
+ * carry a `.25P` parameter or when its value is empty.
34
+ *
35
+ * diQueryCandidateKeys — given a `.25P` concatenated value, return up to three
36
+ * candidate `identifierKey` strings (one per possible IAC length 1–3) for a
37
+ * MongoDB `{ identifierKey: { $in: candidates } }` lookup. The IAC must match
38
+ * `[A-Z][A-Z0-9]{0,2}`. An empty or too-short `.25P` value returns `[]`.
39
+ *
26
40
  * identifierKey — a canonical string for deduplication / map keys.
27
41
  * gs1 → `gs1:<gtin14>:<serial>`
28
42
  * iso15459 → `iso15459:<agency>:<primaryId>:<serial|>` (empty string if no serial)
@@ -30,11 +44,23 @@
30
44
  * did → `did:<did>`
31
45
  * doi → `doi:<lowercased-bare>`
32
46
  *
33
- * Note on open question: does the iso15459 path form match the ISO/IEC 18975
34
- * resolver path that EN 18219 scheme 1 references? ISO/IEC 18975 is paywalled
35
- * and unread. Until that is resolved, the path here is a TracePass resolver
36
- * route, not a claim of conformance with 18975. The identifier's own `raw`/`uri`
37
- * field is its authoritative form.
47
+ * Conformance note: the ISO/IEC 15459 resolver path that `identifierToUri` previously
48
+ * emitted (`/<AGENCY>/<primaryId>`) was a TracePass vendor route, not conformant with
49
+ * the ISO/IEC 18975 resolver query form that EN 18219 §5.2.2 references. The query form
50
+ * `/?` `.25P=<IAC+primaryId>[&.S=<serial>]` is what EN 18219 Table B.12 shows as the
51
+ * conformant non-GS1 web URI. The old path form still parses and resolves as an alias
52
+ * (zero live iso15459 passports in prod as of this change, so no migration needed).
53
+ *
54
+ * ⚠️ MIRRORED INTO THE PUBLIC npm PACKAGE @tracepass/dpp-identifiers.
55
+ * `tracepass-open/packages/dpp-identifiers/src/uri.ts` is a hand-copy of this
56
+ * file — nothing generates one from the other, and a stale copy fails silently
57
+ * (it still compiles and still returns a plausible answer). tracepass-open
58
+ * gates on a hash of this file in CI, so after changing it:
59
+ *
60
+ * cd ../tracepass-open && node scripts/build-mirror-manifest.mjs \
61
+ * && npm run check:mirrors
62
+ *
63
+ * and commit `mirror-manifest.json` with the code.
38
64
  */
39
65
  import type { ProductIdentifier } from "@tracepass/dpp-types";
40
66
  /**
@@ -75,6 +101,41 @@ export declare function identifierOwnUrl(id: ProductIdentifier): string | null;
75
101
  * an ISO/IEC 15459 issuing agency code.
76
102
  */
77
103
  export declare function parseResolverPath(path: string): ProductIdentifier | null;
104
+ /**
105
+ * Parse an ISO/IEC 18975 query string (e.g. from `/?` `.25P=QCELMI12345&.S=654321`)
106
+ * into its components. Accepts a raw `URLSearchParams`-parseable string or the full
107
+ * query string starting with `?`.
108
+ *
109
+ * Returns `null` when:
110
+ * - the query string contains no `.25P` parameter
111
+ * - the `.25P` value is empty after decoding
112
+ *
113
+ * The `concatenated25P` value is the raw decoded string — IAC + primaryId, with
114
+ * no separator. Use `diQueryCandidateKeys` to split it into candidate identifierKey
115
+ * strings for a DB lookup.
116
+ */
117
+ export declare function parseDiQuery(queryString: string): {
118
+ concatenated25P: string;
119
+ serial?: string;
120
+ } | null;
121
+ /**
122
+ * Given the concatenated `.25P` value (`IAC + primaryId`, no separator), generate
123
+ * up to three candidate `identifierKey` strings — one per possible IAC length (1, 2, 3).
124
+ *
125
+ * The IAC (issuing agency code) is 1–3 upper-case alphanumeric characters with the
126
+ * first character being a letter (`[A-Z][A-Z0-9]{0,2}`). Since the value is
127
+ * concatenated without a separator, ambiguity exists when the `.25P` is parsed. The
128
+ * caller resolves ambiguity by querying the DB with `identifierKey: {$in: candidates}`:
129
+ * - exactly one match → that passport
130
+ * - more than one match → ambiguous (caller must treat as not found)
131
+ * - zero matches → not found
132
+ *
133
+ * Returns `[]` when the input does not start with a letter (invalid for any IAC length).
134
+ *
135
+ * @param concatenated25P - the decoded `.25P` value, e.g. `"QCELMI12345"` or `"MI12345"`
136
+ * @param serial - the decoded `.S` value, if present (same as Iso15459Identifier.serial)
137
+ */
138
+ export declare function diQueryCandidateKeys(concatenated25P: string, serial?: string): string[];
78
139
  /**
79
140
  * A canonical string key for deduplication and map-key use.
80
141
  *
package/dist/uri.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"uri.d.ts","sourceRoot":"","sources":["../src/uri.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiC1F;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,iBAAiB,GAAG,MAAM,GAAG,IAAI,CAwBrE;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAmDxE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,iBAAiB,GAAG,MAAM,CAuB3D"}
1
+ {"version":3,"file":"uri.d.ts","sourceRoot":"","sources":["../src/uri.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkC1F;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,iBAAiB,GAAG,MAAM,GAAG,IAAI,CAwBrE;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAmDxE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAC1B,WAAW,EAAE,MAAM,GAClB;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAYrD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,oBAAoB,CAClC,eAAe,EAAE,MAAM,EACvB,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,EAAE,CAkBV;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,iBAAiB,GAAG,MAAM,CAuB3D"}
package/dist/uri.js CHANGED
@@ -3,19 +3,24 @@
3
3
  *
4
4
  * identifierToUri — build a resolver URL from any ProductIdentifier.
5
5
  * gs1 → Digital Link path `/01/<gtin14>/21/<encoded-serial>`
6
- * iso15459 → `/<agency>/<encoded-primaryId>[/<encoded-serial>]`
6
+ * iso15459 → ISO/IEC 18975 query form `/?` `.25P=<encodeURIComponent(iac+primaryId)>[&.S=<encodeURIComponent(serial)>]`
7
+ * (EN 18219 §5.2.2 + Table B.12; the `.25P` DI concatenates IAC + CIN + product number
8
+ * with no separators; `.S` is the optional serial)
7
9
  * iec61406 / did / doi → null (they carry their own canonical URL)
8
10
  *
9
11
  * identifierOwnUrl — the identifier's own URL form, when it has one.
10
12
  * iec61406 → the Identification Link uri
11
- * doi → `https://doi.org/<doi>`
13
+ * doi → `https://doi.org/<doi>` (§5.6.2(c): lowercase `doi.org`)
12
14
  * did → null (resolution is method-specific; the DID itself is not a URL)
13
15
  * gs1/iso15459 → null (no URL intrinsic to the identifier; use identifierToUri)
14
16
  *
15
- * parseResolverPath — inverse of identifierToUri, for gs1 and iso15459 only.
17
+ * parseResolverPath — inverse of identifierToUri for GS1 only; also parses the
18
+ * legacy ISO/IEC 15459 agency path `/<AGENCY>/<primaryId>[/<serial>]` for
19
+ * backward compatibility with QR codes minted before the conformant query form.
20
+ *
16
21
  * Leading digits in the first path segment → GS1 AI path (AI 01 + AI 21).
17
- * A 1–3 char uppercase `[A-Z][A-Z0-9]{0,2}` first segment → ISO/IEC 15459 agency.
18
- * Otherwise → null (e.g. "/about/team", "/api/v1", lowercase-agency paths).
22
+ * A 1–3 char uppercase `[A-Z][A-Z0-9]{0,2}` first segment → ISO/IEC 15459 agency path (legacy alias).
23
+ * Otherwise → null.
19
24
  *
20
25
  * ⚠️ Consumers MUST match their own reserved app routes (/p, /api, /docs, …)
21
26
  * BEFORE delegating to parseResolverPath. A 1–3 char uppercase route (e.g. /P)
@@ -23,6 +28,15 @@
23
28
  * cannot tell them apart and will return a spurious iso15459 result. Pre-empt
24
29
  * all known app routes first, then call parseResolverPath for the remainder.
25
30
  *
31
+ * parseDiQuery — parse an ISO/IEC 18975 query string (from a `/?` `.25P=…&.S=…` URL)
32
+ * into `{ concatenated25P, serial? }`. Returns `null` when the query string does not
33
+ * carry a `.25P` parameter or when its value is empty.
34
+ *
35
+ * diQueryCandidateKeys — given a `.25P` concatenated value, return up to three
36
+ * candidate `identifierKey` strings (one per possible IAC length 1–3) for a
37
+ * MongoDB `{ identifierKey: { $in: candidates } }` lookup. The IAC must match
38
+ * `[A-Z][A-Z0-9]{0,2}`. An empty or too-short `.25P` value returns `[]`.
39
+ *
26
40
  * identifierKey — a canonical string for deduplication / map keys.
27
41
  * gs1 → `gs1:<gtin14>:<serial>`
28
42
  * iso15459 → `iso15459:<agency>:<primaryId>:<serial|>` (empty string if no serial)
@@ -30,11 +44,23 @@
30
44
  * did → `did:<did>`
31
45
  * doi → `doi:<lowercased-bare>`
32
46
  *
33
- * Note on open question: does the iso15459 path form match the ISO/IEC 18975
34
- * resolver path that EN 18219 scheme 1 references? ISO/IEC 18975 is paywalled
35
- * and unread. Until that is resolved, the path here is a TracePass resolver
36
- * route, not a claim of conformance with 18975. The identifier's own `raw`/`uri`
37
- * field is its authoritative form.
47
+ * Conformance note: the ISO/IEC 15459 resolver path that `identifierToUri` previously
48
+ * emitted (`/<AGENCY>/<primaryId>`) was a TracePass vendor route, not conformant with
49
+ * the ISO/IEC 18975 resolver query form that EN 18219 §5.2.2 references. The query form
50
+ * `/?` `.25P=<IAC+primaryId>[&.S=<serial>]` is what EN 18219 Table B.12 shows as the
51
+ * conformant non-GS1 web URI. The old path form still parses and resolves as an alias
52
+ * (zero live iso15459 passports in prod as of this change, so no migration needed).
53
+ *
54
+ * ⚠️ MIRRORED INTO THE PUBLIC npm PACKAGE @tracepass/dpp-identifiers.
55
+ * `tracepass-open/packages/dpp-identifiers/src/uri.ts` is a hand-copy of this
56
+ * file — nothing generates one from the other, and a stale copy fails silently
57
+ * (it still compiles and still returns a plausible answer). tracepass-open
58
+ * gates on a hash of this file in CI, so after changing it:
59
+ *
60
+ * cd ../tracepass-open && node scripts/build-mirror-manifest.mjs \
61
+ * && npm run check:mirrors
62
+ *
63
+ * and commit `mirror-manifest.json` with the code.
38
64
  */
39
65
  /**
40
66
  * Build a resolver URL for a `ProductIdentifier`.
@@ -54,13 +80,13 @@ export function identifierToUri(id, resolverBase) {
54
80
  return `https://${base}/01/${gtin}/21/${encodeURIComponent(id.serialNumber)}`;
55
81
  }
56
82
  case "iso15459": {
57
- const parts = [
58
- encodeURIComponent(id.issuingAgencyCode),
59
- encodeURIComponent(id.primaryId),
60
- ];
61
- if (id.serial)
62
- parts.push(encodeURIComponent(id.serial));
63
- return `https://${base}/${parts.join("/")}`;
83
+ // EN 18219 §5.2.2 + Table B.12: the conformant non-GS1 web URI for
84
+ // ASC MH10.8.2 Data Identifiers uses the ISO/IEC 18975 query form.
85
+ // `.25P` carries the IAC + primaryId concatenated (no separator).
86
+ // `.S` carries the optional serial number.
87
+ const dot25P = encodeURIComponent(id.issuingAgencyCode + id.primaryId);
88
+ const serialPart = id.serial ? `&.S=${encodeURIComponent(id.serial)}` : "";
89
+ return `https://${base}/?.25P=${dot25P}${serialPart}`;
64
90
  }
65
91
  case "iec61406":
66
92
  case "did":
@@ -176,6 +202,66 @@ export function parseResolverPath(path) {
176
202
  }
177
203
  return null;
178
204
  }
205
+ /**
206
+ * Parse an ISO/IEC 18975 query string (e.g. from `/?` `.25P=QCELMI12345&.S=654321`)
207
+ * into its components. Accepts a raw `URLSearchParams`-parseable string or the full
208
+ * query string starting with `?`.
209
+ *
210
+ * Returns `null` when:
211
+ * - the query string contains no `.25P` parameter
212
+ * - the `.25P` value is empty after decoding
213
+ *
214
+ * The `concatenated25P` value is the raw decoded string — IAC + primaryId, with
215
+ * no separator. Use `diQueryCandidateKeys` to split it into candidate identifierKey
216
+ * strings for a DB lookup.
217
+ */
218
+ export function parseDiQuery(queryString) {
219
+ // Strip a leading "?" so both "?.25P=..." and ".25P=..." are accepted.
220
+ const qs = queryString.startsWith("?") ? queryString.slice(1) : queryString;
221
+ const params = new URLSearchParams(qs);
222
+ const raw25P = params.get(".25P");
223
+ if (!raw25P)
224
+ return null;
225
+ const serial = params.get(".S") ?? undefined;
226
+ return {
227
+ concatenated25P: raw25P,
228
+ ...(serial ? { serial } : {}),
229
+ };
230
+ }
231
+ /**
232
+ * Given the concatenated `.25P` value (`IAC + primaryId`, no separator), generate
233
+ * up to three candidate `identifierKey` strings — one per possible IAC length (1, 2, 3).
234
+ *
235
+ * The IAC (issuing agency code) is 1–3 upper-case alphanumeric characters with the
236
+ * first character being a letter (`[A-Z][A-Z0-9]{0,2}`). Since the value is
237
+ * concatenated without a separator, ambiguity exists when the `.25P` is parsed. The
238
+ * caller resolves ambiguity by querying the DB with `identifierKey: {$in: candidates}`:
239
+ * - exactly one match → that passport
240
+ * - more than one match → ambiguous (caller must treat as not found)
241
+ * - zero matches → not found
242
+ *
243
+ * Returns `[]` when the input does not start with a letter (invalid for any IAC length).
244
+ *
245
+ * @param concatenated25P - the decoded `.25P` value, e.g. `"QCELMI12345"` or `"MI12345"`
246
+ * @param serial - the decoded `.S` value, if present (same as Iso15459Identifier.serial)
247
+ */
248
+ export function diQueryCandidateKeys(concatenated25P, serial) {
249
+ if (!concatenated25P || !/^[A-Z]/.test(concatenated25P))
250
+ return [];
251
+ const IAC_PATTERN = /^[A-Z][A-Z0-9]{0,2}$/;
252
+ const candidates = [];
253
+ for (const len of [1, 2, 3]) {
254
+ if (concatenated25P.length <= len)
255
+ continue; // primaryId must be non-empty
256
+ const candidateIac = concatenated25P.slice(0, len);
257
+ if (!IAC_PATTERN.test(candidateIac))
258
+ continue;
259
+ const primaryId = concatenated25P.slice(len);
260
+ // identifierKey format: iso15459:<agency>:<primaryId>:<serial|>
261
+ candidates.push(`iso15459:${candidateIac}:${primaryId}:${serial ?? ""}`);
262
+ }
263
+ return candidates;
264
+ }
179
265
  /**
180
266
  * A canonical string key for deduplication and map-key use.
181
267
  *
package/dist/uri.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"uri.js","sourceRoot":"","sources":["../src/uri.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"uri.js","sourceRoot":"","sources":["../src/uri.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tracepass/dpp-identifiers",
3
- "version": "0.9.1",
3
+ "version": "0.11.0",
4
4
  "description": "Validate and parse EU Digital Product Passport identifiers (EN 18219) — GS1 Digital Link, ISO/IEC 15459, IEC 61406, DID, DOI. Pure functions, no network, no third-party runtime dependencies.",
5
5
  "keywords": [
6
6
  "digital-product-passport",
@@ -50,8 +50,8 @@
50
50
  "clean": "rm -rf dist"
51
51
  },
52
52
  "dependencies": {
53
- "@tracepass/dpp-types": "^0.9.1",
54
- "@tracepass/gs1-utils": "^0.9.1"
53
+ "@tracepass/dpp-types": "^0.11.0",
54
+ "@tracepass/gs1-utils": "^0.11.0"
55
55
  },
56
56
  "devDependencies": {
57
57
  "typescript": "^5.6.3"