@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,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `sequences/<slug>.sequence.yaml`: parsing, validation and serialisation of one sequence file.
|
|
3
|
+
*
|
|
4
|
+
* The file may come from a teammate or a branch just pulled, so it is untrusted input: its size is
|
|
5
|
+
* checked before it is parsed, it is parsed with the project's YAML parser (core schema, aliases capped
|
|
6
|
+
* by the library), and every count is bounded by {@link SEQUENCE_LIMITS}. It names requests only by id,
|
|
7
|
+
* so nothing in it can name a path on disk.
|
|
8
|
+
*
|
|
9
|
+
* Like every project schema, objects are `looseObject`: an unknown key is ignored and not written back.
|
|
10
|
+
* That is only safe because a file whose `version` is newer than {@link SEQUENCE_VERSION} is refused
|
|
11
|
+
* whole rather than read in part, and a refused file is never deleted by a save (`save.ts`).
|
|
12
|
+
*/
|
|
13
|
+
import { z } from 'zod';
|
|
14
|
+
import { stepAssertionsSchema, toCallbackAssertion } from '../assert/schema.js';
|
|
15
|
+
import { ProjectError } from '../errors.js';
|
|
16
|
+
import { compact, parseYaml, stringifyYaml } from '../project/yaml.js';
|
|
17
|
+
import { SEQUENCE_LIMITS, SEQUENCE_VERSION, TRANSFER_NAME_PATTERN } from './model.js';
|
|
18
|
+
/** Directory holding every sequence file, beside `interfaces/` and `apis/`. */
|
|
19
|
+
export const SEQUENCES_DIR = 'sequences';
|
|
20
|
+
/** Suffix identifying a sequence file. */
|
|
21
|
+
export const SEQUENCE_SUFFIX = '.sequence.yaml';
|
|
22
|
+
const nonEmpty = z.string().min(1);
|
|
23
|
+
const transferBase = {
|
|
24
|
+
name: z.string().regex(TRANSFER_NAME_PATTERN, 'a transfer name is a letter or _, then letters, digits, _ . or -'),
|
|
25
|
+
secret: z.boolean().optional(),
|
|
26
|
+
optional: z.boolean().optional(),
|
|
27
|
+
};
|
|
28
|
+
const transferSchema = z.discriminatedUnion('from', [
|
|
29
|
+
z.looseObject({
|
|
30
|
+
...transferBase,
|
|
31
|
+
from: z.literal('body'),
|
|
32
|
+
language: z.enum(['xpath', 'xquery', 'jsonpath']),
|
|
33
|
+
expression: nonEmpty,
|
|
34
|
+
namespaces: z.record(z.string(), z.string()).optional(),
|
|
35
|
+
}),
|
|
36
|
+
z.looseObject({ ...transferBase, from: z.literal('header'), header: nonEmpty }),
|
|
37
|
+
z.looseObject({ ...transferBase, from: z.literal('status') }),
|
|
38
|
+
z.looseObject({ ...transferBase, from: z.literal('cookie'), cookie: nonEmpty }),
|
|
39
|
+
]);
|
|
40
|
+
const stepSchema = z.looseObject({
|
|
41
|
+
id: nonEmpty,
|
|
42
|
+
name: z.string().optional(),
|
|
43
|
+
request: nonEmpty,
|
|
44
|
+
enabled: z.boolean().default(true),
|
|
45
|
+
requestAssertions: z.boolean().default(true),
|
|
46
|
+
transfers: z.array(transferSchema).max(SEQUENCE_LIMITS.transfersPerStep).default([]),
|
|
47
|
+
assertions: stepAssertionsSchema.max(SEQUENCE_LIMITS.assertionsPerStep).default([]),
|
|
48
|
+
});
|
|
49
|
+
/** One sequence file, after its `kind` and `version` have been checked. */
|
|
50
|
+
export const sequenceFileSchema = z.looseObject({
|
|
51
|
+
kind: z.literal('sequence'),
|
|
52
|
+
version: z.literal(SEQUENCE_VERSION),
|
|
53
|
+
id: nonEmpty,
|
|
54
|
+
name: z.string(),
|
|
55
|
+
order: z.number().int(),
|
|
56
|
+
description: z.string().optional(),
|
|
57
|
+
settings: z
|
|
58
|
+
.looseObject({
|
|
59
|
+
stopOnFailure: z.boolean().default(true),
|
|
60
|
+
stepTimeoutMs: z.number().int().positive().optional(),
|
|
61
|
+
})
|
|
62
|
+
.default({ stopOnFailure: true }),
|
|
63
|
+
steps: z.array(stepSchema).max(SEQUENCE_LIMITS.steps).default([]),
|
|
64
|
+
});
|
|
65
|
+
/** The relative path of a sequence's file. */
|
|
66
|
+
export function sequenceFilePath(slug) {
|
|
67
|
+
return `${SEQUENCES_DIR}/${slug}${SEQUENCE_SUFFIX}`;
|
|
68
|
+
}
|
|
69
|
+
/** The slug a sequence file's name gives it, or `undefined` for a name that is not a sequence file. */
|
|
70
|
+
export function sequenceSlugOf(fileName) {
|
|
71
|
+
return fileName.endsWith(SEQUENCE_SUFFIX) && fileName.length > SEQUENCE_SUFFIX.length
|
|
72
|
+
? fileName.slice(0, -SEQUENCE_SUFFIX.length)
|
|
73
|
+
: undefined;
|
|
74
|
+
}
|
|
75
|
+
function refuse(code, message, file, issues) {
|
|
76
|
+
throw new ProjectError(code, message, { details: { file, ...(issues !== undefined ? { issues } : {}) } });
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Parses one sequence file.
|
|
80
|
+
*
|
|
81
|
+
* @throws ProjectError `sequence-file-invalid` (too large, malformed YAML, not a sequence, or failing the
|
|
82
|
+
* schema or a limit), `sequence-version-too-new` (a `version` above {@link SEQUENCE_VERSION})
|
|
83
|
+
*/
|
|
84
|
+
export function parseSequenceFile(bytes, file, slug) {
|
|
85
|
+
const size = typeof bytes === 'string' ? Buffer.byteLength(bytes, 'utf8') : bytes.byteLength;
|
|
86
|
+
if (size > SEQUENCE_LIMITS.fileBytes) {
|
|
87
|
+
refuse('sequence-file-invalid', `${file} is larger than ${SEQUENCE_LIMITS.fileBytes} bytes`, file);
|
|
88
|
+
}
|
|
89
|
+
const text = typeof bytes === 'string' ? bytes : Buffer.from(bytes).toString('utf8');
|
|
90
|
+
let document;
|
|
91
|
+
try {
|
|
92
|
+
document = parseYaml(text, file);
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
refuse('sequence-file-invalid', `Malformed YAML in ${file}`, file, [
|
|
96
|
+
{ path: '', message: error instanceof Error ? error.message : String(error) },
|
|
97
|
+
]);
|
|
98
|
+
}
|
|
99
|
+
if (typeof document !== 'object' || document === null || Array.isArray(document)) {
|
|
100
|
+
refuse('sequence-file-invalid', `${file} is not a sequence`, file);
|
|
101
|
+
}
|
|
102
|
+
const header = document;
|
|
103
|
+
if (header['kind'] !== 'sequence') {
|
|
104
|
+
refuse('sequence-file-invalid', `${file} is not a sequence (kind: ${String(header['kind'])})`, file);
|
|
105
|
+
}
|
|
106
|
+
const version = header['version'];
|
|
107
|
+
if (typeof version === 'number' && Number.isInteger(version) && version > SEQUENCE_VERSION) {
|
|
108
|
+
refuse('sequence-version-too-new', `${file} was written by a newer version of Wirebench (sequence version ${version}); it was left as it is`, file);
|
|
109
|
+
}
|
|
110
|
+
const result = sequenceFileSchema.safeParse(document);
|
|
111
|
+
if (!result.success) {
|
|
112
|
+
refuse('sequence-file-invalid', `Invalid sequence file ${file}`, file, result.error.issues.map((issue) => ({ path: issue.path.join('.'), message: issue.message })));
|
|
113
|
+
}
|
|
114
|
+
const parsed = result.data;
|
|
115
|
+
return {
|
|
116
|
+
id: parsed.id,
|
|
117
|
+
name: parsed.name,
|
|
118
|
+
slug,
|
|
119
|
+
order: parsed.order,
|
|
120
|
+
...(parsed.description !== undefined ? { description: parsed.description } : {}),
|
|
121
|
+
settings: {
|
|
122
|
+
stopOnFailure: parsed.settings.stopOnFailure,
|
|
123
|
+
...(parsed.settings.stepTimeoutMs !== undefined ? { stepTimeoutMs: parsed.settings.stepTimeoutMs } : {}),
|
|
124
|
+
},
|
|
125
|
+
steps: parsed.steps.map((step) => ({
|
|
126
|
+
id: step.id,
|
|
127
|
+
...(step.name !== undefined ? { name: step.name } : {}),
|
|
128
|
+
requestId: step.request,
|
|
129
|
+
enabled: step.enabled,
|
|
130
|
+
requestAssertions: step.requestAssertions,
|
|
131
|
+
transfers: step.transfers.map(toTransfer),
|
|
132
|
+
assertions: step.assertions.map(knownAssertionFields),
|
|
133
|
+
})),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Only the fields an assertion of its type defines. `looseObject` keeps unknown keys on the parsed value;
|
|
138
|
+
* dropping them here is what keeps them from being written back.
|
|
139
|
+
*/
|
|
140
|
+
function knownAssertionFields(raw) {
|
|
141
|
+
const name = raw.name !== undefined ? { name: raw.name } : {};
|
|
142
|
+
switch (raw.type) {
|
|
143
|
+
case 'status':
|
|
144
|
+
return { type: 'status', equals: raw.equals, ...name };
|
|
145
|
+
case 'soap-fault':
|
|
146
|
+
return { type: 'soap-fault', expect: raw.expect, ...name };
|
|
147
|
+
case 'schema':
|
|
148
|
+
return { type: 'schema', ...name };
|
|
149
|
+
case 'sla':
|
|
150
|
+
return { type: 'sla', maxMs: raw.maxMs, ...name };
|
|
151
|
+
case 'match':
|
|
152
|
+
return {
|
|
153
|
+
type: 'match',
|
|
154
|
+
language: raw.language,
|
|
155
|
+
expression: raw.expression,
|
|
156
|
+
...(raw.namespaces !== undefined ? { namespaces: raw.namespaces } : {}),
|
|
157
|
+
...(raw.equals !== undefined ? { equals: raw.equals } : {}),
|
|
158
|
+
...(raw.matches !== undefined ? { matches: raw.matches } : {}),
|
|
159
|
+
...(raw.exists !== undefined ? { exists: raw.exists } : {}),
|
|
160
|
+
...name,
|
|
161
|
+
};
|
|
162
|
+
case 'callback':
|
|
163
|
+
return toCallbackAssertion(raw);
|
|
164
|
+
case 'header':
|
|
165
|
+
return {
|
|
166
|
+
type: 'header',
|
|
167
|
+
header: raw.header,
|
|
168
|
+
...(raw.equals !== undefined ? { equals: raw.equals } : {}),
|
|
169
|
+
...(raw.matches !== undefined ? { matches: raw.matches } : {}),
|
|
170
|
+
...(raw.exists !== undefined ? { exists: raw.exists } : {}),
|
|
171
|
+
...name,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
function toTransfer(raw) {
|
|
176
|
+
const base = {
|
|
177
|
+
name: raw.name,
|
|
178
|
+
...(raw.secret === true ? { secret: true } : {}),
|
|
179
|
+
...(raw.optional === true ? { optional: true } : {}),
|
|
180
|
+
};
|
|
181
|
+
switch (raw.from) {
|
|
182
|
+
case 'body':
|
|
183
|
+
return {
|
|
184
|
+
...base,
|
|
185
|
+
from: 'body',
|
|
186
|
+
language: raw.language,
|
|
187
|
+
expression: raw.expression,
|
|
188
|
+
...(raw.namespaces !== undefined ? { namespaces: raw.namespaces } : {}),
|
|
189
|
+
};
|
|
190
|
+
case 'header':
|
|
191
|
+
return { ...base, from: 'header', header: raw.header };
|
|
192
|
+
case 'status':
|
|
193
|
+
return { ...base, from: 'status' };
|
|
194
|
+
case 'cookie':
|
|
195
|
+
return { ...base, from: 'cookie', cookie: raw.cookie };
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/** Only the fields a transfer or assertion defines, in a stable shape; defaults are left out. */
|
|
199
|
+
function transferDocument(transfer) {
|
|
200
|
+
return compact({
|
|
201
|
+
name: transfer.name,
|
|
202
|
+
from: transfer.from,
|
|
203
|
+
language: transfer.from === 'body' ? transfer.language : undefined,
|
|
204
|
+
expression: transfer.from === 'body' ? transfer.expression : undefined,
|
|
205
|
+
namespaces: transfer.from === 'body' ? transfer.namespaces : undefined,
|
|
206
|
+
header: transfer.from === 'header' ? transfer.header : undefined,
|
|
207
|
+
cookie: transfer.from === 'cookie' ? transfer.cookie : undefined,
|
|
208
|
+
secret: transfer.secret === true ? true : undefined,
|
|
209
|
+
optional: transfer.optional === true ? true : undefined,
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
/** Serialises a sequence as its file's content: keys sorted, defaults omitted, steps in order. */
|
|
213
|
+
export function sequenceDocument(sequence) {
|
|
214
|
+
return stringifyYaml(compact({
|
|
215
|
+
kind: 'sequence',
|
|
216
|
+
version: SEQUENCE_VERSION,
|
|
217
|
+
id: sequence.id,
|
|
218
|
+
name: sequence.name,
|
|
219
|
+
order: sequence.order,
|
|
220
|
+
description: sequence.description,
|
|
221
|
+
settings: compact({
|
|
222
|
+
stopOnFailure: sequence.settings.stopOnFailure,
|
|
223
|
+
stepTimeoutMs: sequence.settings.stepTimeoutMs,
|
|
224
|
+
}),
|
|
225
|
+
steps: sequence.steps.map((step) => compact({
|
|
226
|
+
id: step.id,
|
|
227
|
+
name: step.name,
|
|
228
|
+
request: step.requestId,
|
|
229
|
+
enabled: step.enabled ? undefined : false,
|
|
230
|
+
requestAssertions: step.requestAssertions ? undefined : false,
|
|
231
|
+
transfers: step.transfers.length > 0 ? step.transfers.map(transferDocument) : undefined,
|
|
232
|
+
assertions: step.assertions.length > 0
|
|
233
|
+
? step.assertions.map((a) => compact({ ...knownAssertionFields(a) }))
|
|
234
|
+
: undefined,
|
|
235
|
+
})),
|
|
236
|
+
}));
|
|
237
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Sequences: saved requests chained with property transfers and declared assertions (#62). */
|
|
2
|
+
export * from './model.js';
|
|
3
|
+
export { SEQUENCES_DIR, SEQUENCE_SUFFIX, parseSequenceFile, sequenceDocument, sequenceFilePath, sequenceFileSchema, sequenceSlugOf, } from './file.js';
|
|
4
|
+
export { extractTransfer } from './transfer.js';
|
|
5
|
+
export type { ExtractedValue } from './transfer.js';
|
|
6
|
+
export { runSequence } from './run.js';
|
|
7
|
+
export type { CallbackStep, ResolvedStep, RunSequenceOptions, SequenceOutcome, SequenceRunResult, SequenceStepNotSent, SequenceStepResult, SequenceStepSender, SequenceStepSent, TransferResult, } from './run.js';
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Sequences: saved requests chained with property transfers and declared assertions (#62). */
|
|
2
|
+
export * from './model.js';
|
|
3
|
+
export { SEQUENCES_DIR, SEQUENCE_SUFFIX, parseSequenceFile, sequenceDocument, sequenceFilePath, sequenceFileSchema, sequenceSlugOf, } from './file.js';
|
|
4
|
+
export { extractTransfer } from './transfer.js';
|
|
5
|
+
export { runSequence } from './run.js';
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reads every file under `sequences/`, for loading a project and for deciding what a save may delete.
|
|
3
|
+
*
|
|
4
|
+
* The two questions share one answer on purpose. A save deletes the managed files the project no
|
|
5
|
+
* longer has; if "managed" meant every `*.sequence.yaml`, a file this build refused to load (written by
|
|
6
|
+
* a newer build, malformed mid-merge, or a copy with a duplicate id) would vanish on the next save
|
|
7
|
+
* without the user ever seeing it. So a file is managed only when this build loaded it.
|
|
8
|
+
*/
|
|
9
|
+
import type { FsLike } from '../project/fs.js';
|
|
10
|
+
import type { SequenceDef } from './model.js';
|
|
11
|
+
/** A sequence file that did not load, and why. */
|
|
12
|
+
export interface SequenceFileProblem {
|
|
13
|
+
readonly code: 'sequence-file-invalid' | 'sequence-version-too-new' | 'sequence-duplicate-id';
|
|
14
|
+
readonly message: string;
|
|
15
|
+
/** Path relative to the project root. */
|
|
16
|
+
readonly file: string;
|
|
17
|
+
}
|
|
18
|
+
/** What {@link readSequences} found. */
|
|
19
|
+
export interface SequenceFiles {
|
|
20
|
+
/** Sequences that loaded, each with the file it came from. */
|
|
21
|
+
readonly loaded: readonly {
|
|
22
|
+
readonly file: string;
|
|
23
|
+
readonly sequence: SequenceDef;
|
|
24
|
+
}[];
|
|
25
|
+
readonly problems: readonly SequenceFileProblem[];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Reads and parses every `sequences/*.sequence.yaml`. Never throws for a bad file: each becomes a
|
|
29
|
+
* problem and is left out. When two files share an id, the first by file name loads and the others are
|
|
30
|
+
* `sequence-duplicate-id` problems, so which one wins does not depend on the order the OS lists them.
|
|
31
|
+
*/
|
|
32
|
+
export declare function readSequences(fs: FsLike, root: string): Promise<SequenceFiles>;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reads every file under `sequences/`, for loading a project and for deciding what a save may delete.
|
|
3
|
+
*
|
|
4
|
+
* The two questions share one answer on purpose. A save deletes the managed files the project no
|
|
5
|
+
* longer has; if "managed" meant every `*.sequence.yaml`, a file this build refused to load (written by
|
|
6
|
+
* a newer build, malformed mid-merge, or a copy with a duplicate id) would vanish on the next save
|
|
7
|
+
* without the user ever seeing it. So a file is managed only when this build loaded it.
|
|
8
|
+
*/
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { isWirebenchError } from '../errors.js';
|
|
11
|
+
import { readFileIfExists, readdirIfExists } from '../project/fs.js';
|
|
12
|
+
import { SEQUENCES_DIR, parseSequenceFile, sequenceSlugOf } from './file.js';
|
|
13
|
+
/**
|
|
14
|
+
* Reads and parses every `sequences/*.sequence.yaml`. Never throws for a bad file: each becomes a
|
|
15
|
+
* problem and is left out. When two files share an id, the first by file name loads and the others are
|
|
16
|
+
* `sequence-duplicate-id` problems, so which one wins does not depend on the order the OS lists them.
|
|
17
|
+
*/
|
|
18
|
+
export async function readSequences(fs, root) {
|
|
19
|
+
const entries = [...(await readdirIfExists(fs, join(root, SEQUENCES_DIR)))]
|
|
20
|
+
.filter((entry) => entry.isFile && sequenceSlugOf(entry.name) !== undefined)
|
|
21
|
+
.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
|
|
22
|
+
const loaded = [];
|
|
23
|
+
const problems = [];
|
|
24
|
+
const seen = new Map();
|
|
25
|
+
for (const entry of entries) {
|
|
26
|
+
const file = `${SEQUENCES_DIR}/${entry.name}`;
|
|
27
|
+
const bytes = await readFileIfExists(fs, join(root, SEQUENCES_DIR, entry.name));
|
|
28
|
+
if (bytes === undefined) {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
let sequence;
|
|
32
|
+
try {
|
|
33
|
+
sequence = parseSequenceFile(bytes, file, sequenceSlugOf(entry.name) ?? entry.name);
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
if (isWirebenchError(error) &&
|
|
37
|
+
(error.code === 'sequence-file-invalid' || error.code === 'sequence-version-too-new')) {
|
|
38
|
+
problems.push({ code: error.code, message: error.message, file });
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
43
|
+
const first = seen.get(sequence.id);
|
|
44
|
+
if (first !== undefined) {
|
|
45
|
+
problems.push({
|
|
46
|
+
code: 'sequence-duplicate-id',
|
|
47
|
+
message: `${file} has the same id as ${first}; it was not loaded and is left as it is`,
|
|
48
|
+
file,
|
|
49
|
+
});
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
seen.set(sequence.id, file);
|
|
53
|
+
loaded.push({ file, sequence });
|
|
54
|
+
}
|
|
55
|
+
return { loaded, problems };
|
|
56
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A sequence: saved requests run in order, each able to lift values out of its response for the steps
|
|
3
|
+
* after it (`${#Sequence#name}`) and to assert on it. One file per sequence under `sequences/`, with its
|
|
4
|
+
* own `version`, outside the project `formatVersion` (ADR-0003, update of 2026-09-28).
|
|
5
|
+
*
|
|
6
|
+
* The limits here bound what a file from someone else can make a run hold in memory; the security
|
|
7
|
+
* reasoning is in `docs/specs/2026-09-28-sequences-design.md` and ADR-0015.
|
|
8
|
+
*/
|
|
9
|
+
import type { AssertionLanguage, StepAssertion } from '../assert/model.js';
|
|
10
|
+
import type { CreateOptions } from '../project/model.js';
|
|
11
|
+
/** The version of the sequence file this build writes and the highest it reads. */
|
|
12
|
+
export declare const SEQUENCE_VERSION = 1;
|
|
13
|
+
/** Bounds on one sequence file and one run, whatever the file or the server says. */
|
|
14
|
+
export declare const SEQUENCE_LIMITS: Readonly<{
|
|
15
|
+
/** A file larger than this is refused before it is parsed. */
|
|
16
|
+
fileBytes: number;
|
|
17
|
+
steps: 100;
|
|
18
|
+
transfersPerStep: 50;
|
|
19
|
+
assertionsPerStep: 50;
|
|
20
|
+
/** A transferred value larger than this errors the step (`sequence-value-too-large`). */
|
|
21
|
+
valueBytes: number;
|
|
22
|
+
}>;
|
|
23
|
+
/** A transfer's name, as `${#Sequence#name}` uses it. */
|
|
24
|
+
export declare const TRANSFER_NAME_PATTERN: RegExp;
|
|
25
|
+
interface TransferBase {
|
|
26
|
+
/** The name later steps use, as `${#Sequence#name}`. A later transfer of the same name replaces it. */
|
|
27
|
+
readonly name: string;
|
|
28
|
+
/** Masked everywhere from the moment it is extracted, and never shown or reported. */
|
|
29
|
+
readonly secret?: boolean;
|
|
30
|
+
/** Finding nothing leaves the name unset instead of failing the step. */
|
|
31
|
+
readonly optional?: boolean;
|
|
32
|
+
}
|
|
33
|
+
/** Lifts the first result of an expression over the response body. */
|
|
34
|
+
export interface BodyTransfer extends TransferBase {
|
|
35
|
+
readonly from: 'body';
|
|
36
|
+
readonly language: AssertionLanguage;
|
|
37
|
+
readonly expression: string;
|
|
38
|
+
/** Prefix bindings for XPath/XQuery. Absent means the response's own prefixes. */
|
|
39
|
+
readonly namespaces?: Readonly<Record<string, string>>;
|
|
40
|
+
}
|
|
41
|
+
/** Lifts the first value of a response header (gRPC: metadata, then trailers). */
|
|
42
|
+
export interface HeaderTransfer extends TransferBase {
|
|
43
|
+
readonly from: 'header';
|
|
44
|
+
readonly header: string;
|
|
45
|
+
}
|
|
46
|
+
/** Lifts the status: HTTP for SOAP and REST, the numeric gRPC status for gRPC. */
|
|
47
|
+
export interface StatusTransfer extends TransferBase {
|
|
48
|
+
readonly from: 'status';
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Lifts the value of one cookie the response set (`Set-Cookie`; the last one of that name wins).
|
|
52
|
+
*
|
|
53
|
+
* Wirebench keeps no shared cookie jar, on purpose (`rest/cookies.ts`), and a sequence does not add
|
|
54
|
+
* one: a step that needs a login's cookie says so, `Cookie: sid=${#Sequence#sid}`, where it can be
|
|
55
|
+
* read and where ADR-0015's guards apply.
|
|
56
|
+
*/
|
|
57
|
+
export interface CookieTransfer extends TransferBase {
|
|
58
|
+
readonly from: 'cookie';
|
|
59
|
+
readonly cookie: string;
|
|
60
|
+
}
|
|
61
|
+
/** One value lifted from a step's response. */
|
|
62
|
+
export type Transfer = BodyTransfer | HeaderTransfer | StatusTransfer | CookieTransfer;
|
|
63
|
+
/** One request in a sequence, and what to take from and check about its response. */
|
|
64
|
+
export interface SequenceStep {
|
|
65
|
+
readonly id: string;
|
|
66
|
+
/** Defaults to the request's own name wherever it is shown. */
|
|
67
|
+
readonly name?: string;
|
|
68
|
+
/** A saved request's id: SOAP, REST or unary gRPC. Never a path, so a rename or a move keeps the step. */
|
|
69
|
+
readonly requestId: string;
|
|
70
|
+
/** A disabled step is reported as `skipped`. */
|
|
71
|
+
readonly enabled: boolean;
|
|
72
|
+
/** Whether the request's own `assertions:` run in this step, before the step's own. */
|
|
73
|
+
readonly requestAssertions: boolean;
|
|
74
|
+
readonly transfers: readonly Transfer[];
|
|
75
|
+
readonly assertions: readonly StepAssertion[];
|
|
76
|
+
}
|
|
77
|
+
/** How a sequence runs. */
|
|
78
|
+
export interface SequenceSettings {
|
|
79
|
+
/** After a failed or errored step, the rest are `skipped`. */
|
|
80
|
+
readonly stopOnFailure: boolean;
|
|
81
|
+
/** Overrides each request's own timeout for every step. */
|
|
82
|
+
readonly stepTimeoutMs?: number;
|
|
83
|
+
}
|
|
84
|
+
/** A whole sequence, as loaded from (or saved to) `sequences/<slug>.sequence.yaml`. */
|
|
85
|
+
export interface SequenceDef {
|
|
86
|
+
readonly id: string;
|
|
87
|
+
readonly name: string;
|
|
88
|
+
readonly slug: string;
|
|
89
|
+
readonly order: number;
|
|
90
|
+
readonly description?: string;
|
|
91
|
+
readonly settings: SequenceSettings;
|
|
92
|
+
readonly steps: readonly SequenceStep[];
|
|
93
|
+
}
|
|
94
|
+
/** The settings a new sequence starts with. */
|
|
95
|
+
export declare const DEFAULT_SEQUENCE_SETTINGS: SequenceSettings;
|
|
96
|
+
/** Input to {@link createSequence} beyond the name. */
|
|
97
|
+
export interface CreateSequenceInput extends CreateOptions {
|
|
98
|
+
readonly slug?: string;
|
|
99
|
+
readonly description?: string;
|
|
100
|
+
readonly settings?: SequenceSettings;
|
|
101
|
+
readonly steps?: readonly SequenceStep[];
|
|
102
|
+
}
|
|
103
|
+
/** Creates a sequence, empty unless `input.steps` says otherwise. */
|
|
104
|
+
export declare function createSequence(name: string, input?: CreateSequenceInput): SequenceDef;
|
|
105
|
+
/** Input to {@link createSequenceStep} beyond the request id. */
|
|
106
|
+
export interface CreateSequenceStepInput extends Omit<CreateOptions, 'order'> {
|
|
107
|
+
readonly name?: string;
|
|
108
|
+
readonly enabled?: boolean;
|
|
109
|
+
readonly requestAssertions?: boolean;
|
|
110
|
+
readonly transfers?: readonly Transfer[];
|
|
111
|
+
readonly assertions?: readonly StepAssertion[];
|
|
112
|
+
}
|
|
113
|
+
/** Creates a step that sends `requestId`, enabled, with the request's own assertions on. */
|
|
114
|
+
export declare function createSequenceStep(requestId: string, input?: CreateSequenceStepInput): SequenceStep;
|
|
115
|
+
export {};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A sequence: saved requests run in order, each able to lift values out of its response for the steps
|
|
3
|
+
* after it (`${#Sequence#name}`) and to assert on it. One file per sequence under `sequences/`, with its
|
|
4
|
+
* own `version`, outside the project `formatVersion` (ADR-0003, update of 2026-09-28).
|
|
5
|
+
*
|
|
6
|
+
* The limits here bound what a file from someone else can make a run hold in memory; the security
|
|
7
|
+
* reasoning is in `docs/specs/2026-09-28-sequences-design.md` and ADR-0015.
|
|
8
|
+
*/
|
|
9
|
+
import { generateId } from '../project/model.js';
|
|
10
|
+
import { slugify } from '../project/paths.js';
|
|
11
|
+
/** The version of the sequence file this build writes and the highest it reads. */
|
|
12
|
+
export const SEQUENCE_VERSION = 1;
|
|
13
|
+
/** Bounds on one sequence file and one run, whatever the file or the server says. */
|
|
14
|
+
export const SEQUENCE_LIMITS = Object.freeze({
|
|
15
|
+
/** A file larger than this is refused before it is parsed. */
|
|
16
|
+
fileBytes: 256 * 1024,
|
|
17
|
+
steps: 100,
|
|
18
|
+
transfersPerStep: 50,
|
|
19
|
+
assertionsPerStep: 50,
|
|
20
|
+
/** A transferred value larger than this errors the step (`sequence-value-too-large`). */
|
|
21
|
+
valueBytes: 64 * 1024,
|
|
22
|
+
});
|
|
23
|
+
/** A transfer's name, as `${#Sequence#name}` uses it. */
|
|
24
|
+
export const TRANSFER_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_.-]{0,63}$/;
|
|
25
|
+
/** The settings a new sequence starts with. */
|
|
26
|
+
export const DEFAULT_SEQUENCE_SETTINGS = Object.freeze({ stopOnFailure: true });
|
|
27
|
+
function idOf(options) {
|
|
28
|
+
return options?.id ?? (options?.newId ?? generateId)();
|
|
29
|
+
}
|
|
30
|
+
/** Creates a sequence, empty unless `input.steps` says otherwise. */
|
|
31
|
+
export function createSequence(name, input = {}) {
|
|
32
|
+
return {
|
|
33
|
+
id: idOf(input),
|
|
34
|
+
name,
|
|
35
|
+
slug: input.slug ?? slugify(name),
|
|
36
|
+
order: input.order ?? 0,
|
|
37
|
+
...(input.description !== undefined ? { description: input.description } : {}),
|
|
38
|
+
settings: input.settings ?? DEFAULT_SEQUENCE_SETTINGS,
|
|
39
|
+
steps: input.steps ?? [],
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/** Creates a step that sends `requestId`, enabled, with the request's own assertions on. */
|
|
43
|
+
export function createSequenceStep(requestId, input = {}) {
|
|
44
|
+
return {
|
|
45
|
+
id: idOf(input),
|
|
46
|
+
...(input.name !== undefined ? { name: input.name } : {}),
|
|
47
|
+
requestId,
|
|
48
|
+
enabled: input.enabled ?? true,
|
|
49
|
+
requestAssertions: input.requestAssertions ?? true,
|
|
50
|
+
transfers: input.transfers ?? [],
|
|
51
|
+
assertions: input.assertions ?? [],
|
|
52
|
+
};
|
|
53
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Running a sequence: the loop, the transfers and the assertions, with the same semantics wherever it
|
|
3
|
+
* runs. Sending stays with the host (the CLI through `createRunSender`, the desktop through its own send
|
|
4
|
+
* paths and History), because the two send with different secrets, auth flows and cookie jars.
|
|
5
|
+
*
|
|
6
|
+
* Values lifted from responses reach the next step only through the `sequence` scope the host passes to
|
|
7
|
+
* its expanders, where ADR-0015's rules apply: literal, explicit, escaped, never the origin.
|
|
8
|
+
*/
|
|
9
|
+
import type { CallbackClock, CallbackWaiting } from '../assert/callback.js';
|
|
10
|
+
import type { CaptureSource } from '../assert/capture-source.js';
|
|
11
|
+
import type { AssertionResult, AssertionSubject } from '../assert/model.js';
|
|
12
|
+
import type { PropertyMap, Project } from '../project/model.js';
|
|
13
|
+
import type { PropertyScopes } from '../project/properties.js';
|
|
14
|
+
import type { ProtocolRegistry } from '../protocol/registry.js';
|
|
15
|
+
import type { SelectedRequest } from '../run/select.js';
|
|
16
|
+
import type { SequenceDef, SequenceStep } from './model.js';
|
|
17
|
+
import { type SentScripts } from '../run/script-support.js';
|
|
18
|
+
/** How one step, or a run, ended. The runner's own outcomes, with `skipped` for a step never sent. */
|
|
19
|
+
export type SequenceOutcome = 'passed' | 'failed' | 'errored' | 'skipped';
|
|
20
|
+
/** What the host needs to send one step. */
|
|
21
|
+
export interface ResolvedStep {
|
|
22
|
+
readonly index: number;
|
|
23
|
+
readonly step: SequenceStep;
|
|
24
|
+
readonly selected: SelectedRequest;
|
|
25
|
+
/** The sequence's `stepTimeoutMs`, when set: it overrides the request's own timeout. */
|
|
26
|
+
readonly timeoutMs?: number;
|
|
27
|
+
}
|
|
28
|
+
/** A step the host sent: the response as assertions see it, and where it went. */
|
|
29
|
+
export interface SequenceStepSent {
|
|
30
|
+
readonly subject: AssertionSubject;
|
|
31
|
+
/** The origin the request went to, for the run panel and the reports. */
|
|
32
|
+
readonly origin?: string;
|
|
33
|
+
/** What the step request's scripts produced (#63): tests, values for later steps, a log. */
|
|
34
|
+
readonly script?: SentScripts;
|
|
35
|
+
/** True when the step's request has scripts and they are switched off. */
|
|
36
|
+
readonly scriptsOff?: boolean;
|
|
37
|
+
}
|
|
38
|
+
/** A step the host could not send. */
|
|
39
|
+
export interface SequenceStepNotSent {
|
|
40
|
+
readonly error: {
|
|
41
|
+
readonly code: string;
|
|
42
|
+
readonly message: string;
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Sends one step's request with `sequenceScope` as the `${#Sequence#…}` values, and describes the
|
|
47
|
+
* response. May throw; a throw becomes an errored step.
|
|
48
|
+
*/
|
|
49
|
+
export type SequenceStepSender = (step: ResolvedStep, sequenceScope: PropertyMap, signal: AbortSignal) => Promise<SequenceStepSent | SequenceStepNotSent>;
|
|
50
|
+
/** What one transfer did. A secret value is never carried here, so it cannot reach a report or the UI. */
|
|
51
|
+
export interface TransferResult {
|
|
52
|
+
readonly name: string;
|
|
53
|
+
readonly outcome: 'set' | 'missing' | 'errored';
|
|
54
|
+
readonly secret: boolean;
|
|
55
|
+
readonly value?: string;
|
|
56
|
+
readonly message?: string;
|
|
57
|
+
}
|
|
58
|
+
/** One step's result. */
|
|
59
|
+
export interface SequenceStepResult {
|
|
60
|
+
readonly index: number;
|
|
61
|
+
readonly stepId: string;
|
|
62
|
+
readonly requestId: string;
|
|
63
|
+
readonly name: string;
|
|
64
|
+
readonly protocol?: SelectedRequest['kind'];
|
|
65
|
+
readonly outcome: SequenceOutcome;
|
|
66
|
+
readonly status?: number;
|
|
67
|
+
readonly durationMs?: number;
|
|
68
|
+
readonly origin?: string;
|
|
69
|
+
readonly assertions: readonly AssertionResult[];
|
|
70
|
+
readonly transfers: readonly TransferResult[];
|
|
71
|
+
readonly error?: {
|
|
72
|
+
readonly code: string;
|
|
73
|
+
readonly message: string;
|
|
74
|
+
};
|
|
75
|
+
/** Why a `skipped` step was not sent. */
|
|
76
|
+
readonly skipped?: 'disabled' | 'after-failure' | 'cancelled';
|
|
77
|
+
/** What the step request's scripts logged. NOT yet redacted. */
|
|
78
|
+
readonly scriptLog?: readonly string[];
|
|
79
|
+
/** True when the step's request has scripts and they are switched off. */
|
|
80
|
+
readonly scriptsOff?: boolean;
|
|
81
|
+
}
|
|
82
|
+
/** A whole run's result. */
|
|
83
|
+
export interface SequenceRunResult {
|
|
84
|
+
readonly sequenceId: string;
|
|
85
|
+
readonly name: string;
|
|
86
|
+
readonly startedAt: string;
|
|
87
|
+
readonly outcome: SequenceOutcome;
|
|
88
|
+
readonly steps: readonly SequenceStepResult[];
|
|
89
|
+
}
|
|
90
|
+
/** Which step waits: for the run panel's waiting row and the CLI's waiting line. */
|
|
91
|
+
export interface CallbackStep {
|
|
92
|
+
readonly index: number;
|
|
93
|
+
readonly stepId: string;
|
|
94
|
+
readonly name: string;
|
|
95
|
+
}
|
|
96
|
+
/** Options for {@link runSequence}. */
|
|
97
|
+
export interface RunSequenceOptions {
|
|
98
|
+
readonly signal?: AbortSignal;
|
|
99
|
+
/** Called as each step ends, in order, skipped steps included. */
|
|
100
|
+
readonly onStepDone?: (result: SequenceStepResult) => void;
|
|
101
|
+
/** Called with every value that is to be masked from here on, as soon as it is extracted. */
|
|
102
|
+
readonly onSecretValue?: (value: string) => void;
|
|
103
|
+
/** Whether `value` contains a credential the host already knows; such a value is treated as secret. */
|
|
104
|
+
readonly containsKnownSecret?: (value: string) => boolean;
|
|
105
|
+
/** Injectable clock for `startedAt`. */
|
|
106
|
+
readonly now?: () => Date;
|
|
107
|
+
/** Where callback assertions read captures (callback-assertion §2.2). */
|
|
108
|
+
readonly captures?: CaptureSource;
|
|
109
|
+
/** The clock callback waits poll by; a test seam. */
|
|
110
|
+
readonly callbackClock?: CallbackClock;
|
|
111
|
+
/** A test seam; `CALLBACK_LIMITS.pollIntervalMs` by default. */
|
|
112
|
+
readonly callbackPollMs?: number;
|
|
113
|
+
/**
|
|
114
|
+
* The scopes a step's callback values expand against: the host's own for that request, with
|
|
115
|
+
* `sequence` set. Absent: the Sequence values alone.
|
|
116
|
+
*/
|
|
117
|
+
readonly callbackScopes?: (step: ResolvedStep, sequenceScope: PropertyMap) => PropertyScopes;
|
|
118
|
+
/** Called after a step's send when it has callbacks to wait for. */
|
|
119
|
+
readonly onCallbackWaiting?: (step: CallbackStep, waiting: readonly CallbackWaiting[]) => void;
|
|
120
|
+
/**
|
|
121
|
+
* The protocol modules a step's request is looked up in. Absent: the built-in ones. A host that
|
|
122
|
+
* sends with `createRunSender` passes the registry of its `RunContext` here too.
|
|
123
|
+
*/
|
|
124
|
+
readonly registry?: ProtocolRegistry;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Runs `sequence` against `project`, sending each step through `send`. Never throws: every failure,
|
|
128
|
+
* a throwing sender included, is an errored step. A step after an abort, after a failure under
|
|
129
|
+
* `stopOnFailure`, or disabled, is `skipped` and never sent.
|
|
130
|
+
*/
|
|
131
|
+
export declare function runSequence(sequence: SequenceDef, project: Project, send: SequenceStepSender, options?: RunSequenceOptions): Promise<SequenceRunResult>;
|