@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,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AsyncAPI 3.0 into the version-neutral view.
|
|
3
|
+
*
|
|
4
|
+
* A 3.0 operation's `action` is the described application's: `receive` is what it accepts, so
|
|
5
|
+
* Wirebench — its peer — sends it, and `send` is what it emits, which Wirebench receives. A `reply`
|
|
6
|
+
* travels the other way from its operation.
|
|
7
|
+
*/
|
|
8
|
+
import { channelParameter, deref, entries, isJsonSchemaFormat, isRecord, localRef, message, record, refKey, securityScheme, str, substitute, tagNames, } from './read.js';
|
|
9
|
+
function payloadOf(node) {
|
|
10
|
+
const payload = node['payload'];
|
|
11
|
+
// A multi-format schema object carries its format beside the schema.
|
|
12
|
+
if (isRecord(payload) && 'schema' in payload && typeof payload['schemaFormat'] === 'string') {
|
|
13
|
+
return { payload: payload['schema'], schemaFormat: payload['schemaFormat'] };
|
|
14
|
+
}
|
|
15
|
+
return payload !== undefined ? { payload } : {};
|
|
16
|
+
}
|
|
17
|
+
/** The channel key a raw `{ $ref: '#/channels/<key>' }` names. */
|
|
18
|
+
function channelKey(rawNode) {
|
|
19
|
+
const tokens = localRef(rawNode);
|
|
20
|
+
return tokens?.length === 2 && tokens[0] === 'channels' ? tokens[1] : undefined;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* @param raw the parsed document before `$ref` inlining, where the keys references name still are
|
|
24
|
+
* @param resolved the same document with references inlined
|
|
25
|
+
*/
|
|
26
|
+
export function normaliseAsyncApi3(raw, resolved, declaredVersion) {
|
|
27
|
+
const notes = [];
|
|
28
|
+
const defaultContentType = str(resolved['defaultContentType']) ?? 'application/json';
|
|
29
|
+
const rawServers = record(raw['servers']);
|
|
30
|
+
const servers = entries(resolved['servers']).map(([key, server]) => {
|
|
31
|
+
const protocol = str(server['protocol']) ?? '';
|
|
32
|
+
const written = `${str(server['host']) ?? ''}${str(server['pathname']) ?? ''}`;
|
|
33
|
+
const { value, unresolved } = substitute(written, server['variables']);
|
|
34
|
+
const rawSecurity = record(deref(raw, rawServers[key]))['security'];
|
|
35
|
+
const security = Array.isArray(server['security']) ? server['security'] : [];
|
|
36
|
+
return {
|
|
37
|
+
key,
|
|
38
|
+
url: protocol === '' ? value : `${protocol}://${value}`,
|
|
39
|
+
protocol,
|
|
40
|
+
security: security.flatMap((scheme, index) => {
|
|
41
|
+
if (!isRecord(scheme))
|
|
42
|
+
return [];
|
|
43
|
+
const rawOne = Array.isArray(rawSecurity) ? rawSecurity[index] : undefined;
|
|
44
|
+
return [securityScheme(refKey(rawOne) ?? `${key}#security${String(index)}`, scheme)];
|
|
45
|
+
}),
|
|
46
|
+
unresolvedVariables: unresolved,
|
|
47
|
+
};
|
|
48
|
+
});
|
|
49
|
+
const rawChannels = record(raw['channels']);
|
|
50
|
+
const channelMessages = new Map();
|
|
51
|
+
const channels = entries(resolved['channels']).map(([key, channel]) => {
|
|
52
|
+
channelMessages.set(key, entries(channel['messages']).map(([messageKey, node]) => {
|
|
53
|
+
const read = message(messageKey, node, defaultContentType, payloadOf, false);
|
|
54
|
+
if (!isJsonSchemaFormat(read.schemaFormat)) {
|
|
55
|
+
notes.push({
|
|
56
|
+
where: `channels/${key}/messages/${messageKey}`,
|
|
57
|
+
reason: `the payload uses ${String(read.schemaFormat)}, which is not JSON Schema`,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
return read;
|
|
61
|
+
}));
|
|
62
|
+
const rawListed = record(deref(raw, rawChannels[key]))['servers'];
|
|
63
|
+
const listed = Array.isArray(rawListed)
|
|
64
|
+
? rawListed.map((node) => refKey(node)).filter((k) => k !== undefined)
|
|
65
|
+
: [];
|
|
66
|
+
return {
|
|
67
|
+
key,
|
|
68
|
+
address: str(channel['address']) ?? null,
|
|
69
|
+
servers: listed.length > 0 ? listed : 'all',
|
|
70
|
+
parameters: Object.fromEntries(entries(channel['parameters']).map(([name, parameter]) => [name, channelParameter(parameter)])),
|
|
71
|
+
bindings: record(channel['bindings']),
|
|
72
|
+
tags: tagNames(channel['tags']),
|
|
73
|
+
};
|
|
74
|
+
});
|
|
75
|
+
/** The messages a raw list of `#/channels/<c>/messages/<m>` refs names, else the channel's all. */
|
|
76
|
+
const pick = (channel, rawList, where) => {
|
|
77
|
+
const all = channelMessages.get(channel) ?? [];
|
|
78
|
+
if (!Array.isArray(rawList))
|
|
79
|
+
return all;
|
|
80
|
+
return rawList.flatMap((node) => {
|
|
81
|
+
const key = refKey(node);
|
|
82
|
+
const found = all.find((m) => m.key === key);
|
|
83
|
+
if (found === undefined) {
|
|
84
|
+
notes.push({ where, reason: `the message ${key ?? 'written inline'} is not one of channel ${channel}'s` });
|
|
85
|
+
return [];
|
|
86
|
+
}
|
|
87
|
+
return [found];
|
|
88
|
+
});
|
|
89
|
+
};
|
|
90
|
+
const operations = [];
|
|
91
|
+
const rawOperations = record(raw['operations']);
|
|
92
|
+
for (const [key] of entries(resolved['operations'])) {
|
|
93
|
+
const where = `operations/${key}`;
|
|
94
|
+
const rawOperation = record(deref(raw, rawOperations[key]));
|
|
95
|
+
const action = rawOperation['action'];
|
|
96
|
+
const direction = action === 'receive' ? 'sent' : action === 'send' ? 'received' : undefined;
|
|
97
|
+
if (direction === undefined) {
|
|
98
|
+
notes.push({ where, reason: `the action ${String(action)} is neither send nor receive` });
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
const channel = channelKey(rawOperation['channel']);
|
|
102
|
+
if (channel === undefined || !channelMessages.has(channel)) {
|
|
103
|
+
notes.push({ where, reason: 'the operation does not reference a channel of this document' });
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
operations.push({ key, channel, direction, messages: pick(channel, rawOperation['messages'], where) });
|
|
107
|
+
const rawReply = deref(raw, rawOperation['reply']);
|
|
108
|
+
if (isRecord(rawReply)) {
|
|
109
|
+
if (rawReply['channel'] === undefined && rawReply['address'] !== undefined) {
|
|
110
|
+
notes.push({
|
|
111
|
+
where: `${where}/reply`,
|
|
112
|
+
reason: "the reply's address is set at run time; it is mapped onto the operation's channel",
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
const replyChannel = channelKey(rawReply['channel']) ?? channel;
|
|
116
|
+
operations.push({
|
|
117
|
+
key: `${key}#reply`,
|
|
118
|
+
channel: replyChannel,
|
|
119
|
+
direction: direction === 'sent' ? 'received' : 'sent',
|
|
120
|
+
messages: pick(replyChannel, rawReply['messages'], `${where}/reply`),
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
version: '3',
|
|
126
|
+
declaredVersion,
|
|
127
|
+
title: str(record(resolved['info'])['title']) ?? '',
|
|
128
|
+
servers,
|
|
129
|
+
channels,
|
|
130
|
+
operations,
|
|
131
|
+
notes,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reading an AsyncAPI 2.x or 3.0 document into the version-neutral view.
|
|
3
|
+
*
|
|
4
|
+
* The fetch, the `$ref` resolution and the source shapes are the OpenAPI import's own, so the
|
|
5
|
+
* documents it hands back are what the definition cache already knows how to store. Only two
|
|
6
|
+
* things are fatal: text that is not a document, and a version this reader does not know.
|
|
7
|
+
* Everything else that cannot be mapped becomes a note on the document.
|
|
8
|
+
*/
|
|
9
|
+
import type { OpenApiSource } from '../json/schema/source.js';
|
|
10
|
+
import { type RefProblem, type ResolvedDocument } from '../json/schema/refs.js';
|
|
11
|
+
import type { FetchDocument } from '../http/fetch-document.js';
|
|
12
|
+
import type { AsyncApiDocument } from './model.js';
|
|
13
|
+
export interface ParseAsyncApiOptions {
|
|
14
|
+
readonly fetchDocument: FetchDocument;
|
|
15
|
+
readonly signal?: AbortSignal;
|
|
16
|
+
}
|
|
17
|
+
/** A parsed document and everything it was made of. */
|
|
18
|
+
export interface ParsedAsyncApi {
|
|
19
|
+
readonly document: AsyncApiDocument;
|
|
20
|
+
/** Every file fetched, root first — what the definition cache stores. */
|
|
21
|
+
readonly documents: readonly ResolvedDocument[];
|
|
22
|
+
/** References that could not be followed. The import continues without them. */
|
|
23
|
+
readonly problems: readonly RefProblem[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Fetches (when needed), resolves and normalises one AsyncAPI document.
|
|
27
|
+
*
|
|
28
|
+
* @throws AsyncApiError `asyncapi-malformed` or `asyncapi-version-unsupported`; an `AbortError`
|
|
29
|
+
* when the signal fires mid-fetch.
|
|
30
|
+
*/
|
|
31
|
+
export declare function parseAsyncApi(source: OpenApiSource, options: ParseAsyncApiOptions): Promise<ParsedAsyncApi>;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reading an AsyncAPI 2.x or 3.0 document into the version-neutral view.
|
|
3
|
+
*
|
|
4
|
+
* The fetch, the `$ref` resolution and the source shapes are the OpenAPI import's own, so the
|
|
5
|
+
* documents it hands back are what the definition cache already knows how to store. Only two
|
|
6
|
+
* things are fatal: text that is not a document, and a version this reader does not know.
|
|
7
|
+
* Everything else that cannot be mapped becomes a note on the document.
|
|
8
|
+
*/
|
|
9
|
+
import { AsyncApiError, OpenApiError } from '../errors.js';
|
|
10
|
+
import { parseDocumentText } from '../json/schema/parse-text.js';
|
|
11
|
+
import { resolveRefs } from '../json/schema/refs.js';
|
|
12
|
+
import { normaliseAsyncApi2 } from './normalise-2.js';
|
|
13
|
+
import { normaliseAsyncApi3 } from './normalise-3.js';
|
|
14
|
+
import { isRecord } from './read.js';
|
|
15
|
+
function locationOf(source) {
|
|
16
|
+
if (source.kind === 'url')
|
|
17
|
+
return source.url;
|
|
18
|
+
if (source.kind === 'file') {
|
|
19
|
+
if (!source.path.startsWith('file:')) {
|
|
20
|
+
throw new AsyncApiError('asyncapi-malformed', 'A file source must be given as a file: URL', {
|
|
21
|
+
details: { path: source.path },
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
return source.path;
|
|
25
|
+
}
|
|
26
|
+
return source.location ?? 'inline:asyncapi';
|
|
27
|
+
}
|
|
28
|
+
/** Which normaliser a declared version goes to, or a refusal naming it. */
|
|
29
|
+
function majorOf(declared) {
|
|
30
|
+
if (/^2\.[0-6](?:\.\d+)?$/.test(declared))
|
|
31
|
+
return '2';
|
|
32
|
+
if (/^3\.0(?:\.\d+)?$/.test(declared))
|
|
33
|
+
return '3';
|
|
34
|
+
throw new AsyncApiError('asyncapi-version-unsupported', `AsyncAPI ${declared} is not supported; 2.0 to 2.6 and 3.0 are`, {
|
|
35
|
+
details: { version: declared },
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function parseRoot(text, where) {
|
|
39
|
+
try {
|
|
40
|
+
return parseDocumentText(text, where);
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
if (error instanceof OpenApiError) {
|
|
44
|
+
throw new AsyncApiError('asyncapi-malformed', error.message, { cause: error });
|
|
45
|
+
}
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Fetches (when needed), resolves and normalises one AsyncAPI document.
|
|
51
|
+
*
|
|
52
|
+
* @throws AsyncApiError `asyncapi-malformed` or `asyncapi-version-unsupported`; an `AbortError`
|
|
53
|
+
* when the signal fires mid-fetch.
|
|
54
|
+
*/
|
|
55
|
+
export async function parseAsyncApi(source, options) {
|
|
56
|
+
const location = locationOf(source);
|
|
57
|
+
let text;
|
|
58
|
+
let bytes;
|
|
59
|
+
let rootLocation = location;
|
|
60
|
+
if (source.kind === 'text') {
|
|
61
|
+
text = source.text;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
const fetched = await options.fetchDocument(location, options.signal);
|
|
65
|
+
text = fetched.text;
|
|
66
|
+
bytes = fetched.bytes;
|
|
67
|
+
rootLocation = fetched.location;
|
|
68
|
+
}
|
|
69
|
+
const raw = parseRoot(text, rootLocation);
|
|
70
|
+
if (!isRecord(raw)) {
|
|
71
|
+
throw new AsyncApiError('asyncapi-malformed', `${rootLocation} is not an AsyncAPI document`);
|
|
72
|
+
}
|
|
73
|
+
const declared = raw['asyncapi'];
|
|
74
|
+
if (typeof declared !== 'string') {
|
|
75
|
+
throw new AsyncApiError('asyncapi-malformed', `${rootLocation} has no asyncapi version`);
|
|
76
|
+
}
|
|
77
|
+
const major = majorOf(declared);
|
|
78
|
+
const resolved = await resolveRefs(text, rootLocation, { fetchDocument: options.fetchDocument, ...(options.signal !== undefined ? { signal: options.signal } : {}) }, bytes);
|
|
79
|
+
const document = isRecord(resolved.document) ? resolved.document : {};
|
|
80
|
+
return {
|
|
81
|
+
document: major === '2' ? normaliseAsyncApi2(raw, document, declared) : normaliseAsyncApi3(raw, document, declared),
|
|
82
|
+
documents: resolved.documents,
|
|
83
|
+
problems: resolved.problems,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Small readers both normalisers share. They take plain objects (the parsed document before and
|
|
3
|
+
* after `$ref` inlining) and never throw: a shape they do not recognise reads as absent.
|
|
4
|
+
*/
|
|
5
|
+
import type { AsyncApiChannelParameter, AsyncApiMessage, AsyncApiSecurityScheme } from './model.js';
|
|
6
|
+
export type Json = Readonly<Record<string, unknown>>;
|
|
7
|
+
export declare function isRecord(value: unknown): value is Json;
|
|
8
|
+
export declare function record(value: unknown): Json;
|
|
9
|
+
export declare function entries(value: unknown): [string, Json][];
|
|
10
|
+
export declare function str(value: unknown): string | undefined;
|
|
11
|
+
/** The pointer tokens of a local `$ref` (`#/a/b` → `['a','b']`), or undefined for any other node. */
|
|
12
|
+
export declare function localRef(node: unknown): string[] | undefined;
|
|
13
|
+
/** The last pointer token of any `$ref` (local or into another file) — the key the target is filed under. */
|
|
14
|
+
export declare function refKey(node: unknown): string | undefined;
|
|
15
|
+
/** Schema formats the contract check can read: JSON Schema, and the AsyncAPI schema that extends it. */
|
|
16
|
+
export declare function isJsonSchemaFormat(format: string | undefined): boolean;
|
|
17
|
+
/** Follows local `$ref`s in the raw document, a bounded number of hops, to the node they name. */
|
|
18
|
+
export declare function deref(root: unknown, node: unknown): unknown;
|
|
19
|
+
/** `{name}` placeholders replaced by each variable's default (else first enum value). */
|
|
20
|
+
export declare function substitute(template: string, variables: unknown): {
|
|
21
|
+
value: string;
|
|
22
|
+
unresolved: string[];
|
|
23
|
+
};
|
|
24
|
+
export declare function securityScheme(key: string, scheme: Json): AsyncApiSecurityScheme;
|
|
25
|
+
/** A channel parameter from where its values live (the 2.x `schema`, or the 3.0 parameter itself). */
|
|
26
|
+
export declare function channelParameter(source: Json): AsyncApiChannelParameter;
|
|
27
|
+
export declare function tagNames(value: unknown): string[];
|
|
28
|
+
/**
|
|
29
|
+
* One message, traits merged in. Its name is its `name`, else its `title`, else its key. `payloadOf` pulls the schema (and a schema format carried with it) out of the
|
|
30
|
+
* version's payload shape.
|
|
31
|
+
*/
|
|
32
|
+
export declare function message(key: string, node: Json, defaultContentType: string, payloadOf: (node: Json) => {
|
|
33
|
+
payload?: unknown;
|
|
34
|
+
schemaFormat?: string;
|
|
35
|
+
}, traitsWin: boolean): AsyncApiMessage;
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Small readers both normalisers share. They take plain objects (the parsed document before and
|
|
3
|
+
* after `$ref` inlining) and never throw: a shape they do not recognise reads as absent.
|
|
4
|
+
*/
|
|
5
|
+
export function isRecord(value) {
|
|
6
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
7
|
+
}
|
|
8
|
+
export function record(value) {
|
|
9
|
+
return isRecord(value) ? value : {};
|
|
10
|
+
}
|
|
11
|
+
export function entries(value) {
|
|
12
|
+
return Object.entries(record(value)).filter((entry) => isRecord(entry[1]));
|
|
13
|
+
}
|
|
14
|
+
export function str(value) {
|
|
15
|
+
return typeof value === 'string' ? value : undefined;
|
|
16
|
+
}
|
|
17
|
+
function scalarText(value) {
|
|
18
|
+
if (typeof value === 'string')
|
|
19
|
+
return value;
|
|
20
|
+
if (typeof value === 'number' || typeof value === 'boolean')
|
|
21
|
+
return String(value);
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
function texts(value) {
|
|
25
|
+
if (!Array.isArray(value))
|
|
26
|
+
return undefined;
|
|
27
|
+
return value.map(scalarText).filter((v) => v !== undefined);
|
|
28
|
+
}
|
|
29
|
+
function unescapeToken(token) {
|
|
30
|
+
return token.replace(/~1/g, '/').replace(/~0/g, '~');
|
|
31
|
+
}
|
|
32
|
+
/** The pointer tokens of a local `$ref` (`#/a/b` → `['a','b']`), or undefined for any other node. */
|
|
33
|
+
export function localRef(node) {
|
|
34
|
+
if (!isRecord(node))
|
|
35
|
+
return undefined;
|
|
36
|
+
const ref = str(node['$ref']);
|
|
37
|
+
if (ref === undefined || !ref.startsWith('#/'))
|
|
38
|
+
return undefined;
|
|
39
|
+
return ref.slice(2).split('/').map(unescapeToken);
|
|
40
|
+
}
|
|
41
|
+
/** The last pointer token of any `$ref` (local or into another file) — the key the target is filed under. */
|
|
42
|
+
export function refKey(node) {
|
|
43
|
+
if (!isRecord(node))
|
|
44
|
+
return undefined;
|
|
45
|
+
const ref = str(node['$ref']);
|
|
46
|
+
const hash = ref?.indexOf('#') ?? -1;
|
|
47
|
+
if (ref === undefined || hash === -1)
|
|
48
|
+
return undefined;
|
|
49
|
+
const last = ref
|
|
50
|
+
.slice(hash + 1)
|
|
51
|
+
.split('/')
|
|
52
|
+
.at(-1);
|
|
53
|
+
return last === undefined || last === '' ? undefined : unescapeToken(last);
|
|
54
|
+
}
|
|
55
|
+
/** Schema formats the contract check can read: JSON Schema, and the AsyncAPI schema that extends it. */
|
|
56
|
+
export function isJsonSchemaFormat(format) {
|
|
57
|
+
if (format === undefined)
|
|
58
|
+
return true;
|
|
59
|
+
return /^application\/(?:schema\+(?:json|yaml)|vnd\.aai\.asyncapi(?:\+(?:json|yaml))?)(?:;|$)/i.test(format.trim());
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* A message with its `traits` shallow-merged in. In 2.x a trait is applied onto the message, so a
|
|
63
|
+
* trait's field wins; in 3.0 the message's own field wins over its traits'.
|
|
64
|
+
*/
|
|
65
|
+
function withTraits(node, traitsWin) {
|
|
66
|
+
const traits = node['traits'];
|
|
67
|
+
if (!Array.isArray(traits))
|
|
68
|
+
return node;
|
|
69
|
+
let merged = traitsWin ? { ...node } : {};
|
|
70
|
+
for (const trait of traits)
|
|
71
|
+
merged = { ...merged, ...record(trait) };
|
|
72
|
+
merged = traitsWin ? merged : { ...merged, ...node };
|
|
73
|
+
delete merged['traits'];
|
|
74
|
+
return merged;
|
|
75
|
+
}
|
|
76
|
+
/** Follows local `$ref`s in the raw document, a bounded number of hops, to the node they name. */
|
|
77
|
+
export function deref(root, node) {
|
|
78
|
+
let current = node;
|
|
79
|
+
for (let hop = 0; hop < 16; hop += 1) {
|
|
80
|
+
const tokens = localRef(current);
|
|
81
|
+
if (tokens === undefined)
|
|
82
|
+
return current;
|
|
83
|
+
let target = root;
|
|
84
|
+
for (const token of tokens)
|
|
85
|
+
target = record(target)[token];
|
|
86
|
+
if (target === undefined)
|
|
87
|
+
return current;
|
|
88
|
+
current = target;
|
|
89
|
+
}
|
|
90
|
+
return current;
|
|
91
|
+
}
|
|
92
|
+
/** `{name}` placeholders replaced by each variable's default (else first enum value). */
|
|
93
|
+
export function substitute(template, variables) {
|
|
94
|
+
const vars = record(variables);
|
|
95
|
+
const unresolved = [];
|
|
96
|
+
const value = template.replace(/\{([^{}]+)\}/g, (whole, name) => {
|
|
97
|
+
const variable = record(vars[name]);
|
|
98
|
+
const chosen = scalarText(variable['default']) ?? texts(variable['enum'])?.[0];
|
|
99
|
+
if (chosen === undefined) {
|
|
100
|
+
if (!unresolved.includes(name))
|
|
101
|
+
unresolved.push(name);
|
|
102
|
+
return whole;
|
|
103
|
+
}
|
|
104
|
+
return chosen;
|
|
105
|
+
});
|
|
106
|
+
return { value, unresolved };
|
|
107
|
+
}
|
|
108
|
+
export function securityScheme(key, scheme) {
|
|
109
|
+
const type = str(scheme['type']) ?? 'unknown';
|
|
110
|
+
const description = str(scheme['description']);
|
|
111
|
+
const httpScheme = str(scheme['scheme']);
|
|
112
|
+
const bearerFormat = str(scheme['bearerFormat']);
|
|
113
|
+
const where = str(scheme['in']);
|
|
114
|
+
const name = str(scheme['name']);
|
|
115
|
+
const flow = firstFlow(scheme['flows']);
|
|
116
|
+
const openIdConnectUrl = str(scheme['openIdConnectUrl']);
|
|
117
|
+
return {
|
|
118
|
+
key,
|
|
119
|
+
type,
|
|
120
|
+
...(description !== undefined ? { description } : {}),
|
|
121
|
+
...(httpScheme !== undefined ? { scheme: httpScheme.toLowerCase() } : {}),
|
|
122
|
+
...(bearerFormat !== undefined ? { bearerFormat } : {}),
|
|
123
|
+
...(where !== undefined ? { in: where } : {}),
|
|
124
|
+
...(name !== undefined ? { name } : {}),
|
|
125
|
+
...flow,
|
|
126
|
+
...(openIdConnectUrl !== undefined ? { openIdConnectUrl } : {}),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
const FLOW_GRANTS = {
|
|
130
|
+
clientCredentials: 'client-credentials',
|
|
131
|
+
authorizationCode: 'authorization-code',
|
|
132
|
+
implicit: 'implicit',
|
|
133
|
+
password: 'password',
|
|
134
|
+
};
|
|
135
|
+
/** The first OAuth2 flow a scheme lists: its grant, endpoints and scope names (2.x `scopes`, 3.0 `availableScopes`). */
|
|
136
|
+
function firstFlow(flows) {
|
|
137
|
+
const first = entries(flows).find(([key]) => key in FLOW_GRANTS);
|
|
138
|
+
if (first === undefined)
|
|
139
|
+
return {};
|
|
140
|
+
const [key, flow] = first;
|
|
141
|
+
const tokenUrl = str(flow['tokenUrl']);
|
|
142
|
+
const authorizationUrl = str(flow['authorizationUrl']);
|
|
143
|
+
const scopes = Object.keys(record(flow['availableScopes'] ?? flow['scopes']));
|
|
144
|
+
return {
|
|
145
|
+
grant: FLOW_GRANTS[key],
|
|
146
|
+
...(tokenUrl !== undefined ? { tokenUrl } : {}),
|
|
147
|
+
...(authorizationUrl !== undefined ? { authorizationUrl } : {}),
|
|
148
|
+
scopes,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
/** A channel parameter from where its values live (the 2.x `schema`, or the 3.0 parameter itself). */
|
|
152
|
+
export function channelParameter(source) {
|
|
153
|
+
const def = scalarText(source['default']);
|
|
154
|
+
const allowed = texts(source['enum']);
|
|
155
|
+
const examples = texts(source['examples']);
|
|
156
|
+
return {
|
|
157
|
+
...(def !== undefined ? { default: def } : {}),
|
|
158
|
+
...(allowed !== undefined ? { enum: allowed } : {}),
|
|
159
|
+
...(examples !== undefined ? { examples } : {}),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
export function tagNames(value) {
|
|
163
|
+
if (!Array.isArray(value))
|
|
164
|
+
return [];
|
|
165
|
+
return value.map((tag) => str(record(tag)['name'])).filter((n) => n !== undefined);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* One message, traits merged in. Its name is its `name`, else its `title`, else its key. `payloadOf` pulls the schema (and a schema format carried with it) out of the
|
|
169
|
+
* version's payload shape.
|
|
170
|
+
*/
|
|
171
|
+
export function message(key, node, defaultContentType, payloadOf, traitsWin) {
|
|
172
|
+
node = withTraits(node, traitsWin);
|
|
173
|
+
const title = str(node['title']);
|
|
174
|
+
const { payload, schemaFormat } = payloadOf(node);
|
|
175
|
+
const examples = node['examples'];
|
|
176
|
+
const first = Array.isArray(examples) ? record(examples[0]) : {};
|
|
177
|
+
return {
|
|
178
|
+
key,
|
|
179
|
+
name: str(node['name']) ?? title ?? key,
|
|
180
|
+
...(title !== undefined ? { title } : {}),
|
|
181
|
+
contentType: str(node['contentType']) ?? defaultContentType,
|
|
182
|
+
...(schemaFormat !== undefined ? { schemaFormat } : {}),
|
|
183
|
+
...(payload !== undefined ? { payload } : {}),
|
|
184
|
+
...('payload' in first ? { example: first['payload'] } : {}),
|
|
185
|
+
};
|
|
186
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An AsyncAPI security scheme as one of the authentication kinds a WebSocket request already has.
|
|
3
|
+
*
|
|
4
|
+
* Only the shape is carried over — which kind, which key name, which endpoints. No secret is ever
|
|
5
|
+
* filled in: the user supplies it through the keychain as for any other request.
|
|
6
|
+
*/
|
|
7
|
+
import type { AuthConfig } from '../project/model.js';
|
|
8
|
+
import type { AsyncApiSecurityScheme, AsyncApiSkip } from './model.js';
|
|
9
|
+
/** What a scheme needs, as the tests and callers hand it: everything but the type is optional. */
|
|
10
|
+
export type AsyncApiSchemeInput = Pick<AsyncApiSecurityScheme, 'type'> & Partial<AsyncApiSecurityScheme>;
|
|
11
|
+
/** The auth a scheme maps to, or why it cannot be mapped. */
|
|
12
|
+
export declare function authFromScheme(scheme: AsyncApiSchemeInput): AuthConfig | AsyncApiSkip;
|
|
13
|
+
/** Whether {@link authFromScheme} answered with a skip rather than an auth. */
|
|
14
|
+
export declare function isSkip(value: AuthConfig | AsyncApiSkip): value is AsyncApiSkip;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An AsyncAPI security scheme as one of the authentication kinds a WebSocket request already has.
|
|
3
|
+
*
|
|
4
|
+
* Only the shape is carried over — which kind, which key name, which endpoints. No secret is ever
|
|
5
|
+
* filled in: the user supplies it through the keychain as for any other request.
|
|
6
|
+
*/
|
|
7
|
+
function skip(scheme, reason) {
|
|
8
|
+
return { where: `security ${scheme.key ?? scheme.type}`, reason };
|
|
9
|
+
}
|
|
10
|
+
/** The auth a scheme maps to, or why it cannot be mapped. */
|
|
11
|
+
export function authFromScheme(scheme) {
|
|
12
|
+
switch (scheme.type) {
|
|
13
|
+
case 'userPassword':
|
|
14
|
+
return { type: 'basic' };
|
|
15
|
+
case 'http':
|
|
16
|
+
if (scheme.scheme === 'basic')
|
|
17
|
+
return { type: 'basic' };
|
|
18
|
+
if (scheme.scheme === 'bearer')
|
|
19
|
+
return { type: 'bearer' };
|
|
20
|
+
return skip(scheme, `http ${scheme.scheme ?? '(no scheme)'} authentication is not supported`);
|
|
21
|
+
case 'httpApiKey':
|
|
22
|
+
if ((scheme.in === 'query' || scheme.in === 'header') && scheme.name !== undefined) {
|
|
23
|
+
return { type: 'api-key', name: scheme.name, in: scheme.in };
|
|
24
|
+
}
|
|
25
|
+
return skip(scheme, `an API key in ${scheme.in ?? 'an unstated place'} cannot be sent on a WebSocket handshake`);
|
|
26
|
+
case 'apiKey':
|
|
27
|
+
return skip(scheme, `an API key carried in the ${scheme.in ?? 'connection'} is not supported`);
|
|
28
|
+
case 'oauth2':
|
|
29
|
+
case 'openIdConnect': {
|
|
30
|
+
if (scheme.grant !== 'client-credentials' && scheme.grant !== 'authorization-code') {
|
|
31
|
+
return skip(scheme, scheme.grant === undefined
|
|
32
|
+
? `${scheme.type} names no flow Wirebench can run`
|
|
33
|
+
: `the OAuth2 ${scheme.grant} flow is not supported`);
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
type: 'oauth2',
|
|
37
|
+
grant: scheme.grant,
|
|
38
|
+
tokenUrl: scheme.tokenUrl ?? '',
|
|
39
|
+
...(scheme.authorizationUrl !== undefined ? { authorizationUrl: scheme.authorizationUrl } : {}),
|
|
40
|
+
clientId: '',
|
|
41
|
+
scopes: scheme.scopes ?? [],
|
|
42
|
+
clientAuth: 'basic',
|
|
43
|
+
pkce: true,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
case 'X509':
|
|
47
|
+
return skip(scheme, 'X509: set a client certificate in the request settings');
|
|
48
|
+
default:
|
|
49
|
+
return skip(scheme, `${scheme.type} authentication is not supported on WebSocket`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** Whether {@link authFromScheme} answered with a skip rather than an auth. */
|
|
53
|
+
export function isSkip(value) {
|
|
54
|
+
return 'reason' in value;
|
|
55
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Update Definition for an AsyncAPI-imported WebSocket API: a per-operation report of what a new
|
|
3
|
+
* version of the document changes, and applying it without losing anything the user made.
|
|
4
|
+
*
|
|
5
|
+
* The rule is the one gRPC and WSDL keep: **nothing is ever deleted.** A channel the document no
|
|
6
|
+
* longer has keeps its request, flagged `orphaned`; one that came back has the flag cleared. A value
|
|
7
|
+
* the mapping generated (URL, query, headers, subprotocols, a message sample, the API's URL and auth)
|
|
8
|
+
* follows the contract only while it still equals what the old contract generated; an edited one is
|
|
9
|
+
* kept, and for a message the new sample is added beside it as `<name> (updated)`.
|
|
10
|
+
*
|
|
11
|
+
* Pure: it compares through {@link mapAsyncApi}'s output and writes nothing.
|
|
12
|
+
*/
|
|
13
|
+
import type { IdGenerator } from '../project/model.js';
|
|
14
|
+
import { type WsApi } from '../ws/model.js';
|
|
15
|
+
import type { AsyncApiDocument } from './model.js';
|
|
16
|
+
export type AsyncApiChangeReason = 'address' | 'payload' | 'bindings' | 'security' | 'messages';
|
|
17
|
+
export interface AsyncApiOpRef {
|
|
18
|
+
readonly key: string;
|
|
19
|
+
readonly channel: string;
|
|
20
|
+
readonly direction: 'sent' | 'received';
|
|
21
|
+
}
|
|
22
|
+
export interface AsyncApiUpdatePlan {
|
|
23
|
+
readonly added: readonly AsyncApiOpRef[];
|
|
24
|
+
readonly removed: readonly AsyncApiOpRef[];
|
|
25
|
+
readonly changed: readonly {
|
|
26
|
+
readonly op: AsyncApiOpRef;
|
|
27
|
+
readonly reasons: readonly AsyncApiChangeReason[];
|
|
28
|
+
}[];
|
|
29
|
+
}
|
|
30
|
+
export interface ApplyAsyncApiUpdateOptions {
|
|
31
|
+
/** The server both versions are mapped against; defaults to the first WebSocket one. */
|
|
32
|
+
readonly server?: string;
|
|
33
|
+
readonly newId?: IdGenerator;
|
|
34
|
+
}
|
|
35
|
+
/** What {@link applyAsyncApiUpdate} did, in ids the caller can report or select. */
|
|
36
|
+
export interface AsyncApiApplyResult {
|
|
37
|
+
readonly api: WsApi;
|
|
38
|
+
readonly requestsAdded: readonly string[];
|
|
39
|
+
readonly requestsOrphaned: readonly string[];
|
|
40
|
+
readonly requestsRestored: readonly string[];
|
|
41
|
+
/** Requests where at least one generated field followed the contract. */
|
|
42
|
+
readonly requestsRewritten: readonly string[];
|
|
43
|
+
/** Untouched saved messages whose sample was replaced in place. */
|
|
44
|
+
readonly messagesReplaced: readonly string[];
|
|
45
|
+
/** Saved messages created: new outgoing messages and `<name> (updated)` beside edited ones. */
|
|
46
|
+
readonly messagesAdded: readonly string[];
|
|
47
|
+
}
|
|
48
|
+
/** Operations added, removed and changed between two versions, keyed by operation id. */
|
|
49
|
+
export declare function planAsyncApiUpdate(old: AsyncApiDocument, next: AsyncApiDocument): AsyncApiUpdatePlan;
|
|
50
|
+
/**
|
|
51
|
+
* Applies `next` to an API imported from `old`. Never deletes a request or a saved message.
|
|
52
|
+
*/
|
|
53
|
+
export declare function applyAsyncApiUpdate(api: WsApi, old: AsyncApiDocument, next: AsyncApiDocument, options?: ApplyAsyncApiUpdateOptions): AsyncApiApplyResult;
|