@wirebench/engine 2.2.0 → 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,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Import = parse + map, with the fetched documents handed back for the definition cache and the
|
|
3
|
+
* references that could not be followed added to the summary.
|
|
4
|
+
*/
|
|
5
|
+
import type { OpenApiSource } from '../json/schema/source.js';
|
|
6
|
+
import type { ResolvedDocument } from '../json/schema/refs.js';
|
|
7
|
+
import { type MapAsyncApiOptions, type MappedAsyncApi } from './map.js';
|
|
8
|
+
import type { AsyncApiDocument } from './model.js';
|
|
9
|
+
import { type ParseAsyncApiOptions } from './parse.js';
|
|
10
|
+
export interface ImportAsyncApiOptions extends ParseAsyncApiOptions, MapAsyncApiOptions {
|
|
11
|
+
}
|
|
12
|
+
export interface ImportedAsyncApi extends MappedAsyncApi {
|
|
13
|
+
/** Every file fetched, root first — what the definition cache stores. */
|
|
14
|
+
readonly documents: readonly ResolvedDocument[];
|
|
15
|
+
readonly declaredVersion: string;
|
|
16
|
+
/** The parsed document, for a caller that wants to map again with another server. */
|
|
17
|
+
readonly document: AsyncApiDocument;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Fetches, resolves, parses and maps one AsyncAPI document into a WebSocket API.
|
|
21
|
+
*
|
|
22
|
+
* @throws AsyncApiError the codes `parseAsyncApi` and `mapAsyncApi` throw; an `AbortError` when the
|
|
23
|
+
* signal fires
|
|
24
|
+
*/
|
|
25
|
+
export declare function importAsyncApi(source: OpenApiSource, options: ImportAsyncApiOptions): Promise<ImportedAsyncApi>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Import = parse + map, with the fetched documents handed back for the definition cache and the
|
|
3
|
+
* references that could not be followed added to the summary.
|
|
4
|
+
*/
|
|
5
|
+
import { mapAsyncApi } from './map.js';
|
|
6
|
+
import { parseAsyncApi } from './parse.js';
|
|
7
|
+
function sourceOf(source) {
|
|
8
|
+
if (source.kind === 'url')
|
|
9
|
+
return source.url;
|
|
10
|
+
if (source.kind === 'file')
|
|
11
|
+
return source.path;
|
|
12
|
+
return source.location ?? 'inline:asyncapi';
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Fetches, resolves, parses and maps one AsyncAPI document into a WebSocket API.
|
|
16
|
+
*
|
|
17
|
+
* @throws AsyncApiError the codes `parseAsyncApi` and `mapAsyncApi` throw; an `AbortError` when the
|
|
18
|
+
* signal fires
|
|
19
|
+
*/
|
|
20
|
+
export async function importAsyncApi(source, options) {
|
|
21
|
+
const parsed = await parseAsyncApi(source, options);
|
|
22
|
+
const mapped = mapAsyncApi(parsed.document, options);
|
|
23
|
+
const skipped = [
|
|
24
|
+
...mapped.summary.skipped,
|
|
25
|
+
...parsed.problems.map((problem) => ({ where: problem.at, reason: `${problem.ref}: ${problem.reason}` })),
|
|
26
|
+
];
|
|
27
|
+
return {
|
|
28
|
+
api: { ...mapped.api, definition: { kind: 'asyncapi', source: sourceOf(source), cache: true } },
|
|
29
|
+
summary: { ...mapped.summary, skipped },
|
|
30
|
+
documents: parsed.documents,
|
|
31
|
+
declaredVersion: parsed.document.declaredVersion,
|
|
32
|
+
document: parsed.document,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An AsyncAPI document as a WebSocket API: one request per WebSocket channel, a saved sample per
|
|
3
|
+
* message Wirebench sends on it, and the server's first mappable security scheme as the API's auth.
|
|
4
|
+
*
|
|
5
|
+
* Pure: the same document and ids give the same API. Everything the mapping cannot carry over is a
|
|
6
|
+
* line in the summary, never an error — except asking for a server the document does not have.
|
|
7
|
+
*/
|
|
8
|
+
import type { IdGenerator } from '../project/model.js';
|
|
9
|
+
import { type WsApi } from '../ws/model.js';
|
|
10
|
+
import type { AsyncApiDocument, AsyncApiSkip } from './model.js';
|
|
11
|
+
export interface MapAsyncApiOptions {
|
|
12
|
+
/** The server key to dial; defaults to the first `ws`/`wss` server. */
|
|
13
|
+
readonly server?: string;
|
|
14
|
+
readonly newId?: IdGenerator;
|
|
15
|
+
}
|
|
16
|
+
export interface AsyncApiImportSummary {
|
|
17
|
+
readonly declaredVersion: string;
|
|
18
|
+
readonly title: string;
|
|
19
|
+
/** The server the API's URL came from, when there was a WebSocket one. */
|
|
20
|
+
readonly server?: string;
|
|
21
|
+
/** Every server key the document lists, WebSocket or not. */
|
|
22
|
+
readonly servers: readonly string[];
|
|
23
|
+
readonly requests: number;
|
|
24
|
+
readonly messages: number;
|
|
25
|
+
readonly skipped: readonly AsyncApiSkip[];
|
|
26
|
+
/** Parameters and server variables left as `${name}` for the user to define. */
|
|
27
|
+
readonly unresolved: readonly string[];
|
|
28
|
+
/** JSON Schema keywords the contract check will not assert. */
|
|
29
|
+
readonly unsupportedKeywords: readonly string[];
|
|
30
|
+
}
|
|
31
|
+
export interface MappedAsyncApi {
|
|
32
|
+
readonly api: WsApi;
|
|
33
|
+
readonly summary: AsyncApiImportSummary;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Maps a parsed document to a WebSocket API.
|
|
37
|
+
*
|
|
38
|
+
* @throws AsyncApiError `asyncapi-server-unknown` when `options.server` names no WebSocket server
|
|
39
|
+
*/
|
|
40
|
+
export declare function mapAsyncApi(document: AsyncApiDocument, options?: MapAsyncApiOptions): MappedAsyncApi;
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An AsyncAPI document as a WebSocket API: one request per WebSocket channel, a saved sample per
|
|
3
|
+
* message Wirebench sends on it, and the server's first mappable security scheme as the API's auth.
|
|
4
|
+
*
|
|
5
|
+
* Pure: the same document and ids give the same API. Everything the mapping cannot carry over is a
|
|
6
|
+
* line in the summary, never an error — except asking for a server the document does not have.
|
|
7
|
+
*/
|
|
8
|
+
import { AsyncApiError } from '../errors.js';
|
|
9
|
+
import { unsupportedKeywordsIn } from '../json/schema-validate.js';
|
|
10
|
+
import { uniqueSlug } from '../project/paths.js';
|
|
11
|
+
import { entry } from '../http/entries.js';
|
|
12
|
+
import { sampleFromSchema } from '../json/schema/sample.js';
|
|
13
|
+
import { createWsApi, createWsFolder, createWsRequest, createWsSavedMessage, } from '../ws/model.js';
|
|
14
|
+
import { isJsonSchemaFormat, isRecord, record, str } from './read.js';
|
|
15
|
+
import { authFromScheme, isSkip } from './security.js';
|
|
16
|
+
const WS_PROTOCOLS = new Set(['ws', 'wss']);
|
|
17
|
+
const SUBPROTOCOL_HEADER = 'sec-websocket-protocol';
|
|
18
|
+
function isWsServer(server) {
|
|
19
|
+
return WS_PROTOCOLS.has(server.protocol.toLowerCase());
|
|
20
|
+
}
|
|
21
|
+
/** `{name}` placeholders as Wirebench properties, the names collected. */
|
|
22
|
+
function asProperties(text, unresolved) {
|
|
23
|
+
return text.replace(/\{([^{}]+)\}/g, (_whole, name) => {
|
|
24
|
+
unresolved.add(name);
|
|
25
|
+
return `\${${name}}`;
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
function channelUrl(channel, unresolved) {
|
|
29
|
+
if (channel.address === null)
|
|
30
|
+
return '';
|
|
31
|
+
return channel.address.replace(/\{([^{}]+)\}/g, (_whole, name) => {
|
|
32
|
+
const p = channel.parameters[name];
|
|
33
|
+
const chosen = p?.default ?? p?.enum?.[0] ?? p?.examples?.[0];
|
|
34
|
+
if (chosen !== undefined)
|
|
35
|
+
return chosen;
|
|
36
|
+
unresolved.add(name);
|
|
37
|
+
return `\${${name}}`;
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
function sampleText(value) {
|
|
41
|
+
if (typeof value === 'string')
|
|
42
|
+
return value;
|
|
43
|
+
return JSON.stringify(value) ?? '';
|
|
44
|
+
}
|
|
45
|
+
function sampleOf(schema) {
|
|
46
|
+
return isRecord(schema) ? sampleFromSchema(schema, { includeOptional: false, sampleValues: true }) : '';
|
|
47
|
+
}
|
|
48
|
+
/** `bindings.ws`: query and header properties as entries, `Sec-WebSocket-Protocol` as subprotocols. */
|
|
49
|
+
function wsBinding(channel, skipped) {
|
|
50
|
+
const binding = record(channel.bindings['ws']);
|
|
51
|
+
const where = `channel ${channel.key}`;
|
|
52
|
+
const method = str(binding['method']);
|
|
53
|
+
if (method !== undefined && method.toUpperCase() !== 'GET') {
|
|
54
|
+
skipped.push({ where, reason: `ws binding method ${method} is ignored: a handshake is always GET` });
|
|
55
|
+
}
|
|
56
|
+
const propertiesOf = (schema) => Object.entries(record(record(schema)['properties']));
|
|
57
|
+
const query = propertiesOf(binding['query']).map(([name, schema]) => entry(name, sampleText(sampleOf(schema))));
|
|
58
|
+
const headers = [];
|
|
59
|
+
const subprotocols = [];
|
|
60
|
+
for (const [name, schema] of propertiesOf(binding['headers'])) {
|
|
61
|
+
if (name.toLowerCase() !== SUBPROTOCOL_HEADER) {
|
|
62
|
+
headers.push(entry(name, sampleText(sampleOf(schema))));
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const s = record(schema);
|
|
66
|
+
const offered = typeof s['const'] === 'string' ? [s['const']] : Array.isArray(s['enum']) ? s['enum'] : [];
|
|
67
|
+
const names = offered.filter((v) => typeof v === 'string');
|
|
68
|
+
if (names.length === 0) {
|
|
69
|
+
skipped.push({ where, reason: 'Sec-WebSocket-Protocol has no const or enum to take a subprotocol from' });
|
|
70
|
+
}
|
|
71
|
+
subprotocols.push(...names);
|
|
72
|
+
}
|
|
73
|
+
return { query, headers, subprotocols };
|
|
74
|
+
}
|
|
75
|
+
/** Why a channel is not a WebSocket one, or undefined when it is. */
|
|
76
|
+
function notWebSocket(channel, servers) {
|
|
77
|
+
if (isRecord(channel.bindings['ws']))
|
|
78
|
+
return undefined;
|
|
79
|
+
const on = channel.servers === 'all' ? servers : servers.filter((s) => channel.servers.includes(s.key));
|
|
80
|
+
if (on.some(isWsServer))
|
|
81
|
+
return undefined;
|
|
82
|
+
const bindings = Object.keys(channel.bindings);
|
|
83
|
+
if (bindings.length > 0)
|
|
84
|
+
return `${bindings.join(', ')} binding: only WebSocket is imported`;
|
|
85
|
+
const protocols = [...new Set(on.map((s) => s.protocol))];
|
|
86
|
+
return protocols.length > 0
|
|
87
|
+
? `served over ${protocols.join(', ')}: only WebSocket is imported`
|
|
88
|
+
: 'no WebSocket server carries it';
|
|
89
|
+
}
|
|
90
|
+
/** The saved-message text for one outgoing message, or undefined when it gets no sample. */
|
|
91
|
+
function messageText(m) {
|
|
92
|
+
if (!isJsonSchemaFormat(m.schemaFormat))
|
|
93
|
+
return undefined;
|
|
94
|
+
const value = m.example !== undefined ? m.example : sampleOf(m.payload);
|
|
95
|
+
if (typeof value === 'string' && record(m.payload)['type'] === 'string')
|
|
96
|
+
return value;
|
|
97
|
+
return JSON.stringify(value, null, 2) ?? '';
|
|
98
|
+
}
|
|
99
|
+
function chooseServer(document, wanted) {
|
|
100
|
+
if (wanted === undefined)
|
|
101
|
+
return document.servers.find(isWsServer);
|
|
102
|
+
const server = document.servers.find((s) => s.key === wanted);
|
|
103
|
+
if (server === undefined || !isWsServer(server)) {
|
|
104
|
+
throw new AsyncApiError('asyncapi-server-unknown', `The document has no WebSocket server named ${wanted}`, {
|
|
105
|
+
details: { server: wanted },
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
return server;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Maps a parsed document to a WebSocket API.
|
|
112
|
+
*
|
|
113
|
+
* @throws AsyncApiError `asyncapi-server-unknown` when `options.server` names no WebSocket server
|
|
114
|
+
*/
|
|
115
|
+
export function mapAsyncApi(document, options = {}) {
|
|
116
|
+
const newId = options.newId;
|
|
117
|
+
const ids = newId !== undefined ? { newId } : {};
|
|
118
|
+
const skipped = [...document.notes];
|
|
119
|
+
const unresolved = new Set();
|
|
120
|
+
const unsupported = new Set();
|
|
121
|
+
const server = chooseServer(document, options.server);
|
|
122
|
+
for (const s of document.servers) {
|
|
123
|
+
if (!isWsServer(s))
|
|
124
|
+
skipped.push({ where: `server ${s.key}`, reason: `${s.protocol} server: only WebSocket is imported` });
|
|
125
|
+
}
|
|
126
|
+
if (server === undefined)
|
|
127
|
+
skipped.push({ where: 'servers', reason: 'no ws or wss server: the API has no URL' });
|
|
128
|
+
const url = server !== undefined ? asProperties(server.url, unresolved) : '';
|
|
129
|
+
let auth;
|
|
130
|
+
for (const scheme of server?.security ?? []) {
|
|
131
|
+
const mapped = authFromScheme(scheme);
|
|
132
|
+
if (isSkip(mapped)) {
|
|
133
|
+
skipped.push(mapped);
|
|
134
|
+
}
|
|
135
|
+
else if (auth === undefined) {
|
|
136
|
+
auth = mapped;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
skipped.push({ where: `security ${scheme.key}`, reason: `only the first scheme becomes the API's auth` });
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
const rootRequests = [];
|
|
143
|
+
const folders = new Map();
|
|
144
|
+
const requestSlugs = new Map();
|
|
145
|
+
let messageCount = 0;
|
|
146
|
+
let order = 0;
|
|
147
|
+
for (const channel of document.channels) {
|
|
148
|
+
const where = `channel ${channel.key}`;
|
|
149
|
+
const why = notWebSocket(channel, document.servers);
|
|
150
|
+
if (why !== undefined) {
|
|
151
|
+
skipped.push({ where, reason: why });
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
for (const key of Object.keys(channel.bindings)) {
|
|
155
|
+
if (key !== 'ws')
|
|
156
|
+
skipped.push({ where, reason: `${key} binding is ignored on a WebSocket channel` });
|
|
157
|
+
}
|
|
158
|
+
const binding = wsBinding(channel, skipped);
|
|
159
|
+
const operations = document.operations.filter((o) => o.channel === channel.key);
|
|
160
|
+
const messages = [];
|
|
161
|
+
const messageSlugs = new Set();
|
|
162
|
+
const seen = new Set();
|
|
163
|
+
for (const op of operations) {
|
|
164
|
+
for (const m of op.messages) {
|
|
165
|
+
if (isJsonSchemaFormat(m.schemaFormat))
|
|
166
|
+
for (const k of unsupportedKeywordsIn(m.payload))
|
|
167
|
+
unsupported.add(k);
|
|
168
|
+
if (op.direction !== 'sent' || seen.has(m.key))
|
|
169
|
+
continue;
|
|
170
|
+
seen.add(m.key);
|
|
171
|
+
const content = messageText(m);
|
|
172
|
+
if (content === undefined)
|
|
173
|
+
continue;
|
|
174
|
+
const slug = uniqueSlug(m.name, messageSlugs);
|
|
175
|
+
messageSlugs.add(slug);
|
|
176
|
+
messages.push(createWsSavedMessage(m.name, { ...ids, slug, content, contract: { message: m.key, generated: content } }));
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
messageCount += messages.length;
|
|
180
|
+
const tag = channel.tags[0];
|
|
181
|
+
const bucket = tag ?? '';
|
|
182
|
+
const slugs = requestSlugs.get(bucket) ?? new Set();
|
|
183
|
+
requestSlugs.set(bucket, slugs);
|
|
184
|
+
const slug = uniqueSlug(channel.key, slugs);
|
|
185
|
+
slugs.add(slug);
|
|
186
|
+
const request = createWsRequest(channel.key, {
|
|
187
|
+
...ids,
|
|
188
|
+
slug,
|
|
189
|
+
order: order++,
|
|
190
|
+
url: channelUrl(channel, unresolved),
|
|
191
|
+
query: binding.query,
|
|
192
|
+
headers: binding.headers,
|
|
193
|
+
subprotocols: binding.subprotocols,
|
|
194
|
+
messages,
|
|
195
|
+
contract: { channel: channel.key },
|
|
196
|
+
});
|
|
197
|
+
if (tag === undefined)
|
|
198
|
+
rootRequests.push(request);
|
|
199
|
+
else
|
|
200
|
+
folders.set(tag, [...(folders.get(tag) ?? []), request]);
|
|
201
|
+
}
|
|
202
|
+
const folderSlugs = new Set();
|
|
203
|
+
const folderList = [...folders].map(([name, requests], index) => {
|
|
204
|
+
const slug = uniqueSlug(name, folderSlugs);
|
|
205
|
+
folderSlugs.add(slug);
|
|
206
|
+
return createWsFolder(name, { ...ids, slug, order: index, requests });
|
|
207
|
+
});
|
|
208
|
+
const requestCount = rootRequests.length + folderList.reduce((n, f) => n + f.requests.length, 0);
|
|
209
|
+
const api = createWsApi(document.title, {
|
|
210
|
+
...ids,
|
|
211
|
+
url,
|
|
212
|
+
...(auth !== undefined ? { auth } : {}),
|
|
213
|
+
folders: folderList,
|
|
214
|
+
requests: rootRequests,
|
|
215
|
+
});
|
|
216
|
+
return {
|
|
217
|
+
api,
|
|
218
|
+
summary: {
|
|
219
|
+
declaredVersion: document.declaredVersion,
|
|
220
|
+
title: document.title,
|
|
221
|
+
...(server !== undefined ? { server: server.key } : {}),
|
|
222
|
+
servers: document.servers.map((s) => s.key),
|
|
223
|
+
requests: requestCount,
|
|
224
|
+
messages: messageCount,
|
|
225
|
+
skipped,
|
|
226
|
+
unresolved: [...unresolved],
|
|
227
|
+
unsupportedKeywords: [...unsupported].sort(),
|
|
228
|
+
},
|
|
229
|
+
};
|
|
230
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The version-neutral view of an AsyncAPI document that both normalisers (2.x and 3.0) produce.
|
|
3
|
+
*
|
|
4
|
+
* Directions are Wirebench's side of the conversation: the document describes an application, and
|
|
5
|
+
* Wirebench is its peer, so what the application receives is what Wirebench sends.
|
|
6
|
+
*/
|
|
7
|
+
export type AsyncApiVersion = '2' | '3';
|
|
8
|
+
/** One security scheme a server asks for, as the document states it. */
|
|
9
|
+
export interface AsyncApiSecurityScheme {
|
|
10
|
+
/** The name the document files it under (`components.securitySchemes` key). */
|
|
11
|
+
readonly key: string;
|
|
12
|
+
/** `http`, `httpApiKey`, `apiKey`, `userPassword`, `oauth2`, … — as written. */
|
|
13
|
+
readonly type: string;
|
|
14
|
+
readonly description?: string;
|
|
15
|
+
/** `http`: `basic`, `bearer`, …, lower-cased. */
|
|
16
|
+
readonly scheme?: string;
|
|
17
|
+
readonly bearerFormat?: string;
|
|
18
|
+
/** `httpApiKey` / `apiKey`: where the key travels (`query`, `header`, `cookie`, `user`, `password`). */
|
|
19
|
+
readonly in?: string;
|
|
20
|
+
/** `httpApiKey`: the parameter's name. */
|
|
21
|
+
readonly name?: string;
|
|
22
|
+
/** `oauth2` / `openIdConnect`: the first flow's endpoints and scope names. */
|
|
23
|
+
readonly grant?: 'client-credentials' | 'authorization-code' | 'implicit' | 'password';
|
|
24
|
+
readonly tokenUrl?: string;
|
|
25
|
+
readonly authorizationUrl?: string;
|
|
26
|
+
readonly scopes?: readonly string[];
|
|
27
|
+
/** `openIdConnect`: the discovery document. */
|
|
28
|
+
readonly openIdConnectUrl?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface AsyncApiServer {
|
|
31
|
+
readonly key: string;
|
|
32
|
+
/** The full URL, variables substituted by `default` (else the first `enum` value). */
|
|
33
|
+
readonly url: string;
|
|
34
|
+
readonly protocol: string;
|
|
35
|
+
readonly security: readonly AsyncApiSecurityScheme[];
|
|
36
|
+
/** Variables left as `{name}` in {@link url}: no default and no enum to take one from. */
|
|
37
|
+
readonly unresolvedVariables: readonly string[];
|
|
38
|
+
}
|
|
39
|
+
export interface AsyncApiMessage {
|
|
40
|
+
readonly key: string;
|
|
41
|
+
/** `name`, else `title`, else {@link key}. */
|
|
42
|
+
readonly name: string;
|
|
43
|
+
readonly title?: string;
|
|
44
|
+
readonly contentType: string;
|
|
45
|
+
readonly schemaFormat?: string;
|
|
46
|
+
readonly payload?: unknown;
|
|
47
|
+
readonly example?: unknown;
|
|
48
|
+
}
|
|
49
|
+
export interface AsyncApiOperation {
|
|
50
|
+
readonly key: string;
|
|
51
|
+
/** The key of the channel it runs on. */
|
|
52
|
+
readonly channel: string;
|
|
53
|
+
/** Wirebench's side: what the described application receives, Wirebench sends. */
|
|
54
|
+
readonly direction: 'sent' | 'received';
|
|
55
|
+
readonly messages: readonly AsyncApiMessage[];
|
|
56
|
+
}
|
|
57
|
+
export interface AsyncApiChannelParameter {
|
|
58
|
+
readonly default?: string;
|
|
59
|
+
readonly enum?: readonly string[];
|
|
60
|
+
readonly examples?: readonly string[];
|
|
61
|
+
}
|
|
62
|
+
export interface AsyncApiChannel {
|
|
63
|
+
readonly key: string;
|
|
64
|
+
readonly address: string | null;
|
|
65
|
+
/** The server keys it is available on, or every server. */
|
|
66
|
+
readonly servers: readonly string[] | 'all';
|
|
67
|
+
readonly parameters: Readonly<Record<string, AsyncApiChannelParameter>>;
|
|
68
|
+
readonly bindings: Readonly<Record<string, unknown>>;
|
|
69
|
+
readonly tags: readonly string[];
|
|
70
|
+
}
|
|
71
|
+
/** Something in the document that could not be mapped, and why. Never fatal. */
|
|
72
|
+
export interface AsyncApiSkip {
|
|
73
|
+
readonly where: string;
|
|
74
|
+
readonly reason: string;
|
|
75
|
+
}
|
|
76
|
+
export interface AsyncApiDocument {
|
|
77
|
+
readonly version: AsyncApiVersion;
|
|
78
|
+
readonly declaredVersion: string;
|
|
79
|
+
readonly title: string;
|
|
80
|
+
readonly servers: readonly AsyncApiServer[];
|
|
81
|
+
readonly channels: readonly AsyncApiChannel[];
|
|
82
|
+
readonly operations: readonly AsyncApiOperation[];
|
|
83
|
+
readonly notes: readonly AsyncApiSkip[];
|
|
84
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The version-neutral view of an AsyncAPI document that both normalisers (2.x and 3.0) produce.
|
|
3
|
+
*
|
|
4
|
+
* Directions are Wirebench's side of the conversation: the document describes an application, and
|
|
5
|
+
* Wirebench is its peer, so what the application receives is what Wirebench sends.
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AsyncAPI 2.x into the version-neutral view.
|
|
3
|
+
*
|
|
4
|
+
* In 2.x a channel's `publish` is what the described application accepts — so Wirebench, its peer,
|
|
5
|
+
* sends it — and `subscribe` is what the application emits, which Wirebench receives.
|
|
6
|
+
*/
|
|
7
|
+
import type { AsyncApiDocument } from './model.js';
|
|
8
|
+
import { type Json } from './read.js';
|
|
9
|
+
/**
|
|
10
|
+
* @param raw the parsed document before `$ref` inlining, where the keys references name still are
|
|
11
|
+
* @param resolved the same document with references inlined
|
|
12
|
+
*/
|
|
13
|
+
export declare function normaliseAsyncApi2(raw: Json, resolved: Json, declaredVersion: string): AsyncApiDocument;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AsyncAPI 2.x into the version-neutral view.
|
|
3
|
+
*
|
|
4
|
+
* In 2.x a channel's `publish` is what the described application accepts — so Wirebench, its peer,
|
|
5
|
+
* sends it — and `subscribe` is what the application emits, which Wirebench receives.
|
|
6
|
+
*/
|
|
7
|
+
import { channelParameter, deref, entries, isJsonSchemaFormat, isRecord, message, record, refKey, securityScheme, str, substitute, tagNames, } from './read.js';
|
|
8
|
+
const DIRECTIONS = [
|
|
9
|
+
['publish', 'sent'],
|
|
10
|
+
['subscribe', 'received'],
|
|
11
|
+
];
|
|
12
|
+
function payloadOf(node) {
|
|
13
|
+
const schemaFormat = str(node['schemaFormat']);
|
|
14
|
+
return {
|
|
15
|
+
...('payload' in node ? { payload: node['payload'] } : {}),
|
|
16
|
+
...(schemaFormat !== undefined ? { schemaFormat } : {}),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* @param raw the parsed document before `$ref` inlining, where the keys references name still are
|
|
21
|
+
* @param resolved the same document with references inlined
|
|
22
|
+
*/
|
|
23
|
+
export function normaliseAsyncApi2(raw, resolved, declaredVersion) {
|
|
24
|
+
const notes = [];
|
|
25
|
+
const defaultContentType = str(resolved['defaultContentType']) ?? 'application/json';
|
|
26
|
+
const schemes = record(record(resolved['components'])['securitySchemes']);
|
|
27
|
+
const servers = entries(resolved['servers']).map(([key, server]) => {
|
|
28
|
+
const protocol = str(server['protocol']) ?? '';
|
|
29
|
+
const written = str(server['url']) ?? '';
|
|
30
|
+
const { value, unresolved } = substitute(written, server['variables']);
|
|
31
|
+
const url = value.includes('://') || protocol === '' ? value : `${protocol}://${value}`;
|
|
32
|
+
const security = Array.isArray(server['security']) ? server['security'] : [];
|
|
33
|
+
return {
|
|
34
|
+
key,
|
|
35
|
+
url,
|
|
36
|
+
protocol,
|
|
37
|
+
security: security.flatMap((requirement) => Object.keys(record(requirement)).flatMap((name) => {
|
|
38
|
+
const scheme = schemes[name];
|
|
39
|
+
if (!isRecord(scheme)) {
|
|
40
|
+
notes.push({ where: `servers/${key}/security`, reason: `no security scheme named ${name}` });
|
|
41
|
+
return [];
|
|
42
|
+
}
|
|
43
|
+
return [securityScheme(name, scheme)];
|
|
44
|
+
})),
|
|
45
|
+
unresolvedVariables: unresolved,
|
|
46
|
+
};
|
|
47
|
+
});
|
|
48
|
+
const channels = [];
|
|
49
|
+
const operations = [];
|
|
50
|
+
const rawChannels = record(raw['channels']);
|
|
51
|
+
for (const [key, channel] of entries(resolved['channels'])) {
|
|
52
|
+
const listed = channel['servers'];
|
|
53
|
+
channels.push({
|
|
54
|
+
key,
|
|
55
|
+
address: key,
|
|
56
|
+
servers: Array.isArray(listed) && listed.length > 0 ? listed.filter((s) => typeof s === 'string') : 'all',
|
|
57
|
+
parameters: Object.fromEntries(entries(channel['parameters']).map(([name, parameter]) => [
|
|
58
|
+
name,
|
|
59
|
+
channelParameter(record(parameter['schema'])),
|
|
60
|
+
])),
|
|
61
|
+
bindings: record(channel['bindings']),
|
|
62
|
+
tags: tagNames(channel['tags']),
|
|
63
|
+
});
|
|
64
|
+
const rawChannel = record(deref(raw, rawChannels[key]));
|
|
65
|
+
for (const [verb, direction] of DIRECTIONS) {
|
|
66
|
+
const operation = channel[verb];
|
|
67
|
+
if (operation === undefined)
|
|
68
|
+
continue;
|
|
69
|
+
const where = `channels/${key}/${verb}`;
|
|
70
|
+
if (!isRecord(operation)) {
|
|
71
|
+
notes.push({ where, reason: 'the operation is not an object' });
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
const opKey = str(operation['operationId']) ?? `${key}#${verb}`;
|
|
75
|
+
const rawMessage = record(deref(raw, rawChannel[verb]))['message'];
|
|
76
|
+
const messages = messagesOf(raw, rawMessage, operation['message'], opKey, defaultContentType);
|
|
77
|
+
for (const m of messages) {
|
|
78
|
+
if (!isJsonSchemaFormat(m.schemaFormat)) {
|
|
79
|
+
notes.push({ where, reason: `message ${m.key} uses ${String(m.schemaFormat)}, which is not JSON Schema` });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (messages.length === 0) {
|
|
83
|
+
notes.push({ where, reason: 'the operation names no message' });
|
|
84
|
+
}
|
|
85
|
+
operations.push({ key: opKey, channel: key, direction, messages });
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
version: '2',
|
|
90
|
+
declaredVersion,
|
|
91
|
+
title: str(record(resolved['info'])['title']) ?? '',
|
|
92
|
+
servers,
|
|
93
|
+
channels,
|
|
94
|
+
operations,
|
|
95
|
+
notes,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
function messagesOf(raw, rawNode, node, opKey, defaultContentType) {
|
|
99
|
+
if (!isRecord(node))
|
|
100
|
+
return [];
|
|
101
|
+
const one = (rawOne, value, index) => {
|
|
102
|
+
if (!isRecord(value))
|
|
103
|
+
return [];
|
|
104
|
+
const key = refKey(rawOne) ?? str(value['messageId']) ?? str(value['name']) ?? `${opKey}#message${String(index)}`;
|
|
105
|
+
return [message(key, value, defaultContentType, payloadOf, true)];
|
|
106
|
+
};
|
|
107
|
+
const oneOf = node['oneOf'];
|
|
108
|
+
if (Array.isArray(oneOf)) {
|
|
109
|
+
const rawOneOf = record(deref(raw, rawNode))['oneOf'];
|
|
110
|
+
return oneOf.flatMap((value, index) => one(Array.isArray(rawOneOf) ? rawOneOf[index] : undefined, value, index));
|
|
111
|
+
}
|
|
112
|
+
return one(rawNode, node, 0);
|
|
113
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
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 type { AsyncApiDocument } from './model.js';
|
|
9
|
+
import { type Json } from './read.js';
|
|
10
|
+
/**
|
|
11
|
+
* @param raw the parsed document before `$ref` inlining, where the keys references name still are
|
|
12
|
+
* @param resolved the same document with references inlined
|
|
13
|
+
*/
|
|
14
|
+
export declare function normaliseAsyncApi3(raw: Json, resolved: Json, declaredVersion: string): AsyncApiDocument;
|