@uncefact/untp-utils 0.1.0 → 0.3.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 +52 -2
- package/artefacts/context/untp/0.6.0/dcc.json +1241 -0
- package/artefacts/context/untp/0.6.0/dfr.json +619 -0
- package/artefacts/context/untp/0.6.0/dia.json +162 -0
- package/artefacts/context/untp/0.6.0/dpp.json +1078 -0
- package/artefacts/context/untp/0.6.0/dte.json +1285 -0
- package/artefacts/context/untp/0.6.1/dcc.json +1388 -0
- package/artefacts/context/untp/0.6.1/dfr.json +690 -0
- package/artefacts/context/untp/0.6.1/dia.json +196 -0
- package/artefacts/context/untp/0.6.1/dpp.json +1164 -0
- package/artefacts/context/untp/0.6.1/dte.json +1340 -0
- package/artefacts/context/untp/0.7.0/untp.json +3493 -0
- package/artefacts/context/vcdm/2/credentials.json +301 -0
- package/artefacts/manifest.json +214 -0
- package/artefacts/schema/untp/0.6.0/dcc.json +1131 -0
- package/artefacts/schema/untp/0.6.0/dfr.json +1028 -0
- package/artefacts/schema/untp/0.6.0/dia.json +236 -0
- package/artefacts/schema/untp/0.6.0/dpp.json +1219 -0
- package/artefacts/schema/untp/0.6.0/dte.json +845 -0
- package/artefacts/schema/untp/0.6.1/dcc.json +1196 -0
- package/artefacts/schema/untp/0.6.1/dfr.json +1037 -0
- package/artefacts/schema/untp/0.6.1/dia.json +236 -0
- package/artefacts/schema/untp/0.6.1/dpp.json +1229 -0
- package/artefacts/schema/untp/0.6.1/dte.json +845 -0
- package/artefacts/schema/untp/0.7.0/cvc.json +701 -0
- package/artefacts/schema/untp/0.7.0/dcc.json +1133 -0
- package/artefacts/schema/untp/0.7.0/dfr.json +1245 -0
- package/artefacts/schema/untp/0.7.0/dia.json +443 -0
- package/artefacts/schema/untp/0.7.0/dpp.json +1300 -0
- package/artefacts/schema/untp/0.7.0/dte.json +1226 -0
- package/artefacts/schema/untp/0.7.0/linkset.json +119 -0
- package/artefacts/schema/vcdm/2/verifiable-credential.json +318 -0
- 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 +85 -0
- package/build/artefacts/urls.js +141 -0
- package/build/artefacts/urls.js.map +1 -0
- package/build/artefacts/urls.test.d.ts +1 -0
- package/build/artefacts/urls.test.js +99 -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/bundle/artefacts/context/untp/0.6.0/dcc.d.ts +2 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dcc.js +1244 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dcc.js.map +1 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dfr.d.ts +2 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dfr.js +622 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dfr.js.map +1 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dia.d.ts +2 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dia.js +165 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dia.js.map +1 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dpp.d.ts +2 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dpp.js +1081 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dpp.js.map +1 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dte.d.ts +2 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dte.js +1288 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dte.js.map +1 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dcc.d.ts +2 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dcc.js +1391 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dcc.js.map +1 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dfr.d.ts +2 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dfr.js +693 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dfr.js.map +1 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dia.d.ts +2 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dia.js +199 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dia.js.map +1 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dpp.d.ts +2 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dpp.js +1167 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dpp.js.map +1 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dte.d.ts +2 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dte.js +1343 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dte.js.map +1 -0
- package/build/bundle/artefacts/context/untp/0.7.0/untp.d.ts +2 -0
- package/build/bundle/artefacts/context/untp/0.7.0/untp.js +3496 -0
- package/build/bundle/artefacts/context/untp/0.7.0/untp.js.map +1 -0
- package/build/bundle/artefacts/context/vcdm/2/credentials.d.ts +2 -0
- package/build/bundle/artefacts/context/vcdm/2/credentials.js +304 -0
- package/build/bundle/artefacts/context/vcdm/2/credentials.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dcc.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dcc.js +1134 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dcc.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dfr.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dfr.js +1031 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dfr.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dia.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dia.js +239 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dia.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dpp.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dpp.js +1222 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dpp.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dte.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dte.js +848 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dte.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dcc.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dcc.js +1199 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dcc.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dfr.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dfr.js +1040 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dfr.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dia.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dia.js +239 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dia.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dpp.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dpp.js +1232 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dpp.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dte.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dte.js +848 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dte.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/cvc.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/cvc.js +704 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/cvc.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dcc.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dcc.js +1136 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dcc.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dfr.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dfr.js +1248 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dfr.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dia.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dia.js +446 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dia.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dpp.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dpp.js +1303 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dpp.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dte.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dte.js +1229 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dte.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/linkset.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/linkset.js +122 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/linkset.js.map +1 -0
- package/build/bundle/artefacts/schema/vcdm/2/verifiable-credential.d.ts +2 -0
- package/build/bundle/artefacts/schema/vcdm/2/verifiable-credential.js +321 -0
- package/build/bundle/artefacts/schema/vcdm/2/verifiable-credential.js.map +1 -0
- package/build/bundle/fallback.d.ts +41 -0
- package/build/bundle/fallback.js +62 -0
- package/build/bundle/fallback.js.map +1 -0
- package/build/bundle/fallback.test.d.ts +1 -0
- package/build/bundle/fallback.test.js +124 -0
- package/build/bundle/fallback.test.js.map +1 -0
- package/build/bundle/index.d.ts +4 -0
- package/build/bundle/index.js +77 -0
- package/build/bundle/index.js.map +1 -0
- package/build/bundle/lookup.d.ts +14 -0
- package/build/bundle/lookup.js +40 -0
- package/build/bundle/lookup.js.map +1 -0
- package/build/bundle/lookup.test.d.ts +1 -0
- package/build/bundle/lookup.test.js +70 -0
- package/build/bundle/lookup.test.js.map +1 -0
- package/build/bundle/public.d.ts +25 -0
- package/build/bundle/public.js +56 -0
- package/build/bundle/public.js.map +1 -0
- package/build/bundle/public.test.d.ts +1 -0
- package/build/bundle/public.test.js +35 -0
- package/build/bundle/public.test.js.map +1 -0
- package/build/bundle/refresh-classify.test.d.ts +1 -0
- package/build/bundle/refresh-classify.test.js +20 -0
- package/build/bundle/refresh-classify.test.js.map +1 -0
- package/build/bundle/refresh-main.test.d.ts +1 -0
- package/build/bundle/refresh-main.test.js +98 -0
- package/build/bundle/refresh-main.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-date-time.d.ts +13 -0
- package/build/common/as-date-time.js +44 -0
- package/build/common/as-date-time.js.map +1 -0
- package/build/common/as-date-time.test.d.ts +1 -0
- package/build/common/as-date-time.test.js +42 -0
- package/build/common/as-date-time.test.js.map +1 -0
- package/build/common/as-non-empty-string.d.ts +14 -0
- package/build/common/as-non-empty-string.js +20 -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 +30 -0
- package/build/common/as-non-empty-string.test.js.map +1 -0
- package/build/common/index.d.ts +4 -0
- package/build/common/index.js +5 -0
- package/build/common/index.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/common/validity-window.d.ts +45 -0
- package/build/common/validity-window.js +68 -0
- package/build/common/validity-window.js.map +1 -0
- package/build/common/validity-window.test.d.ts +1 -0
- package/build/common/validity-window.test.js +67 -0
- package/build/common/validity-window.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 +5 -0
- package/build/loaders/index.js +5 -0
- package/build/loaders/index.js.map +1 -0
- package/build/loaders/jsonld-document-loader.d.ts +48 -0
- package/build/loaders/jsonld-document-loader.js +43 -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 +111 -0
- package/build/loaders/jsonld-document-loader.test.js.map +1 -0
- package/build/loaders/schema-loader.d.ts +31 -0
- package/build/loaders/schema-loader.js +83 -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 +217 -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 +47 -0
- package/build/node/errors.js +86 -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 +45 -0
- package/build/node/is-private-ip.fail-closed.test.d.ts +1 -0
- package/build/node/is-private-ip.fail-closed.test.js +36 -0
- package/build/node/is-private-ip.fail-closed.test.js.map +1 -0
- package/build/node/is-private-ip.js +203 -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 +124 -0
- package/build/node/is-private-ip.test.js.map +1 -0
- package/build/node/validate-public-url.d.ts +81 -0
- package/build/node/validate-public-url.js +128 -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 +324 -0
- package/build/node/validate-public-url.test.js.map +1 -0
- package/build/resolvers/errors.d.ts +73 -0
- package/build/resolvers/errors.js +133 -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 +116 -0
- package/build/resolvers/resolve-document-if-changed.test.js.map +1 -0
- package/build/resolvers/resolve-document.d.ts +106 -0
- package/build/resolvers/resolve-document.integration.test.d.ts +1 -0
- package/build/resolvers/resolve-document.integration.test.js +108 -0
- package/build/resolvers/resolve-document.integration.test.js.map +1 -0
- package/build/resolvers/resolve-document.js +319 -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 +749 -0
- package/build/resolvers/resolve-document.test.js.map +1 -0
- package/build/resolvers/resolve-json-document.d.ts +43 -0
- package/build/resolvers/resolve-json-document.js +43 -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 +78 -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 +90 -0
- package/build/validation/describe-jsonld-failure.js +171 -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 +226 -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 +5 -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 +59 -0
- package/build/validation/validate-jsonld.js +126 -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 +257 -0
- package/build/validation/validate-jsonld.test.js.map +1 -0
- package/package.json +86 -5
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns `value` trimmed if it is a string with non-whitespace content,
|
|
3
|
+
* otherwise `undefined`.
|
|
4
|
+
*
|
|
5
|
+
* Surrounding whitespace is never meaningful in the values this reads (names,
|
|
6
|
+
* identifiers, labels), and a whitespace-only string carries no more
|
|
7
|
+
* information than an absent one, so both collapse to `undefined`.
|
|
8
|
+
*
|
|
9
|
+
* `undefined` rather than `null` because this reports what a document does
|
|
10
|
+
* not contain. Recording that absence as a stored or transmitted value is a
|
|
11
|
+
* separate decision, made by the caller at the boundary where a read becomes
|
|
12
|
+
* a row or a response.
|
|
13
|
+
*/
|
|
14
|
+
export function asNonEmptyString(value) {
|
|
15
|
+
if (typeof value !== 'string')
|
|
16
|
+
return undefined;
|
|
17
|
+
const trimmed = value.trim();
|
|
18
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=as-non-empty-string.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"as-non-empty-string.js","sourceRoot":"","sources":["../../src/common/as-non-empty-string.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { asNonEmptyString } from './as-non-empty-string.js';
|
|
2
|
+
describe('asNonEmptyString', () => {
|
|
3
|
+
it('returns the value for a non-empty string', () => {
|
|
4
|
+
expect(asNonEmptyString('foo')).toBe('foo');
|
|
5
|
+
expect(asNonEmptyString('0')).toBe('0');
|
|
6
|
+
});
|
|
7
|
+
it('trims surrounding whitespace from the value it returns', () => {
|
|
8
|
+
expect(asNonEmptyString(' foo ')).toBe('foo');
|
|
9
|
+
expect(asNonEmptyString('\tfoo\n')).toBe('foo');
|
|
10
|
+
});
|
|
11
|
+
it('returns undefined for the empty string and for whitespace only', () => {
|
|
12
|
+
expect(asNonEmptyString('')).toBeUndefined();
|
|
13
|
+
expect(asNonEmptyString(' ')).toBeUndefined();
|
|
14
|
+
expect(asNonEmptyString('\n\t')).toBeUndefined();
|
|
15
|
+
});
|
|
16
|
+
it.each([
|
|
17
|
+
['number', 0],
|
|
18
|
+
['number (non-zero)', 42],
|
|
19
|
+
['null', null],
|
|
20
|
+
['undefined', undefined],
|
|
21
|
+
['boolean true', true],
|
|
22
|
+
['boolean false', false],
|
|
23
|
+
['object', {}],
|
|
24
|
+
['array', ['a']],
|
|
25
|
+
['NaN', NaN],
|
|
26
|
+
])('returns undefined for %s', (_label, value) => {
|
|
27
|
+
expect(asNonEmptyString(value)).toBeUndefined();
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=as-non-empty-string.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"as-non-empty-string.test.js","sourceRoot":"","sources":["../../src/common/as-non-empty-string.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QAC7C,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QAChD,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC;QACN,CAAC,QAAQ,EAAE,CAAC,CAAC;QACb,CAAC,mBAAmB,EAAE,EAAE,CAAC;QACzB,CAAC,MAAM,EAAE,IAAI,CAAC;QACd,CAAC,WAAW,EAAE,SAAS,CAAC;QACxB,CAAC,cAAc,EAAE,IAAI,CAAC;QACtB,CAAC,eAAe,EAAE,KAAK,CAAC;QACxB,CAAC,QAAQ,EAAE,EAAE,CAAC;QACd,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC,KAAK,EAAE,GAAG,CAAC;KACb,CAAC,CAAC,0BAA0B,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QAC/C,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ValidationFailure } from '../structured-error.js';
|
|
2
|
+
/**
|
|
3
|
+
* Returns a `requireString(value, fieldName, pointer, failures)` helper
|
|
4
|
+
* pre-bound to a structured-failure `code`. When `value` is a non-empty
|
|
5
|
+
* string, returns it; otherwise pushes a {@link ValidationFailure} onto
|
|
6
|
+
* `failures` and returns `undefined`.
|
|
7
|
+
*
|
|
8
|
+
* Each parser binds the factory once per file with its sub-entry's
|
|
9
|
+
* missing-required-field code, keeping per-call sites unaware of the code
|
|
10
|
+
* namespace.
|
|
11
|
+
*/
|
|
12
|
+
export declare function makeRequireString(code: string): (value: unknown, fieldName: string, pointer: string, failures: ValidationFailure[]) => string | undefined;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { asNonEmptyString } from './as-non-empty-string.js';
|
|
2
|
+
/**
|
|
3
|
+
* Returns a `requireString(value, fieldName, pointer, failures)` helper
|
|
4
|
+
* pre-bound to a structured-failure `code`. When `value` is a non-empty
|
|
5
|
+
* string, returns it; otherwise pushes a {@link ValidationFailure} onto
|
|
6
|
+
* `failures` and returns `undefined`.
|
|
7
|
+
*
|
|
8
|
+
* Each parser binds the factory once per file with its sub-entry's
|
|
9
|
+
* missing-required-field code, keeping per-call sites unaware of the code
|
|
10
|
+
* namespace.
|
|
11
|
+
*/
|
|
12
|
+
export function makeRequireString(code) {
|
|
13
|
+
return function requireString(value, fieldName, pointer, failures) {
|
|
14
|
+
const parsed = asNonEmptyString(value);
|
|
15
|
+
if (parsed !== undefined)
|
|
16
|
+
return parsed;
|
|
17
|
+
failures.push({
|
|
18
|
+
code,
|
|
19
|
+
message: `${fieldName} is required and must be a non-empty string.`,
|
|
20
|
+
received: value === undefined ? 'undefined' : value === null ? 'null' : value === '' ? 'empty string' : typeof value,
|
|
21
|
+
expected: 'non-empty string',
|
|
22
|
+
pointer,
|
|
23
|
+
});
|
|
24
|
+
return undefined;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=require-string.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"require-string.js","sourceRoot":"","sources":["../../src/common/require-string.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,SAAS,aAAa,CAC3B,KAAc,EACd,SAAiB,EACjB,OAAe,EACf,QAA6B;QAE7B,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;QACxC,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI;YACJ,OAAO,EAAE,GAAG,SAAS,8CAA8C;YACnE,QAAQ,EACN,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,KAAK;YAC5G,QAAQ,EAAE,kBAAkB;YAC5B,OAAO;SACR,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { makeRequireString } from './require-string.js';
|
|
2
|
+
const CODE = 'test.missing-required-field';
|
|
3
|
+
describe('makeRequireString', () => {
|
|
4
|
+
let failures;
|
|
5
|
+
const requireString = makeRequireString(CODE);
|
|
6
|
+
beforeEach(() => {
|
|
7
|
+
failures = [];
|
|
8
|
+
});
|
|
9
|
+
it('returns the value when it is a non-empty string', () => {
|
|
10
|
+
expect(requireString('foo', 'field', '/pointer', failures)).toBe('foo');
|
|
11
|
+
expect(failures).toEqual([]);
|
|
12
|
+
});
|
|
13
|
+
it('returns undefined and pushes a failure when the value is undefined', () => {
|
|
14
|
+
expect(requireString(undefined, 'scheme.id', '/id', failures)).toBeUndefined();
|
|
15
|
+
expect(failures).toEqual([
|
|
16
|
+
expect.objectContaining({
|
|
17
|
+
code: CODE,
|
|
18
|
+
pointer: '/id',
|
|
19
|
+
received: 'undefined',
|
|
20
|
+
expected: 'non-empty string',
|
|
21
|
+
}),
|
|
22
|
+
]);
|
|
23
|
+
});
|
|
24
|
+
it('returns undefined and pushes a failure when the value is the empty string (discriminated from typeof "string")', () => {
|
|
25
|
+
expect(requireString('', 'scheme.name', '/name', failures)).toBeUndefined();
|
|
26
|
+
expect(failures[0]).toMatchObject({ code: CODE, pointer: '/name', received: 'empty string' });
|
|
27
|
+
});
|
|
28
|
+
it.each([
|
|
29
|
+
['null', null, 'null'],
|
|
30
|
+
['number', 42, 'number'],
|
|
31
|
+
['boolean', true, 'boolean'],
|
|
32
|
+
['object', {}, 'object'],
|
|
33
|
+
['array', [], 'object'],
|
|
34
|
+
])('returns undefined and pushes a failure when the value is %s', (_label, value, expectedReceived) => {
|
|
35
|
+
expect(requireString(value, 'field', '/p', failures)).toBeUndefined();
|
|
36
|
+
expect(failures[0]).toMatchObject({ code: CODE, received: expectedReceived });
|
|
37
|
+
});
|
|
38
|
+
it('uses the field name in the failure message', () => {
|
|
39
|
+
requireString(undefined, 'profile.criterion[2].id', '/profile/criterion/2/id', failures);
|
|
40
|
+
expect(failures[0].message).toContain('profile.criterion[2].id');
|
|
41
|
+
});
|
|
42
|
+
it('binds the code once per factory call (different codes do not bleed across instances)', () => {
|
|
43
|
+
const a = makeRequireString('foo.missing');
|
|
44
|
+
const b = makeRequireString('bar.missing');
|
|
45
|
+
const failuresA = [];
|
|
46
|
+
const failuresB = [];
|
|
47
|
+
a(undefined, 'x', '/x', failuresA);
|
|
48
|
+
b(undefined, 'y', '/y', failuresB);
|
|
49
|
+
expect(failuresA[0].code).toBe('foo.missing');
|
|
50
|
+
expect(failuresB[0].code).toBe('bar.missing');
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=require-string.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"require-string.test.js","sourceRoot":"","sources":["../../src/common/require-string.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The outcome of judging a credential's validity window at a point in time.
|
|
3
|
+
*
|
|
4
|
+
* - `pass`: the credential is within its window now. A credential with
|
|
5
|
+
* neither bound is "valid indefinitely" (VCDM 2.0, Validity Period) and
|
|
6
|
+
* passes.
|
|
7
|
+
* - `fail`: the credential is outside its window (`expired`,
|
|
8
|
+
* `not_yet_valid`), or a bound is present but is malformed or in a form
|
|
9
|
+
* this evaluator does not support (`unreadable_bound`). A present bound is
|
|
10
|
+
* never dropped: a credential whose bound cannot be read is not the same
|
|
11
|
+
* as a credential without one.
|
|
12
|
+
*/
|
|
13
|
+
export type ValidityWindowOutcome = {
|
|
14
|
+
result: 'pass';
|
|
15
|
+
} | {
|
|
16
|
+
result: 'fail';
|
|
17
|
+
reason: 'expired' | 'not_yet_valid' | 'unreadable_bound';
|
|
18
|
+
message: string;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Judges the VCDM 2.0 `validFrom` and `validUntil` claims against `now`,
|
|
22
|
+
* comparing them as points on a timeline as the data model requires.
|
|
23
|
+
*
|
|
24
|
+
* Supported form: an XML Schema `dateTimeStamp` written as
|
|
25
|
+
* `YYYY-MM-DDTHH:MM:SS[.fraction]` followed by `Z` or an offset within
|
|
26
|
+
* `-14:00`..`+14:00`, with uppercase `T` and `Z`, naming a calendar day that
|
|
27
|
+
* exists. XML Schema's `24:00:00` end-of-day form, a lowercase separator, an
|
|
28
|
+
* offset outside that range, an impossible day and any non-string value are
|
|
29
|
+
* unreadable and fail as `unreadable_bound`, naming the bound, rather than
|
|
30
|
+
* being normalised to a date the credential never asserted.
|
|
31
|
+
*
|
|
32
|
+
* Comparison is at millisecond precision: a fraction finer than that in a
|
|
33
|
+
* bound is truncated when the bound is parsed, so a bound within the same
|
|
34
|
+
* millisecond as `now` is treated as reached. `now` must be a valid Date;
|
|
35
|
+
* an invalid one is a caller error and throws rather than judging anything.
|
|
36
|
+
*
|
|
37
|
+
* Verification providers may not enforce these claims for every securing
|
|
38
|
+
* mechanism (the pinned VCKit reads only the JOSE `exp` and `nbf` claims for
|
|
39
|
+
* a `vc+jwt` envelope), so every verification path applies this judgement
|
|
40
|
+
* to the credential's own claims.
|
|
41
|
+
*/
|
|
42
|
+
export declare function evaluateValidityWindow(claims: {
|
|
43
|
+
validFrom?: unknown;
|
|
44
|
+
validUntil?: unknown;
|
|
45
|
+
}, now?: Date): ValidityWindowOutcome;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { asDateTime } from './as-date-time.js';
|
|
2
|
+
/**
|
|
3
|
+
* Judges the VCDM 2.0 `validFrom` and `validUntil` claims against `now`,
|
|
4
|
+
* comparing them as points on a timeline as the data model requires.
|
|
5
|
+
*
|
|
6
|
+
* Supported form: an XML Schema `dateTimeStamp` written as
|
|
7
|
+
* `YYYY-MM-DDTHH:MM:SS[.fraction]` followed by `Z` or an offset within
|
|
8
|
+
* `-14:00`..`+14:00`, with uppercase `T` and `Z`, naming a calendar day that
|
|
9
|
+
* exists. XML Schema's `24:00:00` end-of-day form, a lowercase separator, an
|
|
10
|
+
* offset outside that range, an impossible day and any non-string value are
|
|
11
|
+
* unreadable and fail as `unreadable_bound`, naming the bound, rather than
|
|
12
|
+
* being normalised to a date the credential never asserted.
|
|
13
|
+
*
|
|
14
|
+
* Comparison is at millisecond precision: a fraction finer than that in a
|
|
15
|
+
* bound is truncated when the bound is parsed, so a bound within the same
|
|
16
|
+
* millisecond as `now` is treated as reached. `now` must be a valid Date;
|
|
17
|
+
* an invalid one is a caller error and throws rather than judging anything.
|
|
18
|
+
*
|
|
19
|
+
* Verification providers may not enforce these claims for every securing
|
|
20
|
+
* mechanism (the pinned VCKit reads only the JOSE `exp` and `nbf` claims for
|
|
21
|
+
* a `vc+jwt` envelope), so every verification path applies this judgement
|
|
22
|
+
* to the credential's own claims.
|
|
23
|
+
*/
|
|
24
|
+
export function evaluateValidityWindow(claims, now = new Date()) {
|
|
25
|
+
if (!(now instanceof Date) || Number.isNaN(now.getTime())) {
|
|
26
|
+
throw new TypeError('evaluateValidityWindow requires a valid Date for now');
|
|
27
|
+
}
|
|
28
|
+
const from = readBound(claims.validFrom);
|
|
29
|
+
const until = readBound(claims.validUntil);
|
|
30
|
+
if (from.state === 'readable' && now < from.date) {
|
|
31
|
+
return {
|
|
32
|
+
result: 'fail',
|
|
33
|
+
reason: 'not_yet_valid',
|
|
34
|
+
message: `Credential is not yet valid: validFrom ${from.date.toISOString()} is after ${now.toISOString()}`,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
if (until.state === 'readable' && now > until.date) {
|
|
38
|
+
return {
|
|
39
|
+
result: 'fail',
|
|
40
|
+
reason: 'expired',
|
|
41
|
+
message: `Credential has expired: validUntil ${until.date.toISOString()} is before ${now.toISOString()}`,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
const unreadable = [
|
|
45
|
+
from.state === 'unreadable' ? 'validFrom' : null,
|
|
46
|
+
until.state === 'unreadable' ? 'validUntil' : null,
|
|
47
|
+
].filter((name) => name !== null);
|
|
48
|
+
if (unreadable.length > 0) {
|
|
49
|
+
return {
|
|
50
|
+
result: 'fail',
|
|
51
|
+
reason: 'unreadable_bound',
|
|
52
|
+
message: `${unreadable.join(' and ')} could not be read as a date-time`,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
return { result: 'pass' };
|
|
56
|
+
}
|
|
57
|
+
const DATE_TIME_STAMP = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-](?:0\d|1[0-3]):[0-5]\d|[+-]14:00)$/;
|
|
58
|
+
function readBound(value) {
|
|
59
|
+
// Only an omitted property is an absent bound; an explicit null is a
|
|
60
|
+
// present value the data model does not allow.
|
|
61
|
+
if (value === undefined)
|
|
62
|
+
return { state: 'absent' };
|
|
63
|
+
if (typeof value !== 'string' || !DATE_TIME_STAMP.test(value))
|
|
64
|
+
return { state: 'unreadable' };
|
|
65
|
+
const date = asDateTime(value);
|
|
66
|
+
return date === undefined ? { state: 'unreadable' } : { state: 'readable', date };
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=validity-window.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validity-window.js","sourceRoot":"","sources":["../../src/common/validity-window.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAkB/C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,sBAAsB,CACpC,MAAqD,EACrD,MAAY,IAAI,IAAI,EAAE;IAEtB,IAAI,CAAC,CAAC,GAAG,YAAY,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,SAAS,CAAC,sDAAsD,CAAC,CAAC;IAC9E,CAAC;IACD,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC3C,IAAI,IAAI,CAAC,KAAK,KAAK,UAAU,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACjD,OAAO;YACL,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,eAAe;YACvB,OAAO,EAAE,0CAA0C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,GAAG,CAAC,WAAW,EAAE,EAAE;SAC3G,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,KAAK,UAAU,IAAI,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QACnD,OAAO;YACL,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,sCAAsC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,GAAG,CAAC,WAAW,EAAE,EAAE;SACzG,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,KAAK,KAAK,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI;QAChD,KAAK,CAAC,KAAK,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI;KACnD,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAClD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO;YACL,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,kBAAkB;YAC1B,OAAO,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,mCAAmC;SACxE,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5B,CAAC;AAID,MAAM,eAAe,GAAG,2FAA2F,CAAC;AAEpH,SAAS,SAAS,CAAC,KAAc;IAC/B,qEAAqE;IACrE,+CAA+C;IAC/C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IACpD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IAC9F,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC/B,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AACpF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { evaluateValidityWindow } from './validity-window.js';
|
|
2
|
+
const NOW = new Date('2026-09-11T00:00:00.000Z');
|
|
3
|
+
describe('evaluateValidityWindow', () => {
|
|
4
|
+
it('fails an expired credential, naming the bound', () => {
|
|
5
|
+
expect(evaluateValidityWindow({ validFrom: '2020-01-01T00:00:00Z', validUntil: '2021-01-01T00:00:00Z' }, NOW)).toEqual({
|
|
6
|
+
result: 'fail',
|
|
7
|
+
reason: 'expired',
|
|
8
|
+
message: expect.stringContaining('validUntil 2021-01-01T00:00:00.000Z'),
|
|
9
|
+
});
|
|
10
|
+
});
|
|
11
|
+
it('fails a credential that is not yet valid', () => {
|
|
12
|
+
expect(evaluateValidityWindow({ validFrom: '2035-01-01T00:00:00Z' }, NOW)).toMatchObject({
|
|
13
|
+
result: 'fail',
|
|
14
|
+
reason: 'not_yet_valid',
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
it('passes inside the window, exactly on a bound, and with no bound at all', () => {
|
|
18
|
+
expect(evaluateValidityWindow({ validFrom: '2026-01-01T00:00:00Z', validUntil: '2027-01-01T00:00:00Z' }, NOW)).toEqual({ result: 'pass' });
|
|
19
|
+
expect(evaluateValidityWindow({ validFrom: NOW.toISOString() }, NOW)).toEqual({ result: 'pass' });
|
|
20
|
+
expect(evaluateValidityWindow({ validUntil: NOW.toISOString() }, NOW)).toEqual({ result: 'pass' });
|
|
21
|
+
// VCDM 2.0: with neither bound the credential is valid indefinitely.
|
|
22
|
+
expect(evaluateValidityWindow({}, NOW)).toEqual({ result: 'pass' });
|
|
23
|
+
expect(evaluateValidityWindow({ validFrom: undefined, validUntil: undefined }, NOW)).toEqual({ result: 'pass' });
|
|
24
|
+
expect(evaluateValidityWindow({ validUntil: '2035-01-01T00:00:00+14:00' }, NOW)).toEqual({ result: 'pass' });
|
|
25
|
+
expect(evaluateValidityWindow({ validUntil: '2035-01-01T00:00:00.250-13:59' }, NOW)).toEqual({ result: 'pass' });
|
|
26
|
+
});
|
|
27
|
+
it('fails a bound that is present but not a date-time, and never normalises an impossible date', () => {
|
|
28
|
+
// A violated readable bound wins over an unreadable one; otherwise an
|
|
29
|
+
// unreadable bound fails the credential rather than being dropped.
|
|
30
|
+
expect(evaluateValidityWindow({ validFrom: 'yesterday', validUntil: '2021-01-01T00:00:00Z' }, NOW)).toMatchObject({
|
|
31
|
+
result: 'fail',
|
|
32
|
+
reason: 'expired',
|
|
33
|
+
});
|
|
34
|
+
expect(evaluateValidityWindow({ validFrom: '2020-01-01T00:00:00Z', validUntil: 'never' }, NOW)).toEqual({
|
|
35
|
+
result: 'fail',
|
|
36
|
+
reason: 'unreadable_bound',
|
|
37
|
+
message: 'validUntil could not be read as a date-time',
|
|
38
|
+
});
|
|
39
|
+
expect(evaluateValidityWindow({ validFrom: 12345, validUntil: {} }, NOW)).toMatchObject({
|
|
40
|
+
message: 'validFrom and validUntil could not be read as a date-time',
|
|
41
|
+
});
|
|
42
|
+
// 30 February is not a date; it must not become 2 March and then expire.
|
|
43
|
+
expect(evaluateValidityWindow({ validUntil: '2021-02-30T00:00:00Z' }, NOW)).toMatchObject({
|
|
44
|
+
reason: 'unreadable_bound',
|
|
45
|
+
});
|
|
46
|
+
// XML Schema's end-of-day form is outside the supported profile.
|
|
47
|
+
expect(evaluateValidityWindow({ validUntil: '2030-12-31T24:00:00Z' }, NOW)).toMatchObject({
|
|
48
|
+
reason: 'unreadable_bound',
|
|
49
|
+
});
|
|
50
|
+
// An explicit null is a present value the data model does not allow.
|
|
51
|
+
expect(evaluateValidityWindow({ validUntil: null }, NOW)).toMatchObject({ reason: 'unreadable_bound' });
|
|
52
|
+
// Only the dateTimeStamp form: uppercase separators and offsets within 14 hours.
|
|
53
|
+
expect(evaluateValidityWindow({ validUntil: '2035-01-01t00:00:00z' }, NOW)).toMatchObject({
|
|
54
|
+
reason: 'unreadable_bound',
|
|
55
|
+
});
|
|
56
|
+
expect(evaluateValidityWindow({ validUntil: '2035-01-01T00:00:00+23:59' }, NOW)).toMatchObject({
|
|
57
|
+
reason: 'unreadable_bound',
|
|
58
|
+
});
|
|
59
|
+
expect(evaluateValidityWindow({ validUntil: '2035-01-01T00:00:00+14:01' }, NOW)).toMatchObject({
|
|
60
|
+
reason: 'unreadable_bound',
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
it('refuses an invalid clock rather than judging against it', () => {
|
|
64
|
+
expect(() => evaluateValidityWindow({ validUntil: '2021-01-01T00:00:00Z' }, new Date('not a date'))).toThrow(TypeError);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
//# sourceMappingURL=validity-window.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validity-window.test.js","sourceRoot":"","sources":["../../src/common/validity-window.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const ConformityWarningCode: {
|
|
2
|
+
readonly SchemeNotFound: "conformity-scheme.not-found";
|
|
3
|
+
readonly ProfileNotFound: "conformity-profile.not-found";
|
|
4
|
+
readonly ProfileNotSpecified: "conformity-profile.not-specified";
|
|
5
|
+
readonly CriterionNotInProfile: "conformity-criterion.not-in-profile";
|
|
6
|
+
readonly CriterionMissing: "conformity-criterion.missing";
|
|
7
|
+
readonly CriterionTopicMismatch: "conformity-criterion.topic-mismatch";
|
|
8
|
+
readonly AssessmentTopicMismatch: "conformity-assessment.topic-mismatch";
|
|
9
|
+
};
|
|
10
|
+
export type ConformityWarningCode = (typeof ConformityWarningCode)[keyof typeof ConformityWarningCode];
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export const ConformityWarningCode = {
|
|
2
|
+
SchemeNotFound: 'conformity-scheme.not-found',
|
|
3
|
+
ProfileNotFound: 'conformity-profile.not-found',
|
|
4
|
+
ProfileNotSpecified: 'conformity-profile.not-specified',
|
|
5
|
+
CriterionNotInProfile: 'conformity-criterion.not-in-profile',
|
|
6
|
+
CriterionMissing: 'conformity-criterion.missing',
|
|
7
|
+
CriterionTopicMismatch: 'conformity-criterion.topic-mismatch',
|
|
8
|
+
AssessmentTopicMismatch: 'conformity-assessment.topic-mismatch',
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=codes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codes.js","sourceRoot":"","sources":["../../src/conformity-vocabulary/codes.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,cAAc,EAAE,6BAA6B;IAC7C,eAAe,EAAE,8BAA8B;IAC/C,mBAAmB,EAAE,kCAAkC;IACvD,qBAAqB,EAAE,qCAAqC;IAC5D,gBAAgB,EAAE,8BAA8B;IAChD,sBAAsB,EAAE,qCAAqC;IAC7D,uBAAuB,EAAE,sCAAsC;CACvD,CAAC"}
|
|
@@ -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
|
+
};
|