@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
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { ProtocolScripting } from '../protocol/module.js';
|
|
2
|
+
import type { HeaderPair } from '../script/model.js';
|
|
3
|
+
import type { RestExchange, RestSendInput } from './send.js';
|
|
4
|
+
/** A REST request body as a script sees it: text it can read and replace, or a kind it cannot edit. */
|
|
5
|
+
export type RestBodySnapshot = {
|
|
6
|
+
readonly kind: 'none';
|
|
7
|
+
} | {
|
|
8
|
+
readonly kind: 'text';
|
|
9
|
+
readonly text: string;
|
|
10
|
+
readonly language: string;
|
|
11
|
+
}
|
|
12
|
+
/** A form, multipart or binary body: kept as it is, and not editable from a script. */
|
|
13
|
+
| {
|
|
14
|
+
readonly kind: 'other';
|
|
15
|
+
readonly description: string;
|
|
16
|
+
};
|
|
17
|
+
export interface RestRequestSnapshot {
|
|
18
|
+
readonly protocol: 'rest';
|
|
19
|
+
readonly method: string;
|
|
20
|
+
/** The full URL, query included, as it will be sent. */
|
|
21
|
+
readonly url: string;
|
|
22
|
+
readonly headers: readonly HeaderPair[];
|
|
23
|
+
readonly body: RestBodySnapshot;
|
|
24
|
+
}
|
|
25
|
+
export interface RestResponseSnapshot {
|
|
26
|
+
readonly protocol: 'rest';
|
|
27
|
+
readonly status: number;
|
|
28
|
+
readonly statusText: string;
|
|
29
|
+
readonly headers: readonly HeaderPair[];
|
|
30
|
+
readonly text: string;
|
|
31
|
+
readonly durationMs: number;
|
|
32
|
+
}
|
|
33
|
+
export declare function restRequestSnapshot(input: RestSendInput): RestRequestSnapshot;
|
|
34
|
+
/** The send with a pre-request script's changes. The URL is rebuilt only when the script changed it. */
|
|
35
|
+
export declare function applyRestSnapshot(input: RestSendInput, before: RestRequestSnapshot, after: RestRequestSnapshot): RestSendInput;
|
|
36
|
+
export declare function restResponseSnapshot(exchange: RestExchange): RestResponseSnapshot;
|
|
37
|
+
/** REST's scripting facet. */
|
|
38
|
+
export declare const restScripting: ProtocolScripting<RestRequestSnapshot, RestResponseSnapshot>;
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a script sees of a REST request and its response (spec §3.4): the snapshots, the converters
|
|
3
|
+
* between a prepared send and a snapshot, the API's declarations, its sandbox-side source, and what
|
|
4
|
+
* the script rules check.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { headerPairSchema } from '../script/apply.js';
|
|
8
|
+
import { entriesOf, pairsOf } from '../script/send.js';
|
|
9
|
+
import { composeUrl } from './url.js';
|
|
10
|
+
const RAW_LANGUAGES = ['json', 'xml', 'text', 'html', 'javascript'];
|
|
11
|
+
export function restRequestSnapshot(input) {
|
|
12
|
+
const { request } = input;
|
|
13
|
+
const url = composeUrl(input.baseUrl, request.url, request.pathParams, request.query, {
|
|
14
|
+
encode: input.settings.encodeUrl ?? true,
|
|
15
|
+
}).url;
|
|
16
|
+
let body;
|
|
17
|
+
switch (request.body.kind) {
|
|
18
|
+
case 'none':
|
|
19
|
+
body = { kind: 'none' };
|
|
20
|
+
break;
|
|
21
|
+
case 'raw':
|
|
22
|
+
body = { kind: 'text', text: request.body.text, language: request.body.language };
|
|
23
|
+
break;
|
|
24
|
+
default:
|
|
25
|
+
body = { kind: 'other', description: `a ${request.body.kind} body` };
|
|
26
|
+
}
|
|
27
|
+
return { protocol: 'rest', method: request.method, url, headers: pairsOf(request.headers), body };
|
|
28
|
+
}
|
|
29
|
+
/** The send with a pre-request script's changes. The URL is rebuilt only when the script changed it. */
|
|
30
|
+
export function applyRestSnapshot(input, before, after) {
|
|
31
|
+
const urlChanged = after.url !== before.url;
|
|
32
|
+
const body = (() => {
|
|
33
|
+
if (after.body.kind === 'other' || JSON.stringify(after.body) === JSON.stringify(before.body)) {
|
|
34
|
+
return input.request.body;
|
|
35
|
+
}
|
|
36
|
+
if (after.body.kind === 'none')
|
|
37
|
+
return { kind: 'none' };
|
|
38
|
+
const language = RAW_LANGUAGES.includes(after.body.language)
|
|
39
|
+
? after.body.language
|
|
40
|
+
: 'text';
|
|
41
|
+
const was = input.request.body;
|
|
42
|
+
return {
|
|
43
|
+
kind: 'raw',
|
|
44
|
+
language,
|
|
45
|
+
...(was.kind === 'raw' && was.contentType !== undefined ? { contentType: was.contentType } : {}),
|
|
46
|
+
text: after.body.text,
|
|
47
|
+
};
|
|
48
|
+
})();
|
|
49
|
+
return {
|
|
50
|
+
...input,
|
|
51
|
+
// A changed URL is sent exactly as the script wrote it: the script's query API has already
|
|
52
|
+
// encoded what it added, so the send must not encode it again.
|
|
53
|
+
...(urlChanged ? { baseUrl: '', settings: { ...input.settings, encodeUrl: false } } : {}),
|
|
54
|
+
request: {
|
|
55
|
+
...input.request,
|
|
56
|
+
method: after.method,
|
|
57
|
+
...(urlChanged ? { url: after.url, pathParams: [], query: [] } : {}),
|
|
58
|
+
headers: entriesOf(after.headers),
|
|
59
|
+
body,
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export function restResponseSnapshot(exchange) {
|
|
64
|
+
return {
|
|
65
|
+
protocol: 'rest',
|
|
66
|
+
status: exchange.status,
|
|
67
|
+
statusText: exchange.statusText,
|
|
68
|
+
headers: exchange.rawHeaders.map(([n, v]) => [n, v]),
|
|
69
|
+
text: exchange.text,
|
|
70
|
+
durationMs: exchange.durationMs,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
const range = (from, to) => Array.from({ length: to - from + 1 }, (_, i) => String(from + i)).join(' | ');
|
|
74
|
+
/** Every HTTP status a response can have, as literals, so an arm's status narrows exactly. */
|
|
75
|
+
const STATUS_TYPES = `
|
|
76
|
+
/** Any HTTP status, as literals, so that checking \`response.status\` narrows the response. */
|
|
77
|
+
type WbStatus = ${range(100, 599)};
|
|
78
|
+
type WbRange1 = Extract<WbStatus, ${range(100, 199)}>;
|
|
79
|
+
type WbRange2 = Extract<WbStatus, ${range(200, 299)}>;
|
|
80
|
+
type WbRange3 = Extract<WbStatus, ${range(300, 399)}>;
|
|
81
|
+
type WbRange4 = Extract<WbStatus, ${range(400, 499)}>;
|
|
82
|
+
type WbRange5 = Extract<WbStatus, ${range(500, 599)}>;
|
|
83
|
+
`;
|
|
84
|
+
const REST_REQUEST = `
|
|
85
|
+
interface WbRestQuery {
|
|
86
|
+
get(name: string): string | undefined;
|
|
87
|
+
getAll(name: string): string[];
|
|
88
|
+
list(): { name: string; value: string }[];
|
|
89
|
+
}
|
|
90
|
+
interface WbWritableRestQuery extends WbRestQuery {
|
|
91
|
+
set(name: string, value: string): void;
|
|
92
|
+
add(name: string, value: string): void;
|
|
93
|
+
delete(name: string): void;
|
|
94
|
+
}
|
|
95
|
+
interface WbRestBody {
|
|
96
|
+
/** \`other\` is a form, multipart or binary body, which a script cannot read or change. */
|
|
97
|
+
readonly kind: 'none' | 'text' | 'other';
|
|
98
|
+
readonly text: string;
|
|
99
|
+
readonly json: WbRequestBody;
|
|
100
|
+
}
|
|
101
|
+
interface WbResponseArm<S extends number, B> {
|
|
102
|
+
readonly status: S;
|
|
103
|
+
readonly statusText: string;
|
|
104
|
+
readonly headers: WbPairs;
|
|
105
|
+
readonly text: string;
|
|
106
|
+
/** The body parsed as JSON, typed from the contract's response for this status. */
|
|
107
|
+
json(): B;
|
|
108
|
+
readonly durationMs: number;
|
|
109
|
+
}
|
|
110
|
+
interface WbWritableRestBody {
|
|
111
|
+
readonly kind: 'none' | 'text' | 'other';
|
|
112
|
+
text: string;
|
|
113
|
+
json: WbRequestBody;
|
|
114
|
+
}
|
|
115
|
+
`;
|
|
116
|
+
const REST_PRE = `
|
|
117
|
+
declare const request: {
|
|
118
|
+
method: string;
|
|
119
|
+
/** The full URL. A script may change the path, query and fragment, never the scheme, host or port. */
|
|
120
|
+
url: string;
|
|
121
|
+
readonly query: WbWritableRestQuery;
|
|
122
|
+
readonly headers: WbWritablePairs;
|
|
123
|
+
readonly body: WbWritableRestBody;
|
|
124
|
+
};
|
|
125
|
+
`;
|
|
126
|
+
const REST_POST = `
|
|
127
|
+
declare const request: {
|
|
128
|
+
readonly method: string;
|
|
129
|
+
readonly url: string;
|
|
130
|
+
readonly query: WbRestQuery;
|
|
131
|
+
readonly headers: WbPairs;
|
|
132
|
+
readonly body: WbRestBody;
|
|
133
|
+
};
|
|
134
|
+
declare const response: WbResponse;
|
|
135
|
+
`;
|
|
136
|
+
/** Splits and joins a URL's query without a URL class, which QuickJS lacks. */
|
|
137
|
+
const REST = String.raw `
|
|
138
|
+
const splitUrl = (url) => {
|
|
139
|
+
const hashAt = url.indexOf('#');
|
|
140
|
+
const fragment = hashAt === -1 ? '' : url.slice(hashAt);
|
|
141
|
+
const beforeHash = hashAt === -1 ? url : url.slice(0, hashAt);
|
|
142
|
+
const queryAt = beforeHash.indexOf('?');
|
|
143
|
+
return {
|
|
144
|
+
base: queryAt === -1 ? beforeHash : beforeHash.slice(0, queryAt),
|
|
145
|
+
query: queryAt === -1 ? '' : beforeHash.slice(queryAt + 1),
|
|
146
|
+
fragment,
|
|
147
|
+
};
|
|
148
|
+
};
|
|
149
|
+
const decode = (text) => { try { return decodeURIComponent(text.replace(/\+/g, ' ')); } catch { return text; } };
|
|
150
|
+
const encode = (text) => encodeURIComponent(text);
|
|
151
|
+
|
|
152
|
+
const restRequest = (snapshot, writable) => {
|
|
153
|
+
const data = {
|
|
154
|
+
method: snapshot.method,
|
|
155
|
+
url: snapshot.url,
|
|
156
|
+
headers: snapshot.headers.map(([n, v]) => [n, v]),
|
|
157
|
+
body: JSON.parse(JSON.stringify(snapshot.body)),
|
|
158
|
+
};
|
|
159
|
+
const queryPairs = () => {
|
|
160
|
+
const { query } = splitUrl(data.url);
|
|
161
|
+
return query === '' ? [] : query.split('&').filter((p) => p !== '').map((part) => {
|
|
162
|
+
const eq = part.indexOf('=');
|
|
163
|
+
return eq === -1 ? [decode(part), ''] : [decode(part.slice(0, eq)), decode(part.slice(eq + 1))];
|
|
164
|
+
});
|
|
165
|
+
};
|
|
166
|
+
const writeQuery = (pairs) => {
|
|
167
|
+
const { base, fragment } = splitUrl(data.url);
|
|
168
|
+
const query = pairs.map(([n, v]) => encode(n) + '=' + encode(v)).join('&');
|
|
169
|
+
data.url = base + (query === '' ? '' : '?' + query) + fragment;
|
|
170
|
+
};
|
|
171
|
+
const refuse = (what) => () => { throw new TypeError('The ' + what + ' of a sent request cannot be changed'); };
|
|
172
|
+
const query = Object.freeze({
|
|
173
|
+
get: (name) => { const hit = queryPairs().find(([n]) => n === String(name)); return hit === undefined ? undefined : hit[1]; },
|
|
174
|
+
getAll: (name) => queryPairs().filter(([n]) => n === String(name)).map(([, v]) => v),
|
|
175
|
+
list: () => queryPairs().map(([name, value]) => ({ name, value })),
|
|
176
|
+
set: writable ? (name, value) => {
|
|
177
|
+
const pairs = queryPairs().filter(([n]) => n !== String(name));
|
|
178
|
+
pairs.push([String(name), String(value)]);
|
|
179
|
+
writeQuery(pairs);
|
|
180
|
+
} : refuse('query'),
|
|
181
|
+
add: writable ? (name, value) => { const pairs = queryPairs(); pairs.push([String(name), String(value)]); writeQuery(pairs); } : refuse('query'),
|
|
182
|
+
delete: writable ? (name) => writeQuery(queryPairs().filter(([n]) => n !== String(name))) : refuse('query'),
|
|
183
|
+
});
|
|
184
|
+
const headers = pairsApi(data.headers, writable, 'header');
|
|
185
|
+
const bodyText = () => {
|
|
186
|
+
if (data.body.kind === 'text') return data.body.text;
|
|
187
|
+
if (data.body.kind === 'none') return '';
|
|
188
|
+
throw new TypeError('This request\'s body is ' + data.body.description + ', which a script cannot read or change');
|
|
189
|
+
};
|
|
190
|
+
const body = Object.freeze({
|
|
191
|
+
get kind() { return data.body.kind === 'other' ? 'other' : data.body.kind; },
|
|
192
|
+
get text() { return bodyText(); },
|
|
193
|
+
set text(value) {
|
|
194
|
+
if (!writable) refuse('body')();
|
|
195
|
+
if (data.body.kind === 'other') bodyText();
|
|
196
|
+
data.body = { kind: 'text', text: String(value), language: data.body.kind === 'text' ? data.body.language : 'text' };
|
|
197
|
+
},
|
|
198
|
+
get json() { return JSON.parse(bodyText()); },
|
|
199
|
+
set json(value) {
|
|
200
|
+
if (!writable) refuse('body')();
|
|
201
|
+
if (data.body.kind === 'other') bodyText();
|
|
202
|
+
const text = JSON.stringify(value);
|
|
203
|
+
if (text === undefined) throw new TypeError('body.json must be a JSON value');
|
|
204
|
+
data.body = { kind: 'text', text, language: 'json' };
|
|
205
|
+
},
|
|
206
|
+
});
|
|
207
|
+
const request = Object.freeze({
|
|
208
|
+
get method() { return data.method; },
|
|
209
|
+
set method(value) { if (!writable) refuse('method')(); data.method = String(value).toUpperCase(); },
|
|
210
|
+
get url() { return data.url; },
|
|
211
|
+
set url(value) { if (!writable) refuse('URL')(); data.url = String(value); },
|
|
212
|
+
query,
|
|
213
|
+
headers,
|
|
214
|
+
body,
|
|
215
|
+
});
|
|
216
|
+
const snapshotOf = () => ({ protocol: 'rest', method: data.method, url: data.url, headers: data.headers, body: data.body });
|
|
217
|
+
return { request, snapshotOf };
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
const restResponse = (snapshot) => deepFreeze({
|
|
221
|
+
status: snapshot.status,
|
|
222
|
+
statusText: snapshot.statusText,
|
|
223
|
+
headers: pairsApi(snapshot.headers.map(([n, v]) => [n, v]), false, 'header'),
|
|
224
|
+
text: snapshot.text,
|
|
225
|
+
json: () => JSON.parse(snapshot.text),
|
|
226
|
+
durationMs: snapshot.durationMs,
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
if (input.phase === 'pre') {
|
|
230
|
+
const built = restRequest(input.request, true);
|
|
231
|
+
define('request', built.request);
|
|
232
|
+
state.request = built.snapshotOf;
|
|
233
|
+
} else {
|
|
234
|
+
define('request', restRequest(input.request, false).request);
|
|
235
|
+
define('response', restResponse(input.response));
|
|
236
|
+
}
|
|
237
|
+
`;
|
|
238
|
+
/** An HTTP method token. The generic rules do not know what a method is, so this one is REST's own. */
|
|
239
|
+
const METHOD = /^[A-Z][A-Z0-9_-]{0,31}$/;
|
|
240
|
+
const bodySchema = z.discriminatedUnion('kind', [
|
|
241
|
+
z.object({ kind: z.literal('none') }),
|
|
242
|
+
z.object({ kind: z.literal('text'), text: z.string(), language: z.string() }),
|
|
243
|
+
z.object({ kind: z.literal('other'), description: z.string() }),
|
|
244
|
+
]);
|
|
245
|
+
const requestSchema = z.object({
|
|
246
|
+
protocol: z.literal('rest'),
|
|
247
|
+
method: z.string(),
|
|
248
|
+
url: z.string(),
|
|
249
|
+
headers: z.array(headerPairSchema),
|
|
250
|
+
body: bodySchema,
|
|
251
|
+
});
|
|
252
|
+
/** REST's scripting facet. */
|
|
253
|
+
export const restScripting = {
|
|
254
|
+
declarations: (phase) => [STATUS_TYPES, REST_REQUEST, phase === 'pre' ? REST_PRE : REST_POST].join('\n'),
|
|
255
|
+
reference: () => [
|
|
256
|
+
{ title: 'REST: shared by both phases', declarations: REST_REQUEST },
|
|
257
|
+
{ title: 'REST: pre-request', declarations: REST_PRE },
|
|
258
|
+
{ title: 'REST: post-response', declarations: REST_POST },
|
|
259
|
+
],
|
|
260
|
+
prelude: () => REST,
|
|
261
|
+
requestSchema,
|
|
262
|
+
inspect(snapshot) {
|
|
263
|
+
return {
|
|
264
|
+
destination: snapshot.url,
|
|
265
|
+
// A form, multipart or binary body comes back exactly as it went; a text body is the script's.
|
|
266
|
+
fixed: snapshot.body.kind === 'other' ? snapshot.body : null,
|
|
267
|
+
pairs: snapshot.headers,
|
|
268
|
+
lines: [snapshot.url],
|
|
269
|
+
texts: [
|
|
270
|
+
snapshot.method,
|
|
271
|
+
snapshot.url,
|
|
272
|
+
...snapshot.headers.flat(),
|
|
273
|
+
...(snapshot.body.kind === 'text' ? [snapshot.body.text] : []),
|
|
274
|
+
],
|
|
275
|
+
};
|
|
276
|
+
},
|
|
277
|
+
validate(_before, after) {
|
|
278
|
+
return METHOD.test(after.method)
|
|
279
|
+
? undefined
|
|
280
|
+
: { code: 'script-value-invalid', message: `"${after.method}" is not an HTTP method` };
|
|
281
|
+
},
|
|
282
|
+
};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turns a saved REST request plus the settings around it into the {@link RestSendInput} the
|
|
3
|
+
* transport receives. The precedence between the layers of configuration is fixed here rather than
|
|
4
|
+
* in the host: the request's own setting wins, then the API's, then the project's, then the user's
|
|
5
|
+
* preference. A setting left unset is therefore never "off" — it is "inherit".
|
|
6
|
+
*/
|
|
7
|
+
import type { SendAuth } from '../http/auth/send-auth.js';
|
|
8
|
+
import type { Cookie } from '../http/cookies.js';
|
|
9
|
+
import type { KeyValueEntry } from '../http/entries.js';
|
|
10
|
+
import type { ProxyOptions, TlsOptions } from '../http/types.js';
|
|
11
|
+
import type { ProjectSettings } from '../project/model.js';
|
|
12
|
+
import type { Preferences } from '../project/preferences.js';
|
|
13
|
+
import type { FileResolver } from './body.js';
|
|
14
|
+
import type { RestBody, RestMethod, RestRequestSettings } from './model.js';
|
|
15
|
+
import type { RestSendInput } from './send.js';
|
|
16
|
+
/** The parts of a REST request {@link toRestSendInput} reads. */
|
|
17
|
+
export interface RestSendRequestInput {
|
|
18
|
+
readonly method: RestMethod;
|
|
19
|
+
readonly url: string;
|
|
20
|
+
readonly pathParams: readonly KeyValueEntry[];
|
|
21
|
+
readonly query: readonly KeyValueEntry[];
|
|
22
|
+
readonly headers: readonly KeyValueEntry[];
|
|
23
|
+
readonly body: RestBody;
|
|
24
|
+
readonly settings: RestRequestSettings;
|
|
25
|
+
}
|
|
26
|
+
/** Everything {@link toRestSendInput} needs beyond the request itself. */
|
|
27
|
+
export interface ToRestSendInputArgs {
|
|
28
|
+
readonly request: RestSendRequestInput;
|
|
29
|
+
/** The API's effective base URL, environment override applied and properties expanded. */
|
|
30
|
+
readonly baseUrl: string;
|
|
31
|
+
/** The API's own settings, which a request inherits where it sets nothing. */
|
|
32
|
+
readonly apiSettings?: RestRequestSettings;
|
|
33
|
+
readonly preferences?: Preferences;
|
|
34
|
+
readonly projectSettings?: Pick<ProjectSettings, 'defaultTimeoutMs'>;
|
|
35
|
+
/** Resolved credentials; the host turns `secretRef`s into values and tokens into `oauth2`. */
|
|
36
|
+
readonly auth?: SendAuth;
|
|
37
|
+
/** Cookies already matched against the URL, when the request asks for them. */
|
|
38
|
+
readonly cookies?: readonly Cookie[];
|
|
39
|
+
/** How a multipart file part or a binary body is read. */
|
|
40
|
+
readonly resolveFile?: FileResolver;
|
|
41
|
+
readonly tls?: TlsOptions;
|
|
42
|
+
readonly proxy?: ProxyOptions;
|
|
43
|
+
readonly signal?: AbortSignal;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Builds the send input for one REST request.
|
|
47
|
+
*
|
|
48
|
+
* Precedence is request → API → project → preference, the same ladder a SOAP request's properties
|
|
49
|
+
* climb, and for the same reason: a setting the request leaves unset means *inherit*, never *off*.
|
|
50
|
+
* The headers the host adds on the request's behalf — `User-Agent`, `Accept-Encoding`, `Connection`,
|
|
51
|
+
* a default `Accept` — are passed separately from the request's own, so `rest/send.ts` can let the
|
|
52
|
+
* user's typed header win without having to guess which came from where.
|
|
53
|
+
*/
|
|
54
|
+
export declare function toRestSendInput(args: ToRestSendInputArgs): RestSendInput;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turns a saved REST request plus the settings around it into the {@link RestSendInput} the
|
|
3
|
+
* transport receives. The precedence between the layers of configuration is fixed here rather than
|
|
4
|
+
* in the host: the request's own setting wins, then the API's, then the project's, then the user's
|
|
5
|
+
* preference. A setting left unset is therefore never "off" — it is "inherit".
|
|
6
|
+
*/
|
|
7
|
+
import { inherited } from '../project/inherit.js';
|
|
8
|
+
import { DEFAULT_PREFERENCES } from '../project/preferences.js';
|
|
9
|
+
/**
|
|
10
|
+
* Builds the send input for one REST request.
|
|
11
|
+
*
|
|
12
|
+
* Precedence is request → API → project → preference, the same ladder a SOAP request's properties
|
|
13
|
+
* climb, and for the same reason: a setting the request leaves unset means *inherit*, never *off*.
|
|
14
|
+
* The headers the host adds on the request's behalf — `User-Agent`, `Accept-Encoding`, `Connection`,
|
|
15
|
+
* a default `Accept` — are passed separately from the request's own, so `rest/send.ts` can let the
|
|
16
|
+
* user's typed header win without having to guess which came from where.
|
|
17
|
+
*/
|
|
18
|
+
export function toRestSendInput(args) {
|
|
19
|
+
const preferences = args.preferences ?? DEFAULT_PREFERENCES;
|
|
20
|
+
const request = args.request;
|
|
21
|
+
const api = args.apiSettings ?? {};
|
|
22
|
+
const defaultHeaders = {};
|
|
23
|
+
if (preferences.http.userAgent.length > 0) {
|
|
24
|
+
defaultHeaders['User-Agent'] = preferences.http.userAgent;
|
|
25
|
+
}
|
|
26
|
+
if (preferences.http.responseCompression) {
|
|
27
|
+
defaultHeaders['Accept-Encoding'] = 'gzip, deflate, br';
|
|
28
|
+
}
|
|
29
|
+
if (preferences.http.closeConnections) {
|
|
30
|
+
defaultHeaders.Connection = 'close';
|
|
31
|
+
}
|
|
32
|
+
if (preferences.rest.defaultAccept.length > 0) {
|
|
33
|
+
defaultHeaders.Accept = preferences.rest.defaultAccept;
|
|
34
|
+
}
|
|
35
|
+
const timeoutMs = inherited(request.settings.timeoutMs, api.timeoutMs, args.projectSettings?.defaultTimeoutMs) ??
|
|
36
|
+
preferences.http.socketTimeoutMs;
|
|
37
|
+
const followRedirects = inherited(request.settings.followRedirects, api.followRedirects) ?? preferences.rest.followRedirects;
|
|
38
|
+
const maxRedirects = inherited(request.settings.maxRedirects, api.maxRedirects) ?? preferences.rest.maxRedirects;
|
|
39
|
+
const keepBodyOnRedirect = inherited(request.settings.keepBodyOnRedirect, api.keepBodyOnRedirect);
|
|
40
|
+
const encodeUrl = inherited(request.settings.encodeUrl, api.encodeUrl);
|
|
41
|
+
const maxSizeBytes = inherited(request.settings.maxSizeBytes, api.maxSizeBytes);
|
|
42
|
+
const bindAddress = inherited(request.settings.bindAddress, api.bindAddress);
|
|
43
|
+
return {
|
|
44
|
+
baseUrl: args.baseUrl,
|
|
45
|
+
request: {
|
|
46
|
+
method: request.method,
|
|
47
|
+
url: request.url,
|
|
48
|
+
pathParams: request.pathParams,
|
|
49
|
+
query: request.query,
|
|
50
|
+
headers: request.headers,
|
|
51
|
+
body: request.body,
|
|
52
|
+
},
|
|
53
|
+
settings: {
|
|
54
|
+
timeoutMs,
|
|
55
|
+
followRedirects,
|
|
56
|
+
maxRedirects,
|
|
57
|
+
...(keepBodyOnRedirect !== undefined ? { keepBodyOnRedirect } : {}),
|
|
58
|
+
...(encodeUrl !== undefined ? { encodeUrl } : {}),
|
|
59
|
+
...(maxSizeBytes !== undefined ? { maxSizeBytes } : {}),
|
|
60
|
+
...(bindAddress !== undefined && bindAddress.length > 0 ? { localAddress: bindAddress } : {}),
|
|
61
|
+
...(preferences.http.allowH2 ? { allowH2: true } : {}),
|
|
62
|
+
},
|
|
63
|
+
defaultHeaders,
|
|
64
|
+
...(args.auth !== undefined ? { auth: args.auth } : {}),
|
|
65
|
+
...(args.cookies !== undefined ? { cookies: args.cookies } : {}),
|
|
66
|
+
// As for SOAP: the TLS floor is the user's one-off choice, and everything else in `tls` is
|
|
67
|
+
// resolved by the host, which reads files and secrets, and merged onto this.
|
|
68
|
+
tls: { minVersion: preferences.ssl.minVersion, ...args.tls },
|
|
69
|
+
...(args.proxy !== undefined ? { proxy: args.proxy } : {}),
|
|
70
|
+
...(args.resolveFile !== undefined ? { resolveFile: args.resolveFile } : {}),
|
|
71
|
+
...(args.signal !== undefined ? { signal: args.signal } : {}),
|
|
72
|
+
};
|
|
73
|
+
}
|
package/dist/rest/send.d.ts
CHANGED
|
@@ -8,11 +8,16 @@
|
|
|
8
8
|
* runner send identically, and there is one implementation of redirects, timings and raw capture
|
|
9
9
|
* rather than two.
|
|
10
10
|
*/
|
|
11
|
-
import type { HttpExchange, HttpRequest, ProxyOptions, TlsOptions } from '../http/types.js';
|
|
12
|
-
import type { AuthSummary, SendAuth } from '../
|
|
11
|
+
import type { HttpExchange, HttpRequest, HttpStreamSink, ProxyOptions, TlsOptions } from '../http/types.js';
|
|
12
|
+
import type { AuthSummary, SendAuth } from '../http/auth/send-auth.js';
|
|
13
|
+
import type { SignatureScheme } from '../http/webhook-signature.js';
|
|
13
14
|
import type { FileResolver } from './body.js';
|
|
15
|
+
import type { CookieJarHost, CookieVerdict } from '../http/cookies.js';
|
|
14
16
|
import type { KeyValueEntry, RestBody, RestMethod } from './model.js';
|
|
15
17
|
import type { BodyLanguage, Cookie } from './response.js';
|
|
18
|
+
import { createSseParser } from './sse.js';
|
|
19
|
+
import type { SseRow } from './sse.js';
|
|
20
|
+
import { createSseRowStore } from './sse-transcript.js';
|
|
16
21
|
/** The parts of a saved request a send reads, with every property already expanded. */
|
|
17
22
|
export interface RestSendRequest {
|
|
18
23
|
readonly method: RestMethod;
|
|
@@ -49,24 +54,73 @@ export interface RestSendInput {
|
|
|
49
54
|
readonly defaultHeaders?: Readonly<Record<string, string>>;
|
|
50
55
|
/** Credentials, already resolved to values. */
|
|
51
56
|
readonly auth?: SendAuth;
|
|
52
|
-
/** Cookies to send back, already matched against the URL
|
|
57
|
+
/** Cookies to send back, already matched against the URL. Kept for the engine's API; a run sends through `jar`.
|
|
58
|
+
* Exclusive with `jar`: when a jar is present this list is ignored. */
|
|
53
59
|
readonly cookies?: readonly Cookie[];
|
|
60
|
+
/**
|
|
61
|
+
* The cookie jar this send stores into and, when `send` is set, reads from (cookie jar spec
|
|
62
|
+
* §1.4). Each hop of a redirect is matched and stored against its own URL. A hand-set `Cookie`
|
|
63
|
+
* header goes first and wins on the same name.
|
|
64
|
+
*/
|
|
65
|
+
readonly jar?: {
|
|
66
|
+
readonly host: CookieJarHost;
|
|
67
|
+
readonly send: boolean;
|
|
68
|
+
};
|
|
54
69
|
readonly tls?: TlsOptions;
|
|
55
70
|
readonly proxy?: ProxyOptions;
|
|
56
71
|
/** How a multipart file part or a binary body is read. */
|
|
57
72
|
readonly resolveFile?: FileResolver;
|
|
58
73
|
/** Fixed multipart boundary; tests inject it. */
|
|
59
74
|
readonly boundary?: string;
|
|
75
|
+
/**
|
|
76
|
+
* A webhook item's signing (webhook-signatures §5.2), its secret already resolved. Applied last,
|
|
77
|
+
* over the encoded body bytes and the merged headers, so the signature covers exactly what goes
|
|
78
|
+
* on the wire. A signing header replaces a merged header of the same name.
|
|
79
|
+
*/
|
|
80
|
+
readonly sign?: {
|
|
81
|
+
readonly scheme: SignatureScheme;
|
|
82
|
+
readonly secret: string;
|
|
83
|
+
};
|
|
60
84
|
readonly signal?: AbortSignal;
|
|
85
|
+
/**
|
|
86
|
+
* Opt-in event-stream handling: when set and the response's `Content-Type` is `text/event-stream`,
|
|
87
|
+
* the body is parsed row by row as it arrives instead of being buffered. A response of any other
|
|
88
|
+
* content type is buffered exactly as without this — `onOpen`/`onRow` simply never fire.
|
|
89
|
+
*/
|
|
90
|
+
readonly onStream?: {
|
|
91
|
+
/** Called once the response's status and headers are in, before any row. */
|
|
92
|
+
onOpen?(status: number, headers: Readonly<Record<string, string>>): void;
|
|
93
|
+
/** Called once per row, in order, as the parser produces it. */
|
|
94
|
+
onRow?(row: SseRow): void;
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/** The rows and outcome of an event-stream response, once the send resolves. */
|
|
98
|
+
export interface RestEventStream {
|
|
99
|
+
readonly rows: readonly SseRow[];
|
|
100
|
+
readonly counts: {
|
|
101
|
+
readonly events: number;
|
|
102
|
+
readonly comments: number;
|
|
103
|
+
readonly retries: number;
|
|
104
|
+
readonly bytes: number;
|
|
105
|
+
};
|
|
106
|
+
readonly lastEventId: string;
|
|
107
|
+
readonly retryMs?: number;
|
|
108
|
+
readonly endedBy: 'server' | 'client' | 'error';
|
|
109
|
+
readonly error?: string;
|
|
110
|
+
readonly droppedRows: number;
|
|
61
111
|
}
|
|
62
112
|
/** One REST exchange: everything the transport captured, plus what the body turned out to be. */
|
|
63
113
|
export interface RestExchange extends HttpExchange {
|
|
114
|
+
/** Present only when `onStream` was given and the response was an event stream. */
|
|
115
|
+
readonly stream?: RestEventStream;
|
|
64
116
|
/** The response body decoded to text; empty for a body with no text form. */
|
|
65
117
|
readonly text: string;
|
|
66
118
|
readonly language: BodyLanguage;
|
|
67
119
|
/** Set when the declared charset could not be honoured and UTF-8 was used instead. */
|
|
68
120
|
readonly decodeNote?: string;
|
|
69
121
|
readonly cookies: readonly Cookie[];
|
|
122
|
+
/** The jar's verdict on each of `cookies`, in order; present when the send had a jar. */
|
|
123
|
+
readonly cookieVerdicts?: readonly CookieVerdict[];
|
|
70
124
|
/** True when a redirect turned the request into a `GET`, which the HTTP log calls out. */
|
|
71
125
|
readonly methodChanged: boolean;
|
|
72
126
|
/** What authentication did, when credentials needed a round trip of their own. */
|
|
@@ -90,8 +144,26 @@ export interface RestExchange extends HttpExchange {
|
|
|
90
144
|
* status is not a failure: it is a response, and the caller inspects it.
|
|
91
145
|
*
|
|
92
146
|
* @throws WirebenchError `rest-url-incomplete` when the URL could not be completed
|
|
147
|
+
* @throws WirebenchError `webhook-signing-secret` when a `standard` signing secret cannot be decoded
|
|
93
148
|
*/
|
|
94
149
|
export declare function sendRest(input: RestSendInput): Promise<RestExchange>;
|
|
150
|
+
/** Mutable state a streamed send accumulates as rows arrive, shared between the hook and decoding. */
|
|
151
|
+
interface SseState {
|
|
152
|
+
hook(onStream: NonNullable<RestSendInput['onStream']>): {
|
|
153
|
+
accept(status: number, headers: Readonly<Record<string, string>>): HttpStreamSink | undefined;
|
|
154
|
+
};
|
|
155
|
+
readonly store: ReturnType<typeof createSseRowStore>;
|
|
156
|
+
readonly counts: {
|
|
157
|
+
events: number;
|
|
158
|
+
comments: number;
|
|
159
|
+
retries: number;
|
|
160
|
+
bytes: number;
|
|
161
|
+
};
|
|
162
|
+
lastEventId: string;
|
|
163
|
+
retryMs?: number;
|
|
164
|
+
/** Set once the response was accepted as an event stream; `decodeRestResponse` finalizes it. */
|
|
165
|
+
parser?: ReturnType<typeof createSseParser>;
|
|
166
|
+
}
|
|
95
167
|
/**
|
|
96
168
|
* Turns a finished HTTP exchange into a REST one: body decoded to text, language detected, cookies
|
|
97
169
|
* parsed, and a note when a redirect changed the method.
|
|
@@ -99,4 +171,5 @@ export declare function sendRest(input: RestSendInput): Promise<RestExchange>;
|
|
|
99
171
|
* Split out so a response replayed from history or from the exchange cache is presented exactly as
|
|
100
172
|
* a live one.
|
|
101
173
|
*/
|
|
102
|
-
export declare function decodeRestResponse(exchange: HttpExchange, sentMethod: HttpRequest['method']): RestExchange;
|
|
174
|
+
export declare function decodeRestResponse(exchange: HttpExchange, sentMethod: HttpRequest['method'], sse?: SseState): RestExchange;
|
|
175
|
+
export {};
|