@wirebench/engine 2.2.1 → 3.1.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 +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
package/dist/run/run.js
CHANGED
|
@@ -5,17 +5,25 @@
|
|
|
5
5
|
* picture, not the first thing that went wrong. An errored assertion outranks a failed one for the
|
|
6
6
|
* request's outcome, because "we could not tell" is a different problem from "it is wrong".
|
|
7
7
|
*/
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
8
|
+
import { sendAwaitingCallbacks } from '../assert/callback.js';
|
|
9
|
+
import { checkRequestAssertions } from '../assert/check.js';
|
|
10
|
+
import { isWirebenchError, WirebenchError } from '../errors.js';
|
|
11
|
+
import { featureDisabled } from '../protocol/registry.js';
|
|
12
|
+
import { defaultRegistry } from '../protocols.js';
|
|
13
|
+
import { scriptProperties } from '../script/props.js';
|
|
14
|
+
import { activeScripts } from '../script/request-scripts.js';
|
|
15
|
+
import { SecretPlaceholders } from '../script/send.js';
|
|
16
|
+
import { finishBaselineUpdate, planBaselineUpdate } from './baseline-update.js';
|
|
17
|
+
import { BASELINE_PROTOCOLS, checkBaseline } from './baseline.js';
|
|
18
|
+
import { scopesFor } from './context.js';
|
|
19
|
+
import { openExchange } from './open.js';
|
|
20
|
+
import { createRunTokenSource } from './oauth2-token.js';
|
|
21
|
+
import { createRunScope, scopeWith } from './scope.js';
|
|
22
|
+
import { listedSecrets, mergeScriptValues, scriptAssertions, scriptSession, } from './script-support.js';
|
|
23
|
+
/** A request's own assertions; a gRPC request that never had any, and a protocol without them, carry none. */
|
|
24
|
+
const assertionsOf = (item) => ('assertions' in item.request ? item.request.assertions : undefined) ?? [];
|
|
25
|
+
/** A request's scripts, as saved; a protocol without scripts has none. */
|
|
26
|
+
const scriptsOf = (item) => 'scripts' in item.request ? item.request.scripts : undefined;
|
|
19
27
|
/** Enough of each exchange to keep for a report: a failing response can be megabytes. */
|
|
20
28
|
const EXCHANGE_CAP_BYTES = 64 * 1024;
|
|
21
29
|
function capped(bytes) {
|
|
@@ -33,138 +41,268 @@ function erroredResult(item, error) {
|
|
|
33
41
|
outcome: 'errored',
|
|
34
42
|
assertions: [],
|
|
35
43
|
error,
|
|
36
|
-
unasserted: item.
|
|
44
|
+
unasserted: assertionsOf(item).length === 0,
|
|
37
45
|
};
|
|
38
46
|
}
|
|
39
|
-
function
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
47
|
+
function outcomeOf(assertions) {
|
|
48
|
+
if (assertions.some((a) => a.outcome === 'errored'))
|
|
49
|
+
return 'errored';
|
|
50
|
+
if (assertions.some((a) => a.outcome === 'failed'))
|
|
51
|
+
return 'failed';
|
|
52
|
+
return 'passed';
|
|
53
|
+
}
|
|
54
|
+
/** The run facet of the module for `item`'s kind. */
|
|
55
|
+
function runOf(registry, item) {
|
|
56
|
+
const run = registry.require(item.kind).run;
|
|
57
|
+
if (run === undefined) {
|
|
58
|
+
throw new Error(`The "${item.kind}" protocol cannot run requests`);
|
|
59
|
+
}
|
|
60
|
+
return run;
|
|
44
61
|
}
|
|
45
62
|
/**
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
63
|
+
* The scripts of one send, opened when the module first runs one. The secrets a request lists for
|
|
64
|
+
* its scripts are read then and not before, so they are asked for after everything resolving the
|
|
65
|
+
* request asks for, and before anything connecting it does. Exported for the desktop's sends,
|
|
66
|
+
* which pass `options` to record each secret value a script sets as the app's other sends do.
|
|
49
67
|
*/
|
|
50
|
-
|
|
51
|
-
|
|
68
|
+
export function deferredSession(scripting, scripted, context, options = {}) {
|
|
69
|
+
let opening;
|
|
70
|
+
const open = () => {
|
|
71
|
+
opening ??= listedSecrets(scripted.scripts.secrets, context.host.getSecret).then((secrets) =>
|
|
72
|
+
// The run records a value as it merges it (`mergeScriptValues`); nothing about the send is
|
|
73
|
+
// shown before that.
|
|
74
|
+
scriptSession(scripting, scripted, {
|
|
75
|
+
vars: context.sequence ?? {},
|
|
76
|
+
props: scriptProperties(scopesFor(context)),
|
|
77
|
+
secrets,
|
|
78
|
+
}, options));
|
|
79
|
+
return opening;
|
|
80
|
+
};
|
|
81
|
+
return {
|
|
82
|
+
pre: async (before) => (await open()).pre(before),
|
|
83
|
+
post: async (sent, response) => (await open()).post(sent, response),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Why a request's active scripts cannot run in this registry, as the error its send reports (spec
|
|
88
|
+
* §5.3, §9): the `scripts` feature is off, or the request's protocol has no scripting facet.
|
|
89
|
+
* Undefined when they can run, and for a protocol the registry does not hold: looking its module up
|
|
90
|
+
* refuses that request first, with the protocol's own `feature-disabled`.
|
|
91
|
+
*/
|
|
92
|
+
function scriptsRefusal(item, registry) {
|
|
93
|
+
const module = registry.find(item.kind);
|
|
94
|
+
if (module === undefined)
|
|
52
95
|
return undefined;
|
|
96
|
+
if (!registry.features.isEnabled('scripts')) {
|
|
97
|
+
return featureDisabled(registry.features, 'scripts');
|
|
53
98
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
definition,
|
|
59
|
-
bundle,
|
|
60
|
-
schemaSet: buildSchemaSet(bundle),
|
|
61
|
-
defaultActionByOperation: summarizeWsa(definition).defaultActionByOperation,
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
catch {
|
|
65
|
-
return undefined;
|
|
99
|
+
if (module.scripting === undefined) {
|
|
100
|
+
return new WirebenchError('script-unsupported', `"${item.path}" has scripts, and ${item.kind} requests cannot have them`, {
|
|
101
|
+
details: { path: item.path, protocol: item.kind },
|
|
102
|
+
});
|
|
66
103
|
}
|
|
104
|
+
return undefined;
|
|
67
105
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
direction: 'response',
|
|
90
|
-
schemaSet: loaded.schemaSet,
|
|
91
|
-
bundle: loaded.bundle,
|
|
92
|
-
binding,
|
|
93
|
-
http: { ...(contentType !== undefined ? { contentType } : {}) },
|
|
94
|
-
}).then((r) => r.problems),
|
|
95
|
-
}
|
|
96
|
-
: {}),
|
|
106
|
+
/**
|
|
107
|
+
* A sender for one run: whatever a protocol loads for a container (a definition, a schema, an
|
|
108
|
+
* OpenAPI document) is loaded once, and one OAuth2 token source serves every request behind the same
|
|
109
|
+
* configuration. `runRequests` sends through it, and so does a sequence run, so a step is sent
|
|
110
|
+
* exactly as a selected request is. Which protocol sends a request is the registry's answer
|
|
111
|
+
* (`context.registry`, the built-in protocols by default).
|
|
112
|
+
*
|
|
113
|
+
* A request with scripts (#63) is type-checked first; its module then resolves it with its secrets
|
|
114
|
+
* behind placeholders, runs the pre-request script on that, puts the secrets back, connects, sends,
|
|
115
|
+
* and runs the post-response script on the response.
|
|
116
|
+
*/
|
|
117
|
+
export function createRunSender(context) {
|
|
118
|
+
const registry = context.registry ?? defaultRegistry();
|
|
119
|
+
// One token source for the whole run: requests behind the same OAuth2 configuration share a token.
|
|
120
|
+
const host = {
|
|
121
|
+
...context.host,
|
|
122
|
+
tokens: context.host.tokens ??
|
|
123
|
+
createRunTokenSource({
|
|
124
|
+
getSecret: context.host.getSecret,
|
|
125
|
+
...(context.host.onSecretValue !== undefined ? { onSecretValue: context.host.onSecretValue } : {}),
|
|
126
|
+
}),
|
|
97
127
|
};
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
128
|
+
const scope = createRunScope({ ...context, host });
|
|
129
|
+
return async (item, overrides = {}) => {
|
|
130
|
+
const itemContext = {
|
|
131
|
+
...scope.context,
|
|
132
|
+
...(overrides.sequence !== undefined ? { sequence: overrides.sequence } : {}),
|
|
133
|
+
...(overrides.timeoutMs !== undefined ? { timeoutMs: overrides.timeoutMs } : {}),
|
|
134
|
+
};
|
|
135
|
+
const itemScope = scopeWith(scope, itemContext);
|
|
136
|
+
const run = runOf(registry, item);
|
|
137
|
+
const scripts = activeScripts(scriptsOf(item));
|
|
138
|
+
if (scripts === undefined) {
|
|
139
|
+
const sent = await openExchange(item, itemContext.host, { scope: itemScope, interactive: false, run: true })
|
|
140
|
+
.result;
|
|
141
|
+
return scriptsOf(item) !== undefined ? { ...sent, scriptsOff: true } : sent;
|
|
142
|
+
}
|
|
143
|
+
const refused = scriptsRefusal(item, registry);
|
|
144
|
+
if (refused !== undefined)
|
|
145
|
+
throw refused;
|
|
146
|
+
const scripting = context.scripting;
|
|
147
|
+
if (scripting === undefined) {
|
|
148
|
+
throw new WirebenchError('script-unavailable', `"${item.path}" has scripts, and this run cannot run them`, {
|
|
149
|
+
details: { path: item.path },
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
const scripted = {
|
|
153
|
+
protocol: item.kind,
|
|
154
|
+
path: item.path,
|
|
155
|
+
name: item.request.name,
|
|
156
|
+
slug: item.request.slug,
|
|
157
|
+
scripts,
|
|
158
|
+
types: await run.scriptTypes(item, itemScope),
|
|
159
|
+
};
|
|
160
|
+
await scripting.check(scripted);
|
|
161
|
+
return openExchange(item, itemContext.host, {
|
|
162
|
+
scope: itemScope,
|
|
163
|
+
interactive: false,
|
|
164
|
+
run: true,
|
|
165
|
+
scripts: { session: deferredSession(scripting, scripted, itemContext), placeholders: new SecretPlaceholders() },
|
|
166
|
+
}).result;
|
|
106
167
|
};
|
|
107
168
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
169
|
+
/**
|
|
170
|
+
* Type-checks the scripts of every selected request before a run sends anything (spec
|
|
171
|
+
* §Type-checking): each request whose scripts are switched on, against its own contract's types.
|
|
172
|
+
* Returns one error per request that fails, in selection order; empty when all pass.
|
|
173
|
+
*/
|
|
174
|
+
export async function checkRunScripts(selected, context) {
|
|
175
|
+
const scripting = context.scripting;
|
|
176
|
+
const errors = [];
|
|
177
|
+
if (scripting === undefined)
|
|
178
|
+
return errors;
|
|
179
|
+
const registry = context.registry ?? defaultRegistry();
|
|
180
|
+
const scope = createRunScope(context);
|
|
181
|
+
for (const item of selected) {
|
|
182
|
+
const scripts = activeScripts(scriptsOf(item));
|
|
183
|
+
if (scripts === undefined)
|
|
184
|
+
continue;
|
|
185
|
+
const refused = scriptsRefusal(item, registry);
|
|
186
|
+
if (refused !== undefined) {
|
|
187
|
+
errors.push(refused);
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
try {
|
|
191
|
+
await scripting.check({
|
|
192
|
+
protocol: item.kind,
|
|
193
|
+
path: item.path,
|
|
194
|
+
name: item.request.name,
|
|
195
|
+
slug: item.request.slug,
|
|
196
|
+
scripts,
|
|
197
|
+
types: await runOf(registry, item).scriptTypes(item, scope),
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
errors.push(isWirebenchError(error)
|
|
202
|
+
? error
|
|
203
|
+
: new WirebenchError('script-type-error', error instanceof Error ? error.message : String(error)));
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return errors;
|
|
207
|
+
}
|
|
208
|
+
/** The `--baseline` check for one sent request: `unsupported` for a protocol without goldens. */
|
|
209
|
+
async function baselineOf(item, subject, baseline) {
|
|
210
|
+
if (!BASELINE_PROTOCOLS.has(item.kind)) {
|
|
211
|
+
return { report: { status: 'unsupported' } };
|
|
212
|
+
}
|
|
213
|
+
return checkBaseline(await baseline.source(item), subject, baseline.require);
|
|
214
|
+
}
|
|
215
|
+
/** The `--update-baseline` step for one sent request whose own outcome did not error. */
|
|
216
|
+
async function baselineUpdateOf(item, subject, failed, update, containsKnownSecret) {
|
|
217
|
+
if (!BASELINE_PROTOCOLS.has(item.kind)) {
|
|
218
|
+
return { report: { status: 'unsupported' } };
|
|
219
|
+
}
|
|
220
|
+
const plan = planBaselineUpdate({
|
|
221
|
+
read: await update.source(item),
|
|
222
|
+
subject,
|
|
223
|
+
failed,
|
|
224
|
+
...(containsKnownSecret !== undefined ? { containsKnownSecret } : {}),
|
|
225
|
+
now: () => new Date(),
|
|
226
|
+
});
|
|
227
|
+
if (plan.kind === 'done')
|
|
228
|
+
return plan.check;
|
|
229
|
+
let outcome;
|
|
230
|
+
try {
|
|
231
|
+
outcome = await update.sink(item, plan.golden);
|
|
232
|
+
}
|
|
233
|
+
catch (error) {
|
|
234
|
+
outcome = { status: 'failed', message: error instanceof Error ? error.message : String(error) };
|
|
235
|
+
}
|
|
236
|
+
return finishBaselineUpdate(plan.report, outcome);
|
|
114
237
|
}
|
|
115
238
|
/** Runs one request; a throw anywhere on the way becomes an errored result, never a stopped run. */
|
|
116
|
-
async function runOne(item,
|
|
239
|
+
async function runOne(item, send, options, overrides, context) {
|
|
117
240
|
try {
|
|
118
|
-
const
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
...(
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
241
|
+
const own = assertionsOf(item);
|
|
242
|
+
// The cursor is taken inside this helper, before the send (§2.3 step 1).
|
|
243
|
+
const { sent, callbacks } = await sendAwaitingCallbacks(own, () => scopesFor({ ...context, ...(overrides.sequence !== undefined ? { sequence: overrides.sequence } : {}) }), () => send(item, overrides), {
|
|
244
|
+
...(options.captures !== undefined ? { captures: options.captures } : {}),
|
|
245
|
+
...(options.callbackClock !== undefined ? { clock: options.callbackClock } : {}),
|
|
246
|
+
...(options.callbackPollMs !== undefined ? { pollIntervalMs: options.callbackPollMs } : {}),
|
|
247
|
+
...(context.signal !== undefined ? { signal: context.signal } : {}),
|
|
248
|
+
onWaiting: (waiting) => options.onCallbackWaiting?.(item.path, waiting),
|
|
126
249
|
});
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
}
|
|
142
|
-
const own = item.request.assertions;
|
|
143
|
-
const withDefault = options.defaultSlaMs !== undefined && !own.some((a) => a.type === 'sla')
|
|
144
|
-
? [...own, { type: 'sla', maxMs: options.defaultSlaMs }]
|
|
145
|
-
: own;
|
|
146
|
-
const assertions = await evaluateAssertions(subject, withDefault);
|
|
147
|
-
const outcome = outcomeOf(assertions);
|
|
250
|
+
options.onSent?.(item, sent);
|
|
251
|
+
const { subject, raw, script } = sent;
|
|
252
|
+
const immediate = await checkRequestAssertions(subject, own, options.defaultSlaMs !== undefined ? { defaultSlaMs: options.defaultSlaMs } : {});
|
|
253
|
+
const checked = [...immediate, ...callbacks, ...scriptAssertions(script?.tests ?? [])];
|
|
254
|
+
// `--update-baseline` writes only for a request its own checks did not error (#217).
|
|
255
|
+
const ownOutcome = script?.error === undefined ? outcomeOf(checked) : 'errored';
|
|
256
|
+
const compared = options.baseline !== undefined
|
|
257
|
+
? await baselineOf(item, subject, options.baseline)
|
|
258
|
+
: options.updateBaseline !== undefined && ownOutcome !== 'errored'
|
|
259
|
+
? await baselineUpdateOf(item, subject, ownOutcome === 'failed', options.updateBaseline, context.containsKnownSecret)
|
|
260
|
+
: undefined;
|
|
261
|
+
const assertions = compared?.assertion !== undefined ? [...checked, compared.assertion] : checked;
|
|
262
|
+
const error = script?.error ?? compared?.error;
|
|
263
|
+
const outcome = error !== undefined ? 'errored' : outcomeOf(assertions);
|
|
148
264
|
return {
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
:
|
|
265
|
+
sent,
|
|
266
|
+
result: {
|
|
267
|
+
...identity(item),
|
|
268
|
+
outcome,
|
|
269
|
+
status: subject.status,
|
|
270
|
+
durationMs: subject.durationMs,
|
|
271
|
+
assertions,
|
|
272
|
+
// The synthetic baseline assertion does not count: --require-assertions keeps its meaning.
|
|
273
|
+
unasserted: own.length === 0 && (script?.tests.length ?? 0) === 0,
|
|
274
|
+
...(error !== undefined ? { error } : {}),
|
|
275
|
+
...(compared !== undefined ? { baseline: compared.report } : {}),
|
|
276
|
+
...scriptReport(script, sent.scriptsOff === true),
|
|
277
|
+
...(outcome !== 'passed'
|
|
278
|
+
? { exchange: { request: capped(raw.rawRequest), response: capped(raw.rawResponse) } }
|
|
279
|
+
: {}),
|
|
280
|
+
},
|
|
158
281
|
};
|
|
159
282
|
}
|
|
160
283
|
catch (e) {
|
|
161
|
-
return erroredResult(item,
|
|
162
|
-
code: isWirebenchError(e) ? e.code : 'internal-error',
|
|
163
|
-
message: e instanceof Error ? e.message : String(e),
|
|
164
|
-
...(isWirebenchError(e) && e.details !== undefined ? { details: e.details } : {}),
|
|
165
|
-
});
|
|
284
|
+
return { result: erroredResult(item, errorOf(e)) };
|
|
166
285
|
}
|
|
167
286
|
}
|
|
287
|
+
/** What a result reports of a request's scripts: their log, or that they were switched off. */
|
|
288
|
+
export function scriptReport(script, scriptsOff) {
|
|
289
|
+
return {
|
|
290
|
+
...(script !== undefined && script.log.lines.length > 0 ? { scriptLog: script.log.lines } : {}),
|
|
291
|
+
...(scriptsOff ? { scriptsOff: true } : {}),
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
/** A thrown value as a result's `error`, with the engine's code when it has one. */
|
|
295
|
+
export function errorOf(e) {
|
|
296
|
+
return {
|
|
297
|
+
code: isWirebenchError(e) ? e.code : 'internal-error',
|
|
298
|
+
message: e instanceof Error ? e.message : String(e),
|
|
299
|
+
...(isWirebenchError(e) && e.details !== undefined ? { details: e.details } : {}),
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
/** A failed or errored exchange as a report keeps it: each side capped, not yet redacted. */
|
|
303
|
+
export function cappedExchange(raw) {
|
|
304
|
+
return { request: capped(raw.rawRequest), response: capped(raw.rawResponse) };
|
|
305
|
+
}
|
|
168
306
|
/**
|
|
169
307
|
* Sends `selected` in order and reports each. A request after an abort, or after the first
|
|
170
308
|
* failure under `bail`, is `skipped` and never sent.
|
|
@@ -172,16 +310,10 @@ async function runOne(item, context, options, definitionFor) {
|
|
|
172
310
|
export async function runRequests(selected, context, options = {}) {
|
|
173
311
|
const started = performance.now();
|
|
174
312
|
const startedAt = new Date().toISOString();
|
|
175
|
-
const
|
|
176
|
-
const definitionFor = (iface) => {
|
|
177
|
-
let loaded = definitions.get(iface.id);
|
|
178
|
-
if (loaded === undefined) {
|
|
179
|
-
loaded = loadDefinition(context.projectDir, iface);
|
|
180
|
-
definitions.set(iface.id, loaded);
|
|
181
|
-
}
|
|
182
|
-
return loaded;
|
|
183
|
-
};
|
|
313
|
+
const send = createRunSender(context);
|
|
184
314
|
const results = [];
|
|
315
|
+
// Values scripts set, which later requests of the run read as `${#Sequence#name}` (#63).
|
|
316
|
+
const runValues = new Map(Object.entries(context.sequence ?? {}));
|
|
185
317
|
let stopped = false;
|
|
186
318
|
for (const item of selected) {
|
|
187
319
|
let result;
|
|
@@ -190,14 +322,18 @@ export async function runRequests(selected, context, options = {}) {
|
|
|
190
322
|
...identity(item),
|
|
191
323
|
outcome: 'skipped',
|
|
192
324
|
assertions: [],
|
|
193
|
-
unasserted: item.
|
|
325
|
+
unasserted: assertionsOf(item).length === 0,
|
|
194
326
|
};
|
|
195
327
|
}
|
|
196
|
-
else if (item.
|
|
328
|
+
else if (assertionsOf(item).length === 0 &&
|
|
329
|
+
activeScripts(scriptsOf(item))?.post === undefined &&
|
|
330
|
+
options.requireAssertions === true) {
|
|
197
331
|
result = erroredResult(item, { code: 'assertions-required', message: 'This request has no assertions.' });
|
|
198
332
|
}
|
|
199
333
|
else {
|
|
200
|
-
|
|
334
|
+
const ran = await runOne(item, send, options, { sequence: Object.fromEntries(runValues) }, context);
|
|
335
|
+
result = ran.result;
|
|
336
|
+
mergeScriptValues(runValues, ran.sent?.script?.values ?? [], context.host.onSecretValue, context.containsKnownSecret);
|
|
201
337
|
}
|
|
202
338
|
results.push(result);
|
|
203
339
|
options.onRequestDone?.(result);
|
|
@@ -206,7 +342,10 @@ export async function runRequests(selected, context, options = {}) {
|
|
|
206
342
|
}
|
|
207
343
|
}
|
|
208
344
|
const count = (outcome) => results.filter((r) => r.outcome === outcome).length;
|
|
209
|
-
const
|
|
345
|
+
const baselineCount = (status) => results.filter((r) => r.baseline?.status === status).length;
|
|
346
|
+
// Inside a workspace the environment a run names is the workspace's.
|
|
347
|
+
const environments = context.workspace?.workspace.environments ?? context.project.environments;
|
|
348
|
+
const environment = environments.find((e) => e.id === context.environmentId)?.name;
|
|
210
349
|
return {
|
|
211
350
|
startedAt,
|
|
212
351
|
...(environment !== undefined ? { environment } : {}),
|
|
@@ -217,6 +356,26 @@ export async function runRequests(selected, context, options = {}) {
|
|
|
217
356
|
errored: count('errored'),
|
|
218
357
|
skipped: count('skipped'),
|
|
219
358
|
durationMs: Math.round(performance.now() - started),
|
|
359
|
+
...(options.baseline !== undefined
|
|
360
|
+
? {
|
|
361
|
+
baseline: {
|
|
362
|
+
matched: baselineCount('matched'),
|
|
363
|
+
differs: baselineCount('differs'),
|
|
364
|
+
missing: baselineCount('missing'),
|
|
365
|
+
},
|
|
366
|
+
}
|
|
367
|
+
: {}),
|
|
368
|
+
...(options.updateBaseline !== undefined
|
|
369
|
+
? {
|
|
370
|
+
baselineUpdate: {
|
|
371
|
+
updated: baselineCount('updated'),
|
|
372
|
+
created: baselineCount('created'),
|
|
373
|
+
matched: baselineCount('matched'),
|
|
374
|
+
skipped: baselineCount('skipped'),
|
|
375
|
+
refused: baselineCount('refused'),
|
|
376
|
+
},
|
|
377
|
+
}
|
|
378
|
+
: {}),
|
|
220
379
|
},
|
|
221
380
|
requests: results,
|
|
222
381
|
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** What a protocol module is given for one run: the run's context and its one cache (spec §3.3). */
|
|
2
|
+
import type { RunScope } from '../protocol/module.js';
|
|
3
|
+
import type { RunContext } from './context.js';
|
|
4
|
+
/**
|
|
5
|
+
* A scope for one run. `memo` keeps one value per key for the scope's lifetime: a compiled WSDL, a
|
|
6
|
+
* proto set, an OpenAPI document. A load that rejects is remembered too, since nothing in a run can
|
|
7
|
+
* fix a cache, and every later request behind the key reports the same error.
|
|
8
|
+
*/
|
|
9
|
+
export declare function createRunScope(context: RunContext): RunScope;
|
|
10
|
+
/** `scope` with another context and the same cache: what one request of the run is sent with. */
|
|
11
|
+
export declare function scopeWith(scope: RunScope, context: RunContext): RunScope;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A scope for one run. `memo` keeps one value per key for the scope's lifetime: a compiled WSDL, a
|
|
3
|
+
* proto set, an OpenAPI document. A load that rejects is remembered too, since nothing in a run can
|
|
4
|
+
* fix a cache, and every later request behind the key reports the same error.
|
|
5
|
+
*/
|
|
6
|
+
export function createRunScope(context) {
|
|
7
|
+
const loads = new Map();
|
|
8
|
+
return {
|
|
9
|
+
context,
|
|
10
|
+
memo(key, load) {
|
|
11
|
+
const known = loads.get(key);
|
|
12
|
+
if (known !== undefined) {
|
|
13
|
+
return known;
|
|
14
|
+
}
|
|
15
|
+
const loading = load();
|
|
16
|
+
// Observed here so a rejection nobody awaits yet is never reported as unhandled.
|
|
17
|
+
loading.catch(() => undefined);
|
|
18
|
+
loads.set(key, loading);
|
|
19
|
+
return loading;
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/** `scope` with another context and the same cache: what one request of the run is sent with. */
|
|
24
|
+
export function scopeWith(scope, context) {
|
|
25
|
+
return { context, memo: (key, load) => scope.memo(key, load) };
|
|
26
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a run needs to run a request's scripts (#63): the script's view of properties and listed
|
|
3
|
+
* secrets, and the results a report shows — tests as assertions, values for later requests.
|
|
4
|
+
*/
|
|
5
|
+
import type { AssertionResult } from '../assert/model.js';
|
|
6
|
+
import { type GetSecret } from '../secrets/resolve.js';
|
|
7
|
+
import type { RequestSnapshotBase, ResponseSnapshotBase } from '../protocol/module.js';
|
|
8
|
+
import type { ScriptLog, ScriptTest, ScriptValue } from '../script/model.js';
|
|
9
|
+
import { type RequestScripting, type ScriptedRequest, type ScriptRunValues } from '../script/request-scripts.js';
|
|
10
|
+
/** What running a request's scripts produced, carried with the sent request. */
|
|
11
|
+
export interface SentScripts {
|
|
12
|
+
readonly tests: readonly ScriptTest[];
|
|
13
|
+
readonly values: readonly ScriptValue[];
|
|
14
|
+
readonly log: ScriptLog;
|
|
15
|
+
/** A post-response script that failed: the response is kept, the request errors. */
|
|
16
|
+
readonly error?: {
|
|
17
|
+
readonly code: string;
|
|
18
|
+
readonly message: string;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/** The values of the secrets a request's scripts list. */
|
|
22
|
+
export declare function listedSecrets(names: readonly string[], getSecret: GetSecret): Promise<Record<string, string>>;
|
|
23
|
+
/** A script's tests as a report's assertions. */
|
|
24
|
+
export declare function scriptAssertions(tests: readonly ScriptTest[]): AssertionResult[];
|
|
25
|
+
/**
|
|
26
|
+
* Adds a script's values to a run's values. A value marked secret, or holding a credential the run
|
|
27
|
+
* knows, is reported for masking first (ADR-0015).
|
|
28
|
+
*/
|
|
29
|
+
export declare function mergeScriptValues(target: Map<string, string>, values: readonly ScriptValue[], onSecretValue: ((value: string) => void) | undefined, containsKnownSecret: ((value: string) => boolean) | undefined): void;
|
|
30
|
+
/** One send's scripts: the pre-request script on the prepared request, the post-response script on the response. */
|
|
31
|
+
export interface ScriptSession {
|
|
32
|
+
/**
|
|
33
|
+
* Runs the pre-request script, if there is one, on `before`; the request as it will be sent.
|
|
34
|
+
*
|
|
35
|
+
* @throws WirebenchError the script's failure: the request is not sent
|
|
36
|
+
*/
|
|
37
|
+
readonly pre: <S extends RequestSnapshotBase>(before: S) => Promise<S>;
|
|
38
|
+
/**
|
|
39
|
+
* Runs the post-response script, if there is one, and returns what both scripts did. The
|
|
40
|
+
* post-response script sees the pre-request script's values; its failure is returned, not thrown.
|
|
41
|
+
*/
|
|
42
|
+
readonly post: (sent: RequestSnapshotBase, response: ResponseSnapshotBase) => Promise<SentScripts>;
|
|
43
|
+
}
|
|
44
|
+
export interface ScriptSessionOptions {
|
|
45
|
+
/** Told each value a script sets that is secret, or holds a known secret, as soon as it is set. */
|
|
46
|
+
readonly onSecretValue?: (value: string) => void;
|
|
47
|
+
readonly containsKnownSecret?: (value: string) => boolean;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* The scripts of one send of `scripted`. The run and the app both send through this, so a value a
|
|
51
|
+
* script marks secret is masked before anything about the send is shown, in either.
|
|
52
|
+
*/
|
|
53
|
+
export declare function scriptSession(scripting: RequestScripting, scripted: ScriptedRequest, values: ScriptRunValues, options?: ScriptSessionOptions): ScriptSession;
|