@uncefact/untp-utils 0.3.0 → 0.4.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.
Files changed (41) hide show
  1. package/README.md +13 -13
  2. package/build/artefacts/detect-version-from-context.d.ts +7 -2
  3. package/build/artefacts/detect-version-from-context.js +17 -6
  4. package/build/artefacts/detect-version-from-context.js.map +1 -1
  5. package/build/artefacts/detect-version-from-context.test.js +59 -0
  6. package/build/artefacts/detect-version-from-context.test.js.map +1 -1
  7. package/build/artefacts/urls.d.ts +2 -1
  8. package/build/artefacts/urls.js +9 -5
  9. package/build/artefacts/urls.js.map +1 -1
  10. package/build/artefacts/urls.test.js +54 -0
  11. package/build/artefacts/urls.test.js.map +1 -1
  12. package/build/bundle/lookup.test.js +8 -8
  13. package/build/bundle/lookup.test.js.map +1 -1
  14. package/build/bundle/public.d.ts +7 -3
  15. package/build/bundle/public.js +7 -3
  16. package/build/bundle/public.js.map +1 -1
  17. package/build/bundle/public.test.js +6 -0
  18. package/build/bundle/public.test.js.map +1 -1
  19. package/build/common/canonical-json.d.ts +10 -0
  20. package/build/common/canonical-json.js +29 -0
  21. package/build/common/canonical-json.js.map +1 -0
  22. package/build/common/canonical-json.test.d.ts +1 -0
  23. package/build/common/canonical-json.test.js +20 -0
  24. package/build/common/canonical-json.test.js.map +1 -0
  25. package/build/common/index.d.ts +1 -0
  26. package/build/common/index.js +1 -0
  27. package/build/common/index.js.map +1 -1
  28. package/build/conformity-vocabulary/codes.d.ts +4 -0
  29. package/build/conformity-vocabulary/codes.js +4 -0
  30. package/build/conformity-vocabulary/codes.js.map +1 -1
  31. package/build/conformity-vocabulary/parse-conformity-scheme.test.js +150 -0
  32. package/build/conformity-vocabulary/parse-conformity-scheme.test.js.map +1 -1
  33. package/build/conformity-vocabulary/parsers/v0-7-0.parser.js +225 -0
  34. package/build/conformity-vocabulary/parsers/v0-7-0.parser.js.map +1 -1
  35. package/build/conformity-vocabulary/types.d.ts +69 -15
  36. package/build/conformity-vocabulary/validate-conformity-claim.d.ts +17 -11
  37. package/build/conformity-vocabulary/validate-conformity-claim.js +118 -13
  38. package/build/conformity-vocabulary/validate-conformity-claim.js.map +1 -1
  39. package/build/conformity-vocabulary/validate-conformity-claim.test.js +265 -0
  40. package/build/conformity-vocabulary/validate-conformity-claim.test.js.map +1 -1
  41. package/package.json +1 -1
package/README.md CHANGED
@@ -14,19 +14,19 @@ The package root exports only `StructuredError`, the base class every
14
14
  sub-entry throws from. Each capability is imported from its own subpath so a
15
15
  consumer only pulls in the dependencies it needs.
16
16
 
17
- | Subpath | Provides |
18
- | -------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
19
- | `@uncefact/untp-utils/multibase-digest` | `MultibaseDigest`: encode, decode and verify multibase-encoded multihashes. |
20
- | `@uncefact/untp-utils/common` | Small document-field readers: `asDateTime`, `asNonEmptyString`, and `makeRequireString` for required fields. |
21
- | `@uncefact/untp-utils/artefacts` | UNTP schema, context and docs URL helpers, and `detectVersionFromContext`. |
22
- | `@uncefact/untp-utils/conformity-vocabulary` | Parses a UNTP conformity scheme or catalogue and validates a conformity claim against it. |
23
- | `@uncefact/untp-utils/validation` | Validates a payload against JSON Schema and expands it as JSON-LD, both guarded against SSRF. |
24
- | `@uncefact/untp-utils/loaders` | The schema and JSON-LD document loaders `validation` runs on. |
25
- | `@uncefact/untp-utils/resolvers` | IP-pinned document fetching with a conditional-fetch skip chain. |
26
- | `@uncefact/untp-utils/node` | `validatePublicUrl`, the SSRF guard the other sub-entries fetch through, with its `isPrivateHostname`, `isPrivateIpv4` and `isPrivateIpv6` predicates and its error classes. |
27
- | `@uncefact/untp-utils/cache` | `createInMemoryTtlCache`, a bounded in-memory TTL cache. |
28
- | `@uncefact/untp-utils/bundled-artefacts` | The bundled UNTP and VCDM schemas and contexts, keyed by published URL. |
29
- | `@uncefact/untp-utils/http-headers` | HTTP header parsing, and the default `User-Agent` guarded fetches send. |
17
+ | Subpath | Provides |
18
+ | -------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
19
+ | `@uncefact/untp-utils/multibase-digest` | `MultibaseDigest`: encode, decode and verify multibase-encoded multihashes. |
20
+ | `@uncefact/untp-utils/common` | Document-field readers (`asDateTime`, `asNonEmptyString`, `makeRequireString`), `evaluateValidityWindow` and `ValidityWindowOutcome`, and `canonicalJson` for deterministic JSON serialisation. |
21
+ | `@uncefact/untp-utils/artefacts` | UNTP schema, context and docs URL helpers, the `isV070OrAbove` version predicate, and `detectVersionFromContext`. |
22
+ | `@uncefact/untp-utils/conformity-vocabulary` | Parses a UNTP conformity scheme or catalogue, including `ConformityScore`, `ConformityScoringFramework` and `ConformityRequiredPerformance`, and validates a conformity claim against it, covering score-code membership and `ConformityReferenceResolution` catalogue tier references. |
23
+ | `@uncefact/untp-utils/validation` | Validates a payload against JSON Schema and expands it as JSON-LD, both guarded against SSRF. |
24
+ | `@uncefact/untp-utils/loaders` | The schema and JSON-LD document loaders `validation` runs on. |
25
+ | `@uncefact/untp-utils/resolvers` | IP-pinned document fetching with a conditional-fetch skip chain. |
26
+ | `@uncefact/untp-utils/node` | `validatePublicUrl`, the SSRF guard the other sub-entries fetch through, with its `isPrivateHostname`, `isPrivateIpv4` and `isPrivateIpv6` predicates and its error classes. |
27
+ | `@uncefact/untp-utils/cache` | `createInMemoryTtlCache`, a bounded in-memory TTL cache. |
28
+ | `@uncefact/untp-utils/bundled-artefacts` | The bundled UNTP and VCDM schemas and contexts, keyed by published URL. |
29
+ | `@uncefact/untp-utils/http-headers` | HTTP header parsing, and the default `User-Agent` guarded fetches send. |
30
30
 
31
31
  Every sub-entry throws a typed error class on failure rather than returning
32
32
  an outcome object. See [RELEASE_NOTES.md](./RELEASE_NOTES.md) for what each
@@ -21,8 +21,13 @@ export interface DetectVersionFromContextOptions {
21
21
  }
22
22
  /**
23
23
  * Derives the spec version from a UNTP document's `@context` by looking for a
24
- * path segment shaped `/{major}.{minor}.{patch}[-prerelease]/` inside a known
25
- * UNTP context URL.
24
+ * path segment shaped `/{major}.{minor}.{patch}[-prerelease]` inside a known
25
+ * UNTP context URL. Only the part of the URL before any `?` or `#` is read, so
26
+ * a version-shaped string inside a query or fragment never supplies the
27
+ * version, while a version that a query or fragment immediately follows still
28
+ * does. Within that part the segment must be bounded on the left by `/` and on
29
+ * the right by `/` or the end of the string. The published schema decides the
30
+ * exact context string that the document must use.
26
31
  *
27
32
  * Works for any UNTP artefact that publishes a versioned context: credentials
28
33
  * (DPP, DCC, DFR, DIA, DTE), conformity schemes, identifier scheme registers,
@@ -7,14 +7,24 @@
7
7
  export const UNTP_CONTEXT_DOMAINS = ['vocabulary.uncefact.org', 'test.uncefact.org'];
8
8
  /**
9
9
  * A version segment in a UNTP-published context path. Matches a path segment
10
- * shaped `/{major}.{minor}.{patch}[-prerelease]/`. The pre-release suffix
11
- * captures common forms (`-rc1`, `-alpha.2`, `-2024-05-21`, etc.).
10
+ * shaped `/{major}.{minor}.{patch}[-prerelease]` when it is bounded on the
11
+ * left by `/` and on the right by `/` or the end of the string. It is applied
12
+ * to the part of the URL before any `?` or `#`, so query and fragment parts
13
+ * never supply the version. The pre-release suffix captures common forms (`-rc1`, `-alpha.2`,
14
+ * `-2024-05-21`, etc.).
15
+ * This identifies only the version; the published schema decides the exact
16
+ * context string.
12
17
  */
13
- const UNTP_VERSION_PATH_SEGMENT = /\/(\d+\.\d+\.\d+(?:-[A-Za-z0-9.-]+)?)\//;
18
+ const UNTP_VERSION_PATH_SEGMENT = /\/(\d+\.\d+\.\d+(?:-[A-Za-z0-9.-]+)?)(?=\/|$)/;
14
19
  /**
15
20
  * Derives the spec version from a UNTP document's `@context` by looking for a
16
- * path segment shaped `/{major}.{minor}.{patch}[-prerelease]/` inside a known
17
- * UNTP context URL.
21
+ * path segment shaped `/{major}.{minor}.{patch}[-prerelease]` inside a known
22
+ * UNTP context URL. Only the part of the URL before any `?` or `#` is read, so
23
+ * a version-shaped string inside a query or fragment never supplies the
24
+ * version, while a version that a query or fragment immediately follows still
25
+ * does. Within that part the segment must be bounded on the left by `/` and on
26
+ * the right by `/` or the end of the string. The published schema decides the
27
+ * exact context string that the document must use.
18
28
  *
19
29
  * Works for any UNTP artefact that publishes a versioned context: credentials
20
30
  * (DPP, DCC, DFR, DIA, DTE), conformity schemes, identifier scheme registers,
@@ -46,7 +56,8 @@ export function detectVersionFromContext(doc, options = {}) {
46
56
  if (!matchesDomain(url)) {
47
57
  continue;
48
58
  }
49
- const match = url.match(UNTP_VERSION_PATH_SEGMENT);
59
+ const path = url.split(/[?#]/, 1)[0];
60
+ const match = path.match(UNTP_VERSION_PATH_SEGMENT);
50
61
  if (match) {
51
62
  return match[1];
52
63
  }
@@ -1 +1 @@
1
- {"version":3,"file":"detect-version-from-context.js","sourceRoot":"","sources":["../../src/artefacts/detect-version-from-context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,yBAAyB,EAAE,mBAAmB,CAAU,CAAC;AAE9F;;;;GAIG;AACH,MAAM,yBAAyB,GAAG,yCAAyC,CAAC;AAiB5E;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,wBAAwB,CACtC,GAAY,EACZ,UAA2C,EAAE;IAE7C,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,YAAY,GAAI,GAAgC,CAAC,UAAU,CAAC,CAAC;IACnE,MAAM,UAAU,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;IACvD,MAAM,aAAa,GAAG,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAEzD,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACnD,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAgB;IAC7C,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,CAAC,OAAO,CAAC,CAAC;IACnB,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,kBAAkB,CAAC,MAA0B;IACpD,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC"}
1
+ {"version":3,"file":"detect-version-from-context.js","sourceRoot":"","sources":["../../src/artefacts/detect-version-from-context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,yBAAyB,EAAE,mBAAmB,CAAU,CAAC;AAE9F;;;;;;;;;GASG;AACH,MAAM,yBAAyB,GAAG,+CAA+C,CAAC;AAiBlF;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,UAAU,wBAAwB,CACtC,GAAY,EACZ,UAA2C,EAAE;IAE7C,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,YAAY,GAAI,GAAgC,CAAC,UAAU,CAAC,CAAC;IACnE,MAAM,UAAU,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;IACvD,MAAM,aAAa,GAAG,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAEzD,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACpD,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAgB;IAC7C,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,CAAC,OAAO,CAAC,CAAC;IACnB,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,kBAAkB,CAAC,MAA0B;IACpD,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC"}
@@ -15,6 +15,61 @@ describe('detectVersionFromContext', () => {
15
15
  const doc = { '@context': 'https://vocabulary.uncefact.org/untp/0.7.0-rc.1/context/' };
16
16
  expect(detectVersionFromContext(doc)).toBe('0.7.0-rc.1');
17
17
  });
18
+ it('returns the version when it is the terminal path segment without a trailing slash', () => {
19
+ const doc = { '@context': 'https://test.uncefact.org/vocabulary/untp/dpp/0.5.0' };
20
+ expect(detectVersionFromContext(doc)).toBe('0.5.0');
21
+ });
22
+ it('recognises a terminal pre-release version without a trailing slash', () => {
23
+ const doc = { '@context': 'https://vocabulary.uncefact.org/untp/0.7.0-rc.1' };
24
+ expect(detectVersionFromContext(doc)).toBe('0.7.0-rc.1');
25
+ });
26
+ it('uses the first version-shaped path segment', () => {
27
+ // The first version-shaped segment wins when a later path segment also looks like a version.
28
+ const doc = { '@context': 'https://vocabulary.uncefact.org/untp/0.6.0/dpp/0.7.0/' };
29
+ expect(detectVersionFromContext(doc)).toBe('0.6.0');
30
+ });
31
+ it('ignores a version-shaped path in a query', () => {
32
+ const doc = { '@context': 'https://vocabulary.uncefact.org/untp/context?path=/0.7.0' };
33
+ expect(detectVersionFromContext(doc)).toBeUndefined();
34
+ });
35
+ it('ignores a version-shaped path in a fragment', () => {
36
+ const doc = { '@context': 'https://vocabulary.uncefact.org/untp/context#path=/0.7.0' };
37
+ expect(detectVersionFromContext(doc)).toBeUndefined();
38
+ });
39
+ it('uses a genuine pathname version after a query-only context entry', () => {
40
+ const doc = {
41
+ '@context': [
42
+ 'https://vocabulary.uncefact.org/untp/context?path=/0.7.0',
43
+ 'https://vocabulary.uncefact.org/untp/0.6.0/context/',
44
+ ],
45
+ };
46
+ expect(detectVersionFromContext(doc)).toBe('0.6.0');
47
+ });
48
+ it('recognises a version bounded by a query string', () => {
49
+ const doc = { '@context': 'https://test.uncefact.org/vocabulary/untp/dpp/0.5.0?format=json' };
50
+ expect(detectVersionFromContext(doc)).toBe('0.5.0');
51
+ });
52
+ it('recognises a version bounded by a fragment', () => {
53
+ const doc = { '@context': 'https://test.uncefact.org/vocabulary/untp/dpp/0.5.0#context' };
54
+ expect(detectVersionFromContext(doc)).toBe('0.5.0');
55
+ });
56
+ it('rejects a version with a trailing dot', () => {
57
+ const doc = { '@context': 'https://test.uncefact.org/vocabulary/untp/dpp/0.5.0./' };
58
+ expect(detectVersionFromContext(doc)).toBeUndefined();
59
+ });
60
+ it('rejects a four-part version', () => {
61
+ const doc = { '@context': 'https://test.uncefact.org/vocabulary/untp/dpp/0.5.0.1/' };
62
+ expect(detectVersionFromContext(doc)).toBeUndefined();
63
+ });
64
+ it('does not detect a filename-shaped version on an unrelated domain', () => {
65
+ const doc = { '@context': 'https://example.org/untp/0.5.0-rc.1.jsonld' };
66
+ expect(detectVersionFromContext(doc)).toBeUndefined();
67
+ });
68
+ it('keeps the complete filename-shaped suffix when the domain is recognised', () => {
69
+ // SemVer permits dotted prerelease identifiers, so the detector cannot tell a filename extension from a prerelease part; no published UNTP context has this shape.
70
+ const doc = { '@context': 'https://vocabulary.uncefact.org/untp/0.5.0-rc.1.jsonld' };
71
+ expect(detectVersionFromContext(doc)).toBe('0.5.0-rc.1.jsonld');
72
+ });
18
73
  it('recognises the test.uncefact.org domain', () => {
19
74
  const doc = { '@context': 'https://test.uncefact.org/untp/0.7.0/context/' };
20
75
  expect(detectVersionFromContext(doc)).toBe('0.7.0');
@@ -23,6 +78,10 @@ describe('detectVersionFromContext', () => {
23
78
  const doc = { '@context': ['https://schema.org/', 'https://example.com/0.7.0/'] };
24
79
  expect(detectVersionFromContext(doc)).toBeUndefined();
25
80
  });
81
+ it('does not recognise a filename-embedded version', () => {
82
+ const doc = { '@context': 'https://aatp.foodagility.com/context/aatp-dlp-context-0.4.0.jsonld' };
83
+ expect(detectVersionFromContext(doc, { domain: 'aatp.foodagility.com' })).toBeUndefined();
84
+ });
26
85
  it('skips non-string entries within an array @context', () => {
27
86
  const doc = {
28
87
  '@context': [{ '@vocab': 'https://example.com/' }, 'https://vocabulary.uncefact.org/untp/0.7.0/context/'],
@@ -1 +1 @@
1
- {"version":3,"file":"detect-version-from-context.test.js","sourceRoot":"","sources":["../../src/artefacts/detect-version-from-context.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"detect-version-from-context.test.js","sourceRoot":"","sources":["../../src/artefacts/detect-version-from-context.test.ts"],"names":[],"mappings":"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"}
@@ -74,7 +74,8 @@ export interface UntpArtefactUrls {
74
74
  * `ConformityScheme`). Must be a recognised type.
75
75
  * @param version - Semantic version of the artefact (e.g. `0.7.0`).
76
76
  * @returns The {@link UntpArtefactUrls} appropriate for the version.
77
- * @throws {Error} When `type` is not a recognised UNTP artefact type.
77
+ * @throws {Error} When `type` is not a recognised UNTP artefact type, or when `type` is
78
+ * `ConformityScheme` and `version` is before 0.7.0.
78
79
  */
79
80
  export declare function buildUntpArtefactUrls(type: string, version: string): UntpArtefactUrls;
80
81
  /**
@@ -91,10 +91,10 @@ const DOCS_VERSION_FALLBACKS = {
91
91
  * @throws {Error} When `type` is not a recognised UNTP artefact type.
92
92
  */
93
93
  export function buildSpecificationPageUrl(type, version) {
94
- const slug = UNTP_SPECIFICATION_PAGE_SLUGS[type];
95
- if (!slug) {
94
+ if (!Object.hasOwn(UNTP_SPECIFICATION_PAGE_SLUGS, type)) {
96
95
  throw new Error(`Unknown UNTP artefact type "${type}". Expected one of: ${Object.keys(UNTP_SPECIFICATION_PAGE_SLUGS).join(', ')}.`);
97
96
  }
97
+ const slug = UNTP_SPECIFICATION_PAGE_SLUGS[type];
98
98
  const docsVersion = DOCS_VERSION_FALLBACKS[version] ?? version;
99
99
  if (docsVersion === CURRENT_UNTP_DOCS_VERSION) {
100
100
  return `${DOCS_BASE}/specification/${slug}`;
@@ -111,13 +111,17 @@ export function buildSpecificationPageUrl(type, version) {
111
111
  * `ConformityScheme`). Must be a recognised type.
112
112
  * @param version - Semantic version of the artefact (e.g. `0.7.0`).
113
113
  * @returns The {@link UntpArtefactUrls} appropriate for the version.
114
- * @throws {Error} When `type` is not a recognised UNTP artefact type.
114
+ * @throws {Error} When `type` is not a recognised UNTP artefact type, or when `type` is
115
+ * `ConformityScheme` and `version` is before 0.7.0.
115
116
  */
116
117
  export function buildUntpArtefactUrls(type, version) {
117
- const shortCode = UNTP_SHORT_CREDENTIAL_TYPES[type];
118
- if (!shortCode) {
118
+ if (!Object.hasOwn(UNTP_SHORT_CREDENTIAL_TYPES, type)) {
119
119
  throw new Error(`Unknown UNTP artefact type "${type}". Expected one of: ${Object.keys(UNTP_SHORT_CREDENTIAL_TYPES).join(', ')}.`);
120
120
  }
121
+ const shortCode = UNTP_SHORT_CREDENTIAL_TYPES[type];
122
+ if (type === 'ConformityScheme' && !isV070OrAbove(version)) {
123
+ throw new Error(`ConformityScheme has no artefacts for versions before UNTP 0.7.0 and "${version}" is not a UNTP 0.7.0 or later version.`);
124
+ }
121
125
  if (isV070OrAbove(version)) {
122
126
  const fileName = UNTP_CORE_SCHEMA_FILENAMES[type];
123
127
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"urls.js","sourceRoot":"","sources":["../../src/artefacts/urls.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"urls.js","sourceRoot":"","sources":["../../src/artefacts/urls.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,53 @@
1
1
  import { buildUntpArtefactUrls, buildSpecificationPageUrl, UNTP_SHORT_CREDENTIAL_TYPES, UNTP_CORE_SCHEMA_FILENAMES, UNTP_SPECIFICATION_PAGE_SLUGS, buildLinkSetSchemaUrl, } from './urls';
2
2
  describe('buildUntpArtefactUrls', () => {
3
+ // Every URL below is the one recorded in artefacts/manifest.json.
4
+ const legacyArtefactUrls = [
5
+ [
6
+ 'DigitalProductPassport',
7
+ 'https://test.uncefact.org/vocabulary/untp/dpp/untp-dpp-schema-0.6.0.json',
8
+ 'https://test.uncefact.org/vocabulary/untp/dpp/0.6.0/context/',
9
+ ],
10
+ [
11
+ 'DigitalConformityCredential',
12
+ 'https://test.uncefact.org/vocabulary/untp/dcc/untp-dcc-schema-0.6.0.json',
13
+ 'https://test.uncefact.org/vocabulary/untp/dcc/0.6.0/context/',
14
+ ],
15
+ [
16
+ 'DigitalTraceabilityEvent',
17
+ 'https://test.uncefact.org/vocabulary/untp/dte/untp-dte-schema-0.6.0.json',
18
+ 'https://test.uncefact.org/vocabulary/untp/dte/0.6.0/context/',
19
+ ],
20
+ [
21
+ 'DigitalFacilityRecord',
22
+ 'https://test.uncefact.org/vocabulary/untp/dfr/untp-dfr-schema-0.6.0.json',
23
+ 'https://test.uncefact.org/vocabulary/untp/dfr/0.6.0/context/',
24
+ ],
25
+ [
26
+ 'DigitalIdentityAnchor',
27
+ 'https://test.uncefact.org/vocabulary/untp/dia/untp-dia-schema-0.6.0.json',
28
+ 'https://test.uncefact.org/vocabulary/untp/dia/0.6.0/context/',
29
+ ],
30
+ ];
31
+ const artefactSchemaUrls = {
32
+ DigitalProductPassport: 'https://untp.unece.org/artefacts/schema/v0.7.0/dpp/DigitalProductPassport.json',
33
+ DigitalConformityCredential: 'https://untp.unece.org/artefacts/schema/v0.7.0/dcc/ConformityCredential.json',
34
+ DigitalTraceabilityEvent: 'https://untp.unece.org/artefacts/schema/v0.7.0/dte/DigitalTraceabilityEvent.json',
35
+ DigitalFacilityRecord: 'https://untp.unece.org/artefacts/schema/v0.7.0/dfr/DigitalFacilityRecord.json',
36
+ DigitalIdentityAnchor: 'https://untp.unece.org/artefacts/schema/v0.7.0/dia/DigitalIdentityAnchor.json',
37
+ ConformityScheme: 'https://untp.unece.org/artefacts/schema/v0.7.0/cvc/ConformityScheme.json',
38
+ };
39
+ it.each(legacyArtefactUrls)('keeps the legacy URL stable for %s', (type, schemaUrl, contextUrl) => {
40
+ expect(buildUntpArtefactUrls(type, '0.6.0')).toEqual({
41
+ schemaUrl,
42
+ contextUrl,
43
+ });
44
+ });
45
+ it.each(['0.6.0', 'draft'])('rejects a ConformityScheme version that has no artefacts: %s', (version) => {
46
+ expect(() => buildUntpArtefactUrls('ConformityScheme', version)).toThrow(`ConformityScheme has no artefacts for versions before UNTP 0.7.0 and "${version}" is not a UNTP 0.7.0 or later version.`);
47
+ });
48
+ it.each(Object.entries(artefactSchemaUrls))('keeps the artefacts URL byte-identical for %s', (type, schemaUrl) => {
49
+ expect(buildUntpArtefactUrls(type, '0.7.0').schemaUrl).toBe(schemaUrl);
50
+ });
3
51
  describe('v0.6.x (legacy layout)', () => {
4
52
  it('builds the legacy per-credential-type schema and context URLs', () => {
5
53
  expect(buildUntpArtefactUrls('DigitalProductPassport', '0.6.1')).toEqual({
@@ -55,6 +103,9 @@ describe('buildUntpArtefactUrls', () => {
55
103
  it('throws with a helpful message listing the supported types', () => {
56
104
  expect(() => buildUntpArtefactUrls('DigitalLivestockPassport', '0.7.0')).toThrow(/Unknown UNTP artefact type/);
57
105
  });
106
+ it('rejects inherited object keys', () => {
107
+ expect(() => buildUntpArtefactUrls('toString', '0.7.0')).toThrow('Unknown UNTP artefact type "toString"');
108
+ });
58
109
  });
59
110
  describe('exported maps', () => {
60
111
  it('the short-code and schema-filename maps agree on the set of supported types', () => {
@@ -84,6 +135,9 @@ describe('buildSpecificationPageUrl', () => {
84
135
  it('throws for an unknown artefact type', () => {
85
136
  expect(() => buildSpecificationPageUrl('DigitalLivestockPassport', '0.7.0')).toThrow(/Unknown UNTP artefact type/);
86
137
  });
138
+ it('rejects inherited object keys', () => {
139
+ expect(() => buildSpecificationPageUrl('toString', '0.7.0')).toThrow('Unknown UNTP artefact type "toString"');
140
+ });
87
141
  it('keeps the slug set aligned with the short-code map', () => {
88
142
  expect(Object.keys(UNTP_SPECIFICATION_PAGE_SLUGS).sort()).toEqual(Object.keys(UNTP_SHORT_CREDENTIAL_TYPES).sort());
89
143
  });
@@ -1 +1 @@
1
- {"version":3,"file":"urls.test.js","sourceRoot":"","sources":["../../src/artefacts/urls.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"urls.test.js","sourceRoot":"","sources":["../../src/artefacts/urls.test.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,8 @@
1
1
  import { findBundledArtefact, normaliseArtefactUrl } from './lookup.js';
2
+ // The refresh script is plain ESM JavaScript outside `src/`, so it is loaded
3
+ // at runtime rather than imported statically (tsc's rootDir is `src`).
4
+ const scriptUrl = new URL('../../scripts/refresh-artefacts.mjs', import.meta.url).href;
5
+ const { canonicalise } = (await import(scriptUrl));
2
6
  describe('normaliseArtefactUrl', () => {
3
7
  it.each([
4
8
  ['https://vocabulary.uncefact.org/untp/0.7.0/context/', 'https://vocabulary.uncefact.org/untp/0.7.0/context'],
@@ -47,22 +51,18 @@ describe('findBundledArtefact', () => {
47
51
  });
48
52
  });
49
53
  describe('bundle integrity', () => {
54
+ it('uses the producer serialisation for integer-like keys so checker ordering cannot drift', () => {
55
+ expect(JSON.stringify(canonicalise({ '2': 'two', '10': 'ten' }))).toBe('{"2":"two","10":"ten"}');
56
+ });
50
57
  it('serves every artefact with the content hash the manifest records', async () => {
51
58
  const { readFile } = await import('node:fs/promises');
52
59
  const { createHash } = await import('node:crypto');
53
60
  const manifest = JSON.parse(await readFile(new URL('../../artefacts/manifest.json', import.meta.url), 'utf8'));
54
- const sortKeys = (value) => Array.isArray(value)
55
- ? value.map(sortKeys)
56
- : value !== null && typeof value === 'object'
57
- ? Object.fromEntries(Object.keys(value)
58
- .sort()
59
- .map((key) => [key, sortKeys(value[key])]))
60
- : value;
61
61
  for (const { url, sha256 } of manifest.artefacts) {
62
62
  const served = await findBundledArtefact(url);
63
63
  expect(served).toBeDefined();
64
64
  expect(createHash('sha256')
65
- .update(JSON.stringify(sortKeys(served)))
65
+ .update(JSON.stringify(canonicalise(served)))
66
66
  .digest('hex')).toBe(sha256);
67
67
  }
68
68
  });
@@ -1 +1 @@
1
- {"version":3,"file":"lookup.test.js","sourceRoot":"","sources":["../../src/bundle/lookup.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lookup.test.js","sourceRoot":"","sources":["../../src/bundle/lookup.test.ts"],"names":[],"mappings":"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"}
@@ -8,13 +8,17 @@ export declare function bundledUntpVersions(): Promise<readonly string[]>;
8
8
  /**
9
9
  * The bundled JSON Schema for a UNTP credential type and version, for example
10
10
  * `bundledSchema('DigitalProductPassport', '0.6.0')`, or `undefined` when the
11
- * bundle does not carry that version. `type` accepts the names
12
- * `buildUntpArtefactUrls` accepts.
11
+ * bundle does not carry a version that has a published artefact; throws for a
12
+ * `ConformityScheme` below UNTP 0.7.0 because no artefact was ever published for
13
+ * one. `type` accepts the names `buildUntpArtefactUrls` accepts.
13
14
  */
14
15
  export declare function bundledSchema(type: string, version: string): Promise<Record<string, unknown> | undefined>;
15
16
  /**
16
17
  * The bundled JSON-LD context a UNTP credential type declares at a version:
17
- * the per-type context before 0.7.0, the unified UNTP context from 0.7.0.
18
+ * the per-type context before 0.7.0, the unified UNTP context from 0.7.0, or
19
+ * `undefined` when the bundle does not carry a version that has a published
20
+ * artefact; throws for a `ConformityScheme` below UNTP 0.7.0 because no artefact
21
+ * was ever published for one.
18
22
  */
19
23
  export declare function bundledContext(type: string, version: string): Promise<Record<string, unknown> | undefined>;
20
24
  /** The bundled Identity Resolver link set schema for a UNTP version (published from 0.7.0). */
@@ -24,8 +24,9 @@ export async function bundledUntpVersions() {
24
24
  /**
25
25
  * The bundled JSON Schema for a UNTP credential type and version, for example
26
26
  * `bundledSchema('DigitalProductPassport', '0.6.0')`, or `undefined` when the
27
- * bundle does not carry that version. `type` accepts the names
28
- * `buildUntpArtefactUrls` accepts.
27
+ * bundle does not carry a version that has a published artefact; throws for a
28
+ * `ConformityScheme` below UNTP 0.7.0 because no artefact was ever published for
29
+ * one. `type` accepts the names `buildUntpArtefactUrls` accepts.
29
30
  */
30
31
  export async function bundledSchema(type, version) {
31
32
  const { buildUntpArtefactUrls } = await import('../artefacts/urls.js');
@@ -33,7 +34,10 @@ export async function bundledSchema(type, version) {
33
34
  }
34
35
  /**
35
36
  * The bundled JSON-LD context a UNTP credential type declares at a version:
36
- * the per-type context before 0.7.0, the unified UNTP context from 0.7.0.
37
+ * the per-type context before 0.7.0, the unified UNTP context from 0.7.0, or
38
+ * `undefined` when the bundle does not carry a version that has a published
39
+ * artefact; throws for a `ConformityScheme` below UNTP 0.7.0 because no artefact
40
+ * was ever published for one.
37
41
  */
38
42
  export async function bundledContext(type, version) {
39
43
  const { buildUntpArtefactUrls } = await import('../artefacts/urls.js');
@@ -1 +1 @@
1
- {"version":3,"file":"public.js","sourceRoot":"","sources":["../../src/bundle/public.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAGtD,sHAAsH;AACtH,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;IACzD,OAAO,IAAI,GAAG,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACpG,CAAC;AAED,+FAA+F;AAC/F,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;IAC7D,OAAO,qBAAqB,CAAC;AAC/B,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,OAAe;IAC/D,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IACvE,OAAO,mBAAmB,CAAC,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC;AAC7E,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY,EAAE,OAAe;IAChE,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IACvE,OAAO,mBAAmB,CAAC,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC;AAC9E,CAAC;AAED,+FAA+F;AAC/F,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAAe;IACxD,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IACvE,OAAO,mBAAmB,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,2FAA2F;AAC3F,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAY;IACnD,OAAO,mBAAmB,CAAC,sCAAsC,OAAO,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED,+FAA+F;AAC/F,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAY;IAClD,KAAK,OAAO,CAAC;IACb,OAAO,mBAAmB,CACxB,oGAAoG,CACrG,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"public.js","sourceRoot":"","sources":["../../src/bundle/public.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAGtD,sHAAsH;AACtH,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;IACzD,OAAO,IAAI,GAAG,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACpG,CAAC;AAED,+FAA+F;AAC/F,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;IAC7D,OAAO,qBAAqB,CAAC;AAC/B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,OAAe;IAC/D,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IACvE,OAAO,mBAAmB,CAAC,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC;AAC7E,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY,EAAE,OAAe;IAChE,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IACvE,OAAO,mBAAmB,CAAC,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC;AAC9E,CAAC;AAED,+FAA+F;AAC/F,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAAe;IACxD,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IACvE,OAAO,mBAAmB,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,2FAA2F;AAC3F,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAY;IACnD,OAAO,mBAAmB,CAAC,sCAAsC,OAAO,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED,+FAA+F;AAC/F,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAY;IAClD,KAAK,OAAO,CAAC;IACb,OAAO,mBAAmB,CACxB,oGAAoG,CACrG,CAAC;AACJ,CAAC"}
@@ -25,6 +25,12 @@ describe('bundled-artefacts public entry', () => {
25
25
  it('rejects an unknown credential type the way the URL builder does', async () => {
26
26
  await expect(bundledSchema('NotAType', '0.7.0')).rejects.toThrow(/Unknown UNTP artefact type/);
27
27
  });
28
+ it('throws when a bundled ConformityScheme schema is requested before UNTP 0.7.0', async () => {
29
+ await expect(bundledSchema('ConformityScheme', '0.6.0')).rejects.toThrow('ConformityScheme has no artefacts for versions before UNTP 0.7.0 and "0.6.0" is not a UNTP 0.7.0 or later version.');
30
+ });
31
+ it('throws when a bundled ConformityScheme context is requested before UNTP 0.7.0', async () => {
32
+ await expect(bundledContext('ConformityScheme', '0.6.0')).rejects.toThrow('ConformityScheme has no artefacts for versions before UNTP 0.7.0 and "0.6.0" is not a UNTP 0.7.0 or later version.');
33
+ });
28
34
  it('returns the link set schema and the VCDM pair by version', async () => {
29
35
  expect(await bundledLinkSetSchema('0.7.0')).toBeDefined();
30
36
  expect(await bundledLinkSetSchema('0.6.0')).toBeUndefined();
@@ -1 +1 @@
1
- {"version":3,"file":"public.test.js","sourceRoot":"","sources":["../../src/bundle/public.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"public.test.js","sourceRoot":"","sources":["../../src/bundle/public.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Serialises JSON-compatible values in a deterministic RFC 8785-style form:
3
+ * object keys are sorted by code unit, whitespace is omitted, arrays retain
4
+ * their order, scalar values use `JSON.stringify`, object keys with undefined
5
+ * values are omitted as `JSON.stringify` does, and a top-level undefined
6
+ * throws.
7
+ *
8
+ * @see https://www.rfc-editor.org/rfc/rfc8785
9
+ */
10
+ export declare function canonicalJson(value: unknown): string;
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Serialises JSON-compatible values in a deterministic RFC 8785-style form:
3
+ * object keys are sorted by code unit, whitespace is omitted, arrays retain
4
+ * their order, scalar values use `JSON.stringify`, object keys with undefined
5
+ * values are omitted as `JSON.stringify` does, and a top-level undefined
6
+ * throws.
7
+ *
8
+ * @see https://www.rfc-editor.org/rfc/rfc8785
9
+ */
10
+ export function canonicalJson(value) {
11
+ if (value === undefined)
12
+ throw new TypeError('Top-level undefined cannot be canonicalised');
13
+ if (Array.isArray(value)) {
14
+ return `[${value.map((item) => (item === undefined ? 'null' : canonicalJson(item))).join(',')}]`;
15
+ }
16
+ if (value !== null && typeof value === 'object') {
17
+ const record = value;
18
+ return `{${Object.keys(record)
19
+ .filter((key) => record[key] !== undefined)
20
+ .sort()
21
+ .map((key) => `${JSON.stringify(key)}:${canonicalJson(record[key])}`)
22
+ .join(',')}}`;
23
+ }
24
+ const serialised = JSON.stringify(value);
25
+ if (serialised === undefined)
26
+ throw new TypeError('Value cannot be canonicalised as JSON');
27
+ return serialised;
28
+ }
29
+ //# sourceMappingURL=canonical-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical-json.js","sourceRoot":"","sources":["../../src/common/canonical-json.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,KAAK,KAAK,SAAS;QAAE,MAAM,IAAI,SAAS,CAAC,6CAA6C,CAAC,CAAC;IAC5F,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IACnG,CAAC;IACD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,KAAgC,CAAC;QAChD,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;aAC3B,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC;aAC1C,IAAI,EAAE;aACN,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;aACpE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAClB,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,UAAU,KAAK,SAAS;QAAE,MAAM,IAAI,SAAS,CAAC,uCAAuC,CAAC,CAAC;IAC3F,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,20 @@
1
+ import { canonicalJson } from './canonical-json';
2
+ describe('canonicalJson', () => {
3
+ it('sorts keys, removes whitespace and preserves nested structure', () => {
4
+ // Catches a regression that only sorts top-level keys or retains whitespace.
5
+ expect(canonicalJson({ z: { b: 2, a: 1 }, a: [3, { d: 4, c: 5 }] })).toBe('{"a":[3,{"c":5,"d":4}],"z":{"a":1,"b":2}}');
6
+ });
7
+ it('omits undefined object properties and writes undefined array items as null', () => {
8
+ // Catches a regression that serialises undefined object values or rejects array holes.
9
+ expect(canonicalJson({ keep: true, omit: undefined, values: [undefined, 'x'] })).toBe('{"keep":true,"values":[null,"x"]}');
10
+ });
11
+ it('preserves array order, unicode and JSON number spelling', () => {
12
+ // Catches a regression that sorts arrays, escapes unicode unnecessarily or changes numbers.
13
+ expect(canonicalJson({ values: ['z', 'ä', 'a'], number: 1.5, negativeZero: -0 })).toBe('{"negativeZero":0,"number":1.5,"values":["z","ä","a"]}');
14
+ });
15
+ it('rejects top-level undefined', () => {
16
+ // Catches a regression that silently turns an absent top-level value into JSON null.
17
+ expect(() => canonicalJson(undefined)).toThrow(TypeError);
18
+ });
19
+ });
20
+ //# sourceMappingURL=canonical-json.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical-json.test.js","sourceRoot":"","sources":["../../src/common/canonical-json.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,6EAA6E;QAC7E,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CACvE,2CAA2C,CAC5C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,uFAAuF;QACvF,MAAM,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CACnF,mCAAmC,CACpC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,4FAA4F;QAC5F,MAAM,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CACpF,wDAAwD,CACzD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,qFAAqF;QACrF,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -2,3 +2,4 @@ export * from './as-date-time.js';
2
2
  export * from './as-non-empty-string.js';
3
3
  export * from './require-string.js';
4
4
  export * from './validity-window.js';
5
+ export * from './canonical-json.js';