@wirebench/engine 2.2.1 → 3.1.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +134 -1
- package/dist/account/schema.d.ts +34 -0
- package/dist/account/schema.js +29 -0
- package/dist/assert/callback.d.ts +76 -0
- package/dist/assert/callback.js +320 -0
- package/dist/assert/capture-source.d.ts +50 -0
- package/dist/assert/capture-source.js +89 -0
- package/dist/assert/check.d.ts +8 -0
- package/dist/assert/check.js +18 -0
- package/dist/assert/header.d.ts +5 -0
- package/dist/assert/header.js +48 -0
- package/dist/assert/index.d.ts +2 -2
- package/dist/assert/index.js +12 -0
- package/dist/assert/match.d.ts +6 -0
- package/dist/assert/match.js +13 -4
- package/dist/assert/model.d.ts +110 -3
- package/dist/assert/model.js +16 -1
- package/dist/assert/schema.d.ts +194 -1
- package/dist/assert/schema.js +154 -12
- package/dist/assert/status-names.d.ts +9 -0
- package/dist/assert/status-names.js +27 -0
- package/dist/assert/status.d.ts +4 -1
- package/dist/assert/status.js +27 -3
- package/dist/asyncapi/browser.d.ts +7 -0
- package/dist/asyncapi/browser.js +6 -0
- package/dist/asyncapi/frame-check-worker-host.d.ts +44 -0
- package/dist/asyncapi/frame-check-worker-host.js +175 -0
- package/dist/asyncapi/frame-check-worker.d.ts +12 -0
- package/dist/asyncapi/frame-check-worker.js +25 -0
- package/dist/asyncapi/frame-check.d.ts +25 -0
- package/dist/asyncapi/frame-check.js +78 -0
- package/dist/asyncapi/import.d.ts +25 -0
- package/dist/asyncapi/import.js +34 -0
- package/dist/asyncapi/map.d.ts +40 -0
- package/dist/asyncapi/map.js +230 -0
- package/dist/asyncapi/model.d.ts +84 -0
- package/dist/asyncapi/model.js +7 -0
- package/dist/asyncapi/normalise-2.d.ts +13 -0
- package/dist/asyncapi/normalise-2.js +113 -0
- package/dist/asyncapi/normalise-3.d.ts +14 -0
- package/dist/asyncapi/normalise-3.js +133 -0
- package/dist/asyncapi/parse.d.ts +31 -0
- package/dist/asyncapi/parse.js +85 -0
- package/dist/asyncapi/read.d.ts +35 -0
- package/dist/asyncapi/read.js +186 -0
- package/dist/asyncapi/security.d.ts +14 -0
- package/dist/asyncapi/security.js +55 -0
- package/dist/asyncapi/update.d.ts +53 -0
- package/dist/asyncapi/update.js +220 -0
- package/dist/errors.d.ts +16 -0
- package/dist/errors.js +22 -0
- package/dist/grpc/events.d.ts +22 -0
- package/dist/grpc/events.js +1 -0
- package/dist/grpc/expand.d.ts +1 -1
- package/dist/grpc/expand.js +15 -5
- package/dist/grpc/files.d.ts +271 -0
- package/dist/grpc/files.js +62 -0
- package/dist/grpc/model.d.ts +11 -1
- package/dist/grpc/module.d.ts +2 -0
- package/dist/grpc/module.js +13 -0
- package/dist/grpc/run.d.ts +73 -0
- package/dist/grpc/run.js +407 -0
- package/dist/grpc/script-types.d.ts +8 -0
- package/dist/grpc/script-types.js +149 -0
- package/dist/grpc/scripting.d.ts +34 -0
- package/dist/grpc/scripting.js +147 -0
- package/dist/grpc/send-input.d.ts +46 -0
- package/dist/grpc/send-input.js +42 -0
- package/dist/grpc/send.d.ts +2 -2
- package/dist/grpc/status.d.ts +9 -2
- package/dist/grpc/status.js +11 -24
- package/dist/grpc/storage.d.ts +9 -0
- package/dist/grpc/storage.js +167 -0
- package/dist/{rest/auth.d.ts → http/auth/apply-auth.d.ts} +4 -4
- package/dist/{rest/auth.js → http/auth/apply-auth.js} +1 -1
- package/dist/http/auth/apply.d.ts +1 -1
- package/dist/{rest → http/auth}/oauth2.d.ts +2 -2
- package/dist/{rest → http/auth}/oauth2.js +1 -1
- package/dist/http/auth/send-auth.d.ts +57 -0
- package/dist/http/auth/send-auth.js +7 -0
- package/dist/http/client.js +150 -8
- package/dist/http/cookies.d.ts +79 -0
- package/dist/http/cookies.js +81 -0
- package/dist/http/curl.d.ts +4 -14
- package/dist/http/curl.js +4 -154
- package/dist/http/decompress.d.ts +7 -0
- package/dist/http/decompress.js +23 -1
- package/dist/http/document-fetch.d.ts +42 -0
- package/dist/http/document-fetch.js +207 -0
- package/dist/http/entries.d.ts +27 -0
- package/dist/http/entries.js +16 -0
- package/dist/http/escape.d.ts +18 -0
- package/dist/http/escape.js +30 -0
- package/dist/http/fetch-document.d.ts +28 -0
- package/dist/{wsdl/fetch.js → http/fetch-document.js} +8 -16
- package/dist/http/media-type.d.ts +9 -0
- package/dist/http/media-type.js +12 -0
- package/dist/http/transcript-cap.d.ts +26 -0
- package/dist/http/transcript-cap.js +36 -0
- package/dist/http/types.d.ts +59 -0
- package/dist/http/webhook-signature.d.ts +81 -0
- package/dist/http/webhook-signature.js +227 -0
- package/dist/import-detect.d.ts +2 -2
- package/dist/import-detect.js +10 -1
- package/dist/index.d.ts +207 -55
- package/dist/index.js +129 -32
- package/dist/json/cursor.d.ts +2 -0
- package/dist/json/cursor.js +1 -0
- package/dist/json/pointer-range.d.ts +18 -0
- package/dist/json/pointer-range.js +157 -0
- package/dist/json/schema/model.d.ts +59 -0
- package/dist/json/schema/model.js +8 -0
- package/dist/json/schema/parse-text.d.ts +16 -0
- package/dist/json/schema/parse-text.js +37 -0
- package/dist/{rest/openapi → json/schema}/refs.d.ts +2 -2
- package/dist/{rest/openapi → json/schema}/refs.js +3 -3
- package/dist/{rest/openapi → json/schema}/sample.d.ts +4 -0
- package/dist/{rest/openapi → json/schema}/sample.js +2 -2
- package/dist/json/schema/source.d.ts +21 -0
- package/dist/json/schema/source.js +8 -0
- package/dist/json/schema-validate.d.ts +49 -0
- package/dist/json/schema-validate.js +557 -0
- package/dist/{wss/keystore → keystore}/index.js +1 -1
- package/dist/{wss/keystore → keystore}/pem.js +1 -1
- package/dist/{wss/keystore → keystore}/pkcs12.js +1 -1
- package/dist/project/attachments-cache.d.ts +3 -1
- package/dist/{wsdl → project}/cache-naming.js +1 -1
- package/dist/project/endpoints.d.ts +18 -8
- package/dist/project/endpoints.js +21 -6
- package/dist/project/environments.d.ts +7 -5
- package/dist/project/history.d.ts +105 -9
- package/dist/project/history.js +195 -23
- package/dist/project/inherit.d.ts +7 -0
- package/dist/project/inherit.js +9 -0
- package/dist/project/keystores.d.ts +1 -1
- package/dist/project/load-helpers.d.ts +89 -0
- package/dist/project/load-helpers.js +177 -0
- package/dist/project/load.d.ts +30 -4
- package/dist/project/load.js +168 -545
- package/dist/project/managed-files.d.ts +36 -0
- package/dist/project/managed-files.js +97 -0
- package/dist/project/migrate.d.ts +2 -2
- package/dist/project/migrate.js +2 -2
- package/dist/project/model.d.ts +92 -14
- package/dist/project/model.js +50 -4
- package/dist/project/paths.d.ts +10 -1
- package/dist/project/paths.js +10 -1
- package/dist/project/preferences.d.ts +11 -2
- package/dist/project/preferences.js +5 -1
- package/dist/project/properties.d.ts +31 -17
- package/dist/project/properties.js +89 -70
- package/dist/project/request-location.d.ts +20 -0
- package/dist/project/request-location.js +62 -0
- package/dist/project/save.d.ts +12 -2
- package/dist/project/save.js +186 -141
- package/dist/project/schema-parts.d.ts +337 -0
- package/dist/project/schema-parts.js +248 -0
- package/dist/project/schema.d.ts +72 -928
- package/dist/project/schema.js +17 -466
- package/dist/project/sequence-guards.d.ts +43 -0
- package/dist/project/sequence-guards.js +109 -0
- package/dist/project/serialize-helpers.d.ts +60 -0
- package/dist/project/serialize-helpers.js +108 -0
- package/dist/project/serialize.d.ts +7 -8
- package/dist/project/serialize.js +34 -293
- package/dist/protocol/features.d.ts +51 -0
- package/dist/protocol/features.js +64 -0
- package/dist/protocol/index.d.ts +7 -0
- package/dist/protocol/index.js +4 -0
- package/dist/protocol/module.d.ts +247 -0
- package/dist/protocol/module.js +48 -0
- package/dist/protocol/registry.d.ts +42 -0
- package/dist/protocol/registry.js +47 -0
- package/dist/protocols.d.ts +77 -0
- package/dist/protocols.js +40 -0
- package/dist/redact/index.d.ts +12 -1
- package/dist/redact/index.js +55 -7
- package/dist/redact/literal.d.ts +10 -0
- package/dist/redact/literal.js +110 -12
- package/dist/rest/body.d.ts +2 -10
- package/dist/rest/body.js +3 -25
- package/dist/rest/browser.d.ts +4 -0
- package/dist/rest/browser.js +5 -0
- package/dist/rest/contract-check-worker-host.d.ts +36 -0
- package/dist/rest/contract-check-worker-host.js +158 -0
- package/dist/rest/contract-check-worker.d.ts +7 -0
- package/dist/rest/contract-check-worker.js +28 -0
- package/dist/rest/contract-check.d.ts +43 -0
- package/dist/rest/contract-check.js +217 -0
- package/dist/rest/cookie-jar.d.ts +62 -0
- package/dist/rest/cookie-jar.js +262 -0
- package/dist/rest/cookies.d.ts +6 -22
- package/dist/rest/cookies.js +6 -42
- package/dist/rest/curl.js +5 -1
- package/dist/rest/events.d.ts +12 -0
- package/dist/rest/events.js +1 -0
- package/dist/rest/expand.d.ts +6 -1
- package/dist/rest/expand.js +29 -11
- package/dist/rest/files.d.ts +439 -0
- package/dist/rest/files.js +107 -0
- package/dist/rest/json-form.d.ts +97 -0
- package/dist/rest/json-form.js +396 -0
- package/dist/rest/model.d.ts +35 -24
- package/dist/rest/model.js +6 -9
- package/dist/rest/module.d.ts +2 -0
- package/dist/rest/module.js +13 -0
- package/dist/rest/openapi/cache.d.ts +7 -2
- package/dist/rest/openapi/cache.js +2 -2
- package/dist/rest/openapi/import.d.ts +11 -16
- package/dist/rest/openapi/import.js +6 -2
- package/dist/rest/openapi/map.d.ts +38 -1
- package/dist/rest/openapi/map.js +151 -41
- package/dist/rest/openapi/match.d.ts +20 -0
- package/dist/rest/openapi/match.js +117 -0
- package/dist/rest/openapi/model.d.ts +33 -45
- package/dist/rest/openapi/parse.d.ts +3 -12
- package/dist/rest/openapi/parse.js +138 -67
- package/dist/rest/openapi/responses.d.ts +23 -0
- package/dist/rest/openapi/responses.js +59 -0
- package/dist/rest/openapi/runtime-expression.d.ts +69 -0
- package/dist/rest/openapi/runtime-expression.js +213 -0
- package/dist/rest/openapi/update.d.ts +116 -0
- package/dist/rest/openapi/update.js +456 -0
- package/dist/rest/postman/map.d.ts +1 -0
- package/dist/rest/postman/map.js +66 -4
- package/dist/rest/postman/model.d.ts +9 -0
- package/dist/rest/postman/parse.js +33 -10
- package/dist/rest/response.d.ts +2 -23
- package/dist/rest/response.js +3 -75
- package/dist/rest/run.d.ts +56 -0
- package/dist/rest/run.js +395 -0
- package/dist/rest/script-types.d.ts +7 -0
- package/dist/rest/script-types.js +83 -0
- package/dist/rest/scripting.d.ts +38 -0
- package/dist/rest/scripting.js +282 -0
- package/dist/rest/send-input.d.ts +54 -0
- package/dist/rest/send-input.js +73 -0
- package/dist/rest/send.d.ts +77 -4
- package/dist/rest/send.js +128 -7
- package/dist/rest/sse-transcript.d.ts +25 -0
- package/dist/rest/sse-transcript.js +95 -0
- package/dist/rest/sse.d.ts +43 -0
- package/dist/rest/sse.js +195 -0
- package/dist/rest/storage.d.ts +26 -0
- package/dist/rest/storage.js +262 -0
- package/dist/rest/url.d.ts +10 -4
- package/dist/rest/url.js +38 -5
- package/dist/run/baseline-update.d.ts +35 -0
- package/dist/run/baseline-update.js +97 -0
- package/dist/run/baseline.d.ts +42 -0
- package/dist/run/baseline.js +93 -0
- package/dist/run/context.d.ts +86 -0
- package/dist/run/context.js +31 -0
- package/dist/run/current-values.d.ts +32 -0
- package/dist/run/current-values.js +43 -0
- package/dist/run/event-queue.d.ts +14 -0
- package/dist/run/event-queue.js +46 -0
- package/dist/run/exchange.d.ts +62 -0
- package/dist/run/exchange.js +65 -0
- package/dist/run/host.d.ts +89 -0
- package/dist/run/host.js +1 -0
- package/dist/run/index.d.ts +20 -7
- package/dist/run/index.js +12 -4
- package/dist/run/oauth2-token.d.ts +42 -0
- package/dist/run/oauth2-token.js +92 -0
- package/dist/run/open.d.ts +12 -0
- package/dist/run/open.js +16 -0
- package/dist/run/run.d.ts +124 -4
- package/dist/run/run.js +293 -134
- package/dist/run/scope.d.ts +11 -0
- package/dist/run/scope.js +26 -0
- package/dist/run/script-support.d.ts +53 -0
- package/dist/run/script-support.js +68 -0
- package/dist/run/secret-needs.d.ts +11 -4
- package/dist/run/secret-needs.js +48 -96
- package/dist/run/select.d.ts +34 -25
- package/dist/run/select.js +45 -54
- package/dist/run/send-helpers.d.ts +93 -0
- package/dist/run/send-helpers.js +255 -0
- package/dist/run/tree.d.ts +50 -0
- package/dist/run/tree.js +54 -0
- package/dist/script/api/postman.d.ts +10 -0
- package/dist/script/api/postman.js +264 -0
- package/dist/script/api/prelude.d.ts +20 -0
- package/dist/script/api/prelude.js +215 -0
- package/dist/script/apply.d.ts +44 -0
- package/dist/script/apply.js +120 -0
- package/dist/script/check/host.d.ts +41 -0
- package/dist/script/check/host.js +143 -0
- package/dist/script/check/service.d.ts +52 -0
- package/dist/script/check/service.js +195 -0
- package/dist/script/check/worker.d.ts +1 -0
- package/dist/script/check/worker.js +40 -0
- package/dist/script/index.d.ts +16 -0
- package/dist/script/index.js +10 -0
- package/dist/script/lookup.d.ts +10 -0
- package/dist/script/lookup.js +23 -0
- package/dist/script/model.d.ts +82 -0
- package/dist/script/model.js +18 -0
- package/dist/script/props.d.ts +8 -0
- package/dist/script/props.js +28 -0
- package/dist/script/request-scripts.d.ts +83 -0
- package/dist/script/request-scripts.js +160 -0
- package/dist/script/run.d.ts +47 -0
- package/dist/script/run.js +146 -0
- package/dist/script/sandbox/execute.d.ts +26 -0
- package/dist/script/sandbox/execute.js +212 -0
- package/dist/script/sandbox/host-api.d.ts +27 -0
- package/dist/script/sandbox/host-api.js +101 -0
- package/dist/script/sandbox/host.d.ts +18 -0
- package/dist/script/sandbox/host.js +172 -0
- package/dist/script/sandbox/model.d.ts +69 -0
- package/dist/script/sandbox/model.js +24 -0
- package/dist/script/sandbox/worker.d.ts +1 -0
- package/dist/script/sandbox/worker.js +20 -0
- package/dist/script/send.d.ts +27 -0
- package/dist/script/send.js +76 -0
- package/dist/script/strip.d.ts +5 -0
- package/dist/script/strip.js +43 -0
- package/dist/script/types/api.d.ts +38 -0
- package/dist/script/types/api.js +113 -0
- package/dist/script/types/json-schema.d.ts +26 -0
- package/dist/script/types/json-schema.js +206 -0
- package/dist/secrets/env-names.d.ts +9 -1
- package/dist/secrets/env-names.js +17 -1
- package/dist/secrets/resolve.d.ts +44 -4
- package/dist/secrets/resolve.js +58 -1
- package/dist/secrets/scan/apply.d.ts +36 -0
- package/dist/secrets/scan/apply.js +194 -0
- package/dist/secrets/scan/rules.d.ts +32 -0
- package/dist/secrets/scan/rules.js +346 -0
- package/dist/secrets/scan/scan.d.ts +6 -0
- package/dist/secrets/scan/scan.js +57 -0
- package/dist/secrets/scan/walk.d.ts +70 -0
- package/dist/secrets/scan/walk.js +156 -0
- package/dist/secrets/secret-refs.d.ts +8 -0
- package/dist/secrets/secret-refs.js +25 -0
- package/dist/secrets/secret-token.d.ts +17 -0
- package/dist/secrets/secret-token.js +25 -0
- package/dist/sequence/file.d.ts +169 -0
- package/dist/sequence/file.js +237 -0
- package/dist/sequence/index.d.ts +7 -0
- package/dist/sequence/index.js +5 -0
- package/dist/sequence/load.d.ts +32 -0
- package/dist/sequence/load.js +56 -0
- package/dist/sequence/model.d.ts +115 -0
- package/dist/sequence/model.js +53 -0
- package/dist/sequence/run.d.ts +131 -0
- package/dist/sequence/run.js +191 -0
- package/dist/sequence/transfer.d.ts +24 -0
- package/dist/sequence/transfer.js +75 -0
- package/dist/server-api/audit.d.ts +455 -0
- package/dist/server-api/audit.js +186 -0
- package/dist/server-api/ci-tokens.d.ts +50 -0
- package/dist/server-api/ci-tokens.js +35 -0
- package/dist/server-api/hooks.d.ts +337 -0
- package/dist/server-api/hooks.js +152 -0
- package/dist/server-api/identity.d.ts +210 -0
- package/dist/server-api/identity.js +115 -0
- package/dist/server-api/licensing.d.ts +80 -0
- package/dist/server-api/licensing.js +53 -0
- package/dist/server-api/live.d.ts +132 -0
- package/dist/server-api/live.js +102 -0
- package/dist/server-api/meta.d.ts +31 -0
- package/dist/server-api/meta.js +21 -0
- package/dist/server-api/sync.d.ts +179 -0
- package/dist/server-api/sync.js +124 -0
- package/dist/server-api/teams.d.ts +306 -0
- package/dist/server-api/teams.js +113 -0
- package/dist/snapshot/diff.d.ts +30 -0
- package/dist/snapshot/diff.js +75 -0
- package/dist/snapshot/format.d.ts +17 -0
- package/dist/snapshot/format.js +40 -0
- package/dist/snapshot/golden-file.d.ts +45 -0
- package/dist/snapshot/golden-file.js +173 -0
- package/dist/snapshot/ignore.d.ts +14 -0
- package/dist/snapshot/ignore.js +79 -0
- package/dist/snapshot/index.d.ts +9 -0
- package/dist/snapshot/index.js +9 -0
- package/dist/snapshot/json-diff.d.ts +3 -0
- package/dist/snapshot/json-diff.js +93 -0
- package/dist/snapshot/xml-diff.d.ts +10 -0
- package/dist/snapshot/xml-diff.js +194 -0
- package/dist/soap/auth.d.ts +26 -0
- package/dist/soap/auth.js +54 -0
- package/dist/soap/curl.d.ts +20 -0
- package/dist/soap/curl.js +161 -0
- package/dist/soap/expand.d.ts +24 -0
- package/dist/soap/expand.js +95 -0
- package/dist/soap/files.d.ts +384 -0
- package/dist/soap/files.js +114 -0
- package/dist/soap/form-request.d.ts +13 -0
- package/dist/soap/form-request.js +2 -2
- package/dist/soap/generate.d.ts +12 -0
- package/dist/{generate.js → soap/generate.js} +4 -4
- package/dist/{import.d.ts → soap/import.d.ts} +4 -4
- package/dist/{import.js → soap/import.js} +13 -13
- package/dist/soap/json-operation.d.ts +35 -0
- package/dist/soap/json-operation.js +225 -0
- package/dist/soap/legacy-project/env-refs.d.ts +19 -0
- package/dist/soap/legacy-project/env-refs.js +105 -0
- package/dist/soap/legacy-project/map.d.ts +2 -2
- package/dist/soap/legacy-project/map.js +6 -0
- package/dist/soap/mime/multipart.d.ts +2 -2
- package/dist/soap/mime/multipart.js +2 -5
- package/dist/soap/mime/send-pipeline.d.ts +1 -1
- package/dist/soap/mime/send-pipeline.js +1 -1
- package/dist/soap/mime/types.d.ts +1 -3
- package/dist/soap/module.d.ts +2 -0
- package/dist/soap/module.js +13 -0
- package/dist/soap/namespace-scope.js +1 -1
- package/dist/soap/operations.d.ts +12 -0
- package/dist/{operations.js → soap/operations.js} +4 -4
- package/dist/soap/run.d.ts +70 -0
- package/dist/soap/run.js +549 -0
- package/dist/soap/script-types.d.ts +65 -0
- package/dist/soap/script-types.js +379 -0
- package/dist/soap/scripting.d.ts +45 -0
- package/dist/soap/scripting.js +221 -0
- package/dist/soap/send-input.d.ts +61 -0
- package/dist/{send-options.js → soap/send-input.js} +5 -109
- package/dist/{send.d.ts → soap/send.d.ts} +1 -1
- package/dist/{send.js → soap/send.js} +28 -12
- package/dist/soap/storage.d.ts +9 -0
- package/dist/soap/storage.js +237 -0
- package/dist/soap/transforms.d.ts +3 -12
- package/dist/soap/transforms.js +3 -14
- package/dist/{types.d.ts → soap/types.d.ts} +34 -84
- package/dist/sync/git-cli.d.ts +202 -0
- package/dist/sync/git-cli.js +684 -0
- package/dist/sync/three-way-merge.d.ts +41 -0
- package/dist/sync/three-way-merge.js +85 -0
- package/dist/sync/tree-paths.d.ts +34 -0
- package/dist/sync/tree-paths.js +131 -0
- package/dist/team-secrets/envelope.d.ts +10 -0
- package/dist/team-secrets/envelope.js +121 -0
- package/dist/team-secrets/errors.d.ts +26 -0
- package/dist/team-secrets/errors.js +27 -0
- package/dist/team-secrets/index.d.ts +14 -0
- package/dist/team-secrets/index.js +8 -0
- package/dist/team-secrets/keys.d.ts +52 -0
- package/dist/team-secrets/keys.js +158 -0
- package/dist/team-secrets/log.d.ts +48 -0
- package/dist/team-secrets/log.js +175 -0
- package/dist/team-secrets/resolve-conflict.d.ts +7 -0
- package/dist/team-secrets/resolve-conflict.js +14 -0
- package/dist/team-secrets/schema.d.ts +97 -0
- package/dist/team-secrets/schema.js +157 -0
- package/dist/team-secrets/sign.d.ts +24 -0
- package/dist/team-secrets/sign.js +71 -0
- package/dist/team-secrets/vault.d.ts +49 -0
- package/dist/team-secrets/vault.js +148 -0
- package/dist/validate/wsi/run-message.d.ts +2 -2
- package/dist/validate/wsi/run-message.js +1 -1
- package/dist/validate/wsi/run-wsdl.d.ts +2 -2
- package/dist/validate/wsi/run-wsdl.js +1 -1
- package/dist/validate/wsi/types.d.ts +1 -1
- package/dist/webhooks/model.d.ts +138 -0
- package/dist/webhooks/model.js +150 -0
- package/dist/workspace/commit-message.d.ts +1 -1
- package/dist/workspace/commit-message.js +6 -1
- package/dist/workspace/environments.d.ts +11 -4
- package/dist/workspace/environments.js +12 -0
- package/dist/workspace/index.d.ts +3 -3
- package/dist/workspace/index.js +2 -2
- package/dist/workspace/paths.d.ts +5 -2
- package/dist/workspace/paths.js +5 -2
- package/dist/workspace/schema.d.ts +7 -3
- package/dist/workspace/schema.js +24 -3
- package/dist/workspace/share.d.ts +30 -11
- package/dist/workspace/share.js +32 -6
- package/dist/ws/call.d.ts +1 -1
- package/dist/ws/call.js +2 -2
- package/dist/ws/connect.d.ts +60 -0
- package/dist/ws/connect.js +131 -0
- package/dist/ws/events.d.ts +17 -0
- package/dist/ws/events.js +1 -0
- package/dist/ws/expand.d.ts +1 -1
- package/dist/ws/expand.js +1 -1
- package/dist/ws/files.d.ts +284 -0
- package/dist/ws/files.js +71 -0
- package/dist/ws/history-entry.d.ts +44 -0
- package/dist/ws/history-entry.js +93 -0
- package/dist/ws/model.d.ts +44 -3
- package/dist/ws/model.js +3 -0
- package/dist/ws/module.d.ts +2 -0
- package/dist/ws/module.js +11 -0
- package/dist/ws/run.d.ts +63 -0
- package/dist/ws/run.js +470 -0
- package/dist/ws/session.d.ts +18 -0
- package/dist/ws/session.js +52 -25
- package/dist/ws/storage.d.ts +9 -0
- package/dist/ws/storage.js +176 -0
- package/dist/ws/transcript.d.ts +3 -4
- package/dist/ws/transcript.js +26 -17
- package/dist/ws/url.d.ts +1 -1
- package/dist/wsdl/cache.js +1 -1
- package/dist/wsdl/docs-generator.d.ts +3 -3
- package/dist/wsdl/docs-generator.js +1 -1
- package/dist/wsdl/export-definition.js +1 -1
- package/dist/wsdl/qname.d.ts +2 -5
- package/dist/wsdl/resolver.d.ts +4 -11
- package/dist/wsdl/resolver.js +3 -3
- package/dist/wsdl/update-definition.d.ts +5 -5
- package/dist/wsdl/update-definition.js +6 -6
- package/dist/wss/apply.js +1 -1
- package/dist/{project/wss-configs.d.ts → wss/configs.d.ts} +2 -2
- package/dist/{project/wss-configs.js → wss/configs.js} +2 -2
- package/dist/wss/incoming/decrypt.d.ts +1 -1
- package/dist/wss/incoming/index.js +1 -1
- package/dist/wss/incoming/verify.d.ts +1 -1
- package/dist/wss/incoming/verify.js +1 -1
- package/dist/wss/key-identifiers.js +1 -1
- package/dist/wss/model.d.ts +1 -1
- package/dist/wss/outgoing/encryption.d.ts +1 -1
- package/dist/wss/outgoing/signature.d.ts +1 -1
- package/dist/xml/decode.d.ts +15 -0
- package/dist/xml/decode.js +22 -0
- package/dist/xml/entitize.d.ts +17 -0
- package/dist/xml/entitize.js +19 -0
- package/dist/xml/index.d.ts +1 -1
- package/dist/xml/index.js +1 -1
- package/dist/xml/locate.d.ts +39 -0
- package/dist/xml/locate.js +117 -0
- package/dist/xml/qname.d.ts +12 -0
- package/dist/xml/qname.js +8 -0
- package/dist/xpath/evaluate-async.d.ts +19 -0
- package/dist/xpath/evaluate-async.js +31 -11
- package/dist/xpath/evaluate.d.ts +1 -1
- package/dist/xpath/namespaces.js +1 -1
- package/dist/xpath/worker.d.ts +11 -5
- package/dist/xpath/worker.js +24 -7
- package/dist/xsd/form-model.d.ts +19 -2
- package/dist/xsd/form-model.js +14 -2
- package/dist/xsd/json-bridge.d.ts +152 -0
- package/dist/xsd/json-bridge.js +1213 -0
- package/dist/xsd/locate.d.ts +2 -30
- package/dist/xsd/locate.js +1 -109
- package/dist/xsd/xml-scan.d.ts +2 -0
- package/dist/xsd/xml-scan.js +1 -1
- package/dist/xsd/xml-writer.d.ts +2 -0
- package/dist/xsd/xml-writer.js +4 -0
- package/package.json +12 -1
- package/dist/generate.d.ts +0 -12
- package/dist/operations.d.ts +0 -12
- package/dist/run/effective-auth.d.ts +0 -10
- package/dist/run/effective-auth.js +0 -19
- package/dist/run/prepare.d.ts +0 -43
- package/dist/run/prepare.js +0 -280
- package/dist/send-options.d.ts +0 -141
- package/dist/wsdl/fetch.d.ts +0 -13
- /package/dist/{soap → http}/charset.d.ts +0 -0
- /package/dist/{soap → http}/charset.js +0 -0
- /package/dist/{wsdl → http}/ref-policy.d.ts +0 -0
- /package/dist/{wsdl → http}/ref-policy.js +0 -0
- /package/dist/{wss/keystore → keystore}/certificate.d.ts +0 -0
- /package/dist/{wss/keystore → keystore}/certificate.js +0 -0
- /package/dist/{wss/keystore → keystore}/index.d.ts +0 -0
- /package/dist/{wss/keystore → keystore}/model.d.ts +0 -0
- /package/dist/{wss/keystore → keystore}/model.js +0 -0
- /package/dist/{wss/keystore → keystore}/pem.d.ts +0 -0
- /package/dist/{wss/keystore → keystore}/pkcs12.d.ts +0 -0
- /package/dist/{wsdl → project}/cache-naming.d.ts +0 -0
- /package/dist/{types.js → soap/types.js} +0 -0
- /package/dist/{soap → xml}/prefixes.d.ts +0 -0
- /package/dist/{soap → xml}/prefixes.js +0 -0
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
import { qnameToString } from '../wsdl/qname.js';
|
|
2
|
+
import { findBinding, findMessage, findPortType } from '../wsdl/model.js';
|
|
3
|
+
import { resolveType } from '../xsd/sample-types.js';
|
|
4
|
+
import { builtinBaseOf, facetsOf } from '../xsd/sample-values.js';
|
|
5
|
+
import { scanXml } from '../xsd/xml-scan.js';
|
|
6
|
+
import { NS } from '../xml/namespaces.js';
|
|
7
|
+
import { propertyKey } from '../script/types/json-schema.js';
|
|
8
|
+
/** Past these the projection widens to `unknown`, and the walk stops. */
|
|
9
|
+
const LIMITS = { depth: 32, aliases: 500 };
|
|
10
|
+
const NUMBER_TYPES = new Set([
|
|
11
|
+
'int',
|
|
12
|
+
'short',
|
|
13
|
+
'byte',
|
|
14
|
+
'unsignedInt',
|
|
15
|
+
'unsignedShort',
|
|
16
|
+
'unsignedByte',
|
|
17
|
+
'float',
|
|
18
|
+
'double',
|
|
19
|
+
]);
|
|
20
|
+
function isMany(occurs) {
|
|
21
|
+
return occurs.max === 'unbounded' || occurs.max > 1;
|
|
22
|
+
}
|
|
23
|
+
function declOf(set, particle) {
|
|
24
|
+
if (particle.kind === 'localElement')
|
|
25
|
+
return particle.decl;
|
|
26
|
+
if (particle.kind === 'elementRef')
|
|
27
|
+
return set.lookupElement(particle.ref);
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
/** The child elements a content particle allows, in schema order. */
|
|
31
|
+
export function elementSlots(set, particle) {
|
|
32
|
+
const found = [];
|
|
33
|
+
const walk = (p, many, optional, inChoice, depth) => {
|
|
34
|
+
if (depth > LIMITS.depth)
|
|
35
|
+
return;
|
|
36
|
+
const here = many || isMany(p.occurs);
|
|
37
|
+
const opt = optional || p.occurs.min === 0 || inChoice;
|
|
38
|
+
if (p.kind === 'sequence' || p.kind === 'all' || p.kind === 'choice') {
|
|
39
|
+
for (const child of p.particles)
|
|
40
|
+
walk(child, here, opt, p.kind === 'choice', depth + 1);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (p.kind === 'groupRef') {
|
|
44
|
+
const group = set.lookupGroup(p.ref);
|
|
45
|
+
if (group !== undefined)
|
|
46
|
+
walk(group.particle, here, opt, false, depth + 1);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const decl = declOf(set, p);
|
|
50
|
+
if (decl !== undefined)
|
|
51
|
+
found.push({ decl, many: here, optional: opt });
|
|
52
|
+
};
|
|
53
|
+
if (particle !== undefined)
|
|
54
|
+
walk(particle, false, false, false, 0);
|
|
55
|
+
// The same element twice in one content model (a, b, a) is one field holding every occurrence.
|
|
56
|
+
const merged = new Map();
|
|
57
|
+
for (const slot of found) {
|
|
58
|
+
const id = qnameToString(slot.decl.name);
|
|
59
|
+
const previous = merged.get(id);
|
|
60
|
+
merged.set(id, previous === undefined ? slot : { decl: previous.decl, many: true, optional: previous.optional && slot.optional });
|
|
61
|
+
}
|
|
62
|
+
const localCounts = new Map();
|
|
63
|
+
for (const { decl } of merged.values()) {
|
|
64
|
+
localCounts.set(decl.name.localName, (localCounts.get(decl.name.localName) ?? 0) + 1);
|
|
65
|
+
}
|
|
66
|
+
return [...merged.values()].map((slot) => ({
|
|
67
|
+
...slot,
|
|
68
|
+
key: (localCounts.get(slot.decl.name.localName) ?? 0) > 1 ? qnameToString(slot.decl.name) : slot.decl.name.localName,
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
function scalarOf(set, ref) {
|
|
72
|
+
const builtin = builtinBaseOf(set, ref);
|
|
73
|
+
if (builtin === undefined || builtin.name.namespaceUri !== NS.XSD)
|
|
74
|
+
return 'string';
|
|
75
|
+
if (builtin.name.localName === 'boolean')
|
|
76
|
+
return 'boolean';
|
|
77
|
+
return NUMBER_TYPES.has(builtin.name.localName) ? 'number' : 'string';
|
|
78
|
+
}
|
|
79
|
+
function scalarType(set, ref) {
|
|
80
|
+
const values = facetsOf(set, ref).enum;
|
|
81
|
+
const scalar = scalarOf(set, ref);
|
|
82
|
+
if (values !== undefined && values.length > 0) {
|
|
83
|
+
if (scalar === 'number' && values.every((v) => Number.isFinite(Number(v))))
|
|
84
|
+
return values.join(' | ');
|
|
85
|
+
return values.map((v) => JSON.stringify(v)).join(' | ');
|
|
86
|
+
}
|
|
87
|
+
return scalar;
|
|
88
|
+
}
|
|
89
|
+
function attributeKey(attribute) {
|
|
90
|
+
return `@${attribute.name.localName}`;
|
|
91
|
+
}
|
|
92
|
+
/** The type of an element's value, declaring an alias for each named complex type it meets. */
|
|
93
|
+
class XsdTypes {
|
|
94
|
+
set;
|
|
95
|
+
aliases = new Map();
|
|
96
|
+
declared = [];
|
|
97
|
+
constructor(set) {
|
|
98
|
+
this.set = set;
|
|
99
|
+
}
|
|
100
|
+
element(decl, depth) {
|
|
101
|
+
const type = this.valueOf(decl.type ?? decl.anonymousType, depth);
|
|
102
|
+
return decl.nillable && type !== 'unknown' ? `${type} | null` : type;
|
|
103
|
+
}
|
|
104
|
+
valueOf(ref, depth) {
|
|
105
|
+
if (depth > LIMITS.depth)
|
|
106
|
+
return 'unknown';
|
|
107
|
+
const resolved = resolveType(this.set, ref);
|
|
108
|
+
switch (resolved.kind) {
|
|
109
|
+
case 'simple':
|
|
110
|
+
return scalarType(this.set, resolved.ref);
|
|
111
|
+
case 'complex':
|
|
112
|
+
return this.complex(resolved.type, depth);
|
|
113
|
+
default:
|
|
114
|
+
return 'unknown';
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
complex(type, depth) {
|
|
118
|
+
if (type.name === undefined)
|
|
119
|
+
return this.complexBody(type, depth);
|
|
120
|
+
const id = qnameToString(type.name);
|
|
121
|
+
const existing = this.aliases.get(id);
|
|
122
|
+
if (existing !== undefined)
|
|
123
|
+
return existing;
|
|
124
|
+
if (this.aliases.size >= LIMITS.aliases)
|
|
125
|
+
return 'unknown';
|
|
126
|
+
const alias = `WbX_${type.name.localName.replace(/[^A-Za-z0-9_]/g, '_')}_${String(this.aliases.size + 1)}`;
|
|
127
|
+
this.aliases.set(id, alias);
|
|
128
|
+
this.declared.push(`/** ${id} */\ntype ${alias} = ${this.complexBody(type, depth)};\n`);
|
|
129
|
+
return alias;
|
|
130
|
+
}
|
|
131
|
+
complexBody(type, depth) {
|
|
132
|
+
const content = this.set.resolveContent(type);
|
|
133
|
+
const lines = [];
|
|
134
|
+
for (const attribute of content.attributes) {
|
|
135
|
+
const optional = attribute.use === 'required' ? '' : '?';
|
|
136
|
+
lines.push(` ${JSON.stringify(attributeKey(attribute))}${optional}: ${scalarType(this.set, attribute.type ?? attribute.anonymousType)};\n`);
|
|
137
|
+
}
|
|
138
|
+
if (content.simpleContentBase !== undefined) {
|
|
139
|
+
const text = scalarType(this.set, content.simpleContentBase);
|
|
140
|
+
if (content.attributes.length === 0)
|
|
141
|
+
return text;
|
|
142
|
+
lines.push(` "#text": ${text};\n`);
|
|
143
|
+
}
|
|
144
|
+
for (const slot of elementSlots(this.set, content.particle)) {
|
|
145
|
+
const value = this.element(slot.decl, depth + 1);
|
|
146
|
+
const item = /^[A-Za-z0-9_$"]+$/.test(value) ? value : `(${value})`;
|
|
147
|
+
lines.push(` ${propertyKey(slot.key)}${slot.optional ? '?' : ''}: ${slot.many ? `${item}[]` : value};\n`);
|
|
148
|
+
}
|
|
149
|
+
return lines.length === 0 ? 'Record<string, never>' : `{\n${lines.join('')}}`;
|
|
150
|
+
}
|
|
151
|
+
declarations() {
|
|
152
|
+
return this.declared.join('');
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/** `WbSoapRequestBody` and `WbSoapResponseBody` for an operation's input and output elements. */
|
|
156
|
+
export function soapScriptTypes(set, input, output) {
|
|
157
|
+
const lines = [];
|
|
158
|
+
const types = set !== undefined ? new XsdTypes(set) : undefined;
|
|
159
|
+
const bodyOf = (name) => {
|
|
160
|
+
const decl = name !== undefined ? set?.lookupElement(name) : undefined;
|
|
161
|
+
return decl !== undefined && types !== undefined ? types.element(decl, 0) : 'unknown';
|
|
162
|
+
};
|
|
163
|
+
const request = bodyOf(input);
|
|
164
|
+
const response = bodyOf(output);
|
|
165
|
+
if (request === 'unknown' || response === 'unknown') {
|
|
166
|
+
lines.push('// A body this operation does not describe with a schema element is untyped; use envelope and select.');
|
|
167
|
+
}
|
|
168
|
+
lines.push(types?.declarations() ?? '', `type WbSoapRequestBody = ${request};`, `type WbSoapResponseBody = ${response};`, '');
|
|
169
|
+
return lines.join('\n');
|
|
170
|
+
}
|
|
171
|
+
// --- The projection -----------------------------------------------------------------------------
|
|
172
|
+
function toScalar(text, scalar) {
|
|
173
|
+
const trimmed = text.trim();
|
|
174
|
+
if (scalar === 'boolean')
|
|
175
|
+
return trimmed === 'true' || trimmed === '1';
|
|
176
|
+
if (scalar === 'number') {
|
|
177
|
+
const n = Number(trimmed);
|
|
178
|
+
return trimmed !== '' && Number.isFinite(n) ? n : text;
|
|
179
|
+
}
|
|
180
|
+
return text;
|
|
181
|
+
}
|
|
182
|
+
function isNil(element) {
|
|
183
|
+
return element.attributes.some((a) => (a.name === 'xsi:nil' || a.name.endsWith(':nil')) && (a.value === 'true' || a.value === '1'));
|
|
184
|
+
}
|
|
185
|
+
/** The text of an element: its own text, or empty. */
|
|
186
|
+
function textOf(element) {
|
|
187
|
+
return element.text?.value ?? '';
|
|
188
|
+
}
|
|
189
|
+
function decodeEntities(text) {
|
|
190
|
+
return text.replace(/&(lt|gt|amp|quot|apos|#\d+|#x[0-9a-fA-F]+);/g, (whole, name) => {
|
|
191
|
+
switch (name) {
|
|
192
|
+
case 'lt':
|
|
193
|
+
return '<';
|
|
194
|
+
case 'gt':
|
|
195
|
+
return '>';
|
|
196
|
+
case 'amp':
|
|
197
|
+
return '&';
|
|
198
|
+
case 'quot':
|
|
199
|
+
return '"';
|
|
200
|
+
case 'apos':
|
|
201
|
+
return "'";
|
|
202
|
+
default: {
|
|
203
|
+
const code = name.startsWith('#x') ? parseInt(name.slice(2), 16) : parseInt(name.slice(1), 10);
|
|
204
|
+
return Number.isFinite(code) ? String.fromCodePoint(code) : whole;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
/** The value `element` holds as `decl` describes it. */
|
|
210
|
+
export function projectElement(set, decl, element, depth = 0) {
|
|
211
|
+
if (depth > LIMITS.depth)
|
|
212
|
+
return undefined;
|
|
213
|
+
if (decl.nillable && isNil(element))
|
|
214
|
+
return null;
|
|
215
|
+
const resolved = resolveType(set, decl.type ?? decl.anonymousType);
|
|
216
|
+
if (resolved.kind === 'simple') {
|
|
217
|
+
return toScalar(decodeEntities(textOf(element)), scalarOf(set, resolved.ref));
|
|
218
|
+
}
|
|
219
|
+
if (resolved.kind !== 'complex')
|
|
220
|
+
return undefined;
|
|
221
|
+
const content = set.resolveContent(resolved.type);
|
|
222
|
+
const out = {};
|
|
223
|
+
for (const attribute of content.attributes) {
|
|
224
|
+
const found = element.attributes.find((a) => (a.name.includes(':') ? a.name.split(':')[1] : a.name) === attribute.name.localName &&
|
|
225
|
+
!a.name.startsWith('xmlns'));
|
|
226
|
+
if (found !== undefined) {
|
|
227
|
+
out[attributeKey(attribute)] = toScalar(decodeEntities(found.value), scalarOf(set, attribute.type ?? attribute.anonymousType));
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
if (content.simpleContentBase !== undefined) {
|
|
231
|
+
const text = toScalar(decodeEntities(textOf(element)), scalarOf(set, content.simpleContentBase));
|
|
232
|
+
if (content.attributes.length === 0)
|
|
233
|
+
return text;
|
|
234
|
+
out['#text'] = text;
|
|
235
|
+
return out;
|
|
236
|
+
}
|
|
237
|
+
const slots = elementSlots(set, content.particle);
|
|
238
|
+
for (const child of element.children) {
|
|
239
|
+
const slot = slots.find((s) => s.decl.name.localName === child.localName && s.decl.name.namespaceUri === child.namespaceUri);
|
|
240
|
+
if (slot === undefined)
|
|
241
|
+
continue;
|
|
242
|
+
const value = projectElement(set, slot.decl, child, depth + 1);
|
|
243
|
+
if (slot.many) {
|
|
244
|
+
const list = out[slot.key] ?? [];
|
|
245
|
+
list.push(value);
|
|
246
|
+
out[slot.key] = list;
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
out[slot.key] = value;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return out;
|
|
253
|
+
}
|
|
254
|
+
function escapeXml(text) {
|
|
255
|
+
return text
|
|
256
|
+
.replace(/&/g, '&')
|
|
257
|
+
.replace(/</g, '<')
|
|
258
|
+
.replace(/>/g, '>')
|
|
259
|
+
.replace(/"/g, '"')
|
|
260
|
+
.replace(/'/g, ''');
|
|
261
|
+
}
|
|
262
|
+
function scalarText(value) {
|
|
263
|
+
if (typeof value === 'boolean' || typeof value === 'number' || typeof value === 'string')
|
|
264
|
+
return String(value);
|
|
265
|
+
throw new TypeError(`expected a string, number or boolean, got ${value === null ? 'null' : typeof value}`);
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* `value` as the XML for `decl`, children in schema order. A namespace is declared as the default
|
|
269
|
+
* wherever it changes from the parent's, so the fragment stands on its own inside any envelope.
|
|
270
|
+
*
|
|
271
|
+
* @throws TypeError when `value` does not have the shape the schema needs
|
|
272
|
+
*/
|
|
273
|
+
export function serializeElement(set, decl, value, parentNamespace, depth = 0) {
|
|
274
|
+
if (depth > LIMITS.depth)
|
|
275
|
+
throw new TypeError('the body is nested too deeply');
|
|
276
|
+
const name = decl.name.localName;
|
|
277
|
+
const namespace = decl.name.namespaceUri;
|
|
278
|
+
const xmlns = namespace === parentNamespace ? '' : ` xmlns="${escapeXml(namespace)}"`;
|
|
279
|
+
if (value === null) {
|
|
280
|
+
if (!decl.nillable)
|
|
281
|
+
throw new TypeError(`${name} cannot be null`);
|
|
282
|
+
return `<${name}${xmlns} xmlns:xsi="${NS.XSI}" xsi:nil="true"/>`;
|
|
283
|
+
}
|
|
284
|
+
const resolved = resolveType(set, decl.type ?? decl.anonymousType);
|
|
285
|
+
if (resolved.kind === 'simple') {
|
|
286
|
+
return `<${name}${xmlns}>${escapeXml(scalarText(value))}</${name}>`;
|
|
287
|
+
}
|
|
288
|
+
if (resolved.kind !== 'complex')
|
|
289
|
+
throw new TypeError(`${name} has no schema type a script can write`);
|
|
290
|
+
const content = set.resolveContent(resolved.type);
|
|
291
|
+
if (content.simpleContentBase !== undefined && content.attributes.length === 0) {
|
|
292
|
+
return `<${name}${xmlns}>${escapeXml(scalarText(value))}</${name}>`;
|
|
293
|
+
}
|
|
294
|
+
if (typeof value !== 'object' || Array.isArray(value))
|
|
295
|
+
throw new TypeError(`${name} must be an object`);
|
|
296
|
+
const record = value;
|
|
297
|
+
let attributes = '';
|
|
298
|
+
for (const attribute of content.attributes) {
|
|
299
|
+
const v = record[attributeKey(attribute)];
|
|
300
|
+
if (v !== undefined)
|
|
301
|
+
attributes += ` ${attribute.name.localName}="${escapeXml(scalarText(v))}"`;
|
|
302
|
+
}
|
|
303
|
+
if (content.simpleContentBase !== undefined) {
|
|
304
|
+
const text = record['#text'];
|
|
305
|
+
return `<${name}${xmlns}${attributes}>${text === undefined ? '' : escapeXml(scalarText(text))}</${name}>`;
|
|
306
|
+
}
|
|
307
|
+
const children = [];
|
|
308
|
+
for (const slot of elementSlots(set, content.particle)) {
|
|
309
|
+
const v = record[slot.key];
|
|
310
|
+
if (v === undefined)
|
|
311
|
+
continue;
|
|
312
|
+
const items = slot.many ? (Array.isArray(v) ? v : [v]) : [v];
|
|
313
|
+
for (const item of items)
|
|
314
|
+
children.push(serializeElement(set, slot.decl, item, namespace, depth + 1));
|
|
315
|
+
}
|
|
316
|
+
return children.length === 0
|
|
317
|
+
? `<${name}${xmlns}${attributes}/>`
|
|
318
|
+
: `<${name}${xmlns}${attributes}>${children.join('')}</${name}>`;
|
|
319
|
+
}
|
|
320
|
+
/** The first element inside the envelope's SOAP Body, if the envelope has one. */
|
|
321
|
+
export function soapBodyElement(envelope) {
|
|
322
|
+
const root = scanXml(envelope).elements[0];
|
|
323
|
+
if (root?.localName !== 'Envelope')
|
|
324
|
+
return undefined;
|
|
325
|
+
const body = root.children.find((child) => child.localName === 'Body' && (child.namespaceUri === NS.SOAP11_ENV || child.namespaceUri === NS.SOAP12_ENV));
|
|
326
|
+
return body?.children[0];
|
|
327
|
+
}
|
|
328
|
+
/** The projection of the envelope's body element, when `element` names its declaration. */
|
|
329
|
+
export function projectSoapBody(set, element, envelope) {
|
|
330
|
+
const decl = element !== undefined ? set?.lookupElement(element) : undefined;
|
|
331
|
+
const body = soapBodyElement(envelope);
|
|
332
|
+
if (set === undefined || decl === undefined || body === undefined)
|
|
333
|
+
return undefined;
|
|
334
|
+
if (body.localName !== decl.name.localName || body.namespaceUri !== decl.name.namespaceUri)
|
|
335
|
+
return undefined;
|
|
336
|
+
return projectElement(set, decl, body);
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* The envelope with its body element replaced by `value` written as `element`. Everything outside
|
|
340
|
+
* the body element is kept byte for byte.
|
|
341
|
+
*
|
|
342
|
+
* @throws TypeError when the envelope has no body element or `value` does not fit the schema
|
|
343
|
+
*/
|
|
344
|
+
export function replaceSoapBody(set, element, envelope, value) {
|
|
345
|
+
const decl = set.lookupElement(element);
|
|
346
|
+
const body = soapBodyElement(envelope);
|
|
347
|
+
if (decl === undefined || body === undefined)
|
|
348
|
+
throw new TypeError('the envelope has no body element to replace');
|
|
349
|
+
const xml = serializeElement(set, decl, value, undefined);
|
|
350
|
+
return envelope.slice(0, body.range.start) + xml + envelope.slice(body.range.end);
|
|
351
|
+
}
|
|
352
|
+
/** `{namespace}local` as a QName. */
|
|
353
|
+
export function qnameFromClark(clark) {
|
|
354
|
+
const match = /^\{([^}]*)\}(.*)$/.exec(clark);
|
|
355
|
+
return match === null ? { namespaceUri: '', localName: clark } : { namespaceUri: match[1], localName: match[2] };
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* The elements a document-style SOAP operation's input and output messages name, when each message
|
|
359
|
+
* has exactly one element part — the shape a typed body needs. An RPC-style operation, or a message
|
|
360
|
+
* of type parts, has none.
|
|
361
|
+
*/
|
|
362
|
+
export function soapOperationElements(definition, bindingName, operationName) {
|
|
363
|
+
const binding = findBinding(definition, qnameFromClark(bindingName));
|
|
364
|
+
if (binding === undefined)
|
|
365
|
+
return {};
|
|
366
|
+
const bindingOperation = binding.operations.find((op) => op.name === operationName);
|
|
367
|
+
// An operation's own style overrides its binding's.
|
|
368
|
+
if ((bindingOperation?.style ?? binding.style) === 'rpc')
|
|
369
|
+
return {};
|
|
370
|
+
const operation = findPortType(definition, binding.type)?.operations.find((op) => op.name === operationName);
|
|
371
|
+
const elementOf = (ref) => {
|
|
372
|
+
const message = ref === undefined ? undefined : findMessage(definition, ref.message);
|
|
373
|
+
const elements = message?.parts.filter((part) => part.element !== undefined) ?? [];
|
|
374
|
+
return elements.length === 1 ? elements[0].element : undefined;
|
|
375
|
+
};
|
|
376
|
+
const input = elementOf(operation?.input);
|
|
377
|
+
const output = elementOf(operation?.output);
|
|
378
|
+
return { ...(input !== undefined ? { input } : {}), ...(output !== undefined ? { output } : {}) };
|
|
379
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { ProtocolScripting } from '../protocol/module.js';
|
|
2
|
+
import type { HeaderPair } from '../script/model.js';
|
|
3
|
+
import type { SoapExchange, SoapSendInput } from './types.js';
|
|
4
|
+
import type { QName } from '../wsdl/qname.js';
|
|
5
|
+
import type { SchemaSet } from '../xsd/schema-set.js';
|
|
6
|
+
export interface SoapRequestSnapshot {
|
|
7
|
+
readonly protocol: 'soap';
|
|
8
|
+
readonly endpoint: string;
|
|
9
|
+
readonly soapAction: string;
|
|
10
|
+
readonly headers: readonly HeaderPair[];
|
|
11
|
+
/** The whole envelope, after property expansion and before WS-Addressing or WS-Security. */
|
|
12
|
+
readonly envelope: string;
|
|
13
|
+
/** The body element as the object its schema describes (`types/xsd.ts`); absent when there is no schema. */
|
|
14
|
+
readonly body?: unknown;
|
|
15
|
+
}
|
|
16
|
+
export interface SoapResponseSnapshot {
|
|
17
|
+
readonly protocol: 'soap';
|
|
18
|
+
readonly status: number;
|
|
19
|
+
readonly headers: readonly HeaderPair[];
|
|
20
|
+
/** The response envelope. */
|
|
21
|
+
readonly text: string;
|
|
22
|
+
readonly durationMs: number;
|
|
23
|
+
readonly fault?: {
|
|
24
|
+
readonly code: string;
|
|
25
|
+
readonly reason: string;
|
|
26
|
+
};
|
|
27
|
+
/** The body element as the object its schema describes; absent when there is no schema. */
|
|
28
|
+
readonly body?: unknown;
|
|
29
|
+
}
|
|
30
|
+
/** A SOAP send already expanded (with placeholders), as a script sees it. */
|
|
31
|
+
export declare function soapRequestSnapshot(expanded: SoapSendInput): SoapRequestSnapshot;
|
|
32
|
+
/** The expanded send with a pre-request script's changes; a header set twice keeps its last value. */
|
|
33
|
+
export declare function applySoapSnapshot(expanded: SoapSendInput, after: SoapRequestSnapshot): SoapSendInput;
|
|
34
|
+
export declare function soapResponseSnapshot(exchange: SoapExchange): SoapResponseSnapshot;
|
|
35
|
+
/**
|
|
36
|
+
* What SOAP's script types carry for the typed `request.body` and `response.body`
|
|
37
|
+
* (`RequestScriptTypes.binding`): the schema and the operation's input and output elements.
|
|
38
|
+
*/
|
|
39
|
+
export interface SoapScriptBinding {
|
|
40
|
+
readonly schemas: SchemaSet;
|
|
41
|
+
readonly input?: QName;
|
|
42
|
+
readonly output?: QName;
|
|
43
|
+
}
|
|
44
|
+
/** SOAP's scripting facet. */
|
|
45
|
+
export declare const soapScripting: ProtocolScripting<SoapRequestSnapshot, SoapResponseSnapshot>;
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a script sees of a SOAP request and its response (spec §3.4): the snapshots, the converters
|
|
3
|
+
* between an expanded send and a snapshot, the API's declarations, its sandbox-side source, what
|
|
4
|
+
* the script rules check, and the typed `body` a schema gives the script.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { headerPairSchema } from '../script/apply.js';
|
|
8
|
+
import { recordPairs } from '../script/send.js';
|
|
9
|
+
import { projectSoapBody, replaceSoapBody } from './script-types.js';
|
|
10
|
+
/** A SOAP send already expanded (with placeholders), as a script sees it. */
|
|
11
|
+
export function soapRequestSnapshot(expanded) {
|
|
12
|
+
return {
|
|
13
|
+
protocol: 'soap',
|
|
14
|
+
endpoint: expanded.endpoint,
|
|
15
|
+
soapAction: expanded.soapAction ?? '',
|
|
16
|
+
headers: recordPairs(expanded.headers),
|
|
17
|
+
envelope: expanded.envelopeXml,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/** The expanded send with a pre-request script's changes; a header set twice keeps its last value. */
|
|
21
|
+
export function applySoapSnapshot(expanded, after) {
|
|
22
|
+
return {
|
|
23
|
+
...expanded,
|
|
24
|
+
endpoint: after.endpoint,
|
|
25
|
+
...(after.soapAction !== '' || expanded.soapAction !== undefined ? { soapAction: after.soapAction } : {}),
|
|
26
|
+
headers: Object.fromEntries(after.headers.map(([n, v]) => [n, v])),
|
|
27
|
+
envelopeXml: after.envelope,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export function soapResponseSnapshot(exchange) {
|
|
31
|
+
const fault = exchange.response?.fault;
|
|
32
|
+
return {
|
|
33
|
+
protocol: 'soap',
|
|
34
|
+
status: exchange.http.status,
|
|
35
|
+
headers: exchange.http.rawHeaders.map(([n, v]) => [n, v]),
|
|
36
|
+
text: exchange.response?.envelopeXml ?? new TextDecoder().decode(exchange.http.body),
|
|
37
|
+
durationMs: exchange.durationMs,
|
|
38
|
+
...(fault !== undefined ? { fault: { code: fault.code, reason: fault.reason } } : {}),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
const SOAP_PRE = `
|
|
42
|
+
declare const request: {
|
|
43
|
+
readonly endpoint: string;
|
|
44
|
+
soapAction: string;
|
|
45
|
+
readonly headers: WbWritablePairs;
|
|
46
|
+
/** The whole envelope, after property expansion and before WS-Addressing and WS-Security. */
|
|
47
|
+
envelope: string;
|
|
48
|
+
/** The SOAP body's element, typed from the operation's input message. */
|
|
49
|
+
body: WbSoapRequestBody;
|
|
50
|
+
};
|
|
51
|
+
`;
|
|
52
|
+
const SOAP_POST = `
|
|
53
|
+
declare const request: {
|
|
54
|
+
readonly endpoint: string;
|
|
55
|
+
readonly soapAction: string;
|
|
56
|
+
readonly headers: WbPairs;
|
|
57
|
+
readonly envelope: string;
|
|
58
|
+
readonly body: WbSoapRequestBody;
|
|
59
|
+
};
|
|
60
|
+
declare const response: {
|
|
61
|
+
readonly status: number;
|
|
62
|
+
readonly headers: WbPairs;
|
|
63
|
+
readonly envelope: string;
|
|
64
|
+
readonly text: string;
|
|
65
|
+
/** The SOAP body's element, typed from the operation's output message. */
|
|
66
|
+
readonly body: WbSoapResponseBody;
|
|
67
|
+
readonly fault?: { readonly code: string; readonly reason: string };
|
|
68
|
+
/** Strings an XPath expression selects in the response envelope. */
|
|
69
|
+
select(xpath: string, namespaces?: Record<string, string>): string[];
|
|
70
|
+
readonly durationMs: number;
|
|
71
|
+
};
|
|
72
|
+
`;
|
|
73
|
+
const SOAP = String.raw `
|
|
74
|
+
const soapRequest = (snapshot, writable) => {
|
|
75
|
+
const data = {
|
|
76
|
+
endpoint: snapshot.endpoint,
|
|
77
|
+
soapAction: snapshot.soapAction,
|
|
78
|
+
headers: snapshot.headers.map(([n, v]) => [n, v]),
|
|
79
|
+
envelope: snapshot.envelope,
|
|
80
|
+
body: snapshot.body === undefined ? undefined : JSON.parse(JSON.stringify(snapshot.body)),
|
|
81
|
+
};
|
|
82
|
+
const refuse = (what) => () => { throw new TypeError('The ' + what + ' of a sent request cannot be changed'); };
|
|
83
|
+
const noSchema = () => {
|
|
84
|
+
throw new TypeError('This operation\'s body has no schema element, so request.body is not available; use request.envelope');
|
|
85
|
+
};
|
|
86
|
+
const request = Object.freeze({
|
|
87
|
+
get endpoint() { return data.endpoint; },
|
|
88
|
+
set endpoint(value) { if (!writable) refuse('endpoint')(); data.endpoint = String(value); },
|
|
89
|
+
get soapAction() { return data.soapAction; },
|
|
90
|
+
set soapAction(value) {
|
|
91
|
+
if (!writable) refuse('SOAPAction')();
|
|
92
|
+
const text = String(value);
|
|
93
|
+
if (hasCrlf(text)) throw new ScriptValueInvalid('The SOAPAction may not hold CR, LF or NUL');
|
|
94
|
+
data.soapAction = text;
|
|
95
|
+
},
|
|
96
|
+
headers: pairsApi(data.headers, writable, 'header'),
|
|
97
|
+
get envelope() { return data.envelope; },
|
|
98
|
+
set envelope(value) { if (!writable) refuse('envelope')(); data.envelope = String(value); },
|
|
99
|
+
get body() {
|
|
100
|
+
if (snapshot.body === undefined) noSchema();
|
|
101
|
+
return writable ? data.body : deepFreeze(data.body);
|
|
102
|
+
},
|
|
103
|
+
set body(value) {
|
|
104
|
+
if (!writable) refuse('body')();
|
|
105
|
+
if (snapshot.body === undefined) noSchema();
|
|
106
|
+
const text = JSON.stringify(value);
|
|
107
|
+
if (text === undefined) throw new TypeError('request.body must be a JSON value');
|
|
108
|
+
data.body = JSON.parse(text);
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
const snapshotOf = () => ({
|
|
112
|
+
protocol: 'soap',
|
|
113
|
+
endpoint: data.endpoint,
|
|
114
|
+
soapAction: data.soapAction,
|
|
115
|
+
headers: data.headers,
|
|
116
|
+
envelope: data.envelope,
|
|
117
|
+
...(data.body === undefined ? {} : { body: data.body }),
|
|
118
|
+
});
|
|
119
|
+
return { request, snapshotOf };
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
const soapResponse = (snapshot) => deepFreeze({
|
|
123
|
+
status: snapshot.status,
|
|
124
|
+
headers: pairsApi(snapshot.headers.map(([n, v]) => [n, v]), false, 'header'),
|
|
125
|
+
text: snapshot.text,
|
|
126
|
+
envelope: snapshot.text,
|
|
127
|
+
fault: snapshot.fault,
|
|
128
|
+
body: snapshot.body,
|
|
129
|
+
select: (xpath, namespaces) => JSON.parse(__host.xpath(snapshot.text, String(xpath), JSON.stringify(namespaces === undefined ? {} : namespaces))),
|
|
130
|
+
durationMs: snapshot.durationMs,
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
if (input.phase === 'pre') {
|
|
134
|
+
const built = soapRequest(input.request, true);
|
|
135
|
+
define('request', built.request);
|
|
136
|
+
state.request = built.snapshotOf;
|
|
137
|
+
} else {
|
|
138
|
+
define('request', soapRequest(input.request, false).request);
|
|
139
|
+
define('response', soapResponse(input.response));
|
|
140
|
+
}
|
|
141
|
+
`;
|
|
142
|
+
function withBody(snapshot, body) {
|
|
143
|
+
return body === undefined ? snapshot : { ...snapshot, body };
|
|
144
|
+
}
|
|
145
|
+
/** The binding this module put on a request's script types, if it put one. */
|
|
146
|
+
function bindingOf(types) {
|
|
147
|
+
const binding = types.binding;
|
|
148
|
+
if (typeof binding !== 'object' || binding === null || !('schemas' in binding))
|
|
149
|
+
return undefined;
|
|
150
|
+
return binding;
|
|
151
|
+
}
|
|
152
|
+
const requestSchema = z.object({
|
|
153
|
+
protocol: z.literal('soap'),
|
|
154
|
+
endpoint: z.string(),
|
|
155
|
+
soapAction: z.string(),
|
|
156
|
+
headers: z.array(headerPairSchema),
|
|
157
|
+
envelope: z.string(),
|
|
158
|
+
body: z.unknown().optional(),
|
|
159
|
+
});
|
|
160
|
+
/** SOAP's scripting facet. */
|
|
161
|
+
export const soapScripting = {
|
|
162
|
+
declarations: (phase) => (phase === 'pre' ? SOAP_PRE : SOAP_POST),
|
|
163
|
+
reference: () => [
|
|
164
|
+
{ title: 'SOAP: pre-request', declarations: SOAP_PRE },
|
|
165
|
+
{ title: 'SOAP: post-response', declarations: SOAP_POST },
|
|
166
|
+
],
|
|
167
|
+
prelude: () => SOAP,
|
|
168
|
+
requestSchema,
|
|
169
|
+
inspect(snapshot) {
|
|
170
|
+
return {
|
|
171
|
+
destination: snapshot.endpoint,
|
|
172
|
+
fixed: null,
|
|
173
|
+
pairs: snapshot.headers,
|
|
174
|
+
lines: [snapshot.endpoint, snapshot.soapAction],
|
|
175
|
+
// Not `body`: it is a view of the envelope. Core runs the rules again on the envelope it is
|
|
176
|
+
// written back into, so a secret added through the body is caught there.
|
|
177
|
+
texts: [snapshot.endpoint, snapshot.soapAction, snapshot.envelope, ...snapshot.headers.flat()],
|
|
178
|
+
};
|
|
179
|
+
},
|
|
180
|
+
views: {
|
|
181
|
+
/** The request with its body projected, when the schema describes the body element. */
|
|
182
|
+
request(snapshot, types) {
|
|
183
|
+
const binding = bindingOf(types);
|
|
184
|
+
return binding === undefined
|
|
185
|
+
? snapshot
|
|
186
|
+
: withBody(snapshot, projectSoapBody(binding.schemas, binding.input, snapshot.envelope));
|
|
187
|
+
},
|
|
188
|
+
response(snapshot, types) {
|
|
189
|
+
const binding = bindingOf(types);
|
|
190
|
+
return binding === undefined
|
|
191
|
+
? snapshot
|
|
192
|
+
: withBody(snapshot, projectSoapBody(binding.schemas, binding.output, snapshot.text));
|
|
193
|
+
},
|
|
194
|
+
/**
|
|
195
|
+
* Writes a changed `request.body` back into the envelope, replacing the body element. The body
|
|
196
|
+
* wins over an envelope the script also edited, since it is written into that edited envelope.
|
|
197
|
+
*/
|
|
198
|
+
writeBack(before, after, types) {
|
|
199
|
+
const binding = bindingOf(types);
|
|
200
|
+
const { body, ...rest } = after;
|
|
201
|
+
if (body === undefined || JSON.stringify(body) === JSON.stringify(before.body) || binding?.input === undefined) {
|
|
202
|
+
return { ok: true, request: rest };
|
|
203
|
+
}
|
|
204
|
+
try {
|
|
205
|
+
return {
|
|
206
|
+
ok: true,
|
|
207
|
+
request: { ...rest, envelope: replaceSoapBody(binding.schemas, binding.input, rest.envelope, body) },
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
return {
|
|
212
|
+
ok: false,
|
|
213
|
+
error: {
|
|
214
|
+
code: 'script-error',
|
|
215
|
+
message: `request.body could not be written: ${error instanceof Error ? error.message : String(error)}`,
|
|
216
|
+
},
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
};
|