@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 +27 -14
- package/dist/index.d.ts +12 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -4
- package/dist/index.js.map +1 -1
- package/dist/operator.d.ts +9 -7
- package/dist/operator.d.ts.map +1 -1
- package/dist/operator.js +45 -16
- package/dist/operator.js.map +1 -1
- package/dist/product.d.ts.map +1 -1
- package/dist/product.js +7 -0
- package/dist/product.js.map +1 -1
- package/dist/uri.d.ts +71 -10
- package/dist/uri.d.ts.map +1 -1
- package/dist/uri.js +103 -17
- package/dist/uri.js.map +1 -1
- package/package.json +3 -3
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 —
|
|
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`
|
|
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
|
-
##
|
|
168
|
+
## Out of scope
|
|
156
169
|
|
|
157
|
-
- **EN 18219 scheme 4** (
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
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
|
|
20
|
-
*
|
|
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
|
-
*
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
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
|
|
20
|
-
*
|
|
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
|
-
*
|
|
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
|
|
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"}
|
package/dist/operator.d.ts
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
|
|
15
|
-
*
|
|
16
|
-
*
|
|
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
|
-
*
|
|
30
|
-
*
|
|
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
|
package/dist/operator.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operator.d.ts","sourceRoot":"","sources":["../src/operator.ts"],"names":[],"mappings":"AAAA
|
|
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
|
|
15
|
-
*
|
|
16
|
-
*
|
|
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
|
-
*
|
|
186
|
-
*
|
|
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
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
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
|
package/dist/operator.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operator.js","sourceRoot":"","sources":["../src/operator.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"operator.js","sourceRoot":"","sources":["../src/operator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,gFAAgF;AAEhF;;;;;;;;;GASG;AACH,SAAS,oBAAoB,CAAC,GAAW;IACvC,2EAA2E;IAC3E,MAAM,MAAM,GAAG,GAAG;SACf,KAAK,CAAC,EAAE,CAAC;SACT,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC7B,yCAAyC;QACzC,OAAO,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,mEAAmE;IACnE,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,SAAS,GAAG,CAAC,SAAS,GAAG,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACxD,CAAC;IACD,OAAO,SAAS,KAAK,CAAC,CAAC;AACzB,CAAC;AAED,iFAAiF;AAEjF,SAAS,iBAAiB,CAAC,GAAW;IACpC,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACjB,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9B,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IACL,CAAC,KAAK,GAAG;YACT,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM;YAClB,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAChD,CAAC;YACD,CAAC,IAAI,CAAC,CAAC;QACT,CAAC;aAAM,CAAC;YACN,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC1C,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;QAChF,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACzC,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IAEpD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,eAAe,MAAM,wBAAwB,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAC/C,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAC9D,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9C,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,mCAAmC,GAAG,+BAA+B,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,iFAAiF;AAEjF,SAAS,eAAe,CACtB,GAAW,EACX,KAAa;IAEb,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAC/C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC/B,CAAC;IAED,qBAAqB;IACrB,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,kEAAkE;QAClE,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1C,MAAM,CAAC,IAAI,CACT,wFAAwF,CACzF,CAAC;QACJ,CAAC;aAAM,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;SAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QAC1B,8DAA8D;QAC9D,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC;SAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QAC1B,6DAA6D;QAC7D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IACD,yEAAyE;IAEzE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACpD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC;AAChE,CAAC;AAED,iFAAiF;AAEjF;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CACxC,EAAsB;IAEtB,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC;QAClB,KAAK,SAAS;YACZ,OAAO,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;QAE3C,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzB,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,MAAM,EAAE,CAAC,oEAAoE,CAAC;iBAC/E,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACjC,CAAC;QAED,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,SAAS,GAAG,iBAAiB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;YAC5C,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;YAClE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACjC,CAAC;QAED,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,IAAI,GAAG,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,MAAM,EAAE;wBACN,QAAQ,EAAE,CAAC,GAAG,uEAAuE;qBACtF;iBACF,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC;QACnD,CAAC;QAED,OAAO,CAAC,CAAC,CAAC;YACR,uBAAuB;YACvB,MAAM,WAAW,GAAU,EAAE,CAAC;YAC9B,KAAK,WAAW,CAAC;YACjB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,oCAAoC,CAAC,EAAE,CAAC;QACvE,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,0BAA0B,CACxC,EAAsB;IAEtB,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC;QAClB,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzB,MAAM,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;YACpF,CAAC;YACD,IAAI,EAAE,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC;gBAChD,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;YAC5D,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;YACpD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACjC,CAAC;QAED,KAAK,SAAS;YACZ,OAAO,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAyC,CAAC;QAEnF,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,SAAS,GAAG,iBAAiB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;YAC5C,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;YAClE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACjC,CAAC;QAED,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,IAAI,GAAG,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,kDAAkD,CAAC;iBAC3E,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC;QACnD,CAAC;QAED,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,WAAW,GAAU,EAAE,CAAC;YAC9B,KAAK,WAAW,CAAC;YACjB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,oCAAoC,CAAC,EAAE,CAAC;QACvE,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/dist/product.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
package/dist/product.js.map
CHANGED
|
@@ -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 →
|
|
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
|
|
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
|
|
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
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
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
|
|
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 →
|
|
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
|
|
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
|
|
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
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
return `https://${base}
|
|
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":"AAAA
|
|
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.
|
|
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.
|
|
54
|
-
"@tracepass/gs1-utils": "^0.
|
|
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"
|