@uncefact/untp-utils 0.1.0 → 0.2.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 (220) hide show
  1. package/README.md +23 -1
  2. package/build/artefacts/detect-version-from-context.d.ts +46 -0
  3. package/build/artefacts/detect-version-from-context.js +77 -0
  4. package/build/artefacts/detect-version-from-context.js.map +1 -0
  5. package/build/artefacts/detect-version-from-context.test.d.ts +1 -0
  6. package/build/artefacts/detect-version-from-context.test.js +69 -0
  7. package/build/artefacts/detect-version-from-context.test.js.map +1 -0
  8. package/build/artefacts/index.d.ts +3 -0
  9. package/build/artefacts/index.js +4 -0
  10. package/build/artefacts/index.js.map +1 -0
  11. package/build/artefacts/urls.d.ts +79 -0
  12. package/build/artefacts/urls.js +133 -0
  13. package/build/artefacts/urls.js.map +1 -0
  14. package/build/artefacts/urls.test.d.ts +1 -0
  15. package/build/artefacts/urls.test.js +91 -0
  16. package/build/artefacts/urls.test.js.map +1 -0
  17. package/build/artefacts/version.d.ts +9 -0
  18. package/build/artefacts/version.js +17 -0
  19. package/build/artefacts/version.js.map +1 -0
  20. package/build/artefacts/version.test.d.ts +1 -0
  21. package/build/artefacts/version.test.js +16 -0
  22. package/build/artefacts/version.test.js.map +1 -0
  23. package/build/cache/in-memory-ttl-cache.d.ts +2 -0
  24. package/build/cache/in-memory-ttl-cache.js +76 -0
  25. package/build/cache/in-memory-ttl-cache.js.map +1 -0
  26. package/build/cache/in-memory-ttl-cache.test.d.ts +1 -0
  27. package/build/cache/in-memory-ttl-cache.test.js +236 -0
  28. package/build/cache/in-memory-ttl-cache.test.js.map +1 -0
  29. package/build/cache/index.d.ts +2 -0
  30. package/build/cache/index.js +2 -0
  31. package/build/cache/index.js.map +1 -0
  32. package/build/cache/ttl-cache.d.ts +22 -0
  33. package/build/cache/ttl-cache.js +2 -0
  34. package/build/cache/ttl-cache.js.map +1 -0
  35. package/build/common/as-non-empty-string.d.ts +7 -0
  36. package/build/common/as-non-empty-string.js +10 -0
  37. package/build/common/as-non-empty-string.js.map +1 -0
  38. package/build/common/as-non-empty-string.test.d.ts +1 -0
  39. package/build/common/as-non-empty-string.test.js +25 -0
  40. package/build/common/as-non-empty-string.test.js.map +1 -0
  41. package/build/common/require-string.d.ts +12 -0
  42. package/build/common/require-string.js +27 -0
  43. package/build/common/require-string.js.map +1 -0
  44. package/build/common/require-string.test.d.ts +1 -0
  45. package/build/common/require-string.test.js +53 -0
  46. package/build/common/require-string.test.js.map +1 -0
  47. package/build/conformity-vocabulary/codes.d.ts +10 -0
  48. package/build/conformity-vocabulary/codes.js +10 -0
  49. package/build/conformity-vocabulary/codes.js.map +1 -0
  50. package/build/conformity-vocabulary/errors.d.ts +44 -0
  51. package/build/conformity-vocabulary/errors.js +68 -0
  52. package/build/conformity-vocabulary/errors.js.map +1 -0
  53. package/build/conformity-vocabulary/index.d.ts +6 -0
  54. package/build/conformity-vocabulary/index.js +7 -0
  55. package/build/conformity-vocabulary/index.js.map +1 -0
  56. package/build/conformity-vocabulary/parse-conformity-catalogue.d.ts +26 -0
  57. package/build/conformity-vocabulary/parse-conformity-catalogue.js +106 -0
  58. package/build/conformity-vocabulary/parse-conformity-catalogue.js.map +1 -0
  59. package/build/conformity-vocabulary/parse-conformity-catalogue.test.d.ts +1 -0
  60. package/build/conformity-vocabulary/parse-conformity-catalogue.test.js +327 -0
  61. package/build/conformity-vocabulary/parse-conformity-catalogue.test.js.map +1 -0
  62. package/build/conformity-vocabulary/parse-conformity-scheme.d.ts +28 -0
  63. package/build/conformity-vocabulary/parse-conformity-scheme.js +47 -0
  64. package/build/conformity-vocabulary/parse-conformity-scheme.js.map +1 -0
  65. package/build/conformity-vocabulary/parse-conformity-scheme.test.d.ts +1 -0
  66. package/build/conformity-vocabulary/parse-conformity-scheme.test.js +284 -0
  67. package/build/conformity-vocabulary/parse-conformity-scheme.test.js.map +1 -0
  68. package/build/conformity-vocabulary/parsers/v0-7-0.parser.d.ts +19 -0
  69. package/build/conformity-vocabulary/parsers/v0-7-0.parser.js +219 -0
  70. package/build/conformity-vocabulary/parsers/v0-7-0.parser.js.map +1 -0
  71. package/build/conformity-vocabulary/types.d.ts +180 -0
  72. package/build/conformity-vocabulary/types.js +2 -0
  73. package/build/conformity-vocabulary/types.js.map +1 -0
  74. package/build/conformity-vocabulary/validate-conformity-claim.d.ts +26 -0
  75. package/build/conformity-vocabulary/validate-conformity-claim.js +165 -0
  76. package/build/conformity-vocabulary/validate-conformity-claim.js.map +1 -0
  77. package/build/conformity-vocabulary/validate-conformity-claim.test.d.ts +1 -0
  78. package/build/conformity-vocabulary/validate-conformity-claim.test.js +478 -0
  79. package/build/conformity-vocabulary/validate-conformity-claim.test.js.map +1 -0
  80. package/build/http-headers/index.d.ts +5 -0
  81. package/build/http-headers/index.js +6 -0
  82. package/build/http-headers/index.js.map +1 -0
  83. package/build/http-headers/is-safe-header-value.d.ts +10 -0
  84. package/build/http-headers/is-safe-header-value.js +15 -0
  85. package/build/http-headers/is-safe-header-value.js.map +1 -0
  86. package/build/http-headers/is-safe-header-value.test.d.ts +1 -0
  87. package/build/http-headers/is-safe-header-value.test.js +37 -0
  88. package/build/http-headers/is-safe-header-value.test.js.map +1 -0
  89. package/build/http-headers/parse-entity-tag.d.ts +9 -0
  90. package/build/http-headers/parse-entity-tag.js +18 -0
  91. package/build/http-headers/parse-entity-tag.js.map +1 -0
  92. package/build/http-headers/parse-entity-tag.test.d.ts +1 -0
  93. package/build/http-headers/parse-entity-tag.test.js +41 -0
  94. package/build/http-headers/parse-entity-tag.test.js.map +1 -0
  95. package/build/http-headers/parse-imf-date.d.ts +13 -0
  96. package/build/http-headers/parse-imf-date.js +23 -0
  97. package/build/http-headers/parse-imf-date.js.map +1 -0
  98. package/build/http-headers/parse-imf-date.test.d.ts +1 -0
  99. package/build/http-headers/parse-imf-date.test.js +31 -0
  100. package/build/http-headers/parse-imf-date.test.js.map +1 -0
  101. package/build/http-headers/parse-media-type.d.ts +8 -0
  102. package/build/http-headers/parse-media-type.js +21 -0
  103. package/build/http-headers/parse-media-type.js.map +1 -0
  104. package/build/http-headers/parse-media-type.test.d.ts +1 -0
  105. package/build/http-headers/parse-media-type.test.js +39 -0
  106. package/build/http-headers/parse-media-type.test.js.map +1 -0
  107. package/build/http-headers/user-agent.d.ts +35 -0
  108. package/build/http-headers/user-agent.js +45 -0
  109. package/build/http-headers/user-agent.js.map +1 -0
  110. package/build/http-headers/user-agent.test.d.ts +1 -0
  111. package/build/http-headers/user-agent.test.js +27 -0
  112. package/build/http-headers/user-agent.test.js.map +1 -0
  113. package/build/index.d.ts +1 -1
  114. package/build/index.js +1 -1
  115. package/build/index.js.map +1 -1
  116. package/build/loaders/errors.d.ts +21 -0
  117. package/build/loaders/errors.js +45 -0
  118. package/build/loaders/errors.js.map +1 -0
  119. package/build/loaders/index.d.ts +3 -0
  120. package/build/loaders/index.js +4 -0
  121. package/build/loaders/index.js.map +1 -0
  122. package/build/loaders/jsonld-document-loader.d.ts +46 -0
  123. package/build/loaders/jsonld-document-loader.js +34 -0
  124. package/build/loaders/jsonld-document-loader.js.map +1 -0
  125. package/build/loaders/jsonld-document-loader.test.d.ts +1 -0
  126. package/build/loaders/jsonld-document-loader.test.js +71 -0
  127. package/build/loaders/jsonld-document-loader.test.js.map +1 -0
  128. package/build/loaders/schema-loader.d.ts +21 -0
  129. package/build/loaders/schema-loader.js +67 -0
  130. package/build/loaders/schema-loader.js.map +1 -0
  131. package/build/loaders/schema-loader.ssrf.test.d.ts +1 -0
  132. package/build/loaders/schema-loader.ssrf.test.js +55 -0
  133. package/build/loaders/schema-loader.ssrf.test.js.map +1 -0
  134. package/build/loaders/schema-loader.test.d.ts +1 -0
  135. package/build/loaders/schema-loader.test.js +162 -0
  136. package/build/loaders/schema-loader.test.js.map +1 -0
  137. package/build/multibase-digest/multibase-digest.d.ts +23 -0
  138. package/build/multibase-digest/multibase-digest.js +40 -0
  139. package/build/multibase-digest/multibase-digest.js.map +1 -1
  140. package/build/multibase-digest/multibase-digest.test.js +46 -0
  141. package/build/multibase-digest/multibase-digest.test.js.map +1 -1
  142. package/build/node/errors.d.ts +41 -0
  143. package/build/node/errors.js +80 -0
  144. package/build/node/errors.js.map +1 -0
  145. package/build/node/index.d.ts +3 -0
  146. package/build/node/index.js +4 -0
  147. package/build/node/index.js.map +1 -0
  148. package/build/node/is-private-ip.d.ts +41 -0
  149. package/build/node/is-private-ip.js +138 -0
  150. package/build/node/is-private-ip.js.map +1 -0
  151. package/build/node/is-private-ip.test.d.ts +1 -0
  152. package/build/node/is-private-ip.test.js +96 -0
  153. package/build/node/is-private-ip.test.js.map +1 -0
  154. package/build/node/validate-public-url.d.ts +49 -0
  155. package/build/node/validate-public-url.js +94 -0
  156. package/build/node/validate-public-url.js.map +1 -0
  157. package/build/node/validate-public-url.test.d.ts +1 -0
  158. package/build/node/validate-public-url.test.js +177 -0
  159. package/build/node/validate-public-url.test.js.map +1 -0
  160. package/build/resolvers/errors.d.ts +43 -0
  161. package/build/resolvers/errors.js +99 -0
  162. package/build/resolvers/errors.js.map +1 -0
  163. package/build/resolvers/index.d.ts +5 -0
  164. package/build/resolvers/index.js +6 -0
  165. package/build/resolvers/index.js.map +1 -0
  166. package/build/resolvers/resolve-document-if-changed.d.ts +48 -0
  167. package/build/resolvers/resolve-document-if-changed.js +42 -0
  168. package/build/resolvers/resolve-document-if-changed.js.map +1 -0
  169. package/build/resolvers/resolve-document-if-changed.test.d.ts +1 -0
  170. package/build/resolvers/resolve-document-if-changed.test.js +109 -0
  171. package/build/resolvers/resolve-document-if-changed.test.js.map +1 -0
  172. package/build/resolvers/resolve-document.d.ts +86 -0
  173. package/build/resolvers/resolve-document.js +239 -0
  174. package/build/resolvers/resolve-document.js.map +1 -0
  175. package/build/resolvers/resolve-document.test.d.ts +1 -0
  176. package/build/resolvers/resolve-document.test.js +299 -0
  177. package/build/resolvers/resolve-document.test.js.map +1 -0
  178. package/build/resolvers/resolve-json-document.d.ts +40 -0
  179. package/build/resolvers/resolve-json-document.js +42 -0
  180. package/build/resolvers/resolve-json-document.js.map +1 -0
  181. package/build/resolvers/resolve-json-document.test.d.ts +1 -0
  182. package/build/resolvers/resolve-json-document.test.js +61 -0
  183. package/build/resolvers/resolve-json-document.test.js.map +1 -0
  184. package/build/structured-error.d.ts +49 -0
  185. package/build/structured-error.js +17 -0
  186. package/build/structured-error.js.map +1 -0
  187. package/build/structured-error.test.d.ts +1 -0
  188. package/build/structured-error.test.js +112 -0
  189. package/build/structured-error.test.js.map +1 -0
  190. package/build/validation/describe-jsonld-failure.d.ts +50 -0
  191. package/build/validation/describe-jsonld-failure.js +104 -0
  192. package/build/validation/describe-jsonld-failure.js.map +1 -0
  193. package/build/validation/describe-jsonld-failure.test.d.ts +1 -0
  194. package/build/validation/describe-jsonld-failure.test.js +141 -0
  195. package/build/validation/describe-jsonld-failure.test.js.map +1 -0
  196. package/build/validation/errors.d.ts +40 -0
  197. package/build/validation/errors.js +75 -0
  198. package/build/validation/errors.js.map +1 -0
  199. package/build/validation/index.d.ts +4 -0
  200. package/build/validation/index.js +5 -0
  201. package/build/validation/index.js.map +1 -0
  202. package/build/validation/validate-against-schemas.d.ts +22 -0
  203. package/build/validation/validate-against-schemas.js +65 -0
  204. package/build/validation/validate-against-schemas.js.map +1 -0
  205. package/build/validation/validate-against-schemas.test.d.ts +1 -0
  206. package/build/validation/validate-against-schemas.test.js +169 -0
  207. package/build/validation/validate-against-schemas.test.js.map +1 -0
  208. package/build/validation/validate-jsonld.context-cache.test.d.ts +1 -0
  209. package/build/validation/validate-jsonld.context-cache.test.js +32 -0
  210. package/build/validation/validate-jsonld.context-cache.test.js.map +1 -0
  211. package/build/validation/validate-jsonld.d.ts +33 -0
  212. package/build/validation/validate-jsonld.js +99 -0
  213. package/build/validation/validate-jsonld.js.map +1 -0
  214. package/build/validation/validate-jsonld.ssrf.test.d.ts +1 -0
  215. package/build/validation/validate-jsonld.ssrf.test.js +108 -0
  216. package/build/validation/validate-jsonld.ssrf.test.js.map +1 -0
  217. package/build/validation/validate-jsonld.test.d.ts +1 -0
  218. package/build/validation/validate-jsonld.test.js +200 -0
  219. package/build/validation/validate-jsonld.test.js.map +1 -0
  220. package/package.json +64 -3
@@ -0,0 +1,28 @@
1
+ import type { ConformityScheme } from './types.js';
2
+ export interface ParseConformitySchemeOptions {
3
+ /** The URL the document was fetched from; recorded on the returned scheme. */
4
+ sourceUrl: string;
5
+ /**
6
+ * Override the CVC spec version detection. When omitted, the version is
7
+ * derived from the document's `@context`.
8
+ */
9
+ specVersion?: string;
10
+ }
11
+ /** CVC spec versions this build can parse. */
12
+ export declare const SUPPORTED_CVC_SPEC_VERSIONS: readonly ["0.7.0"];
13
+ export type SupportedCvcSpecVersion = (typeof SUPPORTED_CVC_SPEC_VERSIONS)[number];
14
+ /**
15
+ * Parses an owner-published conformity scheme JSON-LD document into a
16
+ * structured tree.
17
+ *
18
+ * The spec version is detected from the document's `@context`; the detection
19
+ * can be overridden via `options.specVersion`.
20
+ *
21
+ * @throws {ConformityUnsupportedSpecVersionError} if the version can't be
22
+ * detected or is not supported by this build (fail-fast).
23
+ * @throws {ConformitySchemeParseError} carrying every accumulated per-field
24
+ * failure in `failures[]` if the document is structurally invalid.
25
+ *
26
+ * @see https://untp.unece.org/docs/specification/ConformityVocabularyCatalog
27
+ */
28
+ export declare function parseConformityScheme(doc: unknown, options: ParseConformitySchemeOptions): ConformityScheme;
@@ -0,0 +1,47 @@
1
+ import { detectVersionFromContext } from '../artefacts/detect-version-from-context.js';
2
+ import { ConformitySchemeParseError, ConformityUnsupportedSpecVersionError } from './errors.js';
3
+ import { parseV070ConformityScheme } from './parsers/v0-7-0.parser.js';
4
+ /** CVC spec versions this build can parse. */
5
+ export const SUPPORTED_CVC_SPEC_VERSIONS = ['0.7.0'];
6
+ const PARSERS = {
7
+ '0.7.0': parseV070ConformityScheme,
8
+ };
9
+ /**
10
+ * Parses an owner-published conformity scheme JSON-LD document into a
11
+ * structured tree.
12
+ *
13
+ * The spec version is detected from the document's `@context`; the detection
14
+ * can be overridden via `options.specVersion`.
15
+ *
16
+ * @throws {ConformityUnsupportedSpecVersionError} if the version can't be
17
+ * detected or is not supported by this build (fail-fast).
18
+ * @throws {ConformitySchemeParseError} carrying every accumulated per-field
19
+ * failure in `failures[]` if the document is structurally invalid.
20
+ *
21
+ * @see https://untp.unece.org/docs/specification/ConformityVocabularyCatalog
22
+ */
23
+ export function parseConformityScheme(doc, options) {
24
+ const detected = options.specVersion ?? detectVersionFromContext(doc);
25
+ if (!detected) {
26
+ throw new ConformityUnsupportedSpecVersionError(undefined, SUPPORTED_CVC_SPEC_VERSIONS);
27
+ }
28
+ const parser = PARSERS[detected];
29
+ if (!parser) {
30
+ throw new ConformityUnsupportedSpecVersionError(detected, SUPPORTED_CVC_SPEC_VERSIONS);
31
+ }
32
+ const failures = [];
33
+ const scheme = parser(doc, options.sourceUrl, failures);
34
+ if (failures.length > 0) {
35
+ throw new ConformitySchemeParseError(failures);
36
+ }
37
+ if (!scheme) {
38
+ throw new ConformitySchemeParseError([
39
+ {
40
+ code: 'conformity-scheme.parse-failed',
41
+ message: 'Parser returned no scheme but reported no failures (internal invariant violated).',
42
+ },
43
+ ]);
44
+ }
45
+ return scheme;
46
+ }
47
+ //# sourceMappingURL=parse-conformity-scheme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-conformity-scheme.js","sourceRoot":"","sources":["../../src/conformity-vocabulary/parse-conformity-scheme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,6CAA6C,CAAC;AAEvF,OAAO,EAAE,0BAA0B,EAAE,qCAAqC,EAAE,MAAM,aAAa,CAAC;AAChG,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAavE,8CAA8C;AAC9C,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,OAAO,CAAU,CAAC;AAK9D,MAAM,OAAO,GAA4C;IACvD,OAAO,EAAE,yBAAyB;CACnC,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAY,EAAE,OAAqC;IACvF,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,IAAI,wBAAwB,CAAC,GAAG,CAAC,CAAC;IACtE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,qCAAqC,CAAC,SAAS,EAAE,2BAA2B,CAAC,CAAC;IAC1F,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,QAAmC,CAAC,CAAC;IAC5D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,qCAAqC,CAAC,QAAQ,EAAE,2BAA2B,CAAC,CAAC;IACzF,CAAC;IAED,MAAM,QAAQ,GAAwB,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACxD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,0BAA0B,CAAC;YACnC;gBACE,IAAI,EAAE,gCAAgC;gBACtC,OAAO,EAAE,mFAAmF;aAC7F;SACF,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,284 @@
1
+ import { ConformityVocabularyError, ConformitySchemeParseError, ConformityUnsupportedSpecVersionError, } from './errors.js';
2
+ import { parseConformityScheme } from './parse-conformity-scheme.js';
3
+ const UNTP_V070_CONTEXT = 'https://vocabulary.uncefact.org/untp/0.7.0/context/';
4
+ function minimalSchemeDoc(overrides = {}) {
5
+ return {
6
+ '@context': [UNTP_V070_CONTEXT],
7
+ type: ['ConformityScheme'],
8
+ id: 'https://example.com/scheme',
9
+ name: 'Example Scheme',
10
+ includedProfile: [],
11
+ ...overrides,
12
+ };
13
+ }
14
+ function profile(overrides = {}) {
15
+ return {
16
+ id: 'https://example.com/scheme/full/1.0.0',
17
+ name: 'Full',
18
+ version: '1.0.0',
19
+ status: 'active',
20
+ criterion: [],
21
+ ...overrides,
22
+ };
23
+ }
24
+ function criterion(overrides = {}) {
25
+ return {
26
+ type: ['Criterion'],
27
+ id: 'https://example.com/criterion/forced-labour/1.0.0',
28
+ name: 'Forced Labour',
29
+ version: '1.0.0',
30
+ status: 'active',
31
+ ...overrides,
32
+ };
33
+ }
34
+ describe('parseConformityScheme', () => {
35
+ describe('version handling', () => {
36
+ it('auto-detects 0.7.0 from the @context', () => {
37
+ const scheme = parseConformityScheme(minimalSchemeDoc(), { sourceUrl: 'https://example.com/scheme' });
38
+ expect(scheme.specVersion).toBe('0.7.0');
39
+ });
40
+ it('honours the specVersion override', () => {
41
+ const doc = minimalSchemeDoc({ '@context': ['https://unknown.example/ctx'] });
42
+ const scheme = parseConformityScheme(doc, { sourceUrl: 'https://example.com/scheme', specVersion: '0.7.0' });
43
+ expect(scheme.specVersion).toBe('0.7.0');
44
+ });
45
+ it('throws ConformityUnsupportedSpecVersionError when version cannot be detected', () => {
46
+ const doc = minimalSchemeDoc({ '@context': ['https://unknown.example/ctx'] });
47
+ const error = (() => {
48
+ try {
49
+ parseConformityScheme(doc, { sourceUrl: 'https://example.com/scheme' });
50
+ return undefined;
51
+ }
52
+ catch (e) {
53
+ return e;
54
+ }
55
+ })();
56
+ expect(error).toBeInstanceOf(ConformityUnsupportedSpecVersionError);
57
+ expect(error.received).toBe('undetected');
58
+ expect(error.pointer).toBe('/@context');
59
+ });
60
+ it('throws ConformityUnsupportedSpecVersionError for a known-but-unsupported version', () => {
61
+ const error = (() => {
62
+ try {
63
+ parseConformityScheme(minimalSchemeDoc(), {
64
+ sourceUrl: 'https://example.com/scheme',
65
+ specVersion: '99.0.0',
66
+ });
67
+ return undefined;
68
+ }
69
+ catch (e) {
70
+ return e;
71
+ }
72
+ })();
73
+ expect(error).toBeInstanceOf(ConformityUnsupportedSpecVersionError);
74
+ expect(error.received).toBe('99.0.0');
75
+ });
76
+ });
77
+ describe('happy path', () => {
78
+ it('parses a minimal scheme with no profiles', () => {
79
+ const scheme = parseConformityScheme(minimalSchemeDoc(), { sourceUrl: 'https://example.com/scheme' });
80
+ expect(scheme).toMatchObject({
81
+ canonicalId: 'https://example.com/scheme',
82
+ sourceUrl: 'https://example.com/scheme',
83
+ specVersion: '0.7.0',
84
+ name: 'Example Scheme',
85
+ profiles: [],
86
+ });
87
+ });
88
+ it('parses a scheme with one profile and one criterion', () => {
89
+ const doc = minimalSchemeDoc({ includedProfile: [profile({ criterion: [criterion()] })] });
90
+ const scheme = parseConformityScheme(doc, { sourceUrl: 'https://example.com/scheme' });
91
+ expect(scheme.profiles).toHaveLength(1);
92
+ expect(scheme.profiles[0].criteria[0].canonicalId).toBe('https://example.com/criterion/forced-labour/1.0.0');
93
+ });
94
+ it('parses inlined topic objects', () => {
95
+ const doc = minimalSchemeDoc({
96
+ includedProfile: [
97
+ profile({
98
+ criterion: [
99
+ criterion({
100
+ conformityTopic: [
101
+ {
102
+ type: ['ConformityTopic'],
103
+ id: 'https://vocabulary.uncefact.org/conformity-topics/forced-labor-elimination',
104
+ name: 'Forced Labor Elimination',
105
+ definition: 'A definition.',
106
+ },
107
+ ],
108
+ }),
109
+ ],
110
+ }),
111
+ ],
112
+ });
113
+ const scheme = parseConformityScheme(doc, { sourceUrl: 'https://example.com/scheme' });
114
+ expect(scheme.profiles[0].criteria[0].topics).toEqual([
115
+ {
116
+ canonicalId: 'https://vocabulary.uncefact.org/conformity-topics/forced-labor-elimination',
117
+ name: 'Forced Labor Elimination',
118
+ definition: 'A definition.',
119
+ },
120
+ ]);
121
+ });
122
+ it('parses a bare-string topic URI as a compact reference', () => {
123
+ const doc = minimalSchemeDoc({
124
+ includedProfile: [profile({ criterion: [criterion({ conformityTopic: ['https://example.com/topics/foo'] })] })],
125
+ });
126
+ const scheme = parseConformityScheme(doc, { sourceUrl: 'https://example.com/scheme' });
127
+ expect(scheme.profiles[0].criteria[0].topics).toEqual([{ canonicalId: 'https://example.com/topics/foo' }]);
128
+ });
129
+ it('parses tags as a string array', () => {
130
+ const doc = minimalSchemeDoc({
131
+ includedProfile: [profile({ criterion: [criterion({ tag: ['forced-labor', 'human-rights'] })] })],
132
+ });
133
+ const scheme = parseConformityScheme(doc, { sourceUrl: 'https://example.com/scheme' });
134
+ expect(scheme.profiles[0].criteria[0].tags).toEqual(['forced-labor', 'human-rights']);
135
+ });
136
+ it('parses a single string tag as a one-element array', () => {
137
+ const doc = minimalSchemeDoc({
138
+ includedProfile: [profile({ criterion: [criterion({ tag: 'forced-labor' })] })],
139
+ });
140
+ const scheme = parseConformityScheme(doc, { sourceUrl: 'https://example.com/scheme' });
141
+ expect(scheme.profiles[0].criteria[0].tags).toEqual(['forced-labor']);
142
+ });
143
+ it('captures the owner reference when present', () => {
144
+ const doc = minimalSchemeDoc({
145
+ owner: { type: ['Party'], id: 'https://example.com/owner', name: 'Example Owner' },
146
+ });
147
+ const scheme = parseConformityScheme(doc, { sourceUrl: 'https://example.com/scheme' });
148
+ expect(scheme.owner).toEqual({ canonicalId: 'https://example.com/owner', name: 'Example Owner' });
149
+ });
150
+ it('parses owner as a bare URI string (compact form)', () => {
151
+ const doc = minimalSchemeDoc({ owner: 'https://example.com/owner' });
152
+ const scheme = parseConformityScheme(doc, { sourceUrl: 'https://example.com/scheme' });
153
+ expect(scheme.owner).toEqual({ canonicalId: 'https://example.com/owner' });
154
+ });
155
+ it('returns undefined owner when input is an array', () => {
156
+ const doc = minimalSchemeDoc({ owner: ['not', 'a', 'party'] });
157
+ const scheme = parseConformityScheme(doc, { sourceUrl: 'https://example.com/scheme' });
158
+ expect(scheme.owner).toBeUndefined();
159
+ });
160
+ });
161
+ describe('parse failures (accumulating)', () => {
162
+ it('throws ConformitySchemeParseError with an invalid-shape failure when the document is not an object', () => {
163
+ const error = (() => {
164
+ try {
165
+ parseConformityScheme(null, { sourceUrl: 'x', specVersion: '0.7.0' });
166
+ return undefined;
167
+ }
168
+ catch (e) {
169
+ return e;
170
+ }
171
+ })();
172
+ expect(error).toBeInstanceOf(ConformitySchemeParseError);
173
+ expect(error.failures).toEqual([
174
+ expect.objectContaining({
175
+ code: 'conformity-scheme.invalid-shape',
176
+ received: 'null',
177
+ expected: 'object',
178
+ }),
179
+ ]);
180
+ });
181
+ it.each([
182
+ ['scheme.id', { id: undefined }, '/id'],
183
+ ['scheme.name', { name: undefined }, '/name'],
184
+ ])('throws with a missing-required-field failure when %s is missing', (_, override, pointer) => {
185
+ const error = (() => {
186
+ try {
187
+ parseConformityScheme(minimalSchemeDoc(override), { sourceUrl: 'https://example.com/scheme' });
188
+ return undefined;
189
+ }
190
+ catch (e) {
191
+ return e;
192
+ }
193
+ })();
194
+ expect(error).toBeInstanceOf(ConformitySchemeParseError);
195
+ expect(error.failures).toEqual(expect.arrayContaining([
196
+ expect.objectContaining({ code: 'conformity-scheme.missing-required-field', pointer }),
197
+ ]));
198
+ });
199
+ it('accumulates multiple failures in a single parse pass', () => {
200
+ const error = (() => {
201
+ try {
202
+ parseConformityScheme(minimalSchemeDoc({ id: undefined, name: undefined }), {
203
+ sourceUrl: 'https://example.com/scheme',
204
+ });
205
+ return undefined;
206
+ }
207
+ catch (e) {
208
+ return e;
209
+ }
210
+ })();
211
+ expect(error).toBeInstanceOf(ConformitySchemeParseError);
212
+ const failures = error.failures;
213
+ expect(failures).toHaveLength(2);
214
+ expect(failures.map((f) => f.pointer)).toEqual(expect.arrayContaining(['/id', '/name']));
215
+ });
216
+ it.each([
217
+ ['profile.id', { id: undefined }, '/includedProfile/0/id'],
218
+ ['profile.name', { name: undefined }, '/includedProfile/0/name'],
219
+ ['profile.version', { version: undefined }, '/includedProfile/0/version'],
220
+ ['profile.status', { status: undefined }, '/includedProfile/0/status'],
221
+ ])('throws with a missing-required-field failure when %s is missing', (_, override, pointer) => {
222
+ const doc = minimalSchemeDoc({ includedProfile: [profile(override)] });
223
+ const error = (() => {
224
+ try {
225
+ parseConformityScheme(doc, { sourceUrl: 'https://example.com/scheme' });
226
+ return undefined;
227
+ }
228
+ catch (e) {
229
+ return e;
230
+ }
231
+ })();
232
+ expect(error).toBeInstanceOf(ConformitySchemeParseError);
233
+ expect(error.failures).toEqual(expect.arrayContaining([
234
+ expect.objectContaining({ code: 'conformity-scheme.missing-required-field', pointer }),
235
+ ]));
236
+ });
237
+ it.each([
238
+ ['criterion.id', { id: undefined }, '/includedProfile/0/criterion/0/id'],
239
+ ['criterion.name', { name: undefined }, '/includedProfile/0/criterion/0/name'],
240
+ ['criterion.version', { version: undefined }, '/includedProfile/0/criterion/0/version'],
241
+ ['criterion.status', { status: undefined }, '/includedProfile/0/criterion/0/status'],
242
+ ])('throws with a missing-required-field failure when %s is missing', (_, override, pointer) => {
243
+ const doc = minimalSchemeDoc({ includedProfile: [profile({ criterion: [criterion(override)] })] });
244
+ const error = (() => {
245
+ try {
246
+ parseConformityScheme(doc, { sourceUrl: 'https://example.com/scheme' });
247
+ return undefined;
248
+ }
249
+ catch (e) {
250
+ return e;
251
+ }
252
+ })();
253
+ expect(error).toBeInstanceOf(ConformitySchemeParseError);
254
+ expect(error.failures).toEqual(expect.arrayContaining([
255
+ expect.objectContaining({ code: 'conformity-scheme.missing-required-field', pointer }),
256
+ ]));
257
+ });
258
+ it('throws with an invalid-shape failure when includedProfile is not an array', () => {
259
+ const doc = minimalSchemeDoc({ includedProfile: 'not-an-array' });
260
+ const error = (() => {
261
+ try {
262
+ parseConformityScheme(doc, { sourceUrl: 'https://example.com/scheme' });
263
+ return undefined;
264
+ }
265
+ catch (e) {
266
+ return e;
267
+ }
268
+ })();
269
+ expect(error).toBeInstanceOf(ConformitySchemeParseError);
270
+ expect(error.failures).toEqual(expect.arrayContaining([
271
+ expect.objectContaining({ code: 'conformity-scheme.invalid-shape', pointer: '/includedProfile' }),
272
+ ]));
273
+ });
274
+ });
275
+ describe('hierarchy', () => {
276
+ it('every concrete error extends ConformityVocabularyError', () => {
277
+ // unsupported version
278
+ expect(() => parseConformityScheme(minimalSchemeDoc(), { sourceUrl: 'x', specVersion: '99.0.0' })).toThrow(ConformityVocabularyError);
279
+ // parse failure
280
+ expect(() => parseConformityScheme(null, { sourceUrl: 'x', specVersion: '0.7.0' })).toThrow(ConformityVocabularyError);
281
+ });
282
+ });
283
+ });
284
+ //# sourceMappingURL=parse-conformity-scheme.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-conformity-scheme.test.js","sourceRoot":"","sources":["../../src/conformity-vocabulary/parse-conformity-scheme.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { ValidationFailure } from '../../structured-error.js';
2
+ import type { ConformityScheme } from '../types.js';
3
+ /**
4
+ * Parses a v0.7.0 ConformityScheme JSON-LD document.
5
+ *
6
+ * Lenient relative to the canonical `ConformityScheme.json` JSON Schema:
7
+ * extracts only the fields downstream consumers need (canonical IDs and
8
+ * the names, versions, statuses of profiles and criteria). Document-level
9
+ * conformance is the upstream JSON Schema validation gate's responsibility
10
+ * (ADR-033 §1).
11
+ *
12
+ * Failures are accumulated into the `failures` sink so a single parse pass
13
+ * surfaces every problem it can detect. The outer `parseConformityScheme`
14
+ * throws a {@link ConformitySchemeParseError} carrying them.
15
+ *
16
+ * @see https://untp.unece.org/docs/specification/ConformityVocabularyCatalog
17
+ * @see https://untp.unece.org/artefacts/schema/v0.7.0/cvc/ConformityScheme.json
18
+ */
19
+ export declare function parseV070ConformityScheme(doc: unknown, sourceUrl: string, failures: ValidationFailure[]): ConformityScheme | undefined;
@@ -0,0 +1,219 @@
1
+ import { asNonEmptyString } from '../../common/as-non-empty-string.js';
2
+ import { makeRequireString } from '../../common/require-string.js';
3
+ const SPEC_VERSION = '0.7.0';
4
+ const INVALID_SHAPE = 'conformity-scheme.invalid-shape';
5
+ const MISSING_REQUIRED_FIELD = 'conformity-scheme.missing-required-field';
6
+ const requireString = makeRequireString(MISSING_REQUIRED_FIELD);
7
+ /**
8
+ * Parses a v0.7.0 ConformityScheme JSON-LD document.
9
+ *
10
+ * Lenient relative to the canonical `ConformityScheme.json` JSON Schema:
11
+ * extracts only the fields downstream consumers need (canonical IDs and
12
+ * the names, versions, statuses of profiles and criteria). Document-level
13
+ * conformance is the upstream JSON Schema validation gate's responsibility
14
+ * (ADR-033 §1).
15
+ *
16
+ * Failures are accumulated into the `failures` sink so a single parse pass
17
+ * surfaces every problem it can detect. The outer `parseConformityScheme`
18
+ * throws a {@link ConformitySchemeParseError} carrying them.
19
+ *
20
+ * @see https://untp.unece.org/docs/specification/ConformityVocabularyCatalog
21
+ * @see https://untp.unece.org/artefacts/schema/v0.7.0/cvc/ConformityScheme.json
22
+ */
23
+ export function parseV070ConformityScheme(doc, sourceUrl, failures) {
24
+ if (!doc || typeof doc !== 'object') {
25
+ failures.push({
26
+ code: INVALID_SHAPE,
27
+ message: 'Conformity scheme document must be a non-null object.',
28
+ received: doc === null ? 'null' : typeof doc,
29
+ expected: 'object',
30
+ pointer: '',
31
+ });
32
+ return undefined;
33
+ }
34
+ const root = doc;
35
+ const canonicalId = requireString(root.id, 'scheme.id', '/id', failures);
36
+ const name = requireString(root.name, 'scheme.name', '/name', failures);
37
+ const profiles = parseProfiles(root.includedProfile, '/includedProfile', failures);
38
+ if (canonicalId === undefined || name === undefined) {
39
+ return undefined;
40
+ }
41
+ return {
42
+ canonicalId,
43
+ sourceUrl,
44
+ specVersion: SPEC_VERSION,
45
+ name,
46
+ description: asNonEmptyString(root.description),
47
+ documentation: asNonEmptyString(root.documentation),
48
+ owner: parseOwner(root.owner),
49
+ profiles,
50
+ };
51
+ }
52
+ function parseProfiles(input, pointer, failures) {
53
+ if (input === undefined || input === null) {
54
+ return [];
55
+ }
56
+ if (!Array.isArray(input)) {
57
+ failures.push({
58
+ code: INVALID_SHAPE,
59
+ message: 'scheme.includedProfile must be an array.',
60
+ received: typeof input,
61
+ expected: 'array',
62
+ pointer,
63
+ });
64
+ return [];
65
+ }
66
+ const out = [];
67
+ input.forEach((entry, i) => {
68
+ const parsed = parseProfile(entry, i, `${pointer}/${i}`, failures);
69
+ if (parsed) {
70
+ out.push(parsed);
71
+ }
72
+ });
73
+ return out;
74
+ }
75
+ function parseProfile(input, index, pointer, failures) {
76
+ if (!input || typeof input !== 'object') {
77
+ failures.push({
78
+ code: INVALID_SHAPE,
79
+ message: `Profile at index ${index} must be a non-null object.`,
80
+ received: input === null ? 'null' : typeof input,
81
+ expected: 'object',
82
+ pointer,
83
+ });
84
+ return undefined;
85
+ }
86
+ const p = input;
87
+ const canonicalId = requireString(p.id, `profile[${index}].id`, `${pointer}/id`, failures);
88
+ const name = requireString(p.name, `profile[${index}].name`, `${pointer}/name`, failures);
89
+ const version = requireString(p.version, `profile[${index}].version`, `${pointer}/version`, failures);
90
+ const status = requireString(p.status, `profile[${index}].status`, `${pointer}/status`, failures);
91
+ const criteria = parseCriteria(p.criterion, `${pointer}/criterion`, failures);
92
+ if (!canonicalId || !name || !version || !status) {
93
+ return undefined;
94
+ }
95
+ return {
96
+ canonicalId,
97
+ name,
98
+ version,
99
+ status,
100
+ description: asNonEmptyString(p.description),
101
+ documentation: asNonEmptyString(p.documentation),
102
+ validFrom: asNonEmptyString(p.validFrom),
103
+ criteria,
104
+ };
105
+ }
106
+ function parseCriteria(input, pointer, failures) {
107
+ if (input === undefined || input === null) {
108
+ return [];
109
+ }
110
+ if (!Array.isArray(input)) {
111
+ failures.push({
112
+ code: INVALID_SHAPE,
113
+ message: 'profile.criterion must be an array.',
114
+ received: typeof input,
115
+ expected: 'array',
116
+ pointer,
117
+ });
118
+ return [];
119
+ }
120
+ const out = [];
121
+ input.forEach((entry, i) => {
122
+ const parsed = parseCriterion(entry, `${pointer}/${i}`, failures);
123
+ if (parsed) {
124
+ out.push(parsed);
125
+ }
126
+ });
127
+ return out;
128
+ }
129
+ function parseCriterion(input, pointer, failures) {
130
+ if (!input || typeof input !== 'object') {
131
+ failures.push({
132
+ code: INVALID_SHAPE,
133
+ message: 'Criterion must be a non-null object.',
134
+ received: input === null ? 'null' : typeof input,
135
+ expected: 'object',
136
+ pointer,
137
+ });
138
+ return undefined;
139
+ }
140
+ const c = input;
141
+ const canonicalId = requireString(c.id, 'criterion.id', `${pointer}/id`, failures);
142
+ const name = requireString(c.name, 'criterion.name', `${pointer}/name`, failures);
143
+ const version = requireString(c.version, 'criterion.version', `${pointer}/version`, failures);
144
+ const status = requireString(c.status, 'criterion.status', `${pointer}/status`, failures);
145
+ if (!canonicalId || !name || !version || !status) {
146
+ return undefined;
147
+ }
148
+ return {
149
+ canonicalId,
150
+ name,
151
+ version,
152
+ status,
153
+ description: asNonEmptyString(c.description),
154
+ documentation: asNonEmptyString(c.documentation),
155
+ topics: parseTopics(c.conformityTopic),
156
+ tags: parseTags(c.tag),
157
+ };
158
+ }
159
+ function parseTopics(input) {
160
+ if (input === undefined || input === null) {
161
+ return [];
162
+ }
163
+ if (!Array.isArray(input)) {
164
+ const single = parseTopic(input);
165
+ return single ? [single] : [];
166
+ }
167
+ const out = [];
168
+ for (const entry of input) {
169
+ const parsed = parseTopic(entry);
170
+ if (parsed) {
171
+ out.push(parsed);
172
+ }
173
+ }
174
+ return out;
175
+ }
176
+ function parseTopic(input) {
177
+ if (typeof input === 'string') {
178
+ if (!input) {
179
+ return undefined;
180
+ }
181
+ return { canonicalId: input };
182
+ }
183
+ if (!input || typeof input !== 'object') {
184
+ return undefined;
185
+ }
186
+ const t = input;
187
+ const id = asNonEmptyString(t.id);
188
+ if (!id) {
189
+ return undefined;
190
+ }
191
+ return {
192
+ canonicalId: id,
193
+ name: asNonEmptyString(t.name),
194
+ definition: asNonEmptyString(t.definition),
195
+ };
196
+ }
197
+ function parseTags(input) {
198
+ if (typeof input === 'string' && input.length > 0) {
199
+ return [input];
200
+ }
201
+ if (!Array.isArray(input)) {
202
+ return [];
203
+ }
204
+ return input.filter((entry) => typeof entry === 'string' && entry.length > 0);
205
+ }
206
+ function parseOwner(input) {
207
+ if (typeof input === 'string' && input.length > 0) {
208
+ return { canonicalId: input };
209
+ }
210
+ if (!input || typeof input !== 'object' || Array.isArray(input)) {
211
+ return undefined;
212
+ }
213
+ const o = input;
214
+ return {
215
+ canonicalId: asNonEmptyString(o.id),
216
+ name: asNonEmptyString(o.name),
217
+ };
218
+ }
219
+ //# sourceMappingURL=v0-7-0.parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v0-7-0.parser.js","sourceRoot":"","sources":["../../../src/conformity-vocabulary/parsers/v0-7-0.parser.ts"],"names":[],"mappings":"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"}