@wirebench/engine 2.2.0 → 3.1.0-rc.1
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 +134 -1
- package/dist/account/schema.d.ts +34 -0
- package/dist/account/schema.js +29 -0
- package/dist/assert/callback.d.ts +76 -0
- package/dist/assert/callback.js +320 -0
- package/dist/assert/capture-source.d.ts +50 -0
- package/dist/assert/capture-source.js +89 -0
- package/dist/assert/check.d.ts +8 -0
- package/dist/assert/check.js +18 -0
- package/dist/assert/header.d.ts +5 -0
- package/dist/assert/header.js +48 -0
- package/dist/assert/index.d.ts +2 -2
- package/dist/assert/index.js +12 -0
- package/dist/assert/match.d.ts +6 -0
- package/dist/assert/match.js +13 -4
- package/dist/assert/model.d.ts +110 -3
- package/dist/assert/model.js +16 -1
- package/dist/assert/schema.d.ts +194 -1
- package/dist/assert/schema.js +154 -12
- package/dist/assert/status-names.d.ts +9 -0
- package/dist/assert/status-names.js +27 -0
- package/dist/assert/status.d.ts +4 -1
- package/dist/assert/status.js +27 -3
- package/dist/asyncapi/browser.d.ts +7 -0
- package/dist/asyncapi/browser.js +6 -0
- package/dist/asyncapi/frame-check-worker-host.d.ts +44 -0
- package/dist/asyncapi/frame-check-worker-host.js +175 -0
- package/dist/asyncapi/frame-check-worker.d.ts +12 -0
- package/dist/asyncapi/frame-check-worker.js +25 -0
- package/dist/asyncapi/frame-check.d.ts +25 -0
- package/dist/asyncapi/frame-check.js +78 -0
- package/dist/asyncapi/import.d.ts +25 -0
- package/dist/asyncapi/import.js +34 -0
- package/dist/asyncapi/map.d.ts +40 -0
- package/dist/asyncapi/map.js +230 -0
- package/dist/asyncapi/model.d.ts +84 -0
- package/dist/asyncapi/model.js +7 -0
- package/dist/asyncapi/normalise-2.d.ts +13 -0
- package/dist/asyncapi/normalise-2.js +113 -0
- package/dist/asyncapi/normalise-3.d.ts +14 -0
- package/dist/asyncapi/normalise-3.js +133 -0
- package/dist/asyncapi/parse.d.ts +31 -0
- package/dist/asyncapi/parse.js +85 -0
- package/dist/asyncapi/read.d.ts +35 -0
- package/dist/asyncapi/read.js +186 -0
- package/dist/asyncapi/security.d.ts +14 -0
- package/dist/asyncapi/security.js +55 -0
- package/dist/asyncapi/update.d.ts +53 -0
- package/dist/asyncapi/update.js +220 -0
- package/dist/errors.d.ts +16 -0
- package/dist/errors.js +22 -0
- package/dist/grpc/events.d.ts +22 -0
- package/dist/grpc/events.js +1 -0
- package/dist/grpc/expand.d.ts +1 -1
- package/dist/grpc/expand.js +15 -5
- package/dist/grpc/files.d.ts +271 -0
- package/dist/grpc/files.js +62 -0
- package/dist/grpc/model.d.ts +11 -1
- package/dist/grpc/module.d.ts +2 -0
- package/dist/grpc/module.js +13 -0
- package/dist/grpc/run.d.ts +73 -0
- package/dist/grpc/run.js +407 -0
- package/dist/grpc/script-types.d.ts +8 -0
- package/dist/grpc/script-types.js +149 -0
- package/dist/grpc/scripting.d.ts +34 -0
- package/dist/grpc/scripting.js +147 -0
- package/dist/grpc/send-input.d.ts +46 -0
- package/dist/grpc/send-input.js +42 -0
- package/dist/grpc/send.d.ts +2 -2
- package/dist/grpc/status.d.ts +9 -2
- package/dist/grpc/status.js +11 -24
- package/dist/grpc/storage.d.ts +9 -0
- package/dist/grpc/storage.js +167 -0
- package/dist/{rest/auth.d.ts → http/auth/apply-auth.d.ts} +4 -4
- package/dist/{rest/auth.js → http/auth/apply-auth.js} +1 -1
- package/dist/http/auth/apply.d.ts +1 -1
- package/dist/{rest → http/auth}/oauth2.d.ts +2 -2
- package/dist/{rest → http/auth}/oauth2.js +1 -1
- package/dist/http/auth/send-auth.d.ts +57 -0
- package/dist/http/auth/send-auth.js +7 -0
- package/dist/http/client.js +150 -8
- package/dist/http/cookies.d.ts +79 -0
- package/dist/http/cookies.js +81 -0
- package/dist/http/curl.d.ts +4 -14
- package/dist/http/curl.js +4 -154
- package/dist/http/decompress.d.ts +7 -0
- package/dist/http/decompress.js +23 -1
- package/dist/http/document-fetch.d.ts +42 -0
- package/dist/http/document-fetch.js +207 -0
- package/dist/http/entries.d.ts +27 -0
- package/dist/http/entries.js +16 -0
- package/dist/http/escape.d.ts +18 -0
- package/dist/http/escape.js +30 -0
- package/dist/http/fetch-document.d.ts +28 -0
- package/dist/{wsdl/fetch.js → http/fetch-document.js} +8 -16
- package/dist/http/media-type.d.ts +9 -0
- package/dist/http/media-type.js +12 -0
- package/dist/http/transcript-cap.d.ts +26 -0
- package/dist/http/transcript-cap.js +36 -0
- package/dist/http/types.d.ts +59 -0
- package/dist/http/webhook-signature.d.ts +81 -0
- package/dist/http/webhook-signature.js +227 -0
- package/dist/import-detect.d.ts +2 -2
- package/dist/import-detect.js +10 -1
- package/dist/index.d.ts +207 -55
- package/dist/index.js +129 -32
- package/dist/json/cursor.d.ts +2 -0
- package/dist/json/cursor.js +1 -0
- package/dist/json/pointer-range.d.ts +18 -0
- package/dist/json/pointer-range.js +157 -0
- package/dist/json/schema/model.d.ts +59 -0
- package/dist/json/schema/model.js +8 -0
- package/dist/json/schema/parse-text.d.ts +16 -0
- package/dist/json/schema/parse-text.js +37 -0
- package/dist/{rest/openapi → json/schema}/refs.d.ts +2 -2
- package/dist/{rest/openapi → json/schema}/refs.js +3 -3
- package/dist/{rest/openapi → json/schema}/sample.d.ts +4 -0
- package/dist/{rest/openapi → json/schema}/sample.js +2 -2
- package/dist/json/schema/source.d.ts +21 -0
- package/dist/json/schema/source.js +8 -0
- package/dist/json/schema-validate.d.ts +49 -0
- package/dist/json/schema-validate.js +557 -0
- package/dist/{wss/keystore → keystore}/index.js +1 -1
- package/dist/{wss/keystore → keystore}/pem.js +1 -1
- package/dist/{wss/keystore → keystore}/pkcs12.js +1 -1
- package/dist/project/attachments-cache.d.ts +3 -1
- package/dist/{wsdl → project}/cache-naming.js +1 -1
- package/dist/project/endpoints.d.ts +18 -8
- package/dist/project/endpoints.js +21 -6
- package/dist/project/environments.d.ts +7 -5
- package/dist/project/history.d.ts +105 -9
- package/dist/project/history.js +195 -23
- package/dist/project/inherit.d.ts +7 -0
- package/dist/project/inherit.js +9 -0
- package/dist/project/keystores.d.ts +1 -1
- package/dist/project/load-helpers.d.ts +89 -0
- package/dist/project/load-helpers.js +177 -0
- package/dist/project/load.d.ts +30 -4
- package/dist/project/load.js +168 -545
- package/dist/project/managed-files.d.ts +36 -0
- package/dist/project/managed-files.js +97 -0
- package/dist/project/migrate.d.ts +2 -2
- package/dist/project/migrate.js +2 -2
- package/dist/project/model.d.ts +92 -14
- package/dist/project/model.js +50 -4
- package/dist/project/paths.d.ts +10 -1
- package/dist/project/paths.js +10 -1
- package/dist/project/preferences.d.ts +11 -2
- package/dist/project/preferences.js +5 -1
- package/dist/project/properties.d.ts +31 -17
- package/dist/project/properties.js +89 -70
- package/dist/project/request-location.d.ts +20 -0
- package/dist/project/request-location.js +62 -0
- package/dist/project/save.d.ts +12 -2
- package/dist/project/save.js +186 -141
- package/dist/project/schema-parts.d.ts +337 -0
- package/dist/project/schema-parts.js +248 -0
- package/dist/project/schema.d.ts +72 -928
- package/dist/project/schema.js +17 -466
- package/dist/project/sequence-guards.d.ts +43 -0
- package/dist/project/sequence-guards.js +109 -0
- package/dist/project/serialize-helpers.d.ts +60 -0
- package/dist/project/serialize-helpers.js +108 -0
- package/dist/project/serialize.d.ts +7 -8
- package/dist/project/serialize.js +34 -293
- package/dist/protocol/features.d.ts +51 -0
- package/dist/protocol/features.js +64 -0
- package/dist/protocol/index.d.ts +7 -0
- package/dist/protocol/index.js +4 -0
- package/dist/protocol/module.d.ts +247 -0
- package/dist/protocol/module.js +48 -0
- package/dist/protocol/registry.d.ts +42 -0
- package/dist/protocol/registry.js +47 -0
- package/dist/protocols.d.ts +77 -0
- package/dist/protocols.js +40 -0
- package/dist/redact/index.d.ts +12 -1
- package/dist/redact/index.js +55 -7
- package/dist/redact/literal.d.ts +10 -0
- package/dist/redact/literal.js +110 -12
- package/dist/rest/body.d.ts +2 -10
- package/dist/rest/body.js +3 -25
- package/dist/rest/browser.d.ts +4 -0
- package/dist/rest/browser.js +5 -0
- package/dist/rest/contract-check-worker-host.d.ts +36 -0
- package/dist/rest/contract-check-worker-host.js +158 -0
- package/dist/rest/contract-check-worker.d.ts +7 -0
- package/dist/rest/contract-check-worker.js +28 -0
- package/dist/rest/contract-check.d.ts +43 -0
- package/dist/rest/contract-check.js +217 -0
- package/dist/rest/cookie-jar.d.ts +62 -0
- package/dist/rest/cookie-jar.js +262 -0
- package/dist/rest/cookies.d.ts +6 -22
- package/dist/rest/cookies.js +6 -42
- package/dist/rest/curl.js +5 -1
- package/dist/rest/events.d.ts +12 -0
- package/dist/rest/events.js +1 -0
- package/dist/rest/expand.d.ts +6 -1
- package/dist/rest/expand.js +29 -11
- package/dist/rest/files.d.ts +439 -0
- package/dist/rest/files.js +107 -0
- package/dist/rest/json-form.d.ts +97 -0
- package/dist/rest/json-form.js +396 -0
- package/dist/rest/model.d.ts +35 -24
- package/dist/rest/model.js +6 -9
- package/dist/rest/module.d.ts +2 -0
- package/dist/rest/module.js +13 -0
- package/dist/rest/openapi/cache.d.ts +7 -2
- package/dist/rest/openapi/cache.js +2 -2
- package/dist/rest/openapi/import.d.ts +11 -16
- package/dist/rest/openapi/import.js +6 -2
- package/dist/rest/openapi/map.d.ts +38 -1
- package/dist/rest/openapi/map.js +151 -41
- package/dist/rest/openapi/match.d.ts +20 -0
- package/dist/rest/openapi/match.js +117 -0
- package/dist/rest/openapi/model.d.ts +33 -45
- package/dist/rest/openapi/parse.d.ts +3 -12
- package/dist/rest/openapi/parse.js +138 -67
- package/dist/rest/openapi/responses.d.ts +23 -0
- package/dist/rest/openapi/responses.js +59 -0
- package/dist/rest/openapi/runtime-expression.d.ts +69 -0
- package/dist/rest/openapi/runtime-expression.js +213 -0
- package/dist/rest/openapi/update.d.ts +116 -0
- package/dist/rest/openapi/update.js +456 -0
- package/dist/rest/postman/map.d.ts +1 -0
- package/dist/rest/postman/map.js +66 -4
- package/dist/rest/postman/model.d.ts +9 -0
- package/dist/rest/postman/parse.js +33 -10
- package/dist/rest/response.d.ts +2 -23
- package/dist/rest/response.js +3 -75
- package/dist/rest/run.d.ts +56 -0
- package/dist/rest/run.js +395 -0
- package/dist/rest/script-types.d.ts +7 -0
- package/dist/rest/script-types.js +83 -0
- package/dist/rest/scripting.d.ts +38 -0
- package/dist/rest/scripting.js +282 -0
- package/dist/rest/send-input.d.ts +54 -0
- package/dist/rest/send-input.js +73 -0
- package/dist/rest/send.d.ts +77 -4
- package/dist/rest/send.js +128 -7
- package/dist/rest/sse-transcript.d.ts +25 -0
- package/dist/rest/sse-transcript.js +95 -0
- package/dist/rest/sse.d.ts +43 -0
- package/dist/rest/sse.js +195 -0
- package/dist/rest/storage.d.ts +26 -0
- package/dist/rest/storage.js +262 -0
- package/dist/rest/url.d.ts +10 -4
- package/dist/rest/url.js +38 -5
- package/dist/run/baseline-update.d.ts +35 -0
- package/dist/run/baseline-update.js +97 -0
- package/dist/run/baseline.d.ts +42 -0
- package/dist/run/baseline.js +93 -0
- package/dist/run/context.d.ts +86 -0
- package/dist/run/context.js +31 -0
- package/dist/run/current-values.d.ts +32 -0
- package/dist/run/current-values.js +43 -0
- package/dist/run/event-queue.d.ts +14 -0
- package/dist/run/event-queue.js +46 -0
- package/dist/run/exchange.d.ts +62 -0
- package/dist/run/exchange.js +65 -0
- package/dist/run/host.d.ts +89 -0
- package/dist/run/host.js +1 -0
- package/dist/run/index.d.ts +20 -7
- package/dist/run/index.js +12 -4
- package/dist/run/oauth2-token.d.ts +42 -0
- package/dist/run/oauth2-token.js +92 -0
- package/dist/run/open.d.ts +12 -0
- package/dist/run/open.js +16 -0
- package/dist/run/run.d.ts +124 -4
- package/dist/run/run.js +293 -134
- package/dist/run/scope.d.ts +11 -0
- package/dist/run/scope.js +26 -0
- package/dist/run/script-support.d.ts +53 -0
- package/dist/run/script-support.js +68 -0
- package/dist/run/secret-needs.d.ts +11 -4
- package/dist/run/secret-needs.js +48 -96
- package/dist/run/select.d.ts +34 -25
- package/dist/run/select.js +45 -54
- package/dist/run/send-helpers.d.ts +93 -0
- package/dist/run/send-helpers.js +255 -0
- package/dist/run/tree.d.ts +50 -0
- package/dist/run/tree.js +54 -0
- package/dist/script/api/postman.d.ts +10 -0
- package/dist/script/api/postman.js +264 -0
- package/dist/script/api/prelude.d.ts +20 -0
- package/dist/script/api/prelude.js +215 -0
- package/dist/script/apply.d.ts +44 -0
- package/dist/script/apply.js +120 -0
- package/dist/script/check/host.d.ts +41 -0
- package/dist/script/check/host.js +143 -0
- package/dist/script/check/service.d.ts +52 -0
- package/dist/script/check/service.js +195 -0
- package/dist/script/check/worker.d.ts +1 -0
- package/dist/script/check/worker.js +40 -0
- package/dist/script/index.d.ts +16 -0
- package/dist/script/index.js +10 -0
- package/dist/script/lookup.d.ts +10 -0
- package/dist/script/lookup.js +23 -0
- package/dist/script/model.d.ts +82 -0
- package/dist/script/model.js +18 -0
- package/dist/script/props.d.ts +8 -0
- package/dist/script/props.js +28 -0
- package/dist/script/request-scripts.d.ts +83 -0
- package/dist/script/request-scripts.js +160 -0
- package/dist/script/run.d.ts +47 -0
- package/dist/script/run.js +146 -0
- package/dist/script/sandbox/execute.d.ts +26 -0
- package/dist/script/sandbox/execute.js +212 -0
- package/dist/script/sandbox/host-api.d.ts +27 -0
- package/dist/script/sandbox/host-api.js +101 -0
- package/dist/script/sandbox/host.d.ts +18 -0
- package/dist/script/sandbox/host.js +172 -0
- package/dist/script/sandbox/model.d.ts +69 -0
- package/dist/script/sandbox/model.js +24 -0
- package/dist/script/sandbox/worker.d.ts +1 -0
- package/dist/script/sandbox/worker.js +20 -0
- package/dist/script/send.d.ts +27 -0
- package/dist/script/send.js +76 -0
- package/dist/script/strip.d.ts +5 -0
- package/dist/script/strip.js +43 -0
- package/dist/script/types/api.d.ts +38 -0
- package/dist/script/types/api.js +113 -0
- package/dist/script/types/json-schema.d.ts +26 -0
- package/dist/script/types/json-schema.js +206 -0
- package/dist/secrets/env-names.d.ts +9 -1
- package/dist/secrets/env-names.js +17 -1
- package/dist/secrets/resolve.d.ts +44 -4
- package/dist/secrets/resolve.js +58 -1
- package/dist/secrets/scan/apply.d.ts +36 -0
- package/dist/secrets/scan/apply.js +194 -0
- package/dist/secrets/scan/rules.d.ts +32 -0
- package/dist/secrets/scan/rules.js +346 -0
- package/dist/secrets/scan/scan.d.ts +6 -0
- package/dist/secrets/scan/scan.js +57 -0
- package/dist/secrets/scan/walk.d.ts +70 -0
- package/dist/secrets/scan/walk.js +156 -0
- package/dist/secrets/secret-refs.d.ts +8 -0
- package/dist/secrets/secret-refs.js +25 -0
- package/dist/secrets/secret-token.d.ts +17 -0
- package/dist/secrets/secret-token.js +25 -0
- package/dist/sequence/file.d.ts +169 -0
- package/dist/sequence/file.js +237 -0
- package/dist/sequence/index.d.ts +7 -0
- package/dist/sequence/index.js +5 -0
- package/dist/sequence/load.d.ts +32 -0
- package/dist/sequence/load.js +56 -0
- package/dist/sequence/model.d.ts +115 -0
- package/dist/sequence/model.js +53 -0
- package/dist/sequence/run.d.ts +131 -0
- package/dist/sequence/run.js +191 -0
- package/dist/sequence/transfer.d.ts +24 -0
- package/dist/sequence/transfer.js +75 -0
- package/dist/server-api/audit.d.ts +455 -0
- package/dist/server-api/audit.js +186 -0
- package/dist/server-api/ci-tokens.d.ts +50 -0
- package/dist/server-api/ci-tokens.js +35 -0
- package/dist/server-api/hooks.d.ts +337 -0
- package/dist/server-api/hooks.js +152 -0
- package/dist/server-api/identity.d.ts +210 -0
- package/dist/server-api/identity.js +115 -0
- package/dist/server-api/licensing.d.ts +80 -0
- package/dist/server-api/licensing.js +53 -0
- package/dist/server-api/live.d.ts +132 -0
- package/dist/server-api/live.js +102 -0
- package/dist/server-api/meta.d.ts +31 -0
- package/dist/server-api/meta.js +21 -0
- package/dist/server-api/sync.d.ts +179 -0
- package/dist/server-api/sync.js +124 -0
- package/dist/server-api/teams.d.ts +306 -0
- package/dist/server-api/teams.js +113 -0
- package/dist/snapshot/diff.d.ts +30 -0
- package/dist/snapshot/diff.js +75 -0
- package/dist/snapshot/format.d.ts +17 -0
- package/dist/snapshot/format.js +40 -0
- package/dist/snapshot/golden-file.d.ts +45 -0
- package/dist/snapshot/golden-file.js +173 -0
- package/dist/snapshot/ignore.d.ts +14 -0
- package/dist/snapshot/ignore.js +79 -0
- package/dist/snapshot/index.d.ts +9 -0
- package/dist/snapshot/index.js +9 -0
- package/dist/snapshot/json-diff.d.ts +3 -0
- package/dist/snapshot/json-diff.js +93 -0
- package/dist/snapshot/xml-diff.d.ts +10 -0
- package/dist/snapshot/xml-diff.js +194 -0
- package/dist/soap/auth.d.ts +26 -0
- package/dist/soap/auth.js +54 -0
- package/dist/soap/curl.d.ts +20 -0
- package/dist/soap/curl.js +161 -0
- package/dist/soap/expand.d.ts +24 -0
- package/dist/soap/expand.js +95 -0
- package/dist/soap/files.d.ts +384 -0
- package/dist/soap/files.js +114 -0
- package/dist/soap/form-request.d.ts +13 -0
- package/dist/soap/form-request.js +2 -2
- package/dist/soap/generate.d.ts +12 -0
- package/dist/{generate.js → soap/generate.js} +4 -4
- package/dist/{import.d.ts → soap/import.d.ts} +4 -4
- package/dist/{import.js → soap/import.js} +13 -13
- package/dist/soap/json-operation.d.ts +35 -0
- package/dist/soap/json-operation.js +225 -0
- package/dist/soap/legacy-project/env-refs.d.ts +19 -0
- package/dist/soap/legacy-project/env-refs.js +105 -0
- package/dist/soap/legacy-project/map.d.ts +2 -2
- package/dist/soap/legacy-project/map.js +6 -0
- package/dist/soap/mime/multipart.d.ts +2 -2
- package/dist/soap/mime/multipart.js +2 -5
- package/dist/soap/mime/send-pipeline.d.ts +1 -1
- package/dist/soap/mime/send-pipeline.js +1 -1
- package/dist/soap/mime/types.d.ts +1 -3
- package/dist/soap/module.d.ts +2 -0
- package/dist/soap/module.js +13 -0
- package/dist/soap/namespace-scope.js +1 -1
- package/dist/soap/operations.d.ts +12 -0
- package/dist/{operations.js → soap/operations.js} +4 -4
- package/dist/soap/run.d.ts +70 -0
- package/dist/soap/run.js +549 -0
- package/dist/soap/script-types.d.ts +65 -0
- package/dist/soap/script-types.js +379 -0
- package/dist/soap/scripting.d.ts +45 -0
- package/dist/soap/scripting.js +221 -0
- package/dist/soap/send-input.d.ts +61 -0
- package/dist/{send-options.js → soap/send-input.js} +5 -109
- package/dist/{send.d.ts → soap/send.d.ts} +1 -1
- package/dist/{send.js → soap/send.js} +28 -12
- package/dist/soap/storage.d.ts +9 -0
- package/dist/soap/storage.js +237 -0
- package/dist/soap/transforms.d.ts +3 -12
- package/dist/soap/transforms.js +3 -14
- package/dist/{types.d.ts → soap/types.d.ts} +34 -84
- package/dist/sync/git-cli.d.ts +202 -0
- package/dist/sync/git-cli.js +684 -0
- package/dist/sync/three-way-merge.d.ts +41 -0
- package/dist/sync/three-way-merge.js +85 -0
- package/dist/sync/tree-paths.d.ts +34 -0
- package/dist/sync/tree-paths.js +131 -0
- package/dist/team-secrets/envelope.d.ts +10 -0
- package/dist/team-secrets/envelope.js +121 -0
- package/dist/team-secrets/errors.d.ts +26 -0
- package/dist/team-secrets/errors.js +27 -0
- package/dist/team-secrets/index.d.ts +14 -0
- package/dist/team-secrets/index.js +8 -0
- package/dist/team-secrets/keys.d.ts +52 -0
- package/dist/team-secrets/keys.js +158 -0
- package/dist/team-secrets/log.d.ts +48 -0
- package/dist/team-secrets/log.js +175 -0
- package/dist/team-secrets/resolve-conflict.d.ts +7 -0
- package/dist/team-secrets/resolve-conflict.js +14 -0
- package/dist/team-secrets/schema.d.ts +97 -0
- package/dist/team-secrets/schema.js +157 -0
- package/dist/team-secrets/sign.d.ts +24 -0
- package/dist/team-secrets/sign.js +71 -0
- package/dist/team-secrets/vault.d.ts +49 -0
- package/dist/team-secrets/vault.js +148 -0
- package/dist/validate/wsi/run-message.d.ts +2 -2
- package/dist/validate/wsi/run-message.js +1 -1
- package/dist/validate/wsi/run-wsdl.d.ts +2 -2
- package/dist/validate/wsi/run-wsdl.js +1 -1
- package/dist/validate/wsi/types.d.ts +1 -1
- package/dist/webhooks/model.d.ts +138 -0
- package/dist/webhooks/model.js +150 -0
- package/dist/workspace/commit-message.d.ts +1 -1
- package/dist/workspace/commit-message.js +6 -1
- package/dist/workspace/environments.d.ts +11 -4
- package/dist/workspace/environments.js +12 -0
- package/dist/workspace/index.d.ts +3 -3
- package/dist/workspace/index.js +2 -2
- package/dist/workspace/paths.d.ts +5 -2
- package/dist/workspace/paths.js +5 -2
- package/dist/workspace/schema.d.ts +7 -3
- package/dist/workspace/schema.js +24 -3
- package/dist/workspace/share.d.ts +30 -11
- package/dist/workspace/share.js +32 -6
- package/dist/ws/call.d.ts +1 -1
- package/dist/ws/call.js +2 -2
- package/dist/ws/connect.d.ts +60 -0
- package/dist/ws/connect.js +131 -0
- package/dist/ws/events.d.ts +17 -0
- package/dist/ws/events.js +1 -0
- package/dist/ws/expand.d.ts +1 -1
- package/dist/ws/expand.js +1 -1
- package/dist/ws/files.d.ts +284 -0
- package/dist/ws/files.js +71 -0
- package/dist/ws/history-entry.d.ts +44 -0
- package/dist/ws/history-entry.js +93 -0
- package/dist/ws/model.d.ts +44 -3
- package/dist/ws/model.js +3 -0
- package/dist/ws/module.d.ts +2 -0
- package/dist/ws/module.js +11 -0
- package/dist/ws/run.d.ts +63 -0
- package/dist/ws/run.js +470 -0
- package/dist/ws/session.d.ts +18 -0
- package/dist/ws/session.js +52 -25
- package/dist/ws/storage.d.ts +9 -0
- package/dist/ws/storage.js +176 -0
- package/dist/ws/transcript.d.ts +3 -4
- package/dist/ws/transcript.js +26 -17
- package/dist/ws/url.d.ts +1 -1
- package/dist/wsdl/cache.js +1 -1
- package/dist/wsdl/docs-generator.d.ts +3 -3
- package/dist/wsdl/docs-generator.js +1 -1
- package/dist/wsdl/export-definition.js +1 -1
- package/dist/wsdl/qname.d.ts +2 -5
- package/dist/wsdl/resolver.d.ts +4 -11
- package/dist/wsdl/resolver.js +3 -3
- package/dist/wsdl/update-definition.d.ts +5 -5
- package/dist/wsdl/update-definition.js +6 -6
- package/dist/wss/apply.js +1 -1
- package/dist/{project/wss-configs.d.ts → wss/configs.d.ts} +2 -2
- package/dist/{project/wss-configs.js → wss/configs.js} +2 -2
- package/dist/wss/incoming/decrypt.d.ts +1 -1
- package/dist/wss/incoming/index.js +1 -1
- package/dist/wss/incoming/verify.d.ts +1 -1
- package/dist/wss/incoming/verify.js +1 -1
- package/dist/wss/key-identifiers.js +1 -1
- package/dist/wss/model.d.ts +1 -1
- package/dist/wss/outgoing/encryption.d.ts +1 -1
- package/dist/wss/outgoing/signature.d.ts +1 -1
- package/dist/xml/decode.d.ts +15 -0
- package/dist/xml/decode.js +22 -0
- package/dist/xml/entitize.d.ts +17 -0
- package/dist/xml/entitize.js +19 -0
- package/dist/xml/index.d.ts +1 -1
- package/dist/xml/index.js +1 -1
- package/dist/xml/locate.d.ts +39 -0
- package/dist/xml/locate.js +117 -0
- package/dist/xml/qname.d.ts +12 -0
- package/dist/xml/qname.js +8 -0
- package/dist/xpath/evaluate-async.d.ts +19 -0
- package/dist/xpath/evaluate-async.js +31 -11
- package/dist/xpath/evaluate.d.ts +1 -1
- package/dist/xpath/namespaces.js +1 -1
- package/dist/xpath/worker.d.ts +11 -5
- package/dist/xpath/worker.js +24 -7
- package/dist/xsd/form-model.d.ts +19 -2
- package/dist/xsd/form-model.js +14 -2
- package/dist/xsd/json-bridge.d.ts +152 -0
- package/dist/xsd/json-bridge.js +1213 -0
- package/dist/xsd/locate.d.ts +2 -30
- package/dist/xsd/locate.js +1 -109
- package/dist/xsd/xml-scan.d.ts +2 -0
- package/dist/xsd/xml-scan.js +1 -1
- package/dist/xsd/xml-writer.d.ts +2 -0
- package/dist/xsd/xml-writer.js +4 -0
- package/package.json +12 -1
- package/dist/generate.d.ts +0 -12
- package/dist/operations.d.ts +0 -12
- package/dist/run/effective-auth.d.ts +0 -10
- package/dist/run/effective-auth.js +0 -19
- package/dist/run/prepare.d.ts +0 -43
- package/dist/run/prepare.js +0 -280
- package/dist/send-options.d.ts +0 -141
- package/dist/wsdl/fetch.d.ts +0 -13
- /package/dist/{soap → http}/charset.d.ts +0 -0
- /package/dist/{soap → http}/charset.js +0 -0
- /package/dist/{wsdl → http}/ref-policy.d.ts +0 -0
- /package/dist/{wsdl → http}/ref-policy.js +0 -0
- /package/dist/{wss/keystore → keystore}/certificate.d.ts +0 -0
- /package/dist/{wss/keystore → keystore}/certificate.js +0 -0
- /package/dist/{wss/keystore → keystore}/index.d.ts +0 -0
- /package/dist/{wss/keystore → keystore}/model.d.ts +0 -0
- /package/dist/{wss/keystore → keystore}/model.js +0 -0
- /package/dist/{wss/keystore → keystore}/pem.d.ts +0 -0
- /package/dist/{wss/keystore → keystore}/pkcs12.d.ts +0 -0
- /package/dist/{wsdl → project}/cache-naming.d.ts +0 -0
- /package/dist/{types.js → soap/types.js} +0 -0
- /package/dist/{soap → xml}/prefixes.d.ts +0 -0
- /package/dist/{soap → xml}/prefixes.js +0 -0
|
@@ -44,6 +44,10 @@ export interface SampleOptions {
|
|
|
44
44
|
/** How many values the sample may hold. Defaults to {@link MAX_SAMPLE_NODES}. */
|
|
45
45
|
readonly maxNodes?: number;
|
|
46
46
|
}
|
|
47
|
+
/** The type to generate for, ignoring `null` — which is an alternative, not a shape. */
|
|
48
|
+
export declare function effectiveType(schema: JsonSchema): string | undefined;
|
|
49
|
+
/** The schema an `allOf` amounts to: every branch merged, later branches filling in blanks. */
|
|
50
|
+
export declare function mergeAllOf(schema: JsonSchema): JsonSchema;
|
|
47
51
|
/**
|
|
48
52
|
* A sample value for one schema.
|
|
49
53
|
*
|
|
@@ -60,7 +60,7 @@ function isNullable(schema) {
|
|
|
60
60
|
return schema.nullable === true || typesOf(schema).has('null');
|
|
61
61
|
}
|
|
62
62
|
/** The type to generate for, ignoring `null` — which is an alternative, not a shape. */
|
|
63
|
-
function effectiveType(schema) {
|
|
63
|
+
export function effectiveType(schema) {
|
|
64
64
|
for (const type of typesOf(schema)) {
|
|
65
65
|
if (type !== 'null') {
|
|
66
66
|
return type;
|
|
@@ -109,7 +109,7 @@ function without(schema, ...keys) {
|
|
|
109
109
|
return copy;
|
|
110
110
|
}
|
|
111
111
|
/** The schema an `allOf` amounts to: every branch merged, later branches filling in blanks. */
|
|
112
|
-
function mergeAllOf(schema) {
|
|
112
|
+
export function mergeAllOf(schema) {
|
|
113
113
|
if (schema.allOf === undefined || schema.allOf.length === 0) {
|
|
114
114
|
return schema;
|
|
115
115
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where a description comes from.
|
|
3
|
+
*
|
|
4
|
+
* In `json/schema/` because the OpenAPI and the AsyncAPI imports take the same three sources, and no
|
|
5
|
+
* protocol folder imports another (protocol modules spec §7.2). `rest/openapi/import.ts` re-exports
|
|
6
|
+
* the type under the name it has always had.
|
|
7
|
+
*/
|
|
8
|
+
/** Where a document comes from: a location to fetch, or text the user already has. */
|
|
9
|
+
export type OpenApiSource = {
|
|
10
|
+
readonly kind: 'url';
|
|
11
|
+
readonly url: string;
|
|
12
|
+
} | {
|
|
13
|
+
readonly kind: 'file';
|
|
14
|
+
readonly path: string;
|
|
15
|
+
}
|
|
16
|
+
/** Text with a location to resolve relative references against — a paste, or a test. */
|
|
17
|
+
| {
|
|
18
|
+
readonly kind: 'text';
|
|
19
|
+
readonly text: string;
|
|
20
|
+
readonly location?: string;
|
|
21
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where a description comes from.
|
|
3
|
+
*
|
|
4
|
+
* In `json/schema/` because the OpenAPI and the AsyncAPI imports take the same three sources, and no
|
|
5
|
+
* protocol folder imports another (protocol modules spec §7.2). `rest/openapi/import.ts` re-exports
|
|
6
|
+
* the type under the name it has always had.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A bounded, in-house JSON Schema validator for contract checks.
|
|
3
|
+
*
|
|
4
|
+
* There is no JSON Schema validator in the engine and no new dependency is allowed for one, so
|
|
5
|
+
* this covers a draft-07-shaped subset: enough of AsyncAPI/OpenAPI message schemas to catch real
|
|
6
|
+
* mistakes without pulling in a library. Unsupported keywords (`format`, `if`/`then`/`else`,
|
|
7
|
+
* `dependencies`/`dependentSchemas`, `propertyNames`, `contains`, `unevaluated*`) and an unresolved
|
|
8
|
+
* `$ref` are silently accepted rather than asserted — a caller wanting to warn about that uses
|
|
9
|
+
* `unsupportedKeywordsIn` up front, once per document.
|
|
10
|
+
*
|
|
11
|
+
* The walk is recursive but shares one `{ nodes, problems }` budget across the whole call, so a
|
|
12
|
+
* pathological schema (a huge array, a `$ref` cycle it does not even try to resolve) cannot make
|
|
13
|
+
* validation expensive: it stops after `maxNodes` schema nodes visited or `maxProblems` problems
|
|
14
|
+
* collected, appending one `budget` problem when the node cap is what stopped it.
|
|
15
|
+
*/
|
|
16
|
+
/** One validation failure, located by a JSON pointer into the value that was checked. */
|
|
17
|
+
export interface JsonSchemaProblem {
|
|
18
|
+
readonly path: string;
|
|
19
|
+
readonly keyword: string;
|
|
20
|
+
readonly message: string;
|
|
21
|
+
}
|
|
22
|
+
/** Caps that bound a single `validateJsonSchema` call. */
|
|
23
|
+
export interface ValidateJsonOptions {
|
|
24
|
+
readonly maxNodes?: number;
|
|
25
|
+
readonly maxProblems?: number;
|
|
26
|
+
/**
|
|
27
|
+
* Word every message without the checked value's own content (a number, a length, a count), so a
|
|
28
|
+
* result can be kept where the body must not be: "below the minimum 0" rather than "-3 is less
|
|
29
|
+
* than 0". The schema's own values (bounds, patterns) and the value's keys still appear.
|
|
30
|
+
*/
|
|
31
|
+
readonly redactValues?: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* What a `pattern` (or `patternProperties` key) the validator will not run comes to: an unsafe
|
|
34
|
+
* pattern, or a value too long to test. `'report'` (the default) adds a "pattern not checked"
|
|
35
|
+
* problem; `'pass'` adds nothing, so the check neither fills the problem cap nor fails a
|
|
36
|
+
* combinator branch, for a caller whose own later check applies the pattern.
|
|
37
|
+
*/
|
|
38
|
+
readonly uncheckedPatterns?: 'report' | 'pass';
|
|
39
|
+
}
|
|
40
|
+
export declare const MAX_VALIDATE_NODES = 10000;
|
|
41
|
+
export declare const MAX_VALIDATE_PROBLEMS = 20;
|
|
42
|
+
/** Keywords this validator recognises but never asserts; a document using one gets a summary line. */
|
|
43
|
+
export declare const UNSUPPORTED_JSON_SCHEMA_KEYWORDS: readonly string[];
|
|
44
|
+
/** Nested `walk` calls past this stop the walk (as the node cap does) instead of the stack. */
|
|
45
|
+
export declare const MAX_VALIDATE_DEPTH = 256;
|
|
46
|
+
/** Validates `value` against `schema`, returning every problem found (bounded by `options`). */
|
|
47
|
+
export declare function validateJsonSchema(value: unknown, schema: unknown, options?: ValidateJsonOptions): JsonSchemaProblem[];
|
|
48
|
+
/** Every keyword this validator does not assert, found anywhere in `schema` (deduplicated, sorted). */
|
|
49
|
+
export declare function unsupportedKeywordsIn(schema: unknown): string[];
|
|
@@ -0,0 +1,557 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A bounded, in-house JSON Schema validator for contract checks.
|
|
3
|
+
*
|
|
4
|
+
* There is no JSON Schema validator in the engine and no new dependency is allowed for one, so
|
|
5
|
+
* this covers a draft-07-shaped subset: enough of AsyncAPI/OpenAPI message schemas to catch real
|
|
6
|
+
* mistakes without pulling in a library. Unsupported keywords (`format`, `if`/`then`/`else`,
|
|
7
|
+
* `dependencies`/`dependentSchemas`, `propertyNames`, `contains`, `unevaluated*`) and an unresolved
|
|
8
|
+
* `$ref` are silently accepted rather than asserted — a caller wanting to warn about that uses
|
|
9
|
+
* `unsupportedKeywordsIn` up front, once per document.
|
|
10
|
+
*
|
|
11
|
+
* The walk is recursive but shares one `{ nodes, problems }` budget across the whole call, so a
|
|
12
|
+
* pathological schema (a huge array, a `$ref` cycle it does not even try to resolve) cannot make
|
|
13
|
+
* validation expensive: it stops after `maxNodes` schema nodes visited or `maxProblems` problems
|
|
14
|
+
* collected, appending one `budget` problem when the node cap is what stopped it.
|
|
15
|
+
*/
|
|
16
|
+
export const MAX_VALIDATE_NODES = 10_000;
|
|
17
|
+
export const MAX_VALIDATE_PROBLEMS = 20;
|
|
18
|
+
/** Keywords this validator recognises but never asserts; a document using one gets a summary line. */
|
|
19
|
+
export const UNSUPPORTED_JSON_SCHEMA_KEYWORDS = [
|
|
20
|
+
'contains',
|
|
21
|
+
'dependencies',
|
|
22
|
+
'dependentSchemas',
|
|
23
|
+
'format',
|
|
24
|
+
'if',
|
|
25
|
+
'propertyNames',
|
|
26
|
+
'then',
|
|
27
|
+
'else',
|
|
28
|
+
'unevaluatedItems',
|
|
29
|
+
'unevaluatedProperties',
|
|
30
|
+
];
|
|
31
|
+
const UNSUPPORTED_SET = new Set(UNSUPPORTED_JSON_SCHEMA_KEYWORDS);
|
|
32
|
+
/** A string longer than this is never tested against a `pattern`: a contract's regex is
|
|
33
|
+
* untrusted, and a bounded scan of a bounded string is the only combination this validator
|
|
34
|
+
* will pay for. */
|
|
35
|
+
const MAX_PATTERN_VALUE_LENGTH = 4_096;
|
|
36
|
+
/** Compiled (or rejected) patterns, keyed by source text so a repeated pattern — the common case,
|
|
37
|
+
* since one contract's messages share few distinct patterns — is scanned and compiled once. */
|
|
38
|
+
const patternCache = new Map();
|
|
39
|
+
/**
|
|
40
|
+
* Compiles `pattern`, refusing to run it at all when its shape can cause catastrophic
|
|
41
|
+
* backtracking: a quantified group whose body itself contains an unbounded quantifier (the
|
|
42
|
+
* `(a+)+` family), a backreference, or a lookaround. An invalid pattern compiles to `'invalid'`
|
|
43
|
+
* rather than throwing, matching this validator's existing "ignore, don't throw" rule.
|
|
44
|
+
*/
|
|
45
|
+
function safeCompile(pattern) {
|
|
46
|
+
const cached = patternCache.get(pattern);
|
|
47
|
+
if (cached !== undefined)
|
|
48
|
+
return cached;
|
|
49
|
+
let result;
|
|
50
|
+
if (isUnsafePattern(pattern)) {
|
|
51
|
+
result = 'unsafe';
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
try {
|
|
55
|
+
result = new RegExp(pattern);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
result = 'invalid';
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
patternCache.set(pattern, result);
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
/** Backreferences, lookarounds, and a quantified group whose body contains its own unbounded
|
|
65
|
+
* quantifier — the shapes that make a regex engine's backtracking exponential in input length.
|
|
66
|
+
* This is a heuristic scan, not a parser: it errs toward refusing rather than missing a risk. */
|
|
67
|
+
function isUnsafePattern(pattern) {
|
|
68
|
+
if (/\\[1-9]/.test(pattern) || pattern.includes('\\k<'))
|
|
69
|
+
return true; // backreference, numbered or named
|
|
70
|
+
if (/\(\?<?[=!]/.test(pattern))
|
|
71
|
+
return true; // lookahead or lookbehind
|
|
72
|
+
return hasNestedUnboundedQuantifier(pattern);
|
|
73
|
+
}
|
|
74
|
+
const UNBOUNDED_QUANTIFIER_AT_START = /^(?:[*+]|\{\d*,\})/;
|
|
75
|
+
function hasNestedUnboundedQuantifier(pattern) {
|
|
76
|
+
let inClass = false;
|
|
77
|
+
const groupHasUnbounded = [];
|
|
78
|
+
let risky = false;
|
|
79
|
+
for (let i = 0; i < pattern.length; i += 1) {
|
|
80
|
+
const c = pattern[i];
|
|
81
|
+
if (c === '\\') {
|
|
82
|
+
i += 1; // skip the escaped character, it is never a live metacharacter
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
if (inClass) {
|
|
86
|
+
if (c === ']')
|
|
87
|
+
inClass = false;
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
if (c === '[') {
|
|
91
|
+
inClass = true;
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
if (c === '(') {
|
|
95
|
+
groupHasUnbounded.push(false);
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
if (c === ')') {
|
|
99
|
+
const bodyHasUnbounded = groupHasUnbounded.pop() ?? false;
|
|
100
|
+
const quantified = UNBOUNDED_QUANTIFIER_AT_START.test(pattern.slice(i + 1));
|
|
101
|
+
if (bodyHasUnbounded && quantified)
|
|
102
|
+
risky = true;
|
|
103
|
+
if (groupHasUnbounded.length > 0 && (bodyHasUnbounded || quantified)) {
|
|
104
|
+
groupHasUnbounded[groupHasUnbounded.length - 1] = true;
|
|
105
|
+
}
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (groupHasUnbounded.length === 0)
|
|
109
|
+
continue;
|
|
110
|
+
if (c === '+' || c === '*') {
|
|
111
|
+
groupHasUnbounded[groupHasUnbounded.length - 1] = true;
|
|
112
|
+
}
|
|
113
|
+
else if (c === '{' && UNBOUNDED_QUANTIFIER_AT_START.test(pattern.slice(i))) {
|
|
114
|
+
groupHasUnbounded[groupHasUnbounded.length - 1] = true;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return risky;
|
|
118
|
+
}
|
|
119
|
+
/** Nested `walk` calls past this stop the walk (as the node cap does) instead of the stack. */
|
|
120
|
+
export const MAX_VALIDATE_DEPTH = 256;
|
|
121
|
+
/** A `Budget` that shares the outer walk's node counter but collects into its own problem list —
|
|
122
|
+
* used to try a combinator's branch without either polluting the caller's problems or letting the
|
|
123
|
+
* branch's own node visits escape the shared cap. */
|
|
124
|
+
function branchBudget(outer, maxProblems) {
|
|
125
|
+
return {
|
|
126
|
+
get nodes() {
|
|
127
|
+
return outer.nodes;
|
|
128
|
+
},
|
|
129
|
+
set nodes(n) {
|
|
130
|
+
outer.nodes = n;
|
|
131
|
+
},
|
|
132
|
+
get depth() {
|
|
133
|
+
return outer.depth;
|
|
134
|
+
},
|
|
135
|
+
set depth(d) {
|
|
136
|
+
outer.depth = d;
|
|
137
|
+
},
|
|
138
|
+
maxNodes: outer.maxNodes,
|
|
139
|
+
problems: [],
|
|
140
|
+
maxProblems,
|
|
141
|
+
stopped: false,
|
|
142
|
+
outOfNodes: false,
|
|
143
|
+
outOfDepth: false,
|
|
144
|
+
redact: outer.redact,
|
|
145
|
+
passUnchecked: outer.passUnchecked,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Tries one combinator branch. A branch that ran out of nodes proved nothing either way: the stop
|
|
150
|
+
* is carried to the outer walk (which then gives no combinator verdict) and `undefined` returned.
|
|
151
|
+
*/
|
|
152
|
+
function tryBranch(value, sub, path, budget, applying) {
|
|
153
|
+
// A branch already being applied to this same value would be skipped by `walk` and so look like a
|
|
154
|
+
// pass; it proves nothing either way, so it gives no verdict (without stopping the walk).
|
|
155
|
+
if (isPlainObject(sub) && applying.has(sub))
|
|
156
|
+
return undefined;
|
|
157
|
+
const trial = branchBudget(budget, 1);
|
|
158
|
+
walk(value, sub, path, trial, applying);
|
|
159
|
+
if (trial.outOfNodes) {
|
|
160
|
+
budget.stopped = true;
|
|
161
|
+
budget.outOfNodes = true;
|
|
162
|
+
if (trial.outOfDepth)
|
|
163
|
+
budget.outOfDepth = true;
|
|
164
|
+
return undefined;
|
|
165
|
+
}
|
|
166
|
+
return trial.problems.length === 0;
|
|
167
|
+
}
|
|
168
|
+
/** Validates `value` against `schema`, returning every problem found (bounded by `options`). */
|
|
169
|
+
export function validateJsonSchema(value, schema, options) {
|
|
170
|
+
const budget = {
|
|
171
|
+
nodes: 0,
|
|
172
|
+
maxNodes: options?.maxNodes ?? MAX_VALIDATE_NODES,
|
|
173
|
+
problems: [],
|
|
174
|
+
maxProblems: options?.maxProblems ?? MAX_VALIDATE_PROBLEMS,
|
|
175
|
+
stopped: false,
|
|
176
|
+
outOfNodes: false,
|
|
177
|
+
depth: 0,
|
|
178
|
+
outOfDepth: false,
|
|
179
|
+
redact: options?.redactValues === true,
|
|
180
|
+
passUnchecked: options?.uncheckedPatterns === 'pass',
|
|
181
|
+
};
|
|
182
|
+
walk(value, schema, '', budget);
|
|
183
|
+
if (budget.outOfNodes &&
|
|
184
|
+
budget.problems.at(-1)?.keyword !== 'budget' &&
|
|
185
|
+
budget.problems.length < budget.maxProblems) {
|
|
186
|
+
budget.problems.push({
|
|
187
|
+
path: '',
|
|
188
|
+
keyword: 'budget',
|
|
189
|
+
message: budget.outOfDepth
|
|
190
|
+
? `validation stopped at nesting depth ${MAX_VALIDATE_DEPTH}`
|
|
191
|
+
: `validation stopped after ${budget.maxNodes} nodes`,
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
return budget.problems;
|
|
195
|
+
}
|
|
196
|
+
/** Every keyword this validator does not assert, found anywhere in `schema` (deduplicated, sorted). */
|
|
197
|
+
export function unsupportedKeywordsIn(schema) {
|
|
198
|
+
const found = new Set();
|
|
199
|
+
const seen = new Set();
|
|
200
|
+
collectUnsupported(schema, found, seen);
|
|
201
|
+
return [...found].sort();
|
|
202
|
+
}
|
|
203
|
+
function collectUnsupported(node, found, seen) {
|
|
204
|
+
if (!isPlainObject(node) || seen.has(node))
|
|
205
|
+
return;
|
|
206
|
+
seen.add(node);
|
|
207
|
+
for (const key of Object.keys(node)) {
|
|
208
|
+
if (UNSUPPORTED_SET.has(key))
|
|
209
|
+
found.add(key);
|
|
210
|
+
collectUnsupported(node[key], found, seen);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
function isPlainObject(v) {
|
|
214
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
215
|
+
}
|
|
216
|
+
function report(budget, path, keyword, message) {
|
|
217
|
+
if (budget.problems.length >= budget.maxProblems) {
|
|
218
|
+
budget.stopped = true;
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
budget.problems.push({ path, keyword, message });
|
|
222
|
+
}
|
|
223
|
+
function hasRoom(budget) {
|
|
224
|
+
if (budget.stopped)
|
|
225
|
+
return false;
|
|
226
|
+
if (budget.problems.length >= budget.maxProblems) {
|
|
227
|
+
budget.stopped = true;
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
if (budget.nodes >= budget.maxNodes) {
|
|
231
|
+
budget.stopped = true;
|
|
232
|
+
budget.outOfNodes = true;
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
budget.nodes += 1;
|
|
236
|
+
return true;
|
|
237
|
+
}
|
|
238
|
+
function typeName(value) {
|
|
239
|
+
if (value === null)
|
|
240
|
+
return 'null';
|
|
241
|
+
if (Array.isArray(value))
|
|
242
|
+
return 'array';
|
|
243
|
+
if (typeof value === 'number')
|
|
244
|
+
return Number.isInteger(value) ? 'integer' : 'number';
|
|
245
|
+
return typeof value;
|
|
246
|
+
}
|
|
247
|
+
function matchesType(value, want) {
|
|
248
|
+
if (want === 'integer')
|
|
249
|
+
return typeof value === 'number' && Number.isInteger(value);
|
|
250
|
+
if (want === 'number')
|
|
251
|
+
return typeof value === 'number';
|
|
252
|
+
return typeName(value) === want;
|
|
253
|
+
}
|
|
254
|
+
function jsonEquals(a, b) {
|
|
255
|
+
if (a === b)
|
|
256
|
+
return true;
|
|
257
|
+
if (typeof a !== typeof b)
|
|
258
|
+
return false;
|
|
259
|
+
if (Array.isArray(a) || Array.isArray(b)) {
|
|
260
|
+
if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length)
|
|
261
|
+
return false;
|
|
262
|
+
return a.every((v, i) => jsonEquals(v, b[i]));
|
|
263
|
+
}
|
|
264
|
+
if (isPlainObject(a) && isPlainObject(b)) {
|
|
265
|
+
const aKeys = Object.keys(a);
|
|
266
|
+
const bKeys = Object.keys(b);
|
|
267
|
+
if (aKeys.length !== bKeys.length)
|
|
268
|
+
return false;
|
|
269
|
+
return aKeys.every((k) => Object.prototype.hasOwnProperty.call(b, k) && jsonEquals(a[k], b[k]));
|
|
270
|
+
}
|
|
271
|
+
return false;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Walks one schema node against one value, at `path`, appending problems into the shared budget.
|
|
275
|
+
*
|
|
276
|
+
* `applying` holds the schema objects already being applied to this same value (through
|
|
277
|
+
* `allOf`/`anyOf`/`oneOf`/`not`). A resolved document can be cyclic, and a schema that composes
|
|
278
|
+
* itself would otherwise recurse without ever moving in the value; re-entering one is skipped,
|
|
279
|
+
* since its constraints are already being checked here. Descending into a child value starts a
|
|
280
|
+
* fresh set, and the depth cap backs both up.
|
|
281
|
+
*/
|
|
282
|
+
function walk(value, schemaValue, path, budget, applying = new Set()) {
|
|
283
|
+
if (!hasRoom(budget))
|
|
284
|
+
return;
|
|
285
|
+
if (!isPlainObject(schemaValue))
|
|
286
|
+
return; // `true`/`false`/malformed schema: nothing to assert
|
|
287
|
+
if (applying.has(schemaValue))
|
|
288
|
+
return;
|
|
289
|
+
if (budget.depth >= MAX_VALIDATE_DEPTH) {
|
|
290
|
+
budget.stopped = true;
|
|
291
|
+
budget.outOfNodes = true;
|
|
292
|
+
budget.outOfDepth = true;
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
applying.add(schemaValue);
|
|
296
|
+
budget.depth++;
|
|
297
|
+
try {
|
|
298
|
+
walkSchema(value, schemaValue, path, budget, applying);
|
|
299
|
+
}
|
|
300
|
+
finally {
|
|
301
|
+
budget.depth--;
|
|
302
|
+
applying.delete(schemaValue);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
function walkSchema(value, schema, path, budget, applying) {
|
|
306
|
+
if (typeof schema.$ref === 'string')
|
|
307
|
+
return; // unresolved $ref: passes, per scope
|
|
308
|
+
const nullable = schema.nullable === true;
|
|
309
|
+
const rawTypes = schema.type === undefined ? undefined : Array.isArray(schema.type) ? schema.type : [schema.type];
|
|
310
|
+
const types = rawTypes?.filter((t) => typeof t === 'string');
|
|
311
|
+
if (value === null && (nullable || types?.includes('null'))) {
|
|
312
|
+
return; // an explicitly nullable slot accepts null without checking the rest of the schema
|
|
313
|
+
}
|
|
314
|
+
// 1. type
|
|
315
|
+
if (types && !types.some((t) => matchesType(value, t))) {
|
|
316
|
+
report(budget, path, 'type', `expected ${types.join(' or ')}, got ${typeName(value)}`);
|
|
317
|
+
return; // further keywords assume the right shape
|
|
318
|
+
}
|
|
319
|
+
// 2. const
|
|
320
|
+
if ('const' in schema) {
|
|
321
|
+
if (!jsonEquals(value, schema.const)) {
|
|
322
|
+
report(budget, path, 'const', `expected ${JSON.stringify(schema.const)}`);
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
// 3. enum
|
|
327
|
+
if (Array.isArray(schema.enum)) {
|
|
328
|
+
if (!schema.enum.some((v) => jsonEquals(value, v))) {
|
|
329
|
+
report(budget, path, 'enum', 'not one of the allowed values');
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
// 4. string checks
|
|
334
|
+
if (typeof value === 'string') {
|
|
335
|
+
if (typeof schema.minLength === 'number' && value.length < schema.minLength) {
|
|
336
|
+
report(budget, path, 'minLength', budget.redact
|
|
337
|
+
? `shorter than the minimum length ${schema.minLength}`
|
|
338
|
+
: `length ${value.length} is less than ${schema.minLength}`);
|
|
339
|
+
}
|
|
340
|
+
if (typeof schema.maxLength === 'number' && value.length > schema.maxLength) {
|
|
341
|
+
report(budget, path, 'maxLength', budget.redact
|
|
342
|
+
? `longer than the maximum length ${schema.maxLength}`
|
|
343
|
+
: `length ${value.length} is more than ${schema.maxLength}`);
|
|
344
|
+
}
|
|
345
|
+
if (typeof schema.pattern === 'string') {
|
|
346
|
+
const compiled = safeCompile(schema.pattern);
|
|
347
|
+
if (compiled === 'unsafe') {
|
|
348
|
+
if (!budget.passUnchecked) {
|
|
349
|
+
report(budget, path, 'pattern', 'pattern not checked: unsafe for evaluation');
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
else if (compiled !== 'invalid') {
|
|
353
|
+
if (value.length > MAX_PATTERN_VALUE_LENGTH) {
|
|
354
|
+
if (!budget.passUnchecked) {
|
|
355
|
+
report(budget, path, 'pattern', `pattern not checked: value longer than ${MAX_PATTERN_VALUE_LENGTH} characters`);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
else if (!compiled.test(value)) {
|
|
359
|
+
report(budget, path, 'pattern', `does not match /${schema.pattern}/`);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
// an invalid pattern is ignored rather than thrown
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
// 5. number checks
|
|
366
|
+
if (typeof value === 'number') {
|
|
367
|
+
if (typeof schema.minimum === 'number' && value < schema.minimum) {
|
|
368
|
+
report(budget, path, 'minimum', budget.redact ? `below the minimum ${schema.minimum}` : `${value} is less than ${schema.minimum}`);
|
|
369
|
+
}
|
|
370
|
+
if (typeof schema.maximum === 'number' && value > schema.maximum) {
|
|
371
|
+
report(budget, path, 'maximum', budget.redact ? `above the maximum ${schema.maximum}` : `${value} is more than ${schema.maximum}`);
|
|
372
|
+
}
|
|
373
|
+
const exclusiveMin = schema.exclusiveMinimum;
|
|
374
|
+
if (typeof exclusiveMin === 'number' && value <= exclusiveMin) {
|
|
375
|
+
report(budget, path, 'exclusiveMinimum', budget.redact ? `not above the exclusive minimum ${exclusiveMin}` : `${value} is not more than ${exclusiveMin}`);
|
|
376
|
+
}
|
|
377
|
+
else if (exclusiveMin === true && typeof schema.minimum === 'number' && value <= schema.minimum) {
|
|
378
|
+
report(budget, path, 'exclusiveMinimum', budget.redact
|
|
379
|
+
? `not above the exclusive minimum ${schema.minimum}`
|
|
380
|
+
: `${value} is not more than ${schema.minimum}`);
|
|
381
|
+
}
|
|
382
|
+
const exclusiveMax = schema.exclusiveMaximum;
|
|
383
|
+
if (typeof exclusiveMax === 'number' && value >= exclusiveMax) {
|
|
384
|
+
report(budget, path, 'exclusiveMaximum', budget.redact ? `not below the exclusive maximum ${exclusiveMax}` : `${value} is not less than ${exclusiveMax}`);
|
|
385
|
+
}
|
|
386
|
+
else if (exclusiveMax === true && typeof schema.maximum === 'number' && value >= schema.maximum) {
|
|
387
|
+
report(budget, path, 'exclusiveMaximum', budget.redact
|
|
388
|
+
? `not below the exclusive maximum ${schema.maximum}`
|
|
389
|
+
: `${value} is not less than ${schema.maximum}`);
|
|
390
|
+
}
|
|
391
|
+
if (typeof schema.multipleOf === 'number' && schema.multipleOf > 0) {
|
|
392
|
+
const ratio = value / schema.multipleOf;
|
|
393
|
+
if (Math.abs(ratio - Math.round(ratio)) > 1e-9) {
|
|
394
|
+
report(budget, path, 'multipleOf', budget.redact
|
|
395
|
+
? `not a multiple of ${schema.multipleOf}`
|
|
396
|
+
: `${value} is not a multiple of ${schema.multipleOf}`);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
// 6. array checks
|
|
401
|
+
if (Array.isArray(value)) {
|
|
402
|
+
if (typeof schema.minItems === 'number' && value.length < schema.minItems) {
|
|
403
|
+
report(budget, path, 'minItems', budget.redact
|
|
404
|
+
? `fewer items than the minimum ${schema.minItems}`
|
|
405
|
+
: `has ${value.length} items, fewer than ${schema.minItems}`);
|
|
406
|
+
}
|
|
407
|
+
if (typeof schema.maxItems === 'number' && value.length > schema.maxItems) {
|
|
408
|
+
report(budget, path, 'maxItems', budget.redact
|
|
409
|
+
? `more items than the maximum ${schema.maxItems}`
|
|
410
|
+
: `has ${value.length} items, more than ${schema.maxItems}`);
|
|
411
|
+
}
|
|
412
|
+
if (schema.uniqueItems === true) {
|
|
413
|
+
const dup = value.some((v, i) => value.slice(0, i).some((prior) => jsonEquals(prior, v)));
|
|
414
|
+
if (dup)
|
|
415
|
+
report(budget, path, 'uniqueItems', 'items are not unique');
|
|
416
|
+
}
|
|
417
|
+
if (Array.isArray(schema.items)) {
|
|
418
|
+
const itemSchemas = schema.items;
|
|
419
|
+
for (let i = 0; i < value.length; i += 1) {
|
|
420
|
+
if (budget.stopped)
|
|
421
|
+
break;
|
|
422
|
+
if (i < itemSchemas.length) {
|
|
423
|
+
const itemSchema = itemSchemas[i];
|
|
424
|
+
if (itemSchema !== undefined)
|
|
425
|
+
walk(value[i], itemSchema, `${path}/${i}`, budget);
|
|
426
|
+
}
|
|
427
|
+
else if (schema.additionalItems === false) {
|
|
428
|
+
report(budget, `${path}/${i}`, 'additionalItems', 'unexpected item beyond the tuple');
|
|
429
|
+
}
|
|
430
|
+
else if (isPlainObject(schema.additionalItems)) {
|
|
431
|
+
walk(value[i], schema.additionalItems, `${path}/${i}`, budget);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
else if (isPlainObject(schema.items)) {
|
|
436
|
+
for (let i = 0; i < value.length; i += 1) {
|
|
437
|
+
if (budget.stopped)
|
|
438
|
+
break;
|
|
439
|
+
walk(value[i], schema.items, `${path}/${i}`, budget);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
// 7. object checks
|
|
444
|
+
if (isPlainObject(value)) {
|
|
445
|
+
if (Array.isArray(schema.required)) {
|
|
446
|
+
for (const key of schema.required) {
|
|
447
|
+
if (!Object.prototype.hasOwnProperty.call(value, key)) {
|
|
448
|
+
report(budget, path, 'required', `missing required property "${key}"`);
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
if (typeof schema.minProperties === 'number' && Object.keys(value).length < schema.minProperties) {
|
|
453
|
+
report(budget, path, 'minProperties', `has fewer than ${schema.minProperties} properties`);
|
|
454
|
+
}
|
|
455
|
+
if (typeof schema.maxProperties === 'number' && Object.keys(value).length > schema.maxProperties) {
|
|
456
|
+
report(budget, path, 'maxProperties', `has more than ${schema.maxProperties} properties`);
|
|
457
|
+
}
|
|
458
|
+
const properties = isPlainObject(schema.properties) ? schema.properties : undefined;
|
|
459
|
+
const patternProperties = isPlainObject(schema.patternProperties) ? schema.patternProperties : undefined;
|
|
460
|
+
const compiledPatterns = [];
|
|
461
|
+
if (patternProperties) {
|
|
462
|
+
for (const [pattern, sub] of Object.entries(patternProperties)) {
|
|
463
|
+
if (!isPlainObject(sub))
|
|
464
|
+
continue;
|
|
465
|
+
const compiled = safeCompile(pattern);
|
|
466
|
+
if (compiled === 'unsafe') {
|
|
467
|
+
if (!budget.passUnchecked) {
|
|
468
|
+
report(budget, path, 'patternProperties', 'pattern not checked: unsafe for evaluation');
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
else if (compiled !== 'invalid') {
|
|
472
|
+
compiledPatterns.push([compiled, sub]);
|
|
473
|
+
}
|
|
474
|
+
// an invalid pattern is ignored rather than thrown
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
for (const key of Object.keys(value)) {
|
|
478
|
+
if (budget.stopped)
|
|
479
|
+
break;
|
|
480
|
+
const childPath = `${path}/${escapePointerSegment(key)}`;
|
|
481
|
+
let matched = false;
|
|
482
|
+
if (properties && Object.prototype.hasOwnProperty.call(properties, key)) {
|
|
483
|
+
matched = true;
|
|
484
|
+
walk(value[key], properties[key], childPath, budget);
|
|
485
|
+
}
|
|
486
|
+
for (const [regex, sub] of compiledPatterns) {
|
|
487
|
+
if (budget.stopped)
|
|
488
|
+
break;
|
|
489
|
+
if (key.length <= MAX_PATTERN_VALUE_LENGTH && regex.test(key)) {
|
|
490
|
+
matched = true;
|
|
491
|
+
walk(value[key], sub, childPath, budget);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
if (!matched && schema.additionalProperties === false) {
|
|
495
|
+
report(budget, childPath, 'additionalProperties', `unexpected property "${key}"`);
|
|
496
|
+
}
|
|
497
|
+
else if (!matched && isPlainObject(schema.additionalProperties)) {
|
|
498
|
+
walk(value[key], schema.additionalProperties, childPath, budget);
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
// 8. allOf / anyOf / oneOf / not
|
|
503
|
+
if (Array.isArray(schema.allOf)) {
|
|
504
|
+
for (const sub of schema.allOf) {
|
|
505
|
+
if (budget.stopped)
|
|
506
|
+
break;
|
|
507
|
+
walk(value, sub, path, budget, applying);
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
if (Array.isArray(schema.anyOf) && !budget.stopped) {
|
|
511
|
+
let anyPasses = false;
|
|
512
|
+
let undecided = false;
|
|
513
|
+
for (const sub of schema.anyOf) {
|
|
514
|
+
const passed = tryBranch(value, sub, path, budget, applying);
|
|
515
|
+
if (passed === undefined) {
|
|
516
|
+
undecided = true;
|
|
517
|
+
if (budget.stopped)
|
|
518
|
+
break;
|
|
519
|
+
continue;
|
|
520
|
+
}
|
|
521
|
+
if (passed) {
|
|
522
|
+
anyPasses = true;
|
|
523
|
+
break;
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
if (!anyPasses && !undecided && !budget.stopped) {
|
|
527
|
+
report(budget, path, 'anyOf', 'value matches none of the allowed schemas');
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
if (Array.isArray(schema.oneOf) && !budget.stopped) {
|
|
531
|
+
let matches = 0;
|
|
532
|
+
let undecided = false;
|
|
533
|
+
for (const sub of schema.oneOf) {
|
|
534
|
+
const passed = tryBranch(value, sub, path, budget, applying);
|
|
535
|
+
if (passed === undefined) {
|
|
536
|
+
undecided = true;
|
|
537
|
+
if (budget.stopped)
|
|
538
|
+
break;
|
|
539
|
+
continue;
|
|
540
|
+
}
|
|
541
|
+
if (passed)
|
|
542
|
+
matches += 1;
|
|
543
|
+
}
|
|
544
|
+
if ((undecided ? matches > 1 : matches !== 1) && !budget.stopped) {
|
|
545
|
+
report(budget, path, 'oneOf', `value matches ${matches} of the allowed schemas, not exactly one`);
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
if (isPlainObject(schema.not) && !budget.stopped) {
|
|
549
|
+
const notPasses = tryBranch(value, schema.not, path, budget, applying);
|
|
550
|
+
if (notPasses === true && !budget.stopped) {
|
|
551
|
+
report(budget, path, 'not', 'value matches the disallowed schema');
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
function escapePointerSegment(segment) {
|
|
556
|
+
return segment.replace(/~/g, '~0').replace(/\//g, '~1');
|
|
557
|
+
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* container format, `selectAlias` picks the entry a send should present, and
|
|
4
4
|
* `toTlsClientIdentity` shapes it for `TlsOptions`.
|
|
5
5
|
*/
|
|
6
|
-
import { WssError } from '
|
|
6
|
+
import { WssError } from '../errors.js';
|
|
7
7
|
import { loadPem } from './pem.js';
|
|
8
8
|
import { loadPkcs12 } from './pkcs12.js';
|
|
9
9
|
export { loadPem } from './pem.js';
|