@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
package/dist/project/schema.js
CHANGED
|
@@ -17,147 +17,20 @@
|
|
|
17
17
|
* project the first time an older build saves. "Additive is safe" is true of
|
|
18
18
|
* formats that round-trip unknown keys; this one deliberately does not. See
|
|
19
19
|
* ADR-0003.
|
|
20
|
+
*
|
|
21
|
+
* This file holds the core documents only: the manifest, an environment, the keystore registry, the
|
|
22
|
+
* WS-Security configurations, the webhook collection and the definition-cache manifests. A
|
|
23
|
+
* protocol's container and request files are in its own folder (`soap/files.ts`, `rest/files.ts`,
|
|
24
|
+
* `grpc/files.ts`, `ws/files.ts`), and the pieces they share in `schema-parts.ts`.
|
|
20
25
|
*/
|
|
21
26
|
import { z } from 'zod';
|
|
22
|
-
import { assertionsSchema } from '../assert/schema.js';
|
|
23
|
-
import { ProjectError } from '../errors.js';
|
|
24
27
|
import { FORMAT_VERSION } from './model.js';
|
|
25
28
|
import { DEFAULT_WSS_ENCRYPTION_PARTS, DEFAULT_WSS_SIGNATURE_PARTS } from '../wss/model.js';
|
|
26
|
-
|
|
29
|
+
import { authConfigSchema, envName, nonEmpty, restFolderFileSchema, webhookSigningSchema } from './schema-parts.js';
|
|
30
|
+
// The pieces the protocols' file schemas share are declared in `schema-parts.ts` and keep their
|
|
31
|
+
// old names here. A protocol's own file schemas are exported from its folder.
|
|
32
|
+
export { assertSupportedKind, attachmentSourceSchema, authConfigSchema, definitionAuthSchema, endpointAuthSchema, hookLinkSchema, keyValueEntrySchema, parseFile, restFolderFileSchema, scriptsSchema, soapOwnerAuthSchema, webhookSigningSchema, } from './schema-parts.js';
|
|
27
33
|
const propertyMapSchema = z.record(z.string(), z.string());
|
|
28
|
-
/**
|
|
29
|
-
* A committed, human-chosen name for a secret reference — not the secret itself — used to build
|
|
30
|
-
* the environment variable a CI run reads it from (see `secrets/env-names.ts`).
|
|
31
|
-
*/
|
|
32
|
-
const envName = z
|
|
33
|
-
.string()
|
|
34
|
-
.regex(/^[A-Z][A-Z0-9_]*$/)
|
|
35
|
-
.optional();
|
|
36
|
-
/**
|
|
37
|
-
* Credentials as persisted: usernames and a `secretRef`, never a password
|
|
38
|
-
* value. Unlike every other schema here, a plaintext `password` key is
|
|
39
|
-
* explicitly rejected rather than merely ignored — secrets must never be
|
|
40
|
-
* written to a project file, in any format.
|
|
41
|
-
*/
|
|
42
|
-
export const endpointAuthSchema = z
|
|
43
|
-
.looseObject({
|
|
44
|
-
type: z.enum(['none', 'basic', 'ntlm']),
|
|
45
|
-
username: z.string().optional(),
|
|
46
|
-
passwordRef: z.string().optional(),
|
|
47
|
-
passwordEnv: envName,
|
|
48
|
-
domain: z.string().optional(),
|
|
49
|
-
workstation: z.string().optional(),
|
|
50
|
-
preemptive: z.boolean().optional(),
|
|
51
|
-
})
|
|
52
|
-
.refine((value) => !('password' in value), {
|
|
53
|
-
message: 'endpoint auth must not contain a plaintext "password" field; use passwordRef',
|
|
54
|
-
path: ['password'],
|
|
55
|
-
});
|
|
56
|
-
/**
|
|
57
|
-
* Keys that would hold a credential *value* rather than a reference to one. A project file must
|
|
58
|
-
* never carry one, in any authentication scheme, so they are rejected outright rather than
|
|
59
|
-
* ignored — the same rule `endpointAuthSchema` applies to `password`, stated once for the
|
|
60
|
-
* schemes added with the REST client (ADR-0004).
|
|
61
|
-
*/
|
|
62
|
-
const PLAINTEXT_SECRET_KEYS = [
|
|
63
|
-
'password',
|
|
64
|
-
'token',
|
|
65
|
-
'secret',
|
|
66
|
-
'clientSecret',
|
|
67
|
-
'client_secret',
|
|
68
|
-
'apiKey',
|
|
69
|
-
'refreshToken',
|
|
70
|
-
];
|
|
71
|
-
/** Adds the {@link PLAINTEXT_SECRET_KEYS} rejection to one authentication schema. */
|
|
72
|
-
function refuseSecretValues(schema) {
|
|
73
|
-
return schema.superRefine((value, ctx) => {
|
|
74
|
-
for (const key of PLAINTEXT_SECRET_KEYS) {
|
|
75
|
-
if (key in value) {
|
|
76
|
-
ctx.addIssue({
|
|
77
|
-
code: 'custom',
|
|
78
|
-
path: [key],
|
|
79
|
-
message: `auth must not contain a plaintext "${key}" field; use a secretRef`,
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
const inheritAuthSchema = z.looseObject({ type: z.literal('inherit') });
|
|
86
|
-
const bearerAuthSchema = refuseSecretValues(z.looseObject({
|
|
87
|
-
type: z.literal('bearer'),
|
|
88
|
-
tokenRef: z.string().optional(),
|
|
89
|
-
tokenEnv: envName,
|
|
90
|
-
scheme: z.string().optional(),
|
|
91
|
-
}));
|
|
92
|
-
const apiKeyAuthSchema = refuseSecretValues(z.looseObject({
|
|
93
|
-
type: z.literal('api-key'),
|
|
94
|
-
name: z.string(),
|
|
95
|
-
valueRef: z.string().optional(),
|
|
96
|
-
valueEnv: envName,
|
|
97
|
-
in: z.enum(['header', 'query']),
|
|
98
|
-
}));
|
|
99
|
-
const oauth2AuthSchema = refuseSecretValues(z.looseObject({
|
|
100
|
-
type: z.literal('oauth2'),
|
|
101
|
-
grant: z.enum(['client-credentials', 'authorization-code']),
|
|
102
|
-
tokenUrl: z.string(),
|
|
103
|
-
authorizationUrl: z.string().optional(),
|
|
104
|
-
clientId: z.string(),
|
|
105
|
-
clientSecretRef: z.string().optional(),
|
|
106
|
-
clientSecretEnv: envName,
|
|
107
|
-
scopes: z.array(z.string()).default([]),
|
|
108
|
-
audience: z.string().optional(),
|
|
109
|
-
clientAuth: z.enum(['basic', 'body']).default('basic'),
|
|
110
|
-
pkce: z.boolean().default(true),
|
|
111
|
-
refreshTokenRef: z.string().optional(),
|
|
112
|
-
}));
|
|
113
|
-
/**
|
|
114
|
-
* Authentication as persisted anywhere a project configures it. `endpointAuthSchema` is one arm,
|
|
115
|
-
* so a file written before the REST client — which only ever held `none`/`basic`/`ntlm` — parses
|
|
116
|
-
* unchanged. `inherit` is accepted here and rejected by the SOAP schemas that reuse
|
|
117
|
-
* `endpointAuthSchema` instead, since an interface has nothing to inherit from.
|
|
118
|
-
*/
|
|
119
|
-
export const authConfigSchema = z.union([
|
|
120
|
-
endpointAuthSchema,
|
|
121
|
-
inheritAuthSchema,
|
|
122
|
-
bearerAuthSchema,
|
|
123
|
-
apiKeyAuthSchema,
|
|
124
|
-
oauth2AuthSchema,
|
|
125
|
-
]);
|
|
126
|
-
const endpointSchema = z.looseObject({
|
|
127
|
-
id: nonEmpty,
|
|
128
|
-
name: z.string(),
|
|
129
|
-
url: z.string(),
|
|
130
|
-
auth: endpointAuthSchema.optional(),
|
|
131
|
-
authMode: z.enum(['override', 'complement']),
|
|
132
|
-
trustInvalid: z.boolean().optional(),
|
|
133
|
-
});
|
|
134
|
-
/**
|
|
135
|
-
* A stored WS-Addressing configuration. Every field beyond `enabled` is optional so a project
|
|
136
|
-
* written before the WS-Addressing task — which only ever held `{ enabled, version? }` — still
|
|
137
|
-
* loads; `normalizeWsa` fills the rest in with the v1 defaults.
|
|
138
|
-
*/
|
|
139
|
-
const wsaSchema = z.looseObject({
|
|
140
|
-
enabled: z.boolean(),
|
|
141
|
-
version: z.enum(['2005/08', '2004/08']).optional(),
|
|
142
|
-
mustUnderstand: z.enum(['none', 'true', 'false']).optional(),
|
|
143
|
-
action: z.string().optional(),
|
|
144
|
-
to: z.string().optional(),
|
|
145
|
-
messageId: z.string().optional(),
|
|
146
|
-
replyTo: z.string().optional(),
|
|
147
|
-
from: z.string().optional(),
|
|
148
|
-
faultTo: z.string().optional(),
|
|
149
|
-
relatesTo: z.string().optional(),
|
|
150
|
-
relationshipType: z.string().optional(),
|
|
151
|
-
addDefaultAction: z.boolean().optional(),
|
|
152
|
-
addDefaultTo: z.boolean().optional(),
|
|
153
|
-
generateMessageId: z.boolean().optional(),
|
|
154
|
-
});
|
|
155
|
-
const operationEntrySchema = z.looseObject({
|
|
156
|
-
name: nonEmpty,
|
|
157
|
-
bindingName: z.string(),
|
|
158
|
-
slug: nonEmpty,
|
|
159
|
-
order: z.number().int(),
|
|
160
|
-
});
|
|
161
34
|
/** `wirebench.yaml`. */
|
|
162
35
|
export const manifestSchema = z.looseObject({
|
|
163
36
|
formatVersion: z.literal(FORMAT_VERSION),
|
|
@@ -177,322 +50,18 @@ export const manifestSchema = z.looseObject({
|
|
|
177
50
|
/** Name of the Wirebench build that last wrote this manifest; informational only. */
|
|
178
51
|
writtenBy: z.string().optional(),
|
|
179
52
|
});
|
|
180
|
-
/** `
|
|
181
|
-
export const
|
|
182
|
-
kind: z.literal('soap'),
|
|
183
|
-
id: nonEmpty,
|
|
184
|
-
name: z.string(),
|
|
185
|
-
order: z.number().int(),
|
|
186
|
-
definitionUrl: z.string(),
|
|
187
|
-
cacheDefinition: z.boolean(),
|
|
188
|
-
targetNamespace: z.string().optional(),
|
|
189
|
-
endpoints: z.array(endpointSchema),
|
|
190
|
-
defaultEndpointId: z.string().optional(),
|
|
191
|
-
wsa: wsaSchema,
|
|
192
|
-
auth: endpointAuthSchema.optional(),
|
|
193
|
-
operations: z.array(operationEntrySchema),
|
|
194
|
-
});
|
|
195
|
-
const requestPropertiesSchema = z.looseObject({
|
|
196
|
-
encoding: z.string(),
|
|
197
|
-
timeoutMs: z.number().int().nonnegative().optional(),
|
|
198
|
-
bindAddress: z.string().optional(),
|
|
199
|
-
followRedirects: z.boolean(),
|
|
200
|
-
skipSoapAction: z.boolean(),
|
|
201
|
-
enableMtom: z.boolean(),
|
|
202
|
-
forceMtom: z.boolean(),
|
|
203
|
-
inlineResponseAttachments: z.boolean(),
|
|
204
|
-
expandMtomAttachments: z.boolean(),
|
|
205
|
-
disableMultiparts: z.boolean(),
|
|
206
|
-
encodeAttachments: z.boolean(),
|
|
207
|
-
enableInlineFiles: z.boolean(),
|
|
208
|
-
removeEmptyContent: z.boolean(),
|
|
209
|
-
entitizeProperties: z.boolean(),
|
|
210
|
-
prettyPrint: z.boolean(),
|
|
211
|
-
stripWhitespaces: z.boolean(),
|
|
212
|
-
dumpFile: z.string().optional(),
|
|
213
|
-
maxSizeBytes: z.number().int().nonnegative().optional(),
|
|
214
|
-
wssPasswordType: z.enum(['text', 'digest']).optional(),
|
|
215
|
-
wssTimeToLive: z.number().int().nonnegative().optional(),
|
|
216
|
-
sslKeystoreRef: z.string().optional(),
|
|
217
|
-
});
|
|
218
|
-
/** Where a file's bytes live: the project's content-addressed cache, or a path on disk. */
|
|
219
|
-
export const attachmentSourceSchema = z.union([
|
|
220
|
-
z.looseObject({ kind: z.literal('cache'), sha256: nonEmpty }),
|
|
221
|
-
z.looseObject({ kind: z.literal('path'), path: nonEmpty }),
|
|
222
|
-
]);
|
|
223
|
-
const attachmentSchema = z.looseObject({
|
|
224
|
-
id: nonEmpty,
|
|
225
|
-
name: z.string(),
|
|
226
|
-
contentType: z.string(),
|
|
227
|
-
size: z.number().int().nonnegative(),
|
|
228
|
-
part: z.string().optional(),
|
|
229
|
-
type: z.enum(['XOP', 'MIME', 'SWAREF', 'CONTENT', 'UNKNOWN']),
|
|
230
|
-
contentId: z.string(),
|
|
231
|
-
cached: z.boolean(),
|
|
232
|
-
source: attachmentSourceSchema,
|
|
233
|
-
});
|
|
234
|
-
/** `interfaces/<slug>/operations/<slug>/<name>.request.yaml` (the envelope lives in the sibling `.xml`). */
|
|
235
|
-
export const requestFileSchema = z.looseObject({
|
|
236
|
-
kind: z.literal('soap'),
|
|
237
|
-
id: nonEmpty,
|
|
238
|
-
name: z.string(),
|
|
239
|
-
order: z.number().int(),
|
|
240
|
-
description: z.string().optional(),
|
|
241
|
-
endpointId: z.string().optional(),
|
|
242
|
-
endpointUrl: z.string().optional(),
|
|
243
|
-
soapVersion: z.enum(['1.1', '1.2']),
|
|
244
|
-
soapAction: z.string().optional(),
|
|
245
|
-
headers: z.array(z.looseObject({ name: z.string(), value: z.string() })),
|
|
246
|
-
attachments: z.array(attachmentSchema),
|
|
247
|
-
auth: endpointAuthSchema.optional(),
|
|
248
|
-
wsa: wsaSchema.optional(),
|
|
249
|
-
wssOutgoingRef: z.string().optional(),
|
|
250
|
-
wssIncomingRef: z.string().optional(),
|
|
251
|
-
properties: requestPropertiesSchema,
|
|
252
|
-
assertions: assertionsSchema.default([]),
|
|
253
|
-
orphaned: z.boolean().optional(),
|
|
254
|
-
});
|
|
255
|
-
/**
|
|
256
|
-
* One table row as persisted. `enabled` is written only when `false`, so a missing key means
|
|
257
|
-
* enabled; names may repeat and their order is the wire order.
|
|
258
|
-
*/
|
|
259
|
-
export const keyValueEntrySchema = z.looseObject({
|
|
260
|
-
name: z.string(),
|
|
261
|
-
value: z.string(),
|
|
262
|
-
enabled: z.boolean().default(true),
|
|
263
|
-
description: z.string().optional(),
|
|
264
|
-
});
|
|
265
|
-
/**
|
|
266
|
-
* An HTTP method: any RFC 9110 token, not just the seven the editor names. A service that speaks
|
|
267
|
-
* `PURGE` or `REPORT` is not a malformed project.
|
|
268
|
-
*/
|
|
269
|
-
const methodSchema = z
|
|
270
|
-
.string()
|
|
271
|
-
.min(1)
|
|
272
|
-
.regex(/^[A-Za-z0-9!#$%&'*+.^_`|~-]+$/, 'a method must be an HTTP token');
|
|
273
|
-
const multipartPartSchema = z.union([
|
|
274
|
-
z.looseObject({
|
|
275
|
-
kind: z.literal('text'),
|
|
276
|
-
name: z.string(),
|
|
277
|
-
value: z.string(),
|
|
278
|
-
enabled: z.boolean().default(true),
|
|
279
|
-
contentType: z.string().optional(),
|
|
280
|
-
}),
|
|
281
|
-
z.looseObject({
|
|
282
|
-
kind: z.literal('file'),
|
|
283
|
-
name: z.string(),
|
|
284
|
-
source: attachmentSourceSchema,
|
|
285
|
-
enabled: z.boolean().default(true),
|
|
286
|
-
fileName: z.string().optional(),
|
|
287
|
-
contentType: z.string().optional(),
|
|
288
|
-
}),
|
|
289
|
-
]);
|
|
290
|
-
/**
|
|
291
|
-
* A request body as persisted. A raw body names its sibling file rather than carrying its text:
|
|
292
|
-
* `file` is a bare file name in the request's own directory, validated as a path segment before
|
|
293
|
-
* anything is read or written (ADR-0005).
|
|
294
|
-
*/
|
|
295
|
-
export const restBodySchema = z.union([
|
|
296
|
-
z.looseObject({ kind: z.literal('none') }),
|
|
297
|
-
z.looseObject({
|
|
298
|
-
kind: z.literal('raw'),
|
|
299
|
-
language: z.enum(['json', 'xml', 'text', 'html', 'javascript']),
|
|
300
|
-
contentType: z.string().optional(),
|
|
301
|
-
file: nonEmpty,
|
|
302
|
-
}),
|
|
303
|
-
z.looseObject({ kind: z.literal('form'), fields: z.array(keyValueEntrySchema).default([]) }),
|
|
304
|
-
z.looseObject({ kind: z.literal('multipart'), parts: z.array(multipartPartSchema).default([]) }),
|
|
305
|
-
z.looseObject({ kind: z.literal('binary'), source: attachmentSourceSchema, contentType: z.string() }),
|
|
306
|
-
]);
|
|
307
|
-
const restSettingsSchema = z.looseObject({
|
|
308
|
-
timeoutMs: z.number().int().nonnegative().optional(),
|
|
309
|
-
followRedirects: z.boolean().optional(),
|
|
310
|
-
maxRedirects: z.number().int().nonnegative().optional(),
|
|
311
|
-
keepBodyOnRedirect: z.boolean().optional(),
|
|
312
|
-
encodeUrl: z.boolean().optional(),
|
|
313
|
-
trustInvalid: z.boolean().optional(),
|
|
314
|
-
sslKeystoreRef: z.string().optional(),
|
|
315
|
-
bindAddress: z.string().optional(),
|
|
316
|
-
maxSizeBytes: z.number().int().nonnegative().optional(),
|
|
317
|
-
sendCookies: z.boolean().optional(),
|
|
318
|
-
escapeProperties: z.boolean().optional(),
|
|
319
|
-
});
|
|
320
|
-
/** `apis/<slug>/requests/[<folder>/…]<name>.request.yaml`. */
|
|
321
|
-
export const restRequestFileSchema = z.looseObject({
|
|
322
|
-
kind: z.literal('rest'),
|
|
323
|
-
id: nonEmpty,
|
|
324
|
-
name: z.string(),
|
|
325
|
-
order: z.number().int(),
|
|
326
|
-
description: z.string().optional(),
|
|
327
|
-
method: methodSchema,
|
|
328
|
-
url: z.string(),
|
|
329
|
-
pathParams: z.array(keyValueEntrySchema).default([]),
|
|
330
|
-
query: z.array(keyValueEntrySchema).default([]),
|
|
331
|
-
headers: z.array(keyValueEntrySchema).default([]),
|
|
332
|
-
body: restBodySchema.default({ kind: 'none' }),
|
|
333
|
-
auth: authConfigSchema.default({ type: 'inherit' }),
|
|
334
|
-
settings: restSettingsSchema.default({}),
|
|
335
|
-
assertions: assertionsSchema.default([]),
|
|
336
|
-
orphaned: z.boolean().optional(),
|
|
337
|
-
});
|
|
338
|
-
/** `apis/<slug>/requests/[<folder>/…]folder.yaml`. */
|
|
339
|
-
export const restFolderFileSchema = z.looseObject({
|
|
340
|
-
id: nonEmpty,
|
|
341
|
-
name: z.string(),
|
|
342
|
-
order: z.number().int(),
|
|
343
|
-
description: z.string().optional(),
|
|
344
|
-
auth: authConfigSchema.optional(),
|
|
345
|
-
});
|
|
346
|
-
/** `apis/<slug>/api.yaml`. */
|
|
347
|
-
export const apiFileSchema = z.looseObject({
|
|
348
|
-
kind: z.literal('rest'),
|
|
349
|
-
id: nonEmpty,
|
|
350
|
-
name: z.string(),
|
|
351
|
-
order: z.number().int(),
|
|
352
|
-
description: z.string().optional(),
|
|
353
|
-
baseUrl: z.string(),
|
|
354
|
-
servers: z.array(z.looseObject({ url: z.string(), description: z.string().optional() })).default([]),
|
|
355
|
-
auth: authConfigSchema.optional(),
|
|
356
|
-
definition: z
|
|
357
|
-
.looseObject({ source: nonEmpty, cache: z.boolean().default(true), version: z.string().default('') })
|
|
358
|
-
.optional(),
|
|
359
|
-
});
|
|
360
|
-
const grpcSettingsSchema = z.looseObject({
|
|
361
|
-
timeoutMs: z.number().int().nonnegative().optional(),
|
|
362
|
-
trustInvalid: z.boolean().optional(),
|
|
363
|
-
sslKeystoreRef: z.string().optional(),
|
|
364
|
-
bindAddress: z.string().optional(),
|
|
365
|
-
maxSizeBytes: z.number().int().nonnegative().optional(),
|
|
366
|
-
escapeProperties: z.boolean().optional(),
|
|
367
|
-
});
|
|
368
|
-
/** The four shapes a gRPC method can take. */
|
|
369
|
-
export const grpcMethodKindSchema = z.enum(['unary', 'server-streaming', 'client-streaming', 'bidi-streaming']);
|
|
370
|
-
/**
|
|
371
|
-
* `apis/<slug>/requests/[<folder>/…]<name>.request.yaml` for a gRPC request. The message text lives
|
|
372
|
-
* in the sibling file `message` names, validated as a path segment before it is read (ADR-0005),
|
|
373
|
-
* so a JSON message is a JSON file in git like a REST raw body.
|
|
374
|
-
*/
|
|
375
|
-
export const grpcRequestFileSchema = z.looseObject({
|
|
376
|
-
kind: z.literal('grpc'),
|
|
377
|
-
id: nonEmpty,
|
|
378
|
-
name: z.string(),
|
|
379
|
-
order: z.number().int(),
|
|
380
|
-
description: z.string().optional(),
|
|
381
|
-
service: z.string(),
|
|
382
|
-
method: z.string(),
|
|
383
|
-
methodKind: grpcMethodKindSchema.default('unary'),
|
|
384
|
-
metadata: z.array(keyValueEntrySchema).default([]),
|
|
385
|
-
message: nonEmpty.optional(),
|
|
386
|
-
auth: authConfigSchema.default({ type: 'inherit' }),
|
|
387
|
-
settings: grpcSettingsSchema.default({}),
|
|
388
|
-
orphaned: z.boolean().optional(),
|
|
389
|
-
});
|
|
390
|
-
/** `apis/<slug>/api.yaml` for a gRPC API. */
|
|
391
|
-
export const grpcApiFileSchema = z.looseObject({
|
|
392
|
-
kind: z.literal('grpc'),
|
|
393
|
-
id: nonEmpty,
|
|
394
|
-
name: z.string(),
|
|
395
|
-
order: z.number().int(),
|
|
396
|
-
description: z.string().optional(),
|
|
53
|
+
/** `webhooks/webhooks.yaml`. */
|
|
54
|
+
export const webhooksFileSchema = z.looseObject({
|
|
397
55
|
target: z.string(),
|
|
398
|
-
tls: z.boolean().default(false),
|
|
399
|
-
metadata: z.array(keyValueEntrySchema).default([]),
|
|
400
56
|
auth: authConfigSchema.optional(),
|
|
401
|
-
|
|
402
|
-
.looseObject({
|
|
403
|
-
// Absent in every project written before server reflection, which is an imported set.
|
|
404
|
-
kind: z.enum(['proto', 'reflection']).default('proto'),
|
|
405
|
-
source: nonEmpty,
|
|
406
|
-
cache: z.boolean().default(true),
|
|
407
|
-
roots: z.array(nonEmpty).default([]),
|
|
408
|
-
reflectionVersion: z.enum(['auto', 'v1', 'v1alpha']).optional(),
|
|
409
|
-
trustInvalid: z.boolean().optional(),
|
|
410
|
-
})
|
|
411
|
-
.optional(),
|
|
412
|
-
});
|
|
413
|
-
const wsSettingsSchema = z.looseObject({
|
|
414
|
-
handshakeTimeoutMs: z.number().int().nonnegative().optional(),
|
|
415
|
-
trustInvalid: z.boolean().optional(),
|
|
416
|
-
sslKeystoreRef: z.string().optional(),
|
|
417
|
-
bindAddress: z.string().optional(),
|
|
418
|
-
maxMessageBytes: z.number().int().nonnegative().optional(),
|
|
419
|
-
escapeProperties: z.boolean().optional(),
|
|
57
|
+
signing: webhookSigningSchema.optional(),
|
|
420
58
|
});
|
|
421
|
-
/**
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
const wsSavedMessageSchema = z.looseObject({
|
|
427
|
-
id: nonEmpty,
|
|
428
|
-
name: z.string(),
|
|
429
|
-
format: z.enum(['text', 'binary']).default('text'),
|
|
430
|
-
file: nonEmpty,
|
|
59
|
+
/** `webhooks/requests/[<folder>/…]folder.yaml`: a REST folder plus a target override and its source API. */
|
|
60
|
+
export const webhookFolderFileSchema = restFolderFileSchema.extend({
|
|
61
|
+
target: z.string().optional(),
|
|
62
|
+
source: z.looseObject({ apiId: nonEmpty }).optional(),
|
|
63
|
+
signing: webhookSigningSchema.optional(),
|
|
431
64
|
});
|
|
432
|
-
/**
|
|
433
|
-
* `apis/<slug>/requests/[<folder>/…]<name>.request.yaml` for a WebSocket request. Each saved
|
|
434
|
-
* message's own text lives in its own sibling file, so a JSON message is a JSON file in git.
|
|
435
|
-
*/
|
|
436
|
-
export const wsRequestFileSchema = z.looseObject({
|
|
437
|
-
kind: z.literal('websocket'),
|
|
438
|
-
id: nonEmpty,
|
|
439
|
-
name: z.string(),
|
|
440
|
-
order: z.number().int(),
|
|
441
|
-
description: z.string().optional(),
|
|
442
|
-
url: z.string(),
|
|
443
|
-
query: z.array(keyValueEntrySchema).default([]),
|
|
444
|
-
headers: z.array(keyValueEntrySchema).default([]),
|
|
445
|
-
subprotocols: z.array(z.string()).default([]),
|
|
446
|
-
auth: authConfigSchema.default({ type: 'inherit' }),
|
|
447
|
-
settings: wsSettingsSchema.default({}),
|
|
448
|
-
messages: z.array(wsSavedMessageSchema).default([]),
|
|
449
|
-
});
|
|
450
|
-
/** `apis/<slug>/api.yaml` for a WebSocket API. */
|
|
451
|
-
export const wsApiFileSchema = z.looseObject({
|
|
452
|
-
kind: z.literal('websocket'),
|
|
453
|
-
id: nonEmpty,
|
|
454
|
-
name: z.string(),
|
|
455
|
-
order: z.number().int(),
|
|
456
|
-
description: z.string().optional(),
|
|
457
|
-
url: z.string(),
|
|
458
|
-
headers: z.array(keyValueEntrySchema).default([]),
|
|
459
|
-
auth: authConfigSchema.optional(),
|
|
460
|
-
definition: z
|
|
461
|
-
.looseObject({ kind: z.literal('asyncapi'), source: nonEmpty, cache: z.boolean().default(true) })
|
|
462
|
-
.optional(),
|
|
463
|
-
});
|
|
464
|
-
/** Every protocol this build can load. A `kind` outside this list is refused by name, never guessed at. */
|
|
465
|
-
const SUPPORTED_KINDS = ['soap', 'rest', 'grpc', 'websocket'];
|
|
466
|
-
/**
|
|
467
|
-
* Refuses a document whose `kind` this build does not know how to honour — a protocol a later
|
|
468
|
-
* release adds, or a typo — before schema validation, so the error says what is actually wrong
|
|
469
|
-
* ("this build cannot open a graphql document") instead of "expected 'rest', received 'graphql'",
|
|
470
|
-
* and so a project written by a future build fails loudly rather than losing its requests to a
|
|
471
|
-
* dropped unknown key. `grpc` was the reserved name this guard existed for until the gRPC client
|
|
472
|
-
* arrived; it stays for whatever comes next.
|
|
473
|
-
*
|
|
474
|
-
* @throws ProjectError `project-kind-not-supported`
|
|
475
|
-
*/
|
|
476
|
-
export function assertSupportedKind(document, file) {
|
|
477
|
-
if (typeof document !== 'object' || document === null || Array.isArray(document)) {
|
|
478
|
-
return;
|
|
479
|
-
}
|
|
480
|
-
const kind = document['kind'];
|
|
481
|
-
if (typeof kind !== 'string' || SUPPORTED_KINDS.includes(kind)) {
|
|
482
|
-
return;
|
|
483
|
-
}
|
|
484
|
-
throw new ProjectError('project-kind-not-supported', `${file} is a "${kind}" document, which this build cannot open`, {
|
|
485
|
-
details: { file, kind, supported: SUPPORTED_KINDS },
|
|
486
|
-
});
|
|
487
|
-
}
|
|
488
|
-
/** The `kind` of an `api.yaml`, read ahead of full validation so the loader knows which schema applies. */
|
|
489
|
-
export function apiKindOf(document) {
|
|
490
|
-
const kind = typeof document === 'object' && document !== null ? document['kind'] : undefined;
|
|
491
|
-
if (kind === 'grpc' || kind === 'websocket') {
|
|
492
|
-
return kind;
|
|
493
|
-
}
|
|
494
|
-
return 'rest';
|
|
495
|
-
}
|
|
496
65
|
/** `environments/<slug>.yaml`. */
|
|
497
66
|
export const environmentFileSchema = z.looseObject({
|
|
498
67
|
id: nonEmpty,
|
|
@@ -717,21 +286,3 @@ export const descriptorDefinitionCacheManifestSchema = z.looseObject({
|
|
|
717
286
|
/** The descriptor set itself: its path under `definition/`, its SHA-256 and its size. */
|
|
718
287
|
file: protoDefinitionCacheFileSchema,
|
|
719
288
|
});
|
|
720
|
-
/**
|
|
721
|
-
* Validates `value` against `schema`, raising
|
|
722
|
-
* `ProjectError('project-file-invalid')` carrying the file path and the
|
|
723
|
-
* individual zod issues when it does not match.
|
|
724
|
-
*/
|
|
725
|
-
export function parseFile(schema, value, file) {
|
|
726
|
-
const result = schema.safeParse(value);
|
|
727
|
-
if (result.success) {
|
|
728
|
-
return result.data;
|
|
729
|
-
}
|
|
730
|
-
const issues = result.error.issues.map((issue) => ({
|
|
731
|
-
path: issue.path.join('.'),
|
|
732
|
-
message: issue.message,
|
|
733
|
-
}));
|
|
734
|
-
throw new ProjectError('project-file-invalid', `Invalid project file ${file}`, {
|
|
735
|
-
details: { file, issues },
|
|
736
|
-
});
|
|
737
|
-
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The checks ADR-0015 puts on `${#Sequence#…}` values wherever a request is expanded: text a server
|
|
3
|
+
* chose may be escaped into a body, but it may never pick where the request goes, and it may never
|
|
4
|
+
* carry a line break or NUL into a URL, a header or metadata. Each per-protocol expander calls these
|
|
5
|
+
* only when the scopes hold Sequence values, so a send outside a sequence pays nothing.
|
|
6
|
+
*/
|
|
7
|
+
import type { ExpandResult, PropertyScopes } from './properties.js';
|
|
8
|
+
/** True when `scopes` carry at least one Sequence value, which is when the guards apply. */
|
|
9
|
+
export declare function hasSequenceValues(scopes: PropertyScopes): boolean;
|
|
10
|
+
/** Full XML escaping, quotes included, so a value is safe in element text and in an attribute alike. */
|
|
11
|
+
export declare function escapeXmlValue(value: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Expands with every Sequence value escaped by `escape` exactly once, wherever it lands and however it
|
|
14
|
+
* is reached, directly or through a chained property.
|
|
15
|
+
*
|
|
16
|
+
* Escaping the Sequence map up front is not enough: a request that escapes its own values would escape
|
|
17
|
+
* a Sequence value a second time. So each value is first replaced by a placeholder no user text can
|
|
18
|
+
* contain (a fresh random nonce per call) and made only of letters and digits, which no escaping
|
|
19
|
+
* touches. `expandText` runs with the request's own escaping, and then each placeholder is swapped
|
|
20
|
+
* for its escaped value.
|
|
21
|
+
*/
|
|
22
|
+
export declare function expandWithSequenceEscaped(expandText: (scopes: PropertyScopes) => string, scopes: PropertyScopes, escape: (value: string) => string): string;
|
|
23
|
+
/** The origin of an absolute URL (`scheme://host:port`), or `undefined` when `text` is not one. */
|
|
24
|
+
export declare function urlOrigin(text: string): string | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Refuses a send whose destination depends on a Sequence value: `resolve` is expanded once with the
|
|
27
|
+
* real values and once with every Sequence value replaced by a fixed marker, and the two results must
|
|
28
|
+
* have the same origin under `originOf`. A value in the path, query or fragment changes neither;
|
|
29
|
+
* one in the scheme, host or port changes it.
|
|
30
|
+
*
|
|
31
|
+
* @param place what is being sent to, for the message ("The request URL")
|
|
32
|
+
* @param resolve builds the destination text from a set of scopes
|
|
33
|
+
* @param originOf reduces that text to what must not change
|
|
34
|
+
* @throws SequenceError `sequence-origin-from-response`
|
|
35
|
+
*/
|
|
36
|
+
export declare function assertOriginIndependent(place: string, resolve: (scopes: PropertyScopes) => string, scopes: PropertyScopes, originOf?: (text: string) => string | undefined): void;
|
|
37
|
+
/**
|
|
38
|
+
* Refuses a Sequence value holding CR, LF or NUL wherever `result` put one: a URL, a header name or
|
|
39
|
+
* value, gRPC metadata, a SOAP action. A body may carry them; a line-oriented place may not.
|
|
40
|
+
*
|
|
41
|
+
* @throws SequenceError `sequence-value-invalid`
|
|
42
|
+
*/
|
|
43
|
+
export declare function assertNoControlCharacters(place: string, result: ExpandResult, scopes: PropertyScopes): void;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The checks ADR-0015 puts on `${#Sequence#…}` values wherever a request is expanded: text a server
|
|
3
|
+
* chose may be escaped into a body, but it may never pick where the request goes, and it may never
|
|
4
|
+
* carry a line break or NUL into a URL, a header or metadata. Each per-protocol expander calls these
|
|
5
|
+
* only when the scopes hold Sequence values, so a send outside a sequence pays nothing.
|
|
6
|
+
*/
|
|
7
|
+
import { randomUUID } from 'node:crypto';
|
|
8
|
+
import { SequenceError } from '../errors.js';
|
|
9
|
+
/** What every Sequence value becomes in the comparison expansion: plain, host-safe, unlikely to be real. */
|
|
10
|
+
const MARKER = 'wbseq';
|
|
11
|
+
/** CR, LF and NUL: what splits a header or a request line. */
|
|
12
|
+
const CONTROL_CHARACTERS = /[\r\n\0]/;
|
|
13
|
+
/** True when `scopes` carry at least one Sequence value, which is when the guards apply. */
|
|
14
|
+
export function hasSequenceValues(scopes) {
|
|
15
|
+
return scopes.sequence !== undefined && Object.keys(scopes.sequence).length > 0;
|
|
16
|
+
}
|
|
17
|
+
function mapValues(map, transform) {
|
|
18
|
+
const out = {};
|
|
19
|
+
for (const [name, value] of Object.entries(map)) {
|
|
20
|
+
out[name] = transform(value);
|
|
21
|
+
}
|
|
22
|
+
return out;
|
|
23
|
+
}
|
|
24
|
+
/** Full XML escaping, quotes included, so a value is safe in element text and in an attribute alike. */
|
|
25
|
+
export function escapeXmlValue(value) {
|
|
26
|
+
return value
|
|
27
|
+
.replace(/&/g, '&')
|
|
28
|
+
.replace(/</g, '<')
|
|
29
|
+
.replace(/>/g, '>')
|
|
30
|
+
.replace(/"/g, '"')
|
|
31
|
+
.replace(/'/g, ''');
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Expands with every Sequence value escaped by `escape` exactly once, wherever it lands and however it
|
|
35
|
+
* is reached, directly or through a chained property.
|
|
36
|
+
*
|
|
37
|
+
* Escaping the Sequence map up front is not enough: a request that escapes its own values would escape
|
|
38
|
+
* a Sequence value a second time. So each value is first replaced by a placeholder no user text can
|
|
39
|
+
* contain (a fresh random nonce per call) and made only of letters and digits, which no escaping
|
|
40
|
+
* touches. `expandText` runs with the request's own escaping, and then each placeholder is swapped
|
|
41
|
+
* for its escaped value.
|
|
42
|
+
*/
|
|
43
|
+
export function expandWithSequenceEscaped(expandText, scopes, escape) {
|
|
44
|
+
if (!hasSequenceValues(scopes) || scopes.sequence === undefined) {
|
|
45
|
+
return expandText(scopes);
|
|
46
|
+
}
|
|
47
|
+
const prefix = `wbseq${randomUUID().replace(/-/g, '')}x`;
|
|
48
|
+
const escaped = new Map();
|
|
49
|
+
const placeholders = {};
|
|
50
|
+
let index = 0;
|
|
51
|
+
for (const [name, value] of Object.entries(scopes.sequence)) {
|
|
52
|
+
// The trailing `z` ends the index, so placeholder 1 followed by a digit is never read as 15.
|
|
53
|
+
const placeholder = `${prefix}${index++}z`;
|
|
54
|
+
placeholders[name] = placeholder;
|
|
55
|
+
escaped.set(placeholder, escape(value));
|
|
56
|
+
}
|
|
57
|
+
const text = expandText({ ...scopes, sequence: placeholders });
|
|
58
|
+
return text.replace(new RegExp(`${prefix}\\d+z`, 'g'), (placeholder) => escaped.get(placeholder) ?? placeholder);
|
|
59
|
+
}
|
|
60
|
+
/** The origin of an absolute URL (`scheme://host:port`), or `undefined` when `text` is not one. */
|
|
61
|
+
export function urlOrigin(text) {
|
|
62
|
+
try {
|
|
63
|
+
const url = new URL(text);
|
|
64
|
+
// A non-special scheme (`grpc:`, `ws+unix:`) has an opaque `origin` of "null"; host and port
|
|
65
|
+
// still say where the request goes.
|
|
66
|
+
return url.origin !== 'null' ? url.origin : `${url.protocol}//${url.host}`;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Refuses a send whose destination depends on a Sequence value: `resolve` is expanded once with the
|
|
74
|
+
* real values and once with every Sequence value replaced by a fixed marker, and the two results must
|
|
75
|
+
* have the same origin under `originOf`. A value in the path, query or fragment changes neither;
|
|
76
|
+
* one in the scheme, host or port changes it.
|
|
77
|
+
*
|
|
78
|
+
* @param place what is being sent to, for the message ("The request URL")
|
|
79
|
+
* @param resolve builds the destination text from a set of scopes
|
|
80
|
+
* @param originOf reduces that text to what must not change
|
|
81
|
+
* @throws SequenceError `sequence-origin-from-response`
|
|
82
|
+
*/
|
|
83
|
+
export function assertOriginIndependent(place, resolve, scopes, originOf = urlOrigin) {
|
|
84
|
+
if (!hasSequenceValues(scopes) || scopes.sequence === undefined) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const marked = { ...scopes, sequence: mapValues(scopes.sequence, () => MARKER) };
|
|
88
|
+
if (originOf(resolve(scopes)) !== originOf(resolve(marked))) {
|
|
89
|
+
throw new SequenceError('sequence-origin-from-response', `${place} would take its scheme, host or port from a value a response supplied; ` +
|
|
90
|
+
'use ${#Sequence#…} only in the path, query or fragment', { details: { place } });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Refuses a Sequence value holding CR, LF or NUL wherever `result` put one: a URL, a header name or
|
|
95
|
+
* value, gRPC metadata, a SOAP action. A body may carry them; a line-oriented place may not.
|
|
96
|
+
*
|
|
97
|
+
* @throws SequenceError `sequence-value-invalid`
|
|
98
|
+
*/
|
|
99
|
+
export function assertNoControlCharacters(place, result, scopes) {
|
|
100
|
+
if (scopes.sequence === undefined) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
for (const { scope, name } of result.used) {
|
|
104
|
+
const value = scope === 'Sequence' && Object.hasOwn(scopes.sequence, name) ? scopes.sequence[name] : undefined;
|
|
105
|
+
if (value !== undefined && CONTROL_CHARACTERS.test(value)) {
|
|
106
|
+
throw new SequenceError('sequence-value-invalid', `${place} would carry a line break or NUL from \${#Sequence#${name}}`, { details: { place, name } });
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|