@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.
- package/README.md +23 -1
- package/build/artefacts/detect-version-from-context.d.ts +46 -0
- package/build/artefacts/detect-version-from-context.js +77 -0
- package/build/artefacts/detect-version-from-context.js.map +1 -0
- package/build/artefacts/detect-version-from-context.test.d.ts +1 -0
- package/build/artefacts/detect-version-from-context.test.js +69 -0
- package/build/artefacts/detect-version-from-context.test.js.map +1 -0
- package/build/artefacts/index.d.ts +3 -0
- package/build/artefacts/index.js +4 -0
- package/build/artefacts/index.js.map +1 -0
- package/build/artefacts/urls.d.ts +79 -0
- package/build/artefacts/urls.js +133 -0
- package/build/artefacts/urls.js.map +1 -0
- package/build/artefacts/urls.test.d.ts +1 -0
- package/build/artefacts/urls.test.js +91 -0
- package/build/artefacts/urls.test.js.map +1 -0
- package/build/artefacts/version.d.ts +9 -0
- package/build/artefacts/version.js +17 -0
- package/build/artefacts/version.js.map +1 -0
- package/build/artefacts/version.test.d.ts +1 -0
- package/build/artefacts/version.test.js +16 -0
- package/build/artefacts/version.test.js.map +1 -0
- package/build/cache/in-memory-ttl-cache.d.ts +2 -0
- package/build/cache/in-memory-ttl-cache.js +76 -0
- package/build/cache/in-memory-ttl-cache.js.map +1 -0
- package/build/cache/in-memory-ttl-cache.test.d.ts +1 -0
- package/build/cache/in-memory-ttl-cache.test.js +236 -0
- package/build/cache/in-memory-ttl-cache.test.js.map +1 -0
- package/build/cache/index.d.ts +2 -0
- package/build/cache/index.js +2 -0
- package/build/cache/index.js.map +1 -0
- package/build/cache/ttl-cache.d.ts +22 -0
- package/build/cache/ttl-cache.js +2 -0
- package/build/cache/ttl-cache.js.map +1 -0
- package/build/common/as-non-empty-string.d.ts +7 -0
- package/build/common/as-non-empty-string.js +10 -0
- package/build/common/as-non-empty-string.js.map +1 -0
- package/build/common/as-non-empty-string.test.d.ts +1 -0
- package/build/common/as-non-empty-string.test.js +25 -0
- package/build/common/as-non-empty-string.test.js.map +1 -0
- package/build/common/require-string.d.ts +12 -0
- package/build/common/require-string.js +27 -0
- package/build/common/require-string.js.map +1 -0
- package/build/common/require-string.test.d.ts +1 -0
- package/build/common/require-string.test.js +53 -0
- package/build/common/require-string.test.js.map +1 -0
- package/build/conformity-vocabulary/codes.d.ts +10 -0
- package/build/conformity-vocabulary/codes.js +10 -0
- package/build/conformity-vocabulary/codes.js.map +1 -0
- package/build/conformity-vocabulary/errors.d.ts +44 -0
- package/build/conformity-vocabulary/errors.js +68 -0
- package/build/conformity-vocabulary/errors.js.map +1 -0
- package/build/conformity-vocabulary/index.d.ts +6 -0
- package/build/conformity-vocabulary/index.js +7 -0
- package/build/conformity-vocabulary/index.js.map +1 -0
- package/build/conformity-vocabulary/parse-conformity-catalogue.d.ts +26 -0
- package/build/conformity-vocabulary/parse-conformity-catalogue.js +106 -0
- package/build/conformity-vocabulary/parse-conformity-catalogue.js.map +1 -0
- package/build/conformity-vocabulary/parse-conformity-catalogue.test.d.ts +1 -0
- package/build/conformity-vocabulary/parse-conformity-catalogue.test.js +327 -0
- package/build/conformity-vocabulary/parse-conformity-catalogue.test.js.map +1 -0
- package/build/conformity-vocabulary/parse-conformity-scheme.d.ts +28 -0
- package/build/conformity-vocabulary/parse-conformity-scheme.js +47 -0
- package/build/conformity-vocabulary/parse-conformity-scheme.js.map +1 -0
- package/build/conformity-vocabulary/parse-conformity-scheme.test.d.ts +1 -0
- package/build/conformity-vocabulary/parse-conformity-scheme.test.js +284 -0
- package/build/conformity-vocabulary/parse-conformity-scheme.test.js.map +1 -0
- package/build/conformity-vocabulary/parsers/v0-7-0.parser.d.ts +19 -0
- package/build/conformity-vocabulary/parsers/v0-7-0.parser.js +219 -0
- package/build/conformity-vocabulary/parsers/v0-7-0.parser.js.map +1 -0
- package/build/conformity-vocabulary/types.d.ts +180 -0
- package/build/conformity-vocabulary/types.js +2 -0
- package/build/conformity-vocabulary/types.js.map +1 -0
- package/build/conformity-vocabulary/validate-conformity-claim.d.ts +26 -0
- package/build/conformity-vocabulary/validate-conformity-claim.js +165 -0
- package/build/conformity-vocabulary/validate-conformity-claim.js.map +1 -0
- package/build/conformity-vocabulary/validate-conformity-claim.test.d.ts +1 -0
- package/build/conformity-vocabulary/validate-conformity-claim.test.js +478 -0
- package/build/conformity-vocabulary/validate-conformity-claim.test.js.map +1 -0
- package/build/http-headers/index.d.ts +5 -0
- package/build/http-headers/index.js +6 -0
- package/build/http-headers/index.js.map +1 -0
- package/build/http-headers/is-safe-header-value.d.ts +10 -0
- package/build/http-headers/is-safe-header-value.js +15 -0
- package/build/http-headers/is-safe-header-value.js.map +1 -0
- package/build/http-headers/is-safe-header-value.test.d.ts +1 -0
- package/build/http-headers/is-safe-header-value.test.js +37 -0
- package/build/http-headers/is-safe-header-value.test.js.map +1 -0
- package/build/http-headers/parse-entity-tag.d.ts +9 -0
- package/build/http-headers/parse-entity-tag.js +18 -0
- package/build/http-headers/parse-entity-tag.js.map +1 -0
- package/build/http-headers/parse-entity-tag.test.d.ts +1 -0
- package/build/http-headers/parse-entity-tag.test.js +41 -0
- package/build/http-headers/parse-entity-tag.test.js.map +1 -0
- package/build/http-headers/parse-imf-date.d.ts +13 -0
- package/build/http-headers/parse-imf-date.js +23 -0
- package/build/http-headers/parse-imf-date.js.map +1 -0
- package/build/http-headers/parse-imf-date.test.d.ts +1 -0
- package/build/http-headers/parse-imf-date.test.js +31 -0
- package/build/http-headers/parse-imf-date.test.js.map +1 -0
- package/build/http-headers/parse-media-type.d.ts +8 -0
- package/build/http-headers/parse-media-type.js +21 -0
- package/build/http-headers/parse-media-type.js.map +1 -0
- package/build/http-headers/parse-media-type.test.d.ts +1 -0
- package/build/http-headers/parse-media-type.test.js +39 -0
- package/build/http-headers/parse-media-type.test.js.map +1 -0
- package/build/http-headers/user-agent.d.ts +35 -0
- package/build/http-headers/user-agent.js +45 -0
- package/build/http-headers/user-agent.js.map +1 -0
- package/build/http-headers/user-agent.test.d.ts +1 -0
- package/build/http-headers/user-agent.test.js +27 -0
- package/build/http-headers/user-agent.test.js.map +1 -0
- package/build/index.d.ts +1 -1
- package/build/index.js +1 -1
- package/build/index.js.map +1 -1
- package/build/loaders/errors.d.ts +21 -0
- package/build/loaders/errors.js +45 -0
- package/build/loaders/errors.js.map +1 -0
- package/build/loaders/index.d.ts +3 -0
- package/build/loaders/index.js +4 -0
- package/build/loaders/index.js.map +1 -0
- package/build/loaders/jsonld-document-loader.d.ts +46 -0
- package/build/loaders/jsonld-document-loader.js +34 -0
- package/build/loaders/jsonld-document-loader.js.map +1 -0
- package/build/loaders/jsonld-document-loader.test.d.ts +1 -0
- package/build/loaders/jsonld-document-loader.test.js +71 -0
- package/build/loaders/jsonld-document-loader.test.js.map +1 -0
- package/build/loaders/schema-loader.d.ts +21 -0
- package/build/loaders/schema-loader.js +67 -0
- package/build/loaders/schema-loader.js.map +1 -0
- package/build/loaders/schema-loader.ssrf.test.d.ts +1 -0
- package/build/loaders/schema-loader.ssrf.test.js +55 -0
- package/build/loaders/schema-loader.ssrf.test.js.map +1 -0
- package/build/loaders/schema-loader.test.d.ts +1 -0
- package/build/loaders/schema-loader.test.js +162 -0
- package/build/loaders/schema-loader.test.js.map +1 -0
- package/build/multibase-digest/multibase-digest.d.ts +23 -0
- package/build/multibase-digest/multibase-digest.js +40 -0
- package/build/multibase-digest/multibase-digest.js.map +1 -1
- package/build/multibase-digest/multibase-digest.test.js +46 -0
- package/build/multibase-digest/multibase-digest.test.js.map +1 -1
- package/build/node/errors.d.ts +41 -0
- package/build/node/errors.js +80 -0
- package/build/node/errors.js.map +1 -0
- package/build/node/index.d.ts +3 -0
- package/build/node/index.js +4 -0
- package/build/node/index.js.map +1 -0
- package/build/node/is-private-ip.d.ts +41 -0
- package/build/node/is-private-ip.js +138 -0
- package/build/node/is-private-ip.js.map +1 -0
- package/build/node/is-private-ip.test.d.ts +1 -0
- package/build/node/is-private-ip.test.js +96 -0
- package/build/node/is-private-ip.test.js.map +1 -0
- package/build/node/validate-public-url.d.ts +49 -0
- package/build/node/validate-public-url.js +94 -0
- package/build/node/validate-public-url.js.map +1 -0
- package/build/node/validate-public-url.test.d.ts +1 -0
- package/build/node/validate-public-url.test.js +177 -0
- package/build/node/validate-public-url.test.js.map +1 -0
- package/build/resolvers/errors.d.ts +43 -0
- package/build/resolvers/errors.js +99 -0
- package/build/resolvers/errors.js.map +1 -0
- package/build/resolvers/index.d.ts +5 -0
- package/build/resolvers/index.js +6 -0
- package/build/resolvers/index.js.map +1 -0
- package/build/resolvers/resolve-document-if-changed.d.ts +48 -0
- package/build/resolvers/resolve-document-if-changed.js +42 -0
- package/build/resolvers/resolve-document-if-changed.js.map +1 -0
- package/build/resolvers/resolve-document-if-changed.test.d.ts +1 -0
- package/build/resolvers/resolve-document-if-changed.test.js +109 -0
- package/build/resolvers/resolve-document-if-changed.test.js.map +1 -0
- package/build/resolvers/resolve-document.d.ts +86 -0
- package/build/resolvers/resolve-document.js +239 -0
- package/build/resolvers/resolve-document.js.map +1 -0
- package/build/resolvers/resolve-document.test.d.ts +1 -0
- package/build/resolvers/resolve-document.test.js +299 -0
- package/build/resolvers/resolve-document.test.js.map +1 -0
- package/build/resolvers/resolve-json-document.d.ts +40 -0
- package/build/resolvers/resolve-json-document.js +42 -0
- package/build/resolvers/resolve-json-document.js.map +1 -0
- package/build/resolvers/resolve-json-document.test.d.ts +1 -0
- package/build/resolvers/resolve-json-document.test.js +61 -0
- package/build/resolvers/resolve-json-document.test.js.map +1 -0
- package/build/structured-error.d.ts +49 -0
- package/build/structured-error.js +17 -0
- package/build/structured-error.js.map +1 -0
- package/build/structured-error.test.d.ts +1 -0
- package/build/structured-error.test.js +112 -0
- package/build/structured-error.test.js.map +1 -0
- package/build/validation/describe-jsonld-failure.d.ts +50 -0
- package/build/validation/describe-jsonld-failure.js +104 -0
- package/build/validation/describe-jsonld-failure.js.map +1 -0
- package/build/validation/describe-jsonld-failure.test.d.ts +1 -0
- package/build/validation/describe-jsonld-failure.test.js +141 -0
- package/build/validation/describe-jsonld-failure.test.js.map +1 -0
- package/build/validation/errors.d.ts +40 -0
- package/build/validation/errors.js +75 -0
- package/build/validation/errors.js.map +1 -0
- package/build/validation/index.d.ts +4 -0
- package/build/validation/index.js +5 -0
- package/build/validation/index.js.map +1 -0
- package/build/validation/validate-against-schemas.d.ts +22 -0
- package/build/validation/validate-against-schemas.js +65 -0
- package/build/validation/validate-against-schemas.js.map +1 -0
- package/build/validation/validate-against-schemas.test.d.ts +1 -0
- package/build/validation/validate-against-schemas.test.js +169 -0
- package/build/validation/validate-against-schemas.test.js.map +1 -0
- package/build/validation/validate-jsonld.context-cache.test.d.ts +1 -0
- package/build/validation/validate-jsonld.context-cache.test.js +32 -0
- package/build/validation/validate-jsonld.context-cache.test.js.map +1 -0
- package/build/validation/validate-jsonld.d.ts +33 -0
- package/build/validation/validate-jsonld.js +99 -0
- package/build/validation/validate-jsonld.js.map +1 -0
- package/build/validation/validate-jsonld.ssrf.test.d.ts +1 -0
- package/build/validation/validate-jsonld.ssrf.test.js +108 -0
- package/build/validation/validate-jsonld.ssrf.test.js.map +1 -0
- package/build/validation/validate-jsonld.test.d.ts +1 -0
- package/build/validation/validate-jsonld.test.js +200 -0
- package/build/validation/validate-jsonld.test.js.map +1 -0
- 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 @@
|
|
|
1
|
+
export {};
|
|
@@ -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":"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"}
|