@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,44 @@
1
+ import { StructuredError, type ValidationFailure } from '../structured-error.js';
2
+ /**
3
+ * Base for every diagnostic from `@uncefact/untp-utils/conformity-vocabulary`
4
+ * (scheme parsing, catalogue parsing, claim validation). Catch to handle any
5
+ * conformity-vocabulary failure generically; catch a concrete subclass for
6
+ * specific handling.
7
+ */
8
+ export declare class ConformityVocabularyError extends StructuredError {
9
+ }
10
+ /**
11
+ * The document's CVC spec version could not be detected, or is not
12
+ * supported by this build. Fail-fast: parsing aborts before per-field
13
+ * checks run.
14
+ */
15
+ export declare class ConformityUnsupportedSpecVersionError extends ConformityVocabularyError {
16
+ constructor(received: string | undefined, supported: readonly string[]);
17
+ }
18
+ /**
19
+ * The scheme document failed structural parsing. Carries every per-field
20
+ * failure (invalid shape, missing required field) in {@link failures};
21
+ * each entry has a stable `code` (`'conformity-scheme.invalid-shape'` or
22
+ * `'conformity-scheme.missing-required-field'`) plus the Ajv-style
23
+ * `pointer`, `received`, and `expected`.
24
+ */
25
+ export declare class ConformitySchemeParseError extends ConformityVocabularyError {
26
+ readonly failures: readonly ValidationFailure[];
27
+ constructor(failures: readonly ValidationFailure[]);
28
+ }
29
+ /**
30
+ * The UNTP Conformity Vocabulary Catalogue Register document failed
31
+ * structural parsing. Carries every per-entry / per-field failure in
32
+ * {@link failures} (codes `'conformity-catalogue.invalid-shape'` or
33
+ * `'conformity-catalogue.missing-required-field'`, with the Ajv-style
34
+ * `pointer`). {@link sourceUrl} is set when the parser was invoked with
35
+ * the URL the register was fetched from, for operator-side triage.
36
+ */
37
+ export declare class ConformityCatalogueParseError extends ConformityVocabularyError {
38
+ readonly failures: readonly ValidationFailure[];
39
+ readonly sourceUrl?: string;
40
+ constructor(args: {
41
+ failures: readonly ValidationFailure[];
42
+ sourceUrl?: string;
43
+ });
44
+ }
@@ -0,0 +1,68 @@
1
+ import { StructuredError } from '../structured-error.js';
2
+ /**
3
+ * Base for every diagnostic from `@uncefact/untp-utils/conformity-vocabulary`
4
+ * (scheme parsing, catalogue parsing, claim validation). Catch to handle any
5
+ * conformity-vocabulary failure generically; catch a concrete subclass for
6
+ * specific handling.
7
+ */
8
+ export class ConformityVocabularyError extends StructuredError {
9
+ }
10
+ /**
11
+ * The document's CVC spec version could not be detected, or is not
12
+ * supported by this build. Fail-fast: parsing aborts before per-field
13
+ * checks run.
14
+ */
15
+ export class ConformityUnsupportedSpecVersionError extends ConformityVocabularyError {
16
+ constructor(received, supported) {
17
+ super({
18
+ code: 'conformity-scheme.unsupported-spec-version',
19
+ message: received === undefined
20
+ ? "Could not detect CVC spec version from the document's @context, and no override was supplied."
21
+ : `CVC spec version '${received}' is not supported by this build.`,
22
+ received: received ?? 'undetected',
23
+ expected: supported,
24
+ pointer: received === undefined ? '/@context' : undefined,
25
+ });
26
+ }
27
+ }
28
+ /**
29
+ * The scheme document failed structural parsing. Carries every per-field
30
+ * failure (invalid shape, missing required field) in {@link failures};
31
+ * each entry has a stable `code` (`'conformity-scheme.invalid-shape'` or
32
+ * `'conformity-scheme.missing-required-field'`) plus the Ajv-style
33
+ * `pointer`, `received`, and `expected`.
34
+ */
35
+ export class ConformitySchemeParseError extends ConformityVocabularyError {
36
+ failures;
37
+ constructor(failures) {
38
+ super({
39
+ code: 'conformity-scheme.parse-failed',
40
+ message: `Conformity scheme failed to parse with ${failures.length} failure(s).`,
41
+ });
42
+ this.failures = failures;
43
+ }
44
+ }
45
+ /**
46
+ * The UNTP Conformity Vocabulary Catalogue Register document failed
47
+ * structural parsing. Carries every per-entry / per-field failure in
48
+ * {@link failures} (codes `'conformity-catalogue.invalid-shape'` or
49
+ * `'conformity-catalogue.missing-required-field'`, with the Ajv-style
50
+ * `pointer`). {@link sourceUrl} is set when the parser was invoked with
51
+ * the URL the register was fetched from, for operator-side triage.
52
+ */
53
+ export class ConformityCatalogueParseError extends ConformityVocabularyError {
54
+ failures;
55
+ sourceUrl;
56
+ constructor(args) {
57
+ super({
58
+ code: 'conformity-catalogue.parse-failed',
59
+ message: args.sourceUrl !== undefined
60
+ ? `Conformity catalogue at ${args.sourceUrl} failed to parse with ${args.failures.length} failure(s).`
61
+ : `Conformity catalogue failed to parse with ${args.failures.length} failure(s).`,
62
+ });
63
+ this.failures = args.failures;
64
+ if (args.sourceUrl !== undefined)
65
+ this.sourceUrl = args.sourceUrl;
66
+ }
67
+ }
68
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/conformity-vocabulary/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAA0B,MAAM,wBAAwB,CAAC;AAEjF;;;;;GAKG;AACH,MAAM,OAAO,yBAA0B,SAAQ,eAAe;CAAG;AAEjE;;;;GAIG;AACH,MAAM,OAAO,qCAAsC,SAAQ,yBAAyB;IAClF,YAAY,QAA4B,EAAE,SAA4B;QACpE,KAAK,CAAC;YACJ,IAAI,EAAE,4CAA4C;YAClD,OAAO,EACL,QAAQ,KAAK,SAAS;gBACpB,CAAC,CAAC,+FAA+F;gBACjG,CAAC,CAAC,qBAAqB,QAAQ,mCAAmC;YACtE,QAAQ,EAAE,QAAQ,IAAI,YAAY;YAClC,QAAQ,EAAE,SAAS;YACnB,OAAO,EAAE,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;SAC1D,CAAC,CAAC;IACL,CAAC;CACF;AAED;;;;;;GAMG;AACH,MAAM,OAAO,0BAA2B,SAAQ,yBAAyB;IAC9D,QAAQ,CAA+B;IAChD,YAAY,QAAsC;QAChD,KAAK,CAAC;YACJ,IAAI,EAAE,gCAAgC;YACtC,OAAO,EAAE,0CAA0C,QAAQ,CAAC,MAAM,cAAc;SACjF,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,6BAA8B,SAAQ,yBAAyB;IACjE,QAAQ,CAA+B;IACvC,SAAS,CAAU;IAC5B,YAAY,IAAoE;QAC9E,KAAK,CAAC;YACJ,IAAI,EAAE,mCAAmC;YACzC,OAAO,EACL,IAAI,CAAC,SAAS,KAAK,SAAS;gBAC1B,CAAC,CAAC,2BAA2B,IAAI,CAAC,SAAS,yBAAyB,IAAI,CAAC,QAAQ,CAAC,MAAM,cAAc;gBACtG,CAAC,CAAC,6CAA6C,IAAI,CAAC,QAAQ,CAAC,MAAM,cAAc;SACtF,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;YAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IACpE,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ export * from './types.js';
2
+ export { ConformityWarningCode } from './codes.js';
3
+ export { ConformityVocabularyError, ConformityUnsupportedSpecVersionError, ConformitySchemeParseError, ConformityCatalogueParseError, } from './errors.js';
4
+ export { parseConformityScheme, SUPPORTED_CVC_SPEC_VERSIONS, type ParseConformitySchemeOptions, type SupportedCvcSpecVersion, } from './parse-conformity-scheme.js';
5
+ export { parseConformityCatalogue } from './parse-conformity-catalogue.js';
6
+ export { validateConformityClaim } from './validate-conformity-claim.js';
@@ -0,0 +1,7 @@
1
+ export * from './types.js';
2
+ export { ConformityWarningCode } from './codes.js';
3
+ export { ConformityVocabularyError, ConformityUnsupportedSpecVersionError, ConformitySchemeParseError, ConformityCatalogueParseError, } from './errors.js';
4
+ export { parseConformityScheme, SUPPORTED_CVC_SPEC_VERSIONS, } from './parse-conformity-scheme.js';
5
+ export { parseConformityCatalogue } from './parse-conformity-catalogue.js';
6
+ export { validateConformityClaim } from './validate-conformity-claim.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/conformity-vocabulary/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EACL,yBAAyB,EACzB,qCAAqC,EACrC,0BAA0B,EAC1B,6BAA6B,GAC9B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,qBAAqB,EACrB,2BAA2B,GAG5B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { ConformityCatalogueEntry } from './types.js';
2
+ export interface ParseConformityCatalogueOptions {
3
+ /**
4
+ * URL the register was fetched from. Surfaces on
5
+ * {@link ConformityCatalogueParseError.sourceUrl} for operator triage when
6
+ * a parse fails.
7
+ */
8
+ sourceUrl?: string;
9
+ }
10
+ /**
11
+ * Parses the UNTP Conformity Vocabulary Catalogue Register document into a
12
+ * list of {@link ConformityCatalogueEntry}s. Each entry pairs the
13
+ * CVC-canonical scheme URI with the owner-published vocabulary URL,
14
+ * plus the human-readable name and optional lifecycle status.
15
+ *
16
+ * Lenient on per-entry fields beyond the ingestion-essential ones: optional
17
+ * metadata (owner, geographic scope, sector, etc.) is not surfaced here.
18
+ *
19
+ * @throws {ConformityCatalogueParseError} carrying every per-field failure
20
+ * in `failures[]` if the document is structurally invalid.
21
+ *
22
+ * @see https://untp.unece.org/docs/specification/ConformityVocabularyCatalog
23
+ */
24
+ export declare function parseConformityCatalogue(doc: unknown, options?: ParseConformityCatalogueOptions): {
25
+ entries: readonly ConformityCatalogueEntry[];
26
+ };
@@ -0,0 +1,106 @@
1
+ import { asNonEmptyString } from '../common/as-non-empty-string.js';
2
+ import { makeRequireString } from '../common/require-string.js';
3
+ import { ConformityCatalogueParseError } from './errors.js';
4
+ const INVALID_SHAPE = 'conformity-catalogue.invalid-shape';
5
+ const MISSING_REQUIRED_FIELD = 'conformity-catalogue.missing-required-field';
6
+ const requireString = makeRequireString(MISSING_REQUIRED_FIELD);
7
+ /**
8
+ * Parses the UNTP Conformity Vocabulary Catalogue Register document into a
9
+ * list of {@link ConformityCatalogueEntry}s. Each entry pairs the
10
+ * CVC-canonical scheme URI with the owner-published vocabulary URL,
11
+ * plus the human-readable name and optional lifecycle status.
12
+ *
13
+ * Lenient on per-entry fields beyond the ingestion-essential ones: optional
14
+ * metadata (owner, geographic scope, sector, etc.) is not surfaced here.
15
+ *
16
+ * @throws {ConformityCatalogueParseError} carrying every per-field failure
17
+ * in `failures[]` if the document is structurally invalid.
18
+ *
19
+ * @see https://untp.unece.org/docs/specification/ConformityVocabularyCatalog
20
+ */
21
+ export function parseConformityCatalogue(doc, options) {
22
+ const failures = [];
23
+ const sourceUrl = options?.sourceUrl;
24
+ if (!doc || typeof doc !== 'object') {
25
+ failures.push({
26
+ code: INVALID_SHAPE,
27
+ message: 'Conformity catalogue document must be a non-null object.',
28
+ received: doc === null ? 'null' : typeof doc,
29
+ expected: 'object',
30
+ pointer: '',
31
+ });
32
+ throw new ConformityCatalogueParseError({ failures, sourceUrl });
33
+ }
34
+ const root = doc;
35
+ const rawEntries = root.entries;
36
+ if (rawEntries === undefined || rawEntries === null) {
37
+ failures.push({
38
+ code: MISSING_REQUIRED_FIELD,
39
+ message: 'Conformity catalogue document must include an `entries` array.',
40
+ received: rawEntries === null ? 'null' : 'undefined',
41
+ expected: 'array',
42
+ pointer: '/entries',
43
+ });
44
+ throw new ConformityCatalogueParseError({ failures, sourceUrl });
45
+ }
46
+ if (!Array.isArray(rawEntries)) {
47
+ failures.push({
48
+ code: INVALID_SHAPE,
49
+ message: 'Conformity catalogue `entries` must be an array.',
50
+ received: typeof rawEntries,
51
+ expected: 'array',
52
+ pointer: '/entries',
53
+ });
54
+ throw new ConformityCatalogueParseError({ failures, sourceUrl });
55
+ }
56
+ const entries = [];
57
+ rawEntries.forEach((rawEntry, i) => {
58
+ const parsed = parseEntry(rawEntry, `/entries/${i}`, failures);
59
+ if (parsed)
60
+ entries.push(parsed);
61
+ });
62
+ if (failures.length > 0) {
63
+ throw new ConformityCatalogueParseError({ failures, sourceUrl });
64
+ }
65
+ return { entries };
66
+ }
67
+ function parseEntry(input, pointer, failures) {
68
+ if (!input || typeof input !== 'object') {
69
+ failures.push({
70
+ code: INVALID_SHAPE,
71
+ message: 'Catalogue entry must be a non-null object.',
72
+ received: input === null ? 'null' : typeof input,
73
+ expected: 'object',
74
+ pointer,
75
+ });
76
+ return undefined;
77
+ }
78
+ const entry = input;
79
+ const canonicalId = requireString(entry.id, 'entry.id', `${pointer}/id`, failures);
80
+ const vocabularyUrl = requireString(entry.vocabularyURL, 'entry.vocabularyURL', `${pointer}/vocabularyURL`, failures);
81
+ const name = requireString(entry.name, 'entry.name', `${pointer}/name`, failures);
82
+ const status = asNonEmptyString(entry.status);
83
+ if (vocabularyUrl !== undefined && !isParseableUrl(vocabularyUrl)) {
84
+ failures.push({
85
+ code: INVALID_SHAPE,
86
+ message: 'entry.vocabularyURL must be a parseable URL.',
87
+ received: vocabularyUrl,
88
+ expected: 'a string parseable by the URL constructor',
89
+ pointer: `${pointer}/vocabularyURL`,
90
+ });
91
+ return undefined;
92
+ }
93
+ if (!canonicalId || !vocabularyUrl || !name)
94
+ return undefined;
95
+ return status !== undefined ? { canonicalId, vocabularyUrl, name, status } : { canonicalId, vocabularyUrl, name };
96
+ }
97
+ function isParseableUrl(value) {
98
+ try {
99
+ new URL(value);
100
+ return true;
101
+ }
102
+ catch {
103
+ return false;
104
+ }
105
+ }
106
+ //# sourceMappingURL=parse-conformity-catalogue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-conformity-catalogue.js","sourceRoot":"","sources":["../../src/conformity-vocabulary/parse-conformity-catalogue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,327 @@
1
+ import { ConformityVocabularyError, ConformityCatalogueParseError } from './errors.js';
2
+ import { parseConformityCatalogue } from './parse-conformity-catalogue.js';
3
+ const REGISTER_CONTEXT = ['https://example.com/context/register'];
4
+ function entry(overrides = {}) {
5
+ return {
6
+ '@type': ['ConformityVocabularyCatalogueEntry', 'ConformityScheme'],
7
+ id: 'https://example.com/registry/example',
8
+ name: 'Example Scheme',
9
+ vocabularyURL: 'https://vocab.example.com/scheme',
10
+ ...overrides,
11
+ };
12
+ }
13
+ function registerDoc(overrides = {}) {
14
+ return {
15
+ '@context': REGISTER_CONTEXT,
16
+ '@type': ['ConformityVocabularyCatalogueRegister', 'Register'],
17
+ id: 'https://example.com/registry',
18
+ name: 'Test Register',
19
+ entries: [],
20
+ ...overrides,
21
+ };
22
+ }
23
+ describe('parseConformityCatalogue', () => {
24
+ describe('happy path', () => {
25
+ it('returns an empty entries array when the register has no entries', () => {
26
+ expect(parseConformityCatalogue(registerDoc())).toEqual({ entries: [] });
27
+ });
28
+ it('returns one entry per register entry with the three required fields', () => {
29
+ const doc = registerDoc({
30
+ entries: [
31
+ entry({
32
+ id: 'https://example.com/registry/scheme-a',
33
+ name: 'Scheme A',
34
+ vocabularyURL: 'https://vocab.example.com/scheme-a',
35
+ }),
36
+ entry({
37
+ id: 'https://example.com/registry/scheme-b',
38
+ name: 'Scheme B',
39
+ vocabularyURL: 'https://vocab.example.org/scheme-b',
40
+ }),
41
+ ],
42
+ });
43
+ expect(parseConformityCatalogue(doc).entries).toEqual([
44
+ {
45
+ canonicalId: 'https://example.com/registry/scheme-a',
46
+ vocabularyUrl: 'https://vocab.example.com/scheme-a',
47
+ name: 'Scheme A',
48
+ },
49
+ {
50
+ canonicalId: 'https://example.com/registry/scheme-b',
51
+ vocabularyUrl: 'https://vocab.example.org/scheme-b',
52
+ name: 'Scheme B',
53
+ },
54
+ ]);
55
+ });
56
+ it('ignores extra metadata fields on each entry', () => {
57
+ const doc = registerDoc({
58
+ entries: [
59
+ entry({
60
+ owner: { id: 'did:web:example.com', name: 'Example Org', website: 'https://example.com' },
61
+ shortName: 'EX',
62
+ statement: 'A statement.',
63
+ industrySector: { id: 'foo' },
64
+ geographicScope: { id: 'bar' },
65
+ endorsementLevel: 'Self',
66
+ licenseType: 'ProprietaryDocument',
67
+ profiles: [{ id: 'https://example.com/profile/1' }],
68
+ }),
69
+ ],
70
+ });
71
+ const { entries } = parseConformityCatalogue(doc);
72
+ expect(entries).toHaveLength(1);
73
+ expect(entries[0]).toEqual({
74
+ canonicalId: 'https://example.com/registry/example',
75
+ vocabularyUrl: 'https://vocab.example.com/scheme',
76
+ name: 'Example Scheme',
77
+ });
78
+ });
79
+ });
80
+ describe('parse failures (accumulating)', () => {
81
+ it('throws ConformityCatalogueParseError with an invalid-shape failure when the document is not an object', () => {
82
+ const error = (() => {
83
+ try {
84
+ parseConformityCatalogue(null);
85
+ return undefined;
86
+ }
87
+ catch (e) {
88
+ return e;
89
+ }
90
+ })();
91
+ expect(error).toBeInstanceOf(ConformityCatalogueParseError);
92
+ expect(error.failures).toEqual([
93
+ expect.objectContaining({
94
+ code: 'conformity-catalogue.invalid-shape',
95
+ received: 'null',
96
+ }),
97
+ ]);
98
+ });
99
+ it('throws when entries is missing', () => {
100
+ const doc = registerDoc({ entries: undefined });
101
+ const error = (() => {
102
+ try {
103
+ parseConformityCatalogue(doc);
104
+ return undefined;
105
+ }
106
+ catch (e) {
107
+ return e;
108
+ }
109
+ })();
110
+ expect(error).toBeInstanceOf(ConformityCatalogueParseError);
111
+ expect(error.failures).toEqual([
112
+ expect.objectContaining({
113
+ code: 'conformity-catalogue.missing-required-field',
114
+ pointer: '/entries',
115
+ received: 'undefined',
116
+ }),
117
+ ]);
118
+ });
119
+ it('throws when entries is null (reports `null`, not `undefined`)', () => {
120
+ const doc = registerDoc({ entries: null });
121
+ const error = (() => {
122
+ try {
123
+ parseConformityCatalogue(doc);
124
+ return undefined;
125
+ }
126
+ catch (e) {
127
+ return e;
128
+ }
129
+ })();
130
+ expect(error).toBeInstanceOf(ConformityCatalogueParseError);
131
+ expect(error.failures).toEqual([
132
+ expect.objectContaining({
133
+ code: 'conformity-catalogue.missing-required-field',
134
+ pointer: '/entries',
135
+ received: 'null',
136
+ }),
137
+ ]);
138
+ });
139
+ it('throws when entries is not an array', () => {
140
+ const doc = registerDoc({ entries: 'not-an-array' });
141
+ const error = (() => {
142
+ try {
143
+ parseConformityCatalogue(doc);
144
+ return undefined;
145
+ }
146
+ catch (e) {
147
+ return e;
148
+ }
149
+ })();
150
+ expect(error).toBeInstanceOf(ConformityCatalogueParseError);
151
+ expect(error.failures).toEqual([
152
+ expect.objectContaining({
153
+ code: 'conformity-catalogue.invalid-shape',
154
+ pointer: '/entries',
155
+ }),
156
+ ]);
157
+ });
158
+ it.each([
159
+ ['entry.id', { id: undefined }, '/entries/0/id'],
160
+ ['entry.name', { name: undefined }, '/entries/0/name'],
161
+ ['entry.vocabularyURL', { vocabularyURL: undefined }, '/entries/0/vocabularyURL'],
162
+ ])('throws with a missing-required-field failure when %s is missing', (_label, override, pointer) => {
163
+ const doc = registerDoc({ entries: [entry(override)] });
164
+ const error = (() => {
165
+ try {
166
+ parseConformityCatalogue(doc);
167
+ return undefined;
168
+ }
169
+ catch (e) {
170
+ return e;
171
+ }
172
+ })();
173
+ expect(error).toBeInstanceOf(ConformityCatalogueParseError);
174
+ expect(error.failures).toEqual(expect.arrayContaining([
175
+ expect.objectContaining({ code: 'conformity-catalogue.missing-required-field', pointer }),
176
+ ]));
177
+ });
178
+ it('accumulates failures from every malformed entry in one pass', () => {
179
+ const doc = registerDoc({
180
+ entries: [entry(), entry({ id: undefined }), entry({ vocabularyURL: undefined }), entry({ name: undefined })],
181
+ });
182
+ const error = (() => {
183
+ try {
184
+ parseConformityCatalogue(doc);
185
+ return undefined;
186
+ }
187
+ catch (e) {
188
+ return e;
189
+ }
190
+ })();
191
+ expect(error).toBeInstanceOf(ConformityCatalogueParseError);
192
+ const failures = error.failures;
193
+ expect(failures).toHaveLength(3);
194
+ expect(failures.map((f) => f.pointer).sort()).toEqual([
195
+ '/entries/1/id',
196
+ '/entries/2/vocabularyURL',
197
+ '/entries/3/name',
198
+ ]);
199
+ });
200
+ it('accumulates all three field failures when a single entry is missing every required field (no intra-entry short-circuit)', () => {
201
+ const doc = registerDoc({
202
+ entries: [entry({ id: undefined, vocabularyURL: undefined, name: undefined })],
203
+ });
204
+ const error = (() => {
205
+ try {
206
+ parseConformityCatalogue(doc);
207
+ return undefined;
208
+ }
209
+ catch (e) {
210
+ return e;
211
+ }
212
+ })();
213
+ expect(error).toBeInstanceOf(ConformityCatalogueParseError);
214
+ const failures = error.failures;
215
+ expect(failures).toHaveLength(3);
216
+ expect(failures.map((f) => f.pointer).sort()).toEqual([
217
+ '/entries/0/id',
218
+ '/entries/0/name',
219
+ '/entries/0/vocabularyURL',
220
+ ]);
221
+ expect(failures.every((f) => f.code === 'conformity-catalogue.missing-required-field')).toBe(true);
222
+ });
223
+ it('throws when an entry is not an object', () => {
224
+ const doc = registerDoc({ entries: [entry(), 'not-an-object', null] });
225
+ const error = (() => {
226
+ try {
227
+ parseConformityCatalogue(doc);
228
+ return undefined;
229
+ }
230
+ catch (e) {
231
+ return e;
232
+ }
233
+ })();
234
+ expect(error).toBeInstanceOf(ConformityCatalogueParseError);
235
+ const failures = error.failures;
236
+ expect(failures.map((f) => f.pointer).sort()).toEqual(['/entries/1', '/entries/2']);
237
+ });
238
+ it('accumulates invalid-shape and missing-required-field failures across entries in one pass', () => {
239
+ const doc = registerDoc({
240
+ entries: [entry(), 'not-an-object', entry({ id: undefined })],
241
+ });
242
+ const error = (() => {
243
+ try {
244
+ parseConformityCatalogue(doc);
245
+ return undefined;
246
+ }
247
+ catch (e) {
248
+ return e;
249
+ }
250
+ })();
251
+ expect(error).toBeInstanceOf(ConformityCatalogueParseError);
252
+ const failures = error.failures;
253
+ const codes = failures.map((f) => f.code).sort();
254
+ expect(codes).toEqual(['conformity-catalogue.invalid-shape', 'conformity-catalogue.missing-required-field']);
255
+ });
256
+ it('throws when vocabularyURL is not a parseable URL', () => {
257
+ const doc = registerDoc({ entries: [entry({ vocabularyURL: 'not a url' })] });
258
+ const error = (() => {
259
+ try {
260
+ parseConformityCatalogue(doc);
261
+ return undefined;
262
+ }
263
+ catch (e) {
264
+ return e;
265
+ }
266
+ })();
267
+ expect(error).toBeInstanceOf(ConformityCatalogueParseError);
268
+ expect(error.failures).toEqual([
269
+ expect.objectContaining({
270
+ code: 'conformity-catalogue.invalid-shape',
271
+ pointer: '/entries/0/vocabularyURL',
272
+ received: 'not a url',
273
+ }),
274
+ ]);
275
+ });
276
+ });
277
+ describe('status', () => {
278
+ it('extracts entry.status when present', () => {
279
+ const doc = registerDoc({ entries: [entry({ status: 'active' })] });
280
+ const { entries } = parseConformityCatalogue(doc);
281
+ expect(entries[0].status).toBe('active');
282
+ });
283
+ it('omits status when entry.status is absent', () => {
284
+ const { entries } = parseConformityCatalogue(registerDoc({ entries: [entry()] }));
285
+ expect(entries[0].status).toBeUndefined();
286
+ });
287
+ it('omits status when entry.status is the empty string', () => {
288
+ const { entries } = parseConformityCatalogue(registerDoc({ entries: [entry({ status: '' })] }));
289
+ expect(entries[0].status).toBeUndefined();
290
+ });
291
+ });
292
+ describe('options.sourceUrl', () => {
293
+ it('attaches sourceUrl to the thrown error when supplied', () => {
294
+ const error = (() => {
295
+ try {
296
+ parseConformityCatalogue(null, { sourceUrl: 'https://example.com/registry.json' });
297
+ return undefined;
298
+ }
299
+ catch (e) {
300
+ return e;
301
+ }
302
+ })();
303
+ expect(error).toBeInstanceOf(ConformityCatalogueParseError);
304
+ expect(error.sourceUrl).toBe('https://example.com/registry.json');
305
+ expect(error.message).toContain('https://example.com/registry.json');
306
+ });
307
+ it('leaves sourceUrl undefined when not supplied', () => {
308
+ const error = (() => {
309
+ try {
310
+ parseConformityCatalogue(null);
311
+ return undefined;
312
+ }
313
+ catch (e) {
314
+ return e;
315
+ }
316
+ })();
317
+ expect(error).toBeInstanceOf(ConformityCatalogueParseError);
318
+ expect(error.sourceUrl).toBeUndefined();
319
+ });
320
+ });
321
+ describe('hierarchy', () => {
322
+ it('extends ConformityVocabularyError (the sub-entry umbrella)', () => {
323
+ expect(() => parseConformityCatalogue(null)).toThrow(ConformityVocabularyError);
324
+ });
325
+ });
326
+ });
327
+ //# sourceMappingURL=parse-conformity-catalogue.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-conformity-catalogue.test.js","sourceRoot":"","sources":["../../src/conformity-vocabulary/parse-conformity-catalogue.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAE3E,MAAM,gBAAgB,GAAG,CAAC,sCAAsC,CAAC,CAAC;AAElE,SAAS,KAAK,CAAC,YAAqC,EAAE;IACpD,OAAO;QACL,OAAO,EAAE,CAAC,oCAAoC,EAAE,kBAAkB,CAAC;QACnE,EAAE,EAAE,sCAAsC;QAC1C,IAAI,EAAE,gBAAgB;QACtB,aAAa,EAAE,kCAAkC;QACjD,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,YAAqC,EAAE;IAC1D,OAAO;QACL,UAAU,EAAE,gBAAgB;QAC5B,OAAO,EAAE,CAAC,uCAAuC,EAAE,UAAU,CAAC;QAC9D,EAAE,EAAE,8BAA8B;QAClC,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,EAAE;QACX,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;YACzE,MAAM,CAAC,wBAAwB,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;YAC7E,MAAM,GAAG,GAAG,WAAW,CAAC;gBACtB,OAAO,EAAE;oBACP,KAAK,CAAC;wBACJ,EAAE,EAAE,uCAAuC;wBAC3C,IAAI,EAAE,UAAU;wBAChB,aAAa,EAAE,oCAAoC;qBACpD,CAAC;oBACF,KAAK,CAAC;wBACJ,EAAE,EAAE,uCAAuC;wBAC3C,IAAI,EAAE,UAAU;wBAChB,aAAa,EAAE,oCAAoC;qBACpD,CAAC;iBACH;aACF,CAAC,CAAC;YAEH,MAAM,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;gBACpD;oBACE,WAAW,EAAE,uCAAuC;oBACpD,aAAa,EAAE,oCAAoC;oBACnD,IAAI,EAAE,UAAU;iBACjB;gBACD;oBACE,WAAW,EAAE,uCAAuC;oBACpD,aAAa,EAAE,oCAAoC;oBACnD,IAAI,EAAE,UAAU;iBACjB;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,GAAG,GAAG,WAAW,CAAC;gBACtB,OAAO,EAAE;oBACP,KAAK,CAAC;wBACJ,KAAK,EAAE,EAAE,EAAE,EAAE,qBAAqB,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,qBAAqB,EAAE;wBACzF,SAAS,EAAE,IAAI;wBACf,SAAS,EAAE,cAAc;wBACzB,cAAc,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE;wBAC7B,eAAe,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE;wBAC9B,gBAAgB,EAAE,MAAM;wBACxB,WAAW,EAAE,qBAAqB;wBAClC,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,+BAA+B,EAAE,CAAC;qBACpD,CAAC;iBACH;aACF,CAAC,CAAC;YAEH,MAAM,EAAE,OAAO,EAAE,GAAG,wBAAwB,CAAC,GAAG,CAAC,CAAC;YAClD,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;gBACzB,WAAW,EAAE,sCAAsC;gBACnD,aAAa,EAAE,kCAAkC;gBACjD,IAAI,EAAE,gBAAgB;aACvB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;QAC7C,EAAE,CAAC,uGAAuG,EAAE,GAAG,EAAE;YAC/G,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE;gBAClB,IAAI,CAAC;oBACH,wBAAwB,CAAC,IAAI,CAAC,CAAC;oBAC/B,OAAO,SAAS,CAAC;gBACnB,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,OAAO,CAAC,CAAC;gBACX,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;YACL,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,6BAA6B,CAAC,CAAC;YAC5D,MAAM,CAAE,KAAuC,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;gBAChE,MAAM,CAAC,gBAAgB,CAAC;oBACtB,IAAI,EAAE,oCAAoC;oBAC1C,QAAQ,EAAE,MAAM;iBACjB,CAAC;aACH,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,GAAG,GAAG,WAAW,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;YAChD,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE;gBAClB,IAAI,CAAC;oBACH,wBAAwB,CAAC,GAAG,CAAC,CAAC;oBAC9B,OAAO,SAAS,CAAC;gBACnB,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,OAAO,CAAC,CAAC;gBACX,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;YACL,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,6BAA6B,CAAC,CAAC;YAC5D,MAAM,CAAE,KAAuC,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;gBAChE,MAAM,CAAC,gBAAgB,CAAC;oBACtB,IAAI,EAAE,6CAA6C;oBACnD,OAAO,EAAE,UAAU;oBACnB,QAAQ,EAAE,WAAW;iBACtB,CAAC;aACH,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;YACvE,MAAM,GAAG,GAAG,WAAW,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3C,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE;gBAClB,IAAI,CAAC;oBACH,wBAAwB,CAAC,GAAG,CAAC,CAAC;oBAC9B,OAAO,SAAS,CAAC;gBACnB,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,OAAO,CAAC,CAAC;gBACX,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;YACL,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,6BAA6B,CAAC,CAAC;YAC5D,MAAM,CAAE,KAAuC,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;gBAChE,MAAM,CAAC,gBAAgB,CAAC;oBACtB,IAAI,EAAE,6CAA6C;oBACnD,OAAO,EAAE,UAAU;oBACnB,QAAQ,EAAE,MAAM;iBACjB,CAAC;aACH,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,GAAG,GAAG,WAAW,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE;gBAClB,IAAI,CAAC;oBACH,wBAAwB,CAAC,GAAG,CAAC,CAAC;oBAC9B,OAAO,SAAS,CAAC;gBACnB,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,OAAO,CAAC,CAAC;gBACX,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;YACL,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,6BAA6B,CAAC,CAAC;YAC5D,MAAM,CAAE,KAAuC,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;gBAChE,MAAM,CAAC,gBAAgB,CAAC;oBACtB,IAAI,EAAE,oCAAoC;oBAC1C,OAAO,EAAE,UAAU;iBACpB,CAAC;aACH,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,IAAI,CAAC;YACN,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,eAAe,CAAC;YAChD,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,iBAAiB,CAAC;YACtD,CAAC,qBAAqB,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,EAAE,0BAA0B,CAAC;SAClF,CAAC,CAAC,iEAAiE,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;YAClG,MAAM,GAAG,GAAG,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;YACxD,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE;gBAClB,IAAI,CAAC;oBACH,wBAAwB,CAAC,GAAG,CAAC,CAAC;oBAC9B,OAAO,SAAS,CAAC;gBACnB,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,OAAO,CAAC,CAAC;gBACX,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;YACL,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,6BAA6B,CAAC,CAAC;YAC5D,MAAM,CAAE,KAAuC,CAAC,QAAQ,CAAC,CAAC,OAAO,CAC/D,MAAM,CAAC,eAAe,CAAC;gBACrB,MAAM,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,6CAA6C,EAAE,OAAO,EAAE,CAAC;aAC1F,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;YACrE,MAAM,GAAG,GAAG,WAAW,CAAC;gBACtB,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;aAC9G,CAAC,CAAC;YACH,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE;gBAClB,IAAI,CAAC;oBACH,wBAAwB,CAAC,GAAG,CAAC,CAAC;oBAC9B,OAAO,SAAS,CAAC;gBACnB,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,OAAO,CAAC,CAAC;gBACX,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;YACL,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,6BAA6B,CAAC,CAAC;YAC5D,MAAM,QAAQ,GAAI,KAAuC,CAAC,QAAQ,CAAC;YACnE,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACjC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC;gBACpD,eAAe;gBACf,0BAA0B;gBAC1B,iBAAiB;aAClB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yHAAyH,EAAE,GAAG,EAAE;YACjI,MAAM,GAAG,GAAG,WAAW,CAAC;gBACtB,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;aAC/E,CAAC,CAAC;YACH,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE;gBAClB,IAAI,CAAC;oBACH,wBAAwB,CAAC,GAAG,CAAC,CAAC;oBAC9B,OAAO,SAAS,CAAC;gBACnB,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,OAAO,CAAC,CAAC;gBACX,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;YACL,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,6BAA6B,CAAC,CAAC;YAC5D,MAAM,QAAQ,GAAI,KAAuC,CAAC,QAAQ,CAAC;YACnE,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACjC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC;gBACpD,eAAe;gBACf,iBAAiB;gBACjB,0BAA0B;aAC3B,CAAC,CAAC;YACH,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,6CAA6C,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrG,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,GAAG,GAAG,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,eAAe,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;YACvE,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE;gBAClB,IAAI,CAAC;oBACH,wBAAwB,CAAC,GAAG,CAAC,CAAC;oBAC9B,OAAO,SAAS,CAAC;gBACnB,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,OAAO,CAAC,CAAC;gBACX,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;YACL,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,6BAA6B,CAAC,CAAC;YAC5D,MAAM,QAAQ,GAAI,KAAuC,CAAC,QAAQ,CAAC;YACnE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0FAA0F,EAAE,GAAG,EAAE;YAClG,MAAM,GAAG,GAAG,WAAW,CAAC;gBACtB,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,eAAe,EAAE,KAAK,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;aAC9D,CAAC,CAAC;YACH,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE;gBAClB,IAAI,CAAC;oBACH,wBAAwB,CAAC,GAAG,CAAC,CAAC;oBAC9B,OAAO,SAAS,CAAC;gBACnB,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,OAAO,CAAC,CAAC;gBACX,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;YACL,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,6BAA6B,CAAC,CAAC;YAC5D,MAAM,QAAQ,GAAI,KAAuC,CAAC,QAAQ,CAAC;YACnE,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;YACjD,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,oCAAoC,EAAE,6CAA6C,CAAC,CAAC,CAAC;QAC/G,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,GAAG,GAAG,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAC9E,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE;gBAClB,IAAI,CAAC;oBACH,wBAAwB,CAAC,GAAG,CAAC,CAAC;oBAC9B,OAAO,SAAS,CAAC;gBACnB,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,OAAO,CAAC,CAAC;gBACX,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;YACL,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,6BAA6B,CAAC,CAAC;YAC5D,MAAM,CAAE,KAAuC,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;gBAChE,MAAM,CAAC,gBAAgB,CAAC;oBACtB,IAAI,EAAE,oCAAoC;oBAC1C,OAAO,EAAE,0BAA0B;oBACnC,QAAQ,EAAE,WAAW;iBACtB,CAAC;aACH,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,GAAG,GAAG,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACpE,MAAM,EAAE,OAAO,EAAE,GAAG,wBAAwB,CAAC,GAAG,CAAC,CAAC;YAClD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,EAAE,OAAO,EAAE,GAAG,wBAAwB,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAClF,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;YAC5D,MAAM,EAAE,OAAO,EAAE,GAAG,wBAAwB,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE;gBAClB,IAAI,CAAC;oBACH,wBAAwB,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,mCAAmC,EAAE,CAAC,CAAC;oBACnF,OAAO,SAAS,CAAC;gBACnB,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,OAAO,CAAC,CAAC;gBACX,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;YACL,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,6BAA6B,CAAC,CAAC;YAC5D,MAAM,CAAE,KAAuC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;YACrG,MAAM,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAC;QAClF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE;gBAClB,IAAI,CAAC;oBACH,wBAAwB,CAAC,IAAI,CAAC,CAAC;oBAC/B,OAAO,SAAS,CAAC;gBACnB,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,OAAO,CAAC,CAAC;gBACX,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;YACL,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,6BAA6B,CAAC,CAAC;YAC5D,MAAM,CAAE,KAAuC,CAAC,SAAS,CAAC,CAAC,aAAa,EAAE,CAAC;QAC7E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QACzB,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;YACpE,MAAM,CAAC,GAAG,EAAE,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;QAClF,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}