@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
|
@@ -7,24 +7,13 @@
|
|
|
7
7
|
* importOpenApi} then adds the mapping from `map.ts`, so a caller that already has the text (a
|
|
8
8
|
* re-import from the cache, a test) can do either half on its own.
|
|
9
9
|
*/
|
|
10
|
-
import type { FetchDocument } from '../../
|
|
10
|
+
import type { FetchDocument } from '../../http/fetch-document.js';
|
|
11
|
+
import type { OpenApiSource } from '../../json/schema/source.js';
|
|
12
|
+
import type { WebhookFolder } from '../../webhooks/model.js';
|
|
11
13
|
import type { MapApiOptions, MappedApi } from './map.js';
|
|
12
14
|
import type { OpenApiDocument } from './model.js';
|
|
13
|
-
import { type RefProblem, type ResolvedDocument } from '
|
|
14
|
-
|
|
15
|
-
export type OpenApiSource = {
|
|
16
|
-
readonly kind: 'url';
|
|
17
|
-
readonly url: string;
|
|
18
|
-
} | {
|
|
19
|
-
readonly kind: 'file';
|
|
20
|
-
readonly path: string;
|
|
21
|
-
}
|
|
22
|
-
/** Text with a location to resolve relative references against — a paste, or a test. */
|
|
23
|
-
| {
|
|
24
|
-
readonly kind: 'text';
|
|
25
|
-
readonly text: string;
|
|
26
|
-
readonly location?: string;
|
|
27
|
-
};
|
|
15
|
+
import { type RefProblem, type ResolvedDocument } from '../../json/schema/refs.js';
|
|
16
|
+
export type { OpenApiSource };
|
|
28
17
|
export interface ParseOpenApiOptions {
|
|
29
18
|
readonly fetchDocument: FetchDocument;
|
|
30
19
|
readonly signal?: AbortSignal;
|
|
@@ -46,6 +35,10 @@ export interface ParsedOpenApi {
|
|
|
46
35
|
export declare function parseOpenApi(source: OpenApiSource, options: ParseOpenApiOptions): Promise<ParsedOpenApi>;
|
|
47
36
|
/** Options for {@link importOpenApi}: how to fetch, and how to map what was fetched. */
|
|
48
37
|
export interface ImportOpenApiOptions extends ParseOpenApiOptions, MapApiOptions {
|
|
38
|
+
/** Also map the document's webhooks and callbacks into a group. Defaults to `true`. */
|
|
39
|
+
readonly webhooks?: boolean;
|
|
40
|
+
/** The id the webhook group links back to. Defaults to the imported API's own id. */
|
|
41
|
+
readonly apiId?: string;
|
|
49
42
|
}
|
|
50
43
|
/** An imported API, every document it was made of, and what the mapping could not use. */
|
|
51
44
|
export interface ImportedOpenApi extends MappedApi {
|
|
@@ -55,6 +48,8 @@ export interface ImportedOpenApi extends MappedApi {
|
|
|
55
48
|
readonly refProblems: readonly RefProblem[];
|
|
56
49
|
/** The document itself, for a caller that wants to offer a choice and map again. */
|
|
57
50
|
readonly document: OpenApiDocument;
|
|
51
|
+
/** The document's webhooks and callbacks, mapped into one group, when there were any to map. */
|
|
52
|
+
readonly webhooks?: WebhookFolder;
|
|
58
53
|
}
|
|
59
54
|
/**
|
|
60
55
|
* Fetches, resolves, parses and maps one OpenAPI document into an API.
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
* re-import from the cache, a test) can do either half on its own.
|
|
9
9
|
*/
|
|
10
10
|
import { OpenApiError } from '../../errors.js';
|
|
11
|
-
import { apiFromDocument } from './map.js';
|
|
11
|
+
import { apiFromDocument, webhooksFromDocument } from './map.js';
|
|
12
12
|
import { parseOpenApiDocument } from './parse.js';
|
|
13
|
-
import { resolveRefs } from '
|
|
13
|
+
import { resolveRefs } from '../../json/schema/refs.js';
|
|
14
14
|
/** The absolute location a source resolves references against. */
|
|
15
15
|
function locationOf(source) {
|
|
16
16
|
if (source.kind === 'url') {
|
|
@@ -73,8 +73,11 @@ export async function parseOpenApi(source, options) {
|
|
|
73
73
|
export async function importOpenApi(source, options) {
|
|
74
74
|
const parsed = await parseOpenApi(source, options);
|
|
75
75
|
const mapped = apiFromDocument(parsed.document, options);
|
|
76
|
+
const webhookOptions = { ...options, apiId: options.apiId ?? mapped.api.id };
|
|
77
|
+
const hooks = options.webhooks === false ? undefined : webhooksFromDocument(parsed.document, webhookOptions);
|
|
76
78
|
const skipped = [
|
|
77
79
|
...mapped.summary.skipped,
|
|
80
|
+
...(hooks?.skipped ?? []),
|
|
78
81
|
...parsed.refProblems.map((problem) => ({
|
|
79
82
|
kind: 'reference',
|
|
80
83
|
where: problem.at,
|
|
@@ -87,5 +90,6 @@ export async function importOpenApi(source, options) {
|
|
|
87
90
|
documents: parsed.documents,
|
|
88
91
|
refProblems: parsed.refProblems,
|
|
89
92
|
document: parsed.document,
|
|
93
|
+
...(hooks !== undefined ? { webhooks: hooks.folder } : {}),
|
|
90
94
|
};
|
|
91
95
|
}
|
|
@@ -12,8 +12,10 @@
|
|
|
12
12
|
* the summary rather than dropped in silence.
|
|
13
13
|
*/
|
|
14
14
|
import type { AuthConfig, IdGenerator } from '../../project/model.js';
|
|
15
|
+
import type { HookLink } from '../../webhooks/model.js';
|
|
16
|
+
import { type WebhookFolder } from '../../webhooks/model.js';
|
|
15
17
|
import type { RestApi, RestDefinitionRef, RestServer } from '../model.js';
|
|
16
|
-
import type { OpenApiDocument, OpenApiSecurityScheme, OpenApiSkipped } from './model.js';
|
|
18
|
+
import type { OpenApiDocument, OpenApiOperation, OpenApiSecurityScheme, OpenApiSkipped } from './model.js';
|
|
17
19
|
/** How the caller wants the document read. Every field has a documented default. */
|
|
18
20
|
export interface MapApiOptions {
|
|
19
21
|
/** The API's name. Defaults to `info.title`, which the import dialog offers for editing. */
|
|
@@ -68,6 +70,8 @@ export interface OpenApiImportSummary {
|
|
|
68
70
|
readonly folders: number;
|
|
69
71
|
readonly requests: number;
|
|
70
72
|
readonly deprecated: number;
|
|
73
|
+
/** Every webhook and callback method the document offers, whether or not this import maps them. */
|
|
74
|
+
readonly webhooks: number;
|
|
71
75
|
/** The auth the API ended up with, by type, when it got any. */
|
|
72
76
|
readonly auth?: AuthConfig['type'];
|
|
73
77
|
/** Every scheme the document declares, so the dialog can offer a different one. */
|
|
@@ -93,6 +97,39 @@ export declare function mapScheme(scheme: OpenApiSecurityScheme): {
|
|
|
93
97
|
};
|
|
94
98
|
/** {@link mapScheme}, recording in `skipped` when the scheme the import needed has no equivalent. */
|
|
95
99
|
export declare function authFromScheme(scheme: OpenApiSecurityScheme, skipped: OpenApiSkipped[]): AuthConfig | undefined;
|
|
100
|
+
/** One webhook or callback method a document offers, keyed as *Update definition* matches it. */
|
|
101
|
+
export interface WebhookItemRef {
|
|
102
|
+
readonly key: string;
|
|
103
|
+
readonly kind: 'webhook' | 'callback';
|
|
104
|
+
readonly name: string;
|
|
105
|
+
readonly method: string;
|
|
106
|
+
readonly operation?: string;
|
|
107
|
+
readonly expression?: string;
|
|
108
|
+
readonly label: string;
|
|
109
|
+
}
|
|
110
|
+
/** A document's webhook and callback methods with their operations. Internal to the OpenAPI modules. */
|
|
111
|
+
export declare function webhookSourcesOf(document: OpenApiDocument): {
|
|
112
|
+
readonly ref: WebhookItemRef;
|
|
113
|
+
readonly operation: OpenApiOperation;
|
|
114
|
+
readonly link: HookLink;
|
|
115
|
+
/** The item's own name for the first method, `name (METHOD)` for a later one — no parent label. */
|
|
116
|
+
readonly displayName: string;
|
|
117
|
+
}[];
|
|
118
|
+
/** Every webhook and callback method `document` offers, in document order. */
|
|
119
|
+
export declare function webhookItemsOf(document: OpenApiDocument): WebhookItemRef[];
|
|
120
|
+
/** Options for {@link webhooksFromDocument}. */
|
|
121
|
+
export interface MapWebhooksOptions extends MapApiOptions {
|
|
122
|
+
/** The API the group is linked to. */
|
|
123
|
+
readonly apiId: string;
|
|
124
|
+
/** Keys ({@link WebhookItemRef.key}) to keep; all when absent. */
|
|
125
|
+
readonly only?: ReadonlySet<string>;
|
|
126
|
+
}
|
|
127
|
+
/** The document's webhooks and callbacks as one group for the project's webhook collection. */
|
|
128
|
+
export declare function webhooksFromDocument(document: OpenApiDocument, options: MapWebhooksOptions): {
|
|
129
|
+
readonly folder: WebhookFolder;
|
|
130
|
+
readonly items: number;
|
|
131
|
+
readonly skipped: readonly OpenApiSkipped[];
|
|
132
|
+
} | undefined;
|
|
96
133
|
/**
|
|
97
134
|
* Maps a parsed document onto one API.
|
|
98
135
|
*
|
package/dist/rest/openapi/map.js
CHANGED
|
@@ -13,11 +13,12 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import { generateId } from '../../project/model.js';
|
|
15
15
|
import { slugify, uniqueSlug } from '../../project/paths.js';
|
|
16
|
+
import { createWebhookFolder, hookKey } from '../../webhooks/model.js';
|
|
16
17
|
import { createApi, createFolder, createRestRequest, entry, RAW_LANGUAGE_CONTENT_TYPES } from '../model.js';
|
|
17
18
|
import { HTTP_METHODS, serverUrl } from './model.js';
|
|
18
|
-
import { sampleFromSchema, sampleXml } from '
|
|
19
|
+
import { sampleFromSchema, sampleXml } from '../../json/schema/sample.js';
|
|
19
20
|
/** Header parameters OpenAPI itself says to ignore, because the message decides them. */
|
|
20
|
-
const RESERVED_HEADERS = new Set(['accept', 'content-type', 'authorization']);
|
|
21
|
+
const RESERVED_HEADERS = new Set(['accept', 'content-type', 'authorization', 'cookie']);
|
|
21
22
|
/** The media types a *Binary* body is the honest reading of. */
|
|
22
23
|
function isBinaryMedia(type, schema) {
|
|
23
24
|
if (schema?.format === 'binary') {
|
|
@@ -92,17 +93,26 @@ function parameterRows(operation, location, options, skipped) {
|
|
|
92
93
|
}
|
|
93
94
|
return rows;
|
|
94
95
|
}
|
|
95
|
-
/**
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
96
|
+
/**
|
|
97
|
+
* Cookie parameters, and an API key the operation's scheme puts in a cookie, as one `Cookie`
|
|
98
|
+
* header row: this client has no cookie table, and a header is how a cookie travels anyway. Off,
|
|
99
|
+
* like every imported header, and an API key's value is left blank — secrets are never invented.
|
|
100
|
+
*/
|
|
101
|
+
function cookieHeader(operation, scheme, options) {
|
|
102
|
+
const pairs = operation.parameters
|
|
103
|
+
.filter((parameter) => parameter.in === 'cookie')
|
|
104
|
+
.map((parameter) => `${parameter.name}=${parameterValue(parameter, options)}`);
|
|
105
|
+
if (scheme?.type === 'apiKey' && scheme.in === 'cookie' && scheme.keyName !== undefined) {
|
|
106
|
+
pairs.push(`${scheme.keyName}=`);
|
|
107
|
+
}
|
|
108
|
+
return pairs.length === 0 ? [] : [entry('Cookie', pairs.join('; '), { enabled: false })];
|
|
109
|
+
}
|
|
110
|
+
/** The scheme an operation is sent under: its own when it states one, else the one the API was given. */
|
|
111
|
+
function effectiveScheme(operation, document, apiScheme) {
|
|
112
|
+
if (operation.security !== undefined) {
|
|
113
|
+
return schemeOfRequirement(operation.security, document.securitySchemes);
|
|
105
114
|
}
|
|
115
|
+
return apiScheme;
|
|
106
116
|
}
|
|
107
117
|
/** The media type an operation's body is built from, under {@link BODY_PREFERENCE}. */
|
|
108
118
|
function preferredMedia(content) {
|
|
@@ -218,7 +228,7 @@ export function mapScheme(scheme) {
|
|
|
218
228
|
if (scheme.in === 'header' || scheme.in === 'query') {
|
|
219
229
|
return { auth: { type: 'api-key', name: scheme.keyName ?? '', in: scheme.in } };
|
|
220
230
|
}
|
|
221
|
-
return { reason: 'An API key in a cookie is
|
|
231
|
+
return { reason: 'An API key in a cookie is sent as a Cookie header on each request instead' };
|
|
222
232
|
case 'oauth2': {
|
|
223
233
|
const clientCredentials = scheme.flows?.clientCredentials;
|
|
224
234
|
const authorizationCode = scheme.flows?.authorizationCode;
|
|
@@ -340,6 +350,122 @@ function groupByFolder(operations) {
|
|
|
340
350
|
}
|
|
341
351
|
return groups;
|
|
342
352
|
}
|
|
353
|
+
/**
|
|
354
|
+
* One operation as a request. Shared by an API's own paths and by a webhook group's items —
|
|
355
|
+
* `overrides` is how the latter departs: its own name and URL, a {@link HookLink} instead of a
|
|
356
|
+
* `contract`, and no path parameters, since a webhook or callback URL is the caller's to fill in.
|
|
357
|
+
*/
|
|
358
|
+
function requestFromOperation(operation, order, taken, context, overrides) {
|
|
359
|
+
const { document, options, newId, skipped, counts } = context;
|
|
360
|
+
if (operation.deprecated === true) {
|
|
361
|
+
counts.deprecated += 1;
|
|
362
|
+
}
|
|
363
|
+
counts.requests += 1;
|
|
364
|
+
const label = overrides?.name ?? requestName(operation);
|
|
365
|
+
const auth = operationAuth(operation, document, skipped);
|
|
366
|
+
const description = requestDescription(operation);
|
|
367
|
+
return createRestRequest(label, {
|
|
368
|
+
id: newId(),
|
|
369
|
+
slug: uniqueSlug(label, taken),
|
|
370
|
+
order,
|
|
371
|
+
method: HTTP_METHODS.includes(operation.method.toLowerCase()) ? operation.method.toUpperCase() : operation.method,
|
|
372
|
+
url: overrides?.url ?? operation.path,
|
|
373
|
+
...(description !== undefined ? { description } : {}),
|
|
374
|
+
pathParams: overrides !== undefined ? [] : parameterRows(operation, 'path', options, skipped),
|
|
375
|
+
query: parameterRows(operation, 'query', options, skipped),
|
|
376
|
+
headers: [
|
|
377
|
+
...parameterRows(operation, 'header', options, skipped),
|
|
378
|
+
...cookieHeader(operation, effectiveScheme(operation, document, context.apiScheme), options),
|
|
379
|
+
],
|
|
380
|
+
body: bodyOf(operation, options, skipped),
|
|
381
|
+
...(auth !== undefined ? { auth } : {}),
|
|
382
|
+
...(overrides !== undefined
|
|
383
|
+
? { hook: overrides.hook }
|
|
384
|
+
: { contract: { method: operation.method.toLowerCase(), path: operation.path } }),
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
/** A document's webhook and callback methods with their operations. Internal to the OpenAPI modules. */
|
|
388
|
+
export function webhookSourcesOf(document) {
|
|
389
|
+
const sources = [];
|
|
390
|
+
const named = (name, method, first) => (first ? name : `${name} (${method.toUpperCase()})`);
|
|
391
|
+
for (const hook of document.webhooks ?? []) {
|
|
392
|
+
hook.operations.forEach((operation, index) => {
|
|
393
|
+
const link = { kind: 'webhook', name: hook.name };
|
|
394
|
+
const displayName = named(hook.name, operation.method, index === 0);
|
|
395
|
+
sources.push({
|
|
396
|
+
operation,
|
|
397
|
+
link,
|
|
398
|
+
displayName,
|
|
399
|
+
ref: {
|
|
400
|
+
key: hookKey(link, operation.method),
|
|
401
|
+
kind: 'webhook',
|
|
402
|
+
name: hook.name,
|
|
403
|
+
method: operation.method,
|
|
404
|
+
label: displayName,
|
|
405
|
+
},
|
|
406
|
+
});
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
for (const parent of document.operations) {
|
|
410
|
+
const parentKey = `${parent.method.toLowerCase()} ${parent.path}`;
|
|
411
|
+
const parentLabel = parent.operationId ?? `${parent.method.toUpperCase()} ${parent.path}`;
|
|
412
|
+
for (const callback of parent.callbacks ?? []) {
|
|
413
|
+
callback.operations.forEach((operation, index) => {
|
|
414
|
+
const link = {
|
|
415
|
+
kind: 'callback',
|
|
416
|
+
operation: parentKey,
|
|
417
|
+
name: callback.name,
|
|
418
|
+
expression: callback.expression,
|
|
419
|
+
};
|
|
420
|
+
const displayName = named(callback.name, operation.method, index === 0);
|
|
421
|
+
sources.push({
|
|
422
|
+
operation,
|
|
423
|
+
link,
|
|
424
|
+
displayName,
|
|
425
|
+
ref: {
|
|
426
|
+
key: hookKey(link, operation.method),
|
|
427
|
+
kind: 'callback',
|
|
428
|
+
name: callback.name,
|
|
429
|
+
method: operation.method,
|
|
430
|
+
operation: parentKey,
|
|
431
|
+
expression: callback.expression,
|
|
432
|
+
label: `${displayName} · ${parentLabel}`,
|
|
433
|
+
},
|
|
434
|
+
});
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
return sources;
|
|
439
|
+
}
|
|
440
|
+
/** Every webhook and callback method `document` offers, in document order. */
|
|
441
|
+
export function webhookItemsOf(document) {
|
|
442
|
+
return webhookSourcesOf(document).map((source) => source.ref);
|
|
443
|
+
}
|
|
444
|
+
/** The document's webhooks and callbacks as one group for the project's webhook collection. */
|
|
445
|
+
export function webhooksFromDocument(document, options) {
|
|
446
|
+
const chosen = webhookSourcesOf(document).filter((source) => options.only?.has(source.ref.key) ?? true);
|
|
447
|
+
if (chosen.length === 0)
|
|
448
|
+
return undefined;
|
|
449
|
+
const newId = options.newId ?? generateId;
|
|
450
|
+
const context = { document, options, newId, skipped: [], counts: { requests: 0, deprecated: 0 } };
|
|
451
|
+
const taken = new Set();
|
|
452
|
+
const requests = chosen.map((source, index) => {
|
|
453
|
+
const request = requestFromOperation(source.operation, index, taken, context, {
|
|
454
|
+
name: source.displayName,
|
|
455
|
+
url: `/${source.ref.name}`,
|
|
456
|
+
hook: source.link,
|
|
457
|
+
});
|
|
458
|
+
taken.add(request.slug);
|
|
459
|
+
return request;
|
|
460
|
+
});
|
|
461
|
+
const title = document.info.title.trim();
|
|
462
|
+
const name = options.name?.trim() ?? (title.length > 0 ? title : 'API');
|
|
463
|
+
return {
|
|
464
|
+
folder: createWebhookFolder(name, { id: newId(), source: { apiId: options.apiId }, requests }),
|
|
465
|
+
items: requests.length,
|
|
466
|
+
skipped: context.skipped,
|
|
467
|
+
};
|
|
468
|
+
}
|
|
343
469
|
/**
|
|
344
470
|
* Maps a parsed document onto one API.
|
|
345
471
|
*
|
|
@@ -368,35 +494,18 @@ export function apiFromDocument(document, options = {}) {
|
|
|
368
494
|
const folders = [];
|
|
369
495
|
const folderSlugs = new Set();
|
|
370
496
|
const rootSlugs = new Set();
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
}
|
|
378
|
-
requests += 1;
|
|
379
|
-
const label = requestName(operation);
|
|
380
|
-
const auth = operationAuth(operation, document, skipped);
|
|
381
|
-
const description = requestDescription(operation);
|
|
382
|
-
return createRestRequest(label, {
|
|
383
|
-
id: newId(),
|
|
384
|
-
slug: uniqueSlug(label, taken),
|
|
385
|
-
order,
|
|
386
|
-
method: HTTP_METHODS.includes(operation.method.toLowerCase()) ? operation.method.toUpperCase() : operation.method,
|
|
387
|
-
url: operation.path,
|
|
388
|
-
...(description !== undefined ? { description } : {}),
|
|
389
|
-
pathParams: parameterRows(operation, 'path', options, skipped),
|
|
390
|
-
query: parameterRows(operation, 'query', options, skipped),
|
|
391
|
-
headers: parameterRows(operation, 'header', options, skipped),
|
|
392
|
-
body: bodyOf(operation, options, skipped),
|
|
393
|
-
...(auth !== undefined ? { auth } : {}),
|
|
394
|
-
});
|
|
497
|
+
const context = {
|
|
498
|
+
document,
|
|
499
|
+
options,
|
|
500
|
+
newId,
|
|
501
|
+
skipped,
|
|
502
|
+
counts: { requests: 0, deprecated: 0 },
|
|
503
|
+
...(chosenScheme !== undefined ? { apiScheme: chosenScheme } : {}),
|
|
395
504
|
};
|
|
396
505
|
for (const [folderName, operations] of groups) {
|
|
397
506
|
if (folderName === undefined) {
|
|
398
507
|
operations.forEach((operation, index) => {
|
|
399
|
-
const request =
|
|
508
|
+
const request = requestFromOperation(operation, index, rootSlugs, context);
|
|
400
509
|
rootSlugs.add(request.slug);
|
|
401
510
|
rootRequests.push(request);
|
|
402
511
|
});
|
|
@@ -404,7 +513,7 @@ export function apiFromDocument(document, options = {}) {
|
|
|
404
513
|
}
|
|
405
514
|
const taken = new Set();
|
|
406
515
|
const inside = operations.map((operation, index) => {
|
|
407
|
-
const request =
|
|
516
|
+
const request = requestFromOperation(operation, index, taken, context);
|
|
408
517
|
taken.add(request.slug);
|
|
409
518
|
return request;
|
|
410
519
|
});
|
|
@@ -441,8 +550,9 @@ export function apiFromDocument(document, options = {}) {
|
|
|
441
550
|
baseUrl,
|
|
442
551
|
servers,
|
|
443
552
|
folders: folders.length,
|
|
444
|
-
requests,
|
|
445
|
-
deprecated,
|
|
553
|
+
requests: context.counts.requests,
|
|
554
|
+
deprecated: context.counts.deprecated,
|
|
555
|
+
webhooks: webhookItemsOf(document).length,
|
|
446
556
|
...(apiAuth !== undefined ? { auth: apiAuth.type } : {}),
|
|
447
557
|
securitySchemes: document.securitySchemes.map((scheme) => {
|
|
448
558
|
const mapped = mapScheme(scheme);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Finding the operation of a definition a request calls, from its method and URL alone.
|
|
3
|
+
*
|
|
4
|
+
* Variables cannot be expanded here, so a `{{…}}` or `${…}` in the URL is opaque: at the start it
|
|
5
|
+
* stands for a base URL, and as a whole segment it matches any segment, as a `{param}` does. Pure,
|
|
6
|
+
* so the importer, the editor and the tests share it.
|
|
7
|
+
*/
|
|
8
|
+
/** An operation as the definition names it: the lower-case method and the templated path. */
|
|
9
|
+
export interface RestOperationRef {
|
|
10
|
+
readonly method: string;
|
|
11
|
+
readonly path: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* The one operation `method` and `url` call. As in OpenAPI, a concrete path wins over a templated
|
|
15
|
+
* one: of several matches, the one with the most literal segments; `undefined` on a tie or no match.
|
|
16
|
+
* A URL whose host matches no server still matches by path, once its origin is dropped and, if it
|
|
17
|
+
* starts with one, a server's own path prefix.
|
|
18
|
+
* `baseUrls` are the API's servers and base URL; the longest one the URL starts with is stripped.
|
|
19
|
+
*/
|
|
20
|
+
export declare function matchOperation(operations: readonly RestOperationRef[], method: string, url: string, baseUrls: readonly string[]): RestOperationRef | undefined;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Finding the operation of a definition a request calls, from its method and URL alone.
|
|
3
|
+
*
|
|
4
|
+
* Variables cannot be expanded here, so a `{{…}}` or `${…}` in the URL is opaque: at the start it
|
|
5
|
+
* stands for a base URL, and as a whole segment it matches any segment, as a `{param}` does. Pure,
|
|
6
|
+
* so the importer, the editor and the tests share it.
|
|
7
|
+
*/
|
|
8
|
+
const VARIABLE = /^(?:\{\{[^}]*\}\}|\$\{[^}]*\}|\{[^}]*\})$/;
|
|
9
|
+
const LEADING_VARIABLE = /^(?:\{\{[^}]*\}\}|\$\{[^}]*\})/;
|
|
10
|
+
const ORIGIN = /^[a-z][a-z0-9+.-]*:\/\/[^/?#]*/i;
|
|
11
|
+
function withoutQuery(url) {
|
|
12
|
+
const end = url.search(/[?#]/);
|
|
13
|
+
return end === -1 ? url : url.slice(0, end);
|
|
14
|
+
}
|
|
15
|
+
/** `value` without trailing slashes; a loop, since `/\/+$/` backtracks on a long run of them. */
|
|
16
|
+
function trimSlash(value) {
|
|
17
|
+
let end = value.length;
|
|
18
|
+
while (end > 0 && value.charCodeAt(end - 1) === 47 /* '/' */) {
|
|
19
|
+
end -= 1;
|
|
20
|
+
}
|
|
21
|
+
return value.slice(0, end);
|
|
22
|
+
}
|
|
23
|
+
/** The URL's path relative to the API: the longest matching base URL, a leading variable, or the origin gone. */
|
|
24
|
+
function relativePath(url, baseUrls) {
|
|
25
|
+
const bases = baseUrls
|
|
26
|
+
.map((base) => trimSlash(withoutQuery(base.trim())))
|
|
27
|
+
.filter((base) => base.length > 0)
|
|
28
|
+
.sort((a, b) => b.length - a.length);
|
|
29
|
+
for (const base of bases) {
|
|
30
|
+
if (url === base || url.startsWith(`${base}/`)) {
|
|
31
|
+
return url.slice(base.length);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const variable = LEADING_VARIABLE.exec(url);
|
|
35
|
+
if (variable !== null) {
|
|
36
|
+
return url.slice(variable[0].length);
|
|
37
|
+
}
|
|
38
|
+
const origin = ORIGIN.exec(url);
|
|
39
|
+
const path = origin === null ? url : url.slice(origin[0].length);
|
|
40
|
+
// No base matched whole, as when the URL is sent to another host (staging, a mock) than the
|
|
41
|
+
// servers name: a base's own path prefix (`/v1`) is still not part of the operation's path.
|
|
42
|
+
const prefixes = bases
|
|
43
|
+
.map((base) => basePath(base))
|
|
44
|
+
.filter((prefix) => prefix.length > 0)
|
|
45
|
+
.sort((a, b) => b.length - a.length);
|
|
46
|
+
for (const prefix of prefixes) {
|
|
47
|
+
if (path === prefix || path.startsWith(`${prefix}/`)) {
|
|
48
|
+
return path.slice(prefix.length);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return path;
|
|
52
|
+
}
|
|
53
|
+
/** A base URL's path after its origin, or after a leading variable standing for one (`{scheme}://…` stays opaque). */
|
|
54
|
+
function basePath(base) {
|
|
55
|
+
const origin = ORIGIN.exec(base) ?? LEADING_VARIABLE.exec(base);
|
|
56
|
+
if (origin !== null)
|
|
57
|
+
return trimSlash(base.slice(origin[0].length));
|
|
58
|
+
return base.startsWith('/') ? trimSlash(base) : '';
|
|
59
|
+
}
|
|
60
|
+
function segments(path) {
|
|
61
|
+
return path.split('/').filter((segment) => segment.length > 0);
|
|
62
|
+
}
|
|
63
|
+
function decoded(segment) {
|
|
64
|
+
try {
|
|
65
|
+
return decodeURIComponent(segment);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return segment;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/** How many of `declared`'s segments are literal when it matches `actual`, or -1 when it does not. */
|
|
72
|
+
function literalMatch(declared, actual) {
|
|
73
|
+
if (declared.length !== actual.length) {
|
|
74
|
+
return -1;
|
|
75
|
+
}
|
|
76
|
+
let literals = 0;
|
|
77
|
+
for (const [index, segment] of declared.entries()) {
|
|
78
|
+
const other = actual[index];
|
|
79
|
+
if (VARIABLE.test(segment) || VARIABLE.test(other)) {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (decoded(segment) !== decoded(other)) {
|
|
83
|
+
return -1;
|
|
84
|
+
}
|
|
85
|
+
literals += 1;
|
|
86
|
+
}
|
|
87
|
+
return literals;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* The one operation `method` and `url` call. As in OpenAPI, a concrete path wins over a templated
|
|
91
|
+
* one: of several matches, the one with the most literal segments; `undefined` on a tie or no match.
|
|
92
|
+
* A URL whose host matches no server still matches by path, once its origin is dropped and, if it
|
|
93
|
+
* starts with one, a server's own path prefix.
|
|
94
|
+
* `baseUrls` are the API's servers and base URL; the longest one the URL starts with is stripped.
|
|
95
|
+
*/
|
|
96
|
+
export function matchOperation(operations, method, url, baseUrls) {
|
|
97
|
+
const actual = segments(withoutQuery(relativePath(url.trim(), baseUrls)));
|
|
98
|
+
const wanted = method.toLowerCase();
|
|
99
|
+
let best;
|
|
100
|
+
let bestLiterals = -1;
|
|
101
|
+
let tied = false;
|
|
102
|
+
for (const operation of operations) {
|
|
103
|
+
if (operation.method.toLowerCase() !== wanted) {
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
const literals = literalMatch(segments(operation.path), actual);
|
|
107
|
+
if (literals > bestLiterals) {
|
|
108
|
+
best = operation;
|
|
109
|
+
bestLiterals = literals;
|
|
110
|
+
tied = false;
|
|
111
|
+
}
|
|
112
|
+
else if (literals >= 0 && literals === bestLiterals) {
|
|
113
|
+
tied = true;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return best === undefined || tied ? undefined : { method: best.method, path: best.path };
|
|
117
|
+
}
|
|
@@ -11,10 +11,8 @@
|
|
|
11
11
|
* omit anything that is not required, and a parser that insists otherwise refuses documents users
|
|
12
12
|
* legitimately have.
|
|
13
13
|
*/
|
|
14
|
-
|
|
15
|
-
export type
|
|
16
|
-
readonly [key: string]: JsonValue;
|
|
17
|
-
};
|
|
14
|
+
import type { JsonSchema, JsonValue, OpenApiXml } from '../../json/schema/model.js';
|
|
15
|
+
export type { JsonSchema, JsonValue, OpenApiXml };
|
|
18
16
|
/** Which specification version a document declares. */
|
|
19
17
|
export type OpenApiVersion = '1.0' | '1.1' | '1.2' | '2.0' | '3.0' | '3.1' | '3.2';
|
|
20
18
|
/** `info`: what the API is called, and which version of *it* this document describes. */
|
|
@@ -81,47 +79,6 @@ export interface OpenApiRequestBody {
|
|
|
81
79
|
readonly description?: string;
|
|
82
80
|
readonly content: Readonly<Record<string, OpenApiMediaType>>;
|
|
83
81
|
}
|
|
84
|
-
/**
|
|
85
|
-
* The JSON Schema subset the sample generator reads — Draft 2020-12 as 3.1 uses it, and 3.0's own
|
|
86
|
-
* dialect, which differs in the two ways noted on the fields.
|
|
87
|
-
*/
|
|
88
|
-
export interface JsonSchema {
|
|
89
|
-
/** 3.0 allows one type; 3.1 allows a list, which is how it spells "nullable". */
|
|
90
|
-
readonly type?: string | readonly string[];
|
|
91
|
-
readonly format?: string;
|
|
92
|
-
readonly title?: string;
|
|
93
|
-
readonly description?: string;
|
|
94
|
-
readonly default?: JsonValue;
|
|
95
|
-
readonly example?: JsonValue;
|
|
96
|
-
/** 3.1 spelling; 3.0 uses `example`. Both are read. */
|
|
97
|
-
readonly examples?: readonly JsonValue[];
|
|
98
|
-
readonly enum?: readonly JsonValue[];
|
|
99
|
-
readonly const?: JsonValue;
|
|
100
|
-
readonly properties?: Readonly<Record<string, JsonSchema>>;
|
|
101
|
-
readonly required?: readonly string[];
|
|
102
|
-
readonly items?: JsonSchema;
|
|
103
|
-
readonly additionalProperties?: boolean | JsonSchema;
|
|
104
|
-
readonly allOf?: readonly JsonSchema[];
|
|
105
|
-
readonly oneOf?: readonly JsonSchema[];
|
|
106
|
-
readonly anyOf?: readonly JsonSchema[];
|
|
107
|
-
/** 3.0 only: 3.1 spells this as a `type` list including `'null'`. */
|
|
108
|
-
readonly nullable?: boolean;
|
|
109
|
-
readonly deprecated?: boolean;
|
|
110
|
-
readonly readOnly?: boolean;
|
|
111
|
-
readonly writeOnly?: boolean;
|
|
112
|
-
/** The `xml` object an XML body's shape honours. */
|
|
113
|
-
readonly xml?: OpenApiXml;
|
|
114
|
-
/** Left in place when a reference could not be resolved, so a sample can say so rather than guess. */
|
|
115
|
-
readonly $ref?: string;
|
|
116
|
-
}
|
|
117
|
-
/** The `xml` object: how a schema's value is spelled as XML. */
|
|
118
|
-
export interface OpenApiXml {
|
|
119
|
-
readonly name?: string;
|
|
120
|
-
readonly namespace?: string;
|
|
121
|
-
readonly prefix?: string;
|
|
122
|
-
readonly attribute?: boolean;
|
|
123
|
-
readonly wrapped?: boolean;
|
|
124
|
-
}
|
|
125
82
|
/** One operation of one path. */
|
|
126
83
|
export interface OpenApiOperation {
|
|
127
84
|
/** Lower-case HTTP method, as the document's key spells it. */
|
|
@@ -138,7 +95,36 @@ export interface OpenApiOperation {
|
|
|
138
95
|
readonly requestBody?: OpenApiRequestBody;
|
|
139
96
|
/** An operation's own security requirements; an empty array means "explicitly unauthenticated". */
|
|
140
97
|
readonly security?: readonly OpenApiSecurityRequirement[];
|
|
98
|
+
/** The declared responses, keyed as the document keys them (`'200'`, `'4XX'`, `'default'`). */
|
|
99
|
+
readonly responses?: OpenApiResponses;
|
|
100
|
+
/** This operation's `callbacks`, when it declares any. */
|
|
101
|
+
readonly callbacks?: readonly OpenApiCallback[];
|
|
102
|
+
}
|
|
103
|
+
/** A root `webhooks` entry (OpenAPI 3.1+): its name and one operation per method. */
|
|
104
|
+
export interface OpenApiHook {
|
|
105
|
+
readonly name: string;
|
|
106
|
+
/** Each operation's `path` is the hook's name; `method` is lower-case. */
|
|
107
|
+
readonly operations: readonly OpenApiOperation[];
|
|
108
|
+
}
|
|
109
|
+
/** One `callbacks` entry of an operation: its name, its path-item key, and that item's operations. */
|
|
110
|
+
export interface OpenApiCallback {
|
|
111
|
+
readonly name: string;
|
|
112
|
+
/** The path-item key verbatim, e.g. `{$request.body#/callbackUrl}`. */
|
|
113
|
+
readonly expression: string;
|
|
114
|
+
/** Each operation's `path` is the expression. */
|
|
115
|
+
readonly operations: readonly OpenApiOperation[];
|
|
116
|
+
}
|
|
117
|
+
/** One declared response media type. The schema is the `$ref`-resolved node, kept as plain data. */
|
|
118
|
+
export interface OpenApiResponseMediaType {
|
|
119
|
+
readonly schema?: unknown;
|
|
120
|
+
}
|
|
121
|
+
/** One declared response. No `content` means the contract declares no body. */
|
|
122
|
+
export interface OpenApiResponse {
|
|
123
|
+
readonly description?: string;
|
|
124
|
+
readonly content?: Readonly<Record<string, OpenApiResponseMediaType>>;
|
|
141
125
|
}
|
|
126
|
+
/** An operation's responses, keyed by status (`'200'`), range (`'4XX'`) or `'default'`. */
|
|
127
|
+
export type OpenApiResponses = Readonly<Record<string, OpenApiResponse>>;
|
|
142
128
|
/** One security requirement: scheme name to the scopes it needs. */
|
|
143
129
|
export type OpenApiSecurityRequirement = Readonly<Record<string, readonly string[]>>;
|
|
144
130
|
/** One `securitySchemes` entry. */
|
|
@@ -189,6 +175,8 @@ export interface OpenApiDocument {
|
|
|
189
175
|
/** The document-level security requirements, when it declares any. */
|
|
190
176
|
readonly security?: readonly OpenApiSecurityRequirement[];
|
|
191
177
|
readonly tags: readonly OpenApiTag[];
|
|
178
|
+
/** Root `webhooks` entries (OpenAPI 3.1+), when the document declares any. */
|
|
179
|
+
readonly webhooks?: readonly OpenApiHook[];
|
|
192
180
|
/** Everything the model does not carry, counted and located. */
|
|
193
181
|
readonly skipped: readonly OpenApiSkipped[];
|
|
194
182
|
}
|
|
@@ -8,21 +8,13 @@
|
|
|
8
8
|
* YAML, and a document that does not declare a supported OpenAPI or Swagger version. Swagger 1.x
|
|
9
9
|
* and 2.0 documents are converted into the intermediate OpenAPI representation.
|
|
10
10
|
*
|
|
11
|
-
* The parser reads a document that is already resolved: `refs.ts` inlines every `$ref` first, so
|
|
11
|
+
* The parser reads a document that is already resolved: `json/schema/refs.ts` inlines every `$ref` first, so
|
|
12
12
|
* nothing here has to fetch anything.
|
|
13
13
|
*/
|
|
14
14
|
import type { JsonSchema, OpenApiDocument, OpenApiVersion } from './model.js';
|
|
15
15
|
/** A plain object, which is all this parser ever walks into. */
|
|
16
16
|
type Record_ = Readonly<Record<string, unknown>>;
|
|
17
|
-
|
|
18
|
-
* Parses text as JSON when it looks like JSON, and as YAML otherwise.
|
|
19
|
-
*
|
|
20
|
-
* JSON is a subset of YAML, so one parser would do — but a JSON document with a syntax error gets a
|
|
21
|
-
* far better message from `JSON.parse`, and that message is what the user has to act on.
|
|
22
|
-
*
|
|
23
|
-
* @throws OpenApiError `openapi-malformed` when the text parses as neither.
|
|
24
|
-
*/
|
|
25
|
-
export declare function parseDocumentText(text: string, where?: string): unknown;
|
|
17
|
+
export { parseDocumentText } from '../../json/schema/parse-text.js';
|
|
26
18
|
/**
|
|
27
19
|
* The version a document declares, as a major-minor this client supports.
|
|
28
20
|
*
|
|
@@ -36,9 +28,8 @@ export declare function versionOf(root: unknown): {
|
|
|
36
28
|
/**
|
|
37
29
|
* Reads a resolved OpenAPI document.
|
|
38
30
|
*
|
|
39
|
-
* @param root the parsed document, with every `$ref` already inlined (see `refs.ts`)
|
|
31
|
+
* @param root the parsed document, with every `$ref` already inlined (see `json/schema/refs.ts`)
|
|
40
32
|
* @throws OpenApiError `openapi-not-a-document` / `openapi-unsupported-version` as {@link versionOf} does
|
|
41
33
|
*/
|
|
42
34
|
export declare function parseOpenApiDocument(root: unknown): OpenApiDocument;
|
|
43
35
|
export declare function parseSchema(value: Record_): JsonSchema;
|
|
44
|
-
export {};
|