@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,324 @@
|
|
|
1
|
+
import { jest } from '@jest/globals';
|
|
2
|
+
import { InvalidUrlError, PrivateAddressError, PrivateHostnameError, ResolutionEmptyError, ResolutionFailedError, UrlValidationError, } from './errors.js';
|
|
3
|
+
const lookup = jest.fn();
|
|
4
|
+
jest.unstable_mockModule('node:dns/promises', () => ({
|
|
5
|
+
default: { lookup },
|
|
6
|
+
lookup,
|
|
7
|
+
}));
|
|
8
|
+
const { validatePublicUrl } = await import('./validate-public-url.js');
|
|
9
|
+
/**
|
|
10
|
+
* The shape `validatePublicUrl` returns for a single validated address:
|
|
11
|
+
* `address` / `family` repeat the first entry of `addresses`.
|
|
12
|
+
*/
|
|
13
|
+
function validated(address, family) {
|
|
14
|
+
return { address, family, addresses: [{ address, family }] };
|
|
15
|
+
}
|
|
16
|
+
describe('validatePublicUrl', () => {
|
|
17
|
+
beforeEach(() => {
|
|
18
|
+
lookup.mockReset();
|
|
19
|
+
});
|
|
20
|
+
describe('URL parsing', () => {
|
|
21
|
+
it('throws InvalidUrlError when the string is not a parseable URL', async () => {
|
|
22
|
+
await expect(validatePublicUrl('not a url')).rejects.toBeInstanceOf(InvalidUrlError);
|
|
23
|
+
await expect(validatePublicUrl('not a url')).rejects.toMatchObject({
|
|
24
|
+
code: 'url.invalid',
|
|
25
|
+
received: 'not a url',
|
|
26
|
+
});
|
|
27
|
+
expect(lookup).not.toHaveBeenCalled();
|
|
28
|
+
});
|
|
29
|
+
it('retains parse rejection when private addresses are allowed', async () => {
|
|
30
|
+
await expect(validatePublicUrl('not a url', { allowPrivateAddresses: true })).rejects.toBeInstanceOf(InvalidUrlError);
|
|
31
|
+
expect(lookup).not.toHaveBeenCalled();
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
describe('scheme', () => {
|
|
35
|
+
it('throws UnsupportedSchemeError for an unallowed scheme', async () => {
|
|
36
|
+
await expect(validatePublicUrl('ftp://example.com/path')).rejects.toMatchObject({
|
|
37
|
+
name: 'UnsupportedSchemeError',
|
|
38
|
+
code: 'url.unsupported-scheme',
|
|
39
|
+
received: 'ftp',
|
|
40
|
+
});
|
|
41
|
+
expect(lookup).not.toHaveBeenCalled();
|
|
42
|
+
});
|
|
43
|
+
it('accepts a caller-supplied allowedSchemes list', async () => {
|
|
44
|
+
lookup.mockResolvedValue([{ address: '1.1.1.1', family: 4 }]);
|
|
45
|
+
await expect(validatePublicUrl('wss://example.com/ws', { allowedSchemes: ['wss', 'ws'] })).resolves.toEqual(validated('1.1.1.1', 4));
|
|
46
|
+
});
|
|
47
|
+
it('retains scheme rejection when private addresses are allowed', async () => {
|
|
48
|
+
await expect(validatePublicUrl('ftp://example.com/path', { allowPrivateAddresses: true })).rejects.toMatchObject({
|
|
49
|
+
name: 'UnsupportedSchemeError',
|
|
50
|
+
});
|
|
51
|
+
expect(lookup).not.toHaveBeenCalled();
|
|
52
|
+
});
|
|
53
|
+
it('reports canonical scheme details on the error', async () => {
|
|
54
|
+
await expect(validatePublicUrl('ftp://example.com/')).rejects.toMatchObject({
|
|
55
|
+
received: 'ftp',
|
|
56
|
+
expected: ['http', 'https'],
|
|
57
|
+
remediation: 'Use one of: http, https.',
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
it('compares schemes case-insensitively', async () => {
|
|
61
|
+
lookup.mockResolvedValue([{ address: '1.1.1.1', family: 4 }]);
|
|
62
|
+
await expect(validatePublicUrl('HTTPS://example.com/')).resolves.toEqual(validated('1.1.1.1', 4));
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
describe('hostname', () => {
|
|
66
|
+
it('rejects localhost without DNS lookup', async () => {
|
|
67
|
+
await expect(validatePublicUrl('http://localhost/path')).rejects.toBeInstanceOf(PrivateHostnameError);
|
|
68
|
+
expect(lookup).not.toHaveBeenCalled();
|
|
69
|
+
});
|
|
70
|
+
it('rejects .internal suffix without DNS lookup', async () => {
|
|
71
|
+
await expect(validatePublicUrl('http://db.internal/')).rejects.toBeInstanceOf(PrivateHostnameError);
|
|
72
|
+
expect(lookup).not.toHaveBeenCalled();
|
|
73
|
+
});
|
|
74
|
+
it('rejects a literal private IPv4 in the URL without DNS lookup', async () => {
|
|
75
|
+
await expect(validatePublicUrl('http://10.0.0.1/')).rejects.toBeInstanceOf(PrivateHostnameError);
|
|
76
|
+
expect(lookup).not.toHaveBeenCalled();
|
|
77
|
+
});
|
|
78
|
+
it('rejects a literal IPv6 loopback in the URL without DNS lookup', async () => {
|
|
79
|
+
await expect(validatePublicUrl('http://[::1]/')).rejects.toBeInstanceOf(PrivateHostnameError);
|
|
80
|
+
expect(lookup).not.toHaveBeenCalled();
|
|
81
|
+
});
|
|
82
|
+
it('returns the literal IP for a public IPv4 host without calling DNS', async () => {
|
|
83
|
+
await expect(validatePublicUrl('http://1.1.1.1/')).resolves.toEqual(validated('1.1.1.1', 4));
|
|
84
|
+
expect(lookup).not.toHaveBeenCalled();
|
|
85
|
+
});
|
|
86
|
+
it('returns the literal IP for a public IPv6 host without calling DNS', async () => {
|
|
87
|
+
await expect(validatePublicUrl('http://[2606:4700:4700::1111]/')).resolves.toEqual(validated('2606:4700:4700::1111', 6));
|
|
88
|
+
expect(lookup).not.toHaveBeenCalled();
|
|
89
|
+
});
|
|
90
|
+
it('rejects a literal 0.0.0.0 host without DNS lookup', async () => {
|
|
91
|
+
await expect(validatePublicUrl('http://0.0.0.0/')).rejects.toBeInstanceOf(PrivateHostnameError);
|
|
92
|
+
expect(lookup).not.toHaveBeenCalled();
|
|
93
|
+
});
|
|
94
|
+
it('rejects userinfo@host smuggling where the host is private', async () => {
|
|
95
|
+
// `URL` discards the `evil.com@` userinfo; pin the regression.
|
|
96
|
+
await expect(validatePublicUrl('http://evil.com@127.0.0.1/')).rejects.toMatchObject({
|
|
97
|
+
name: 'PrivateHostnameError',
|
|
98
|
+
received: '127.0.0.1',
|
|
99
|
+
});
|
|
100
|
+
expect(lookup).not.toHaveBeenCalled();
|
|
101
|
+
});
|
|
102
|
+
it.each([undefined, false, 'true'])('keeps private literals strict when allowPrivateAddresses is %p', async (option) => {
|
|
103
|
+
await expect(validatePublicUrl('http://10.0.0.1/', { allowPrivateAddresses: option })).rejects.toBeInstanceOf(PrivateHostnameError);
|
|
104
|
+
expect(lookup).not.toHaveBeenCalled();
|
|
105
|
+
});
|
|
106
|
+
it('rejects an empty hostname as malformed input even when private addresses are allowed', async () => {
|
|
107
|
+
await expect(validatePublicUrl('file:///', { allowedSchemes: ['file'], allowPrivateAddresses: true })).rejects.toBeInstanceOf(InvalidUrlError);
|
|
108
|
+
expect(lookup).not.toHaveBeenCalled();
|
|
109
|
+
});
|
|
110
|
+
it.each(['localhost', 'db.internal'])('resolves local names when private addresses are allowed', async (hostname) => {
|
|
111
|
+
lookup.mockResolvedValue([{ address: '10.0.0.5', family: 4 }]);
|
|
112
|
+
await expect(validatePublicUrl(`http://${hostname}/`, { allowPrivateAddresses: true })).resolves.toEqual(validated('10.0.0.5', 4));
|
|
113
|
+
expect(lookup).toHaveBeenCalledWith(hostname, { family: 0, all: true });
|
|
114
|
+
});
|
|
115
|
+
it.each([
|
|
116
|
+
['127.0.0.1', 'http://127.0.0.1/'],
|
|
117
|
+
['169.254.169.254', 'http://169.254.169.254/'],
|
|
118
|
+
['224.0.0.1', 'http://224.0.0.1/'],
|
|
119
|
+
['0.0.0.0', 'http://0.0.0.0/'],
|
|
120
|
+
['::1', 'http://[::1]/'],
|
|
121
|
+
['fc00::1', 'http://[fc00::1]/'],
|
|
122
|
+
['::ffff:10.0.0.1', 'http://[::ffff:10.0.0.1]/'],
|
|
123
|
+
])('allows the non-public literal %s without DNS when opted in', async (_address, url) => {
|
|
124
|
+
const hostname = new URL(url).hostname.replace(/^\[|\]$/g, '');
|
|
125
|
+
await expect(validatePublicUrl(url, { allowPrivateAddresses: true })).resolves.toEqual(validated(hostname, url.includes('[') ? 6 : 4));
|
|
126
|
+
expect(lookup).not.toHaveBeenCalled();
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
describe('DNS resolution', () => {
|
|
130
|
+
it('uses a supplied lookup callback while still validating its addresses', async () => {
|
|
131
|
+
const suppliedLookup = jest.fn().mockResolvedValue([{ address: '10.0.0.5', family: 4 }]);
|
|
132
|
+
await expect(validatePublicUrl('https://example.com/', { lookup: suppliedLookup })).rejects.toBeInstanceOf(PrivateAddressError);
|
|
133
|
+
expect(suppliedLookup).toHaveBeenCalledWith('example.com', { family: 0, all: true });
|
|
134
|
+
});
|
|
135
|
+
it('throws ResolutionFailedError when dns.lookup rejects', async () => {
|
|
136
|
+
lookup.mockRejectedValue(new Error('ENOTFOUND example.com'));
|
|
137
|
+
await expect(validatePublicUrl('https://example.com/')).rejects.toMatchObject({
|
|
138
|
+
name: 'ResolutionFailedError',
|
|
139
|
+
code: 'url.resolution-failed',
|
|
140
|
+
received: 'ENOTFOUND example.com',
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
it('throws ResolutionEmptyError when the resolver returns no records', async () => {
|
|
144
|
+
lookup.mockResolvedValue([]);
|
|
145
|
+
await expect(validatePublicUrl('https://example.com/')).rejects.toBeInstanceOf(ResolutionEmptyError);
|
|
146
|
+
});
|
|
147
|
+
it('rejects a record whose address does not parse as an IP', async () => {
|
|
148
|
+
lookup.mockResolvedValue([{ address: 'not-an-ip-address', family: 4 }]);
|
|
149
|
+
await expect(validatePublicUrl('https://example.com/')).rejects.toThrow(ResolutionFailedError);
|
|
150
|
+
});
|
|
151
|
+
it('rejects a record whose claimed family contradicts its address', async () => {
|
|
152
|
+
lookup.mockResolvedValue([{ address: '10.0.0.1', family: 6 }]);
|
|
153
|
+
await expect(validatePublicUrl('https://example.com/')).rejects.toThrow(ResolutionFailedError);
|
|
154
|
+
});
|
|
155
|
+
it('requires family agreement even when the address itself is public', async () => {
|
|
156
|
+
lookup.mockResolvedValue([{ address: '93.184.216.34', family: 0 }]);
|
|
157
|
+
await expect(validatePublicUrl('https://example.com/')).rejects.toThrow(ResolutionFailedError);
|
|
158
|
+
});
|
|
159
|
+
it('passes the family option through to dns.lookup with all: true', async () => {
|
|
160
|
+
lookup.mockResolvedValue([{ address: '1.1.1.1', family: 4 }]);
|
|
161
|
+
await validatePublicUrl('https://example.com/', { family: 4 });
|
|
162
|
+
expect(lookup).toHaveBeenCalledWith('example.com', { family: 4, all: true });
|
|
163
|
+
});
|
|
164
|
+
it('defaults the family option to 0 (any)', async () => {
|
|
165
|
+
lookup.mockResolvedValue([{ address: '1.1.1.1', family: 4 }]);
|
|
166
|
+
await validatePublicUrl('https://example.com/');
|
|
167
|
+
expect(lookup).toHaveBeenCalledWith('example.com', { family: 0, all: true });
|
|
168
|
+
});
|
|
169
|
+
it('throws ResolutionFailedError when dns returns an unsupported family', async () => {
|
|
170
|
+
lookup.mockResolvedValue([{ address: 'whatever', family: 7 }]);
|
|
171
|
+
await expect(validatePublicUrl('https://example.com/')).rejects.toBeInstanceOf(ResolutionFailedError);
|
|
172
|
+
});
|
|
173
|
+
it('retains DNS rejection when private addresses are allowed', async () => {
|
|
174
|
+
const dnsError = new Error('EAI_AGAIN');
|
|
175
|
+
lookup.mockRejectedValue(dnsError);
|
|
176
|
+
await expect(validatePublicUrl('https://example.com/', { allowPrivateAddresses: true })).rejects.toMatchObject({
|
|
177
|
+
name: 'ResolutionFailedError',
|
|
178
|
+
cause: dnsError,
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
it('retains empty resolution when private addresses are allowed', async () => {
|
|
182
|
+
lookup.mockResolvedValue([]);
|
|
183
|
+
await expect(validatePublicUrl('https://example.com/', { allowPrivateAddresses: true })).rejects.toBeInstanceOf(ResolutionEmptyError);
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
describe('rebind defence', () => {
|
|
187
|
+
it('rejects a hostname that resolves to AWS metadata', async () => {
|
|
188
|
+
lookup.mockResolvedValue([{ address: '169.254.169.254', family: 4 }]);
|
|
189
|
+
await expect(validatePublicUrl('https://metadata.attacker.example/')).rejects.toMatchObject({
|
|
190
|
+
name: 'PrivateAddressError',
|
|
191
|
+
code: 'url.private-address',
|
|
192
|
+
resolvedAddresses: ['169.254.169.254'],
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
it('rejects a hostname that resolves to an RFC 1918 address', async () => {
|
|
196
|
+
lookup.mockResolvedValue([{ address: '10.0.0.1', family: 4 }]);
|
|
197
|
+
await expect(validatePublicUrl('https://internal.attacker.example/')).rejects.toMatchObject({
|
|
198
|
+
name: 'PrivateAddressError',
|
|
199
|
+
resolvedAddresses: ['10.0.0.1'],
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
it('rejects a hostname that resolves to an IPv6 loopback', async () => {
|
|
203
|
+
lookup.mockResolvedValue([{ address: '::1', family: 6 }]);
|
|
204
|
+
await expect(validatePublicUrl('https://example.com/')).rejects.toBeInstanceOf(PrivateAddressError);
|
|
205
|
+
});
|
|
206
|
+
it('rejects a hostname that resolves to an IPv6 unique-local address', async () => {
|
|
207
|
+
lookup.mockResolvedValue([{ address: 'fc00::1', family: 6 }]);
|
|
208
|
+
await expect(validatePublicUrl('https://example.com/')).rejects.toBeInstanceOf(PrivateAddressError);
|
|
209
|
+
});
|
|
210
|
+
it('rejects a hostname that resolves to an IPv4-mapped private IPv6 address', async () => {
|
|
211
|
+
lookup.mockResolvedValue([{ address: '::ffff:10.0.0.1', family: 6 }]);
|
|
212
|
+
await expect(validatePublicUrl('https://example.com/')).rejects.toBeInstanceOf(PrivateAddressError);
|
|
213
|
+
});
|
|
214
|
+
it('rejects when any A or AAAA record is private even if others are public', async () => {
|
|
215
|
+
lookup.mockResolvedValue([
|
|
216
|
+
{ address: '1.1.1.1', family: 4 },
|
|
217
|
+
{ address: '169.254.169.254', family: 4 },
|
|
218
|
+
]);
|
|
219
|
+
await expect(validatePublicUrl('https://mixed.attacker.example/')).rejects.toMatchObject({
|
|
220
|
+
name: 'PrivateAddressError',
|
|
221
|
+
resolvedAddresses: ['169.254.169.254'],
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
it('returns every validated public record so callers can use them all as connect targets', async () => {
|
|
225
|
+
lookup.mockResolvedValue([
|
|
226
|
+
{ address: '1.1.1.1', family: 4 },
|
|
227
|
+
{ address: '8.8.8.8', family: 4 },
|
|
228
|
+
]);
|
|
229
|
+
await expect(validatePublicUrl('https://example.com/')).resolves.toEqual({
|
|
230
|
+
address: '1.1.1.1',
|
|
231
|
+
family: 4,
|
|
232
|
+
addresses: [
|
|
233
|
+
{ address: '1.1.1.1', family: 4 },
|
|
234
|
+
{ address: '8.8.8.8', family: 4 },
|
|
235
|
+
],
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
it('allows private and public records and returns them all when opted in', async () => {
|
|
239
|
+
lookup.mockResolvedValue([
|
|
240
|
+
{ address: '10.0.0.1', family: 4 },
|
|
241
|
+
{ address: '1.1.1.1', family: 4 },
|
|
242
|
+
]);
|
|
243
|
+
await expect(validatePublicUrl('https://mixed.example/', { allowPrivateAddresses: true })).resolves.toEqual({
|
|
244
|
+
address: '10.0.0.1',
|
|
245
|
+
family: 4,
|
|
246
|
+
addresses: [
|
|
247
|
+
{ address: '10.0.0.1', family: 4 },
|
|
248
|
+
{ address: '1.1.1.1', family: 4 },
|
|
249
|
+
],
|
|
250
|
+
});
|
|
251
|
+
});
|
|
252
|
+
// The dual-stack `localhost` case that CI hit: only one of the two
|
|
253
|
+
// addresses has a listener, so the caller needs both to reach it.
|
|
254
|
+
it('returns both records for a dual-stack loopback name when opted in', async () => {
|
|
255
|
+
lookup.mockResolvedValue([
|
|
256
|
+
{ address: '::1', family: 6 },
|
|
257
|
+
{ address: '127.0.0.1', family: 4 },
|
|
258
|
+
]);
|
|
259
|
+
await expect(validatePublicUrl('http://localhost/', { allowPrivateAddresses: true })).resolves.toEqual({
|
|
260
|
+
address: '::1',
|
|
261
|
+
family: 6,
|
|
262
|
+
addresses: [
|
|
263
|
+
{ address: '::1', family: 6 },
|
|
264
|
+
{ address: '127.0.0.1', family: 4 },
|
|
265
|
+
],
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
it('returns every public record in strict mode', async () => {
|
|
269
|
+
lookup.mockResolvedValue([
|
|
270
|
+
{ address: '1.1.1.1', family: 4 },
|
|
271
|
+
{ address: '2606:4700:4700::1111', family: 6 },
|
|
272
|
+
]);
|
|
273
|
+
await expect(validatePublicUrl('https://example.com/')).resolves.toEqual({
|
|
274
|
+
address: '1.1.1.1',
|
|
275
|
+
family: 4,
|
|
276
|
+
addresses: [
|
|
277
|
+
{ address: '1.1.1.1', family: 4 },
|
|
278
|
+
{ address: '2606:4700:4700::1111', family: 6 },
|
|
279
|
+
],
|
|
280
|
+
});
|
|
281
|
+
});
|
|
282
|
+
it('still throws when a later record is private in strict mode', async () => {
|
|
283
|
+
lookup.mockResolvedValue([
|
|
284
|
+
{ address: '1.1.1.1', family: 4 },
|
|
285
|
+
{ address: '10.0.0.1', family: 4 },
|
|
286
|
+
]);
|
|
287
|
+
await expect(validatePublicUrl('https://example.com/')).rejects.toBeInstanceOf(PrivateAddressError);
|
|
288
|
+
});
|
|
289
|
+
it('leads with a public first record rather than preferring a later private record when opted in', async () => {
|
|
290
|
+
lookup.mockResolvedValue([
|
|
291
|
+
{ address: '1.1.1.1', family: 4 },
|
|
292
|
+
{ address: '10.0.0.1', family: 4 },
|
|
293
|
+
]);
|
|
294
|
+
await expect(validatePublicUrl('https://mixed.example/', { allowPrivateAddresses: true })).resolves.toEqual({
|
|
295
|
+
address: '1.1.1.1',
|
|
296
|
+
family: 4,
|
|
297
|
+
addresses: [
|
|
298
|
+
{ address: '1.1.1.1', family: 4 },
|
|
299
|
+
{ address: '10.0.0.1', family: 4 },
|
|
300
|
+
],
|
|
301
|
+
});
|
|
302
|
+
});
|
|
303
|
+
it('checks every record for contradictory metadata in relaxed mode', async () => {
|
|
304
|
+
lookup.mockResolvedValue([
|
|
305
|
+
{ address: '10.0.0.1', family: 4 },
|
|
306
|
+
{ address: 'not-an-ip', family: 4 },
|
|
307
|
+
]);
|
|
308
|
+
await expect(validatePublicUrl('https://mixed.example/', { allowPrivateAddresses: true })).rejects.toBeInstanceOf(ResolutionFailedError);
|
|
309
|
+
});
|
|
310
|
+
it('retains family validation and lookup hints in relaxed mode', async () => {
|
|
311
|
+
lookup.mockResolvedValue([{ address: '10.0.0.1', family: 6 }]);
|
|
312
|
+
await expect(validatePublicUrl('https://mixed.example/', { allowPrivateAddresses: true, family: 6 })).rejects.toBeInstanceOf(ResolutionFailedError);
|
|
313
|
+
expect(lookup).toHaveBeenCalledWith('mixed.example', { family: 6, all: true });
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
describe('hierarchy', () => {
|
|
317
|
+
it('every concrete error extends UrlValidationError', async () => {
|
|
318
|
+
await expect(validatePublicUrl('not a url')).rejects.toBeInstanceOf(UrlValidationError);
|
|
319
|
+
lookup.mockResolvedValue([{ address: '10.0.0.1', family: 4 }]);
|
|
320
|
+
await expect(validatePublicUrl('https://example.com/')).rejects.toBeInstanceOf(UrlValidationError);
|
|
321
|
+
});
|
|
322
|
+
});
|
|
323
|
+
});
|
|
324
|
+
//# sourceMappingURL=validate-public-url.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-public-url.test.js","sourceRoot":"","sources":["../../src/node/validate-public-url.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { StructuredError } from '../structured-error.js';
|
|
2
|
+
/**
|
|
3
|
+
* Base for every diagnostic from `@uncefact/untp-utils/resolvers`.
|
|
4
|
+
* Catch to handle any resolver failure generically; catch a concrete
|
|
5
|
+
* subclass for specific handling. URL-shape failures (invalid URL,
|
|
6
|
+
* unsupported scheme, private hostname, resolution failure, private
|
|
7
|
+
* address) surface as `UrlValidationError` subclasses from the
|
|
8
|
+
* underlying `validatePublicUrl` call rather than being re-wrapped here.
|
|
9
|
+
*/
|
|
10
|
+
export declare class ResolverError extends StructuredError {
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* The fetch call rejected before producing a response (TCP/TLS error, DNS
|
|
14
|
+
* race, etc.), or the body read rejected after the headers arrived. Rejections
|
|
15
|
+
* that the resolver classifies as this request's timeout are reported as
|
|
16
|
+
* {@link ResolverTimedOutError} instead; every other rejection caught at those
|
|
17
|
+
* two awaits, including a non-abort-shaped one that arrives after the deadline
|
|
18
|
+
* has passed, arrives here.
|
|
19
|
+
*/
|
|
20
|
+
export declare class ResolverNetworkError extends ResolverError {
|
|
21
|
+
constructor(url: string, cause: unknown);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The remote returned a non-success HTTP status. `url` is the URL of the hop
|
|
25
|
+
* that produced the status (the end of the redirect chain), exposed so
|
|
26
|
+
* callers can still report on the final URL of a failed resolution.
|
|
27
|
+
*/
|
|
28
|
+
export declare class ResolverHttpError extends ResolverError {
|
|
29
|
+
readonly status: number;
|
|
30
|
+
readonly url: string;
|
|
31
|
+
constructor(url: string, status: number);
|
|
32
|
+
}
|
|
33
|
+
/** The response body exceeded the configured size cap. */
|
|
34
|
+
export declare class ResolverTooLargeError extends ResolverError {
|
|
35
|
+
readonly limit: number;
|
|
36
|
+
constructor(url: string, limit: number);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* A redirect chain exceeded the configured maximum hop count. `.lastHopUrl` is
|
|
40
|
+
* optional. The resolver supplies it as the hop that answered the exhausting
|
|
41
|
+
* redirect whenever a chain exhausts a finite non-negative integer
|
|
42
|
+
* `maxRedirects`, which is the supported input. It is absent otherwise: for a
|
|
43
|
+
* negative or non-integer limit, where the loop names no responder, and for a
|
|
44
|
+
* direct two-argument construction, which this constructor permits.
|
|
45
|
+
*/
|
|
46
|
+
export declare class ResolverTooManyRedirectsError extends ResolverError {
|
|
47
|
+
readonly limit: number;
|
|
48
|
+
readonly lastHopUrl?: string;
|
|
49
|
+
constructor(startUrl: string, limit: number, lastHopUrl?: string);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* The request's total deadline expired. That covers expiry while the guard was
|
|
53
|
+
* still waiting on DNS, before any fetch began, as well as a fetch or body read
|
|
54
|
+
* that rejected with an abort-shaped error once this request's signal had
|
|
55
|
+
* fired.
|
|
56
|
+
*/
|
|
57
|
+
export declare class ResolverTimedOutError extends ResolverError {
|
|
58
|
+
readonly timeoutMs: number;
|
|
59
|
+
constructor(url: string, timeoutMs: number, cause?: unknown);
|
|
60
|
+
}
|
|
61
|
+
/** A 3xx response was received without a parseable `Location` header. */
|
|
62
|
+
export declare class ResolverRedirectMissingLocationError extends ResolverError {
|
|
63
|
+
constructor(url: string, received: string | number, cause?: unknown);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* The response body was fetched but could not be parsed as JSON. `url` is
|
|
67
|
+
* the final URL the body was fetched from (after redirect chasing), exposed
|
|
68
|
+
* so callers can still report on the final URL of a failed resolution.
|
|
69
|
+
*/
|
|
70
|
+
export declare class ResolverInvalidJsonError extends ResolverError {
|
|
71
|
+
readonly url: string;
|
|
72
|
+
constructor(url: string, cause: unknown);
|
|
73
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { StructuredError } from '../structured-error.js';
|
|
2
|
+
/**
|
|
3
|
+
* Base for every diagnostic from `@uncefact/untp-utils/resolvers`.
|
|
4
|
+
* Catch to handle any resolver failure generically; catch a concrete
|
|
5
|
+
* subclass for specific handling. URL-shape failures (invalid URL,
|
|
6
|
+
* unsupported scheme, private hostname, resolution failure, private
|
|
7
|
+
* address) surface as `UrlValidationError` subclasses from the
|
|
8
|
+
* underlying `validatePublicUrl` call rather than being re-wrapped here.
|
|
9
|
+
*/
|
|
10
|
+
export class ResolverError extends StructuredError {
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* The fetch call rejected before producing a response (TCP/TLS error, DNS
|
|
14
|
+
* race, etc.), or the body read rejected after the headers arrived. Rejections
|
|
15
|
+
* that the resolver classifies as this request's timeout are reported as
|
|
16
|
+
* {@link ResolverTimedOutError} instead; every other rejection caught at those
|
|
17
|
+
* two awaits, including a non-abort-shaped one that arrives after the deadline
|
|
18
|
+
* has passed, arrives here.
|
|
19
|
+
*/
|
|
20
|
+
export class ResolverNetworkError extends ResolverError {
|
|
21
|
+
constructor(url, cause) {
|
|
22
|
+
super({
|
|
23
|
+
code: 'resolver.network-error',
|
|
24
|
+
message: `Network error fetching ${url}.`,
|
|
25
|
+
received: cause instanceof Error ? cause.message : String(cause),
|
|
26
|
+
cause,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The remote returned a non-success HTTP status. `url` is the URL of the hop
|
|
32
|
+
* that produced the status (the end of the redirect chain), exposed so
|
|
33
|
+
* callers can still report on the final URL of a failed resolution.
|
|
34
|
+
*/
|
|
35
|
+
export class ResolverHttpError extends ResolverError {
|
|
36
|
+
status;
|
|
37
|
+
url;
|
|
38
|
+
constructor(url, status) {
|
|
39
|
+
super({
|
|
40
|
+
code: 'resolver.http-error',
|
|
41
|
+
message: `${url} returned status ${status}.`,
|
|
42
|
+
received: status,
|
|
43
|
+
expected: '2xx',
|
|
44
|
+
});
|
|
45
|
+
this.status = status;
|
|
46
|
+
this.url = url;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/** The response body exceeded the configured size cap. */
|
|
50
|
+
export class ResolverTooLargeError extends ResolverError {
|
|
51
|
+
limit;
|
|
52
|
+
constructor(url, limit) {
|
|
53
|
+
super({
|
|
54
|
+
code: 'resolver.too-large',
|
|
55
|
+
message: `Response body for ${url} exceeds ${limit}-byte limit.`,
|
|
56
|
+
received: `> ${limit} bytes`,
|
|
57
|
+
expected: `<= ${limit} bytes`,
|
|
58
|
+
});
|
|
59
|
+
this.limit = limit;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* A redirect chain exceeded the configured maximum hop count. `.lastHopUrl` is
|
|
64
|
+
* optional. The resolver supplies it as the hop that answered the exhausting
|
|
65
|
+
* redirect whenever a chain exhausts a finite non-negative integer
|
|
66
|
+
* `maxRedirects`, which is the supported input. It is absent otherwise: for a
|
|
67
|
+
* negative or non-integer limit, where the loop names no responder, and for a
|
|
68
|
+
* direct two-argument construction, which this constructor permits.
|
|
69
|
+
*/
|
|
70
|
+
export class ResolverTooManyRedirectsError extends ResolverError {
|
|
71
|
+
limit;
|
|
72
|
+
lastHopUrl;
|
|
73
|
+
constructor(startUrl, limit, lastHopUrl) {
|
|
74
|
+
super({
|
|
75
|
+
code: 'resolver.too-many-redirects',
|
|
76
|
+
message: `Exceeded ${limit} redirect hops starting from ${startUrl}.`,
|
|
77
|
+
received: `> ${limit} hops`,
|
|
78
|
+
expected: `<= ${limit} hops`,
|
|
79
|
+
});
|
|
80
|
+
this.limit = limit;
|
|
81
|
+
if (lastHopUrl !== undefined)
|
|
82
|
+
this.lastHopUrl = lastHopUrl;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* The request's total deadline expired. That covers expiry while the guard was
|
|
87
|
+
* still waiting on DNS, before any fetch began, as well as a fetch or body read
|
|
88
|
+
* that rejected with an abort-shaped error once this request's signal had
|
|
89
|
+
* fired.
|
|
90
|
+
*/
|
|
91
|
+
export class ResolverTimedOutError extends ResolverError {
|
|
92
|
+
timeoutMs;
|
|
93
|
+
constructor(url, timeoutMs, cause) {
|
|
94
|
+
super({
|
|
95
|
+
code: 'resolver.timed-out',
|
|
96
|
+
message: `Request to ${url} timed out after ${timeoutMs}ms.`,
|
|
97
|
+
received: `> ${timeoutMs}ms`,
|
|
98
|
+
expected: `<= ${timeoutMs}ms`,
|
|
99
|
+
cause,
|
|
100
|
+
});
|
|
101
|
+
this.timeoutMs = timeoutMs;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/** A 3xx response was received without a parseable `Location` header. */
|
|
105
|
+
export class ResolverRedirectMissingLocationError extends ResolverError {
|
|
106
|
+
constructor(url, received, cause) {
|
|
107
|
+
super({
|
|
108
|
+
code: 'resolver.redirect-missing-location',
|
|
109
|
+
message: `Redirect from ${url} had no parseable Location header.`,
|
|
110
|
+
received,
|
|
111
|
+
cause,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* The response body was fetched but could not be parsed as JSON. `url` is
|
|
117
|
+
* the final URL the body was fetched from (after redirect chasing), exposed
|
|
118
|
+
* so callers can still report on the final URL of a failed resolution.
|
|
119
|
+
*/
|
|
120
|
+
export class ResolverInvalidJsonError extends ResolverError {
|
|
121
|
+
url;
|
|
122
|
+
constructor(url, cause) {
|
|
123
|
+
super({
|
|
124
|
+
code: 'resolver.invalid-json',
|
|
125
|
+
message: `Response body for ${url} is not valid JSON.`,
|
|
126
|
+
received: cause instanceof Error ? cause.message : String(cause),
|
|
127
|
+
expected: 'a JSON document',
|
|
128
|
+
cause,
|
|
129
|
+
});
|
|
130
|
+
this.url = url;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/resolvers/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { ResolverError, ResolverNetworkError, ResolverHttpError, ResolverTooLargeError, ResolverTooManyRedirectsError, ResolverTimedOutError, ResolverRedirectMissingLocationError, ResolverInvalidJsonError, } from './errors.js';
|
|
2
|
+
export { resolveDocument, RESOLVER_DEFAULTS, type LoadResult, type ResolveDocumentOptions, } from './resolve-document.js';
|
|
3
|
+
export { DEFAULT_USER_AGENT, USER_AGENT_ENV_VAR, isValidHttpUserAgent } from '../http-headers/index.js';
|
|
4
|
+
export { resolveJsonDocument, type ResolveJsonDocumentOptions, type ResolvedJsonDocument, } from './resolve-json-document.js';
|
|
5
|
+
export { resolveDocumentIfChanged, type CachedResource, type ResolveDocumentIfChangedValue, } from './resolve-document-if-changed.js';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { ResolverError, ResolverNetworkError, ResolverHttpError, ResolverTooLargeError, ResolverTooManyRedirectsError, ResolverTimedOutError, ResolverRedirectMissingLocationError, ResolverInvalidJsonError, } from './errors.js';
|
|
2
|
+
export { resolveDocument, RESOLVER_DEFAULTS, } from './resolve-document.js';
|
|
3
|
+
export { DEFAULT_USER_AGENT, USER_AGENT_ENV_VAR, isValidHttpUserAgent } from '../http-headers/index.js';
|
|
4
|
+
export { resolveJsonDocument, } from './resolve-json-document.js';
|
|
5
|
+
export { resolveDocumentIfChanged, } from './resolve-document-if-changed.js';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resolvers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,EACrB,6BAA6B,EAC7B,qBAAqB,EACrB,oCAAoC,EACpC,wBAAwB,GACzB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,eAAe,EACf,iBAAiB,GAGlB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACxG,OAAO,EACL,mBAAmB,GAGpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,wBAAwB,GAGzB,MAAM,kCAAkC,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { MultibaseDigest } from '../multibase-digest/index.js';
|
|
2
|
+
import { type LoadResult, type ResolveDocumentOptions } from './resolve-document.js';
|
|
3
|
+
/**
|
|
4
|
+
* Description of a previously-cached resource, used by
|
|
5
|
+
* {@link resolveDocumentIfChanged} to drive the conditional-fetch skip
|
|
6
|
+
* chain (`If-None-Match`, `If-Modified-Since`, body-digest comparison).
|
|
7
|
+
*/
|
|
8
|
+
export interface CachedResource {
|
|
9
|
+
/** The `ETag` previously observed for this URL, if any. */
|
|
10
|
+
etag?: string;
|
|
11
|
+
/** The `Last-Modified` header previously observed, if any. */
|
|
12
|
+
lastModifiedHeader?: string;
|
|
13
|
+
/** The body digest of the previously cached response. */
|
|
14
|
+
bodyDigest?: MultibaseDigest;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Discriminated return from {@link resolveDocumentIfChanged}.
|
|
18
|
+
*
|
|
19
|
+
* - `{ kind: 'unchanged' }`: the upstream confirmed the cache is fresh
|
|
20
|
+
* (either via a `304 Not Modified` or via a `200` whose body digest
|
|
21
|
+
* matched `cached.bodyDigest`).
|
|
22
|
+
* - `{ kind: 'loaded'; result }`: the upstream returned fresh content;
|
|
23
|
+
* `result` is the new {@link LoadResult} the caller should store.
|
|
24
|
+
*/
|
|
25
|
+
export type ResolveDocumentIfChangedValue = {
|
|
26
|
+
kind: 'unchanged';
|
|
27
|
+
} | {
|
|
28
|
+
kind: 'loaded';
|
|
29
|
+
result: LoadResult;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Conditional-fetch wrapper around {@link resolveDocument} that implements
|
|
33
|
+
* the skip chain from ADR-033 §1.
|
|
34
|
+
*
|
|
35
|
+
* Three short-circuits, in order:
|
|
36
|
+
*
|
|
37
|
+
* 1. **`304 Not Modified`** from the upstream (driven by `If-None-Match`
|
|
38
|
+
* and `If-Modified-Since` headers built from `cached.etag` and
|
|
39
|
+
* `cached.lastModifiedHeader`).
|
|
40
|
+
* 2. **Body-digest match** after a `200 OK` (the upstream ignored the
|
|
41
|
+
* conditional headers but returned the same content; compared against
|
|
42
|
+
* `cached.bodyDigest`).
|
|
43
|
+
* 3. Otherwise, the fresh {@link LoadResult} is returned under the
|
|
44
|
+
* `loaded` discriminator.
|
|
45
|
+
*
|
|
46
|
+
* Errors from the underlying {@link resolveDocument} propagate unchanged.
|
|
47
|
+
*/
|
|
48
|
+
export declare function resolveDocumentIfChanged(url: string, cached: CachedResource, options?: ResolveDocumentOptions): Promise<ResolveDocumentIfChangedValue>;
|