@wirebench/engine 2.2.1 → 3.1.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +134 -1
- package/dist/account/schema.d.ts +34 -0
- package/dist/account/schema.js +29 -0
- package/dist/assert/callback.d.ts +76 -0
- package/dist/assert/callback.js +320 -0
- package/dist/assert/capture-source.d.ts +50 -0
- package/dist/assert/capture-source.js +89 -0
- package/dist/assert/check.d.ts +8 -0
- package/dist/assert/check.js +18 -0
- package/dist/assert/header.d.ts +5 -0
- package/dist/assert/header.js +48 -0
- package/dist/assert/index.d.ts +2 -2
- package/dist/assert/index.js +12 -0
- package/dist/assert/match.d.ts +6 -0
- package/dist/assert/match.js +13 -4
- package/dist/assert/model.d.ts +110 -3
- package/dist/assert/model.js +16 -1
- package/dist/assert/schema.d.ts +194 -1
- package/dist/assert/schema.js +154 -12
- package/dist/assert/status-names.d.ts +9 -0
- package/dist/assert/status-names.js +27 -0
- package/dist/assert/status.d.ts +4 -1
- package/dist/assert/status.js +27 -3
- package/dist/asyncapi/browser.d.ts +7 -0
- package/dist/asyncapi/browser.js +6 -0
- package/dist/asyncapi/frame-check-worker-host.d.ts +44 -0
- package/dist/asyncapi/frame-check-worker-host.js +175 -0
- package/dist/asyncapi/frame-check-worker.d.ts +12 -0
- package/dist/asyncapi/frame-check-worker.js +25 -0
- package/dist/asyncapi/frame-check.d.ts +25 -0
- package/dist/asyncapi/frame-check.js +78 -0
- package/dist/asyncapi/import.d.ts +25 -0
- package/dist/asyncapi/import.js +34 -0
- package/dist/asyncapi/map.d.ts +40 -0
- package/dist/asyncapi/map.js +230 -0
- package/dist/asyncapi/model.d.ts +84 -0
- package/dist/asyncapi/model.js +7 -0
- package/dist/asyncapi/normalise-2.d.ts +13 -0
- package/dist/asyncapi/normalise-2.js +113 -0
- package/dist/asyncapi/normalise-3.d.ts +14 -0
- package/dist/asyncapi/normalise-3.js +133 -0
- package/dist/asyncapi/parse.d.ts +31 -0
- package/dist/asyncapi/parse.js +85 -0
- package/dist/asyncapi/read.d.ts +35 -0
- package/dist/asyncapi/read.js +186 -0
- package/dist/asyncapi/security.d.ts +14 -0
- package/dist/asyncapi/security.js +55 -0
- package/dist/asyncapi/update.d.ts +53 -0
- package/dist/asyncapi/update.js +220 -0
- package/dist/errors.d.ts +16 -0
- package/dist/errors.js +22 -0
- package/dist/grpc/events.d.ts +22 -0
- package/dist/grpc/events.js +1 -0
- package/dist/grpc/expand.d.ts +1 -1
- package/dist/grpc/expand.js +15 -5
- package/dist/grpc/files.d.ts +271 -0
- package/dist/grpc/files.js +62 -0
- package/dist/grpc/model.d.ts +11 -1
- package/dist/grpc/module.d.ts +2 -0
- package/dist/grpc/module.js +13 -0
- package/dist/grpc/run.d.ts +73 -0
- package/dist/grpc/run.js +407 -0
- package/dist/grpc/script-types.d.ts +8 -0
- package/dist/grpc/script-types.js +149 -0
- package/dist/grpc/scripting.d.ts +34 -0
- package/dist/grpc/scripting.js +147 -0
- package/dist/grpc/send-input.d.ts +46 -0
- package/dist/grpc/send-input.js +42 -0
- package/dist/grpc/send.d.ts +2 -2
- package/dist/grpc/status.d.ts +9 -2
- package/dist/grpc/status.js +11 -24
- package/dist/grpc/storage.d.ts +9 -0
- package/dist/grpc/storage.js +167 -0
- package/dist/{rest/auth.d.ts → http/auth/apply-auth.d.ts} +4 -4
- package/dist/{rest/auth.js → http/auth/apply-auth.js} +1 -1
- package/dist/http/auth/apply.d.ts +1 -1
- package/dist/{rest → http/auth}/oauth2.d.ts +2 -2
- package/dist/{rest → http/auth}/oauth2.js +1 -1
- package/dist/http/auth/send-auth.d.ts +57 -0
- package/dist/http/auth/send-auth.js +7 -0
- package/dist/http/client.js +150 -8
- package/dist/http/cookies.d.ts +79 -0
- package/dist/http/cookies.js +81 -0
- package/dist/http/curl.d.ts +4 -14
- package/dist/http/curl.js +4 -154
- package/dist/http/decompress.d.ts +7 -0
- package/dist/http/decompress.js +23 -1
- package/dist/http/document-fetch.d.ts +42 -0
- package/dist/http/document-fetch.js +207 -0
- package/dist/http/entries.d.ts +27 -0
- package/dist/http/entries.js +16 -0
- package/dist/http/escape.d.ts +18 -0
- package/dist/http/escape.js +30 -0
- package/dist/http/fetch-document.d.ts +28 -0
- package/dist/{wsdl/fetch.js → http/fetch-document.js} +8 -16
- package/dist/http/media-type.d.ts +9 -0
- package/dist/http/media-type.js +12 -0
- package/dist/http/transcript-cap.d.ts +26 -0
- package/dist/http/transcript-cap.js +36 -0
- package/dist/http/types.d.ts +59 -0
- package/dist/http/webhook-signature.d.ts +81 -0
- package/dist/http/webhook-signature.js +227 -0
- package/dist/import-detect.d.ts +2 -2
- package/dist/import-detect.js +10 -1
- package/dist/index.d.ts +207 -55
- package/dist/index.js +129 -32
- package/dist/json/cursor.d.ts +2 -0
- package/dist/json/cursor.js +1 -0
- package/dist/json/pointer-range.d.ts +18 -0
- package/dist/json/pointer-range.js +157 -0
- package/dist/json/schema/model.d.ts +59 -0
- package/dist/json/schema/model.js +8 -0
- package/dist/json/schema/parse-text.d.ts +16 -0
- package/dist/json/schema/parse-text.js +37 -0
- package/dist/{rest/openapi → json/schema}/refs.d.ts +2 -2
- package/dist/{rest/openapi → json/schema}/refs.js +3 -3
- package/dist/{rest/openapi → json/schema}/sample.d.ts +4 -0
- package/dist/{rest/openapi → json/schema}/sample.js +2 -2
- package/dist/json/schema/source.d.ts +21 -0
- package/dist/json/schema/source.js +8 -0
- package/dist/json/schema-validate.d.ts +49 -0
- package/dist/json/schema-validate.js +557 -0
- package/dist/{wss/keystore → keystore}/index.js +1 -1
- package/dist/{wss/keystore → keystore}/pem.js +1 -1
- package/dist/{wss/keystore → keystore}/pkcs12.js +1 -1
- package/dist/project/attachments-cache.d.ts +3 -1
- package/dist/{wsdl → project}/cache-naming.js +1 -1
- package/dist/project/endpoints.d.ts +18 -8
- package/dist/project/endpoints.js +21 -6
- package/dist/project/environments.d.ts +7 -5
- package/dist/project/history.d.ts +105 -9
- package/dist/project/history.js +195 -23
- package/dist/project/inherit.d.ts +7 -0
- package/dist/project/inherit.js +9 -0
- package/dist/project/keystores.d.ts +1 -1
- package/dist/project/load-helpers.d.ts +89 -0
- package/dist/project/load-helpers.js +177 -0
- package/dist/project/load.d.ts +30 -4
- package/dist/project/load.js +168 -545
- package/dist/project/managed-files.d.ts +36 -0
- package/dist/project/managed-files.js +97 -0
- package/dist/project/migrate.d.ts +2 -2
- package/dist/project/migrate.js +2 -2
- package/dist/project/model.d.ts +92 -14
- package/dist/project/model.js +50 -4
- package/dist/project/paths.d.ts +10 -1
- package/dist/project/paths.js +10 -1
- package/dist/project/preferences.d.ts +11 -2
- package/dist/project/preferences.js +5 -1
- package/dist/project/properties.d.ts +31 -17
- package/dist/project/properties.js +89 -70
- package/dist/project/request-location.d.ts +20 -0
- package/dist/project/request-location.js +62 -0
- package/dist/project/save.d.ts +12 -2
- package/dist/project/save.js +186 -141
- package/dist/project/schema-parts.d.ts +337 -0
- package/dist/project/schema-parts.js +248 -0
- package/dist/project/schema.d.ts +72 -928
- package/dist/project/schema.js +17 -466
- package/dist/project/sequence-guards.d.ts +43 -0
- package/dist/project/sequence-guards.js +109 -0
- package/dist/project/serialize-helpers.d.ts +60 -0
- package/dist/project/serialize-helpers.js +108 -0
- package/dist/project/serialize.d.ts +7 -8
- package/dist/project/serialize.js +34 -293
- package/dist/protocol/features.d.ts +51 -0
- package/dist/protocol/features.js +64 -0
- package/dist/protocol/index.d.ts +7 -0
- package/dist/protocol/index.js +4 -0
- package/dist/protocol/module.d.ts +247 -0
- package/dist/protocol/module.js +48 -0
- package/dist/protocol/registry.d.ts +42 -0
- package/dist/protocol/registry.js +47 -0
- package/dist/protocols.d.ts +77 -0
- package/dist/protocols.js +40 -0
- package/dist/redact/index.d.ts +12 -1
- package/dist/redact/index.js +55 -7
- package/dist/redact/literal.d.ts +10 -0
- package/dist/redact/literal.js +110 -12
- package/dist/rest/body.d.ts +2 -10
- package/dist/rest/body.js +3 -25
- package/dist/rest/browser.d.ts +4 -0
- package/dist/rest/browser.js +5 -0
- package/dist/rest/contract-check-worker-host.d.ts +36 -0
- package/dist/rest/contract-check-worker-host.js +158 -0
- package/dist/rest/contract-check-worker.d.ts +7 -0
- package/dist/rest/contract-check-worker.js +28 -0
- package/dist/rest/contract-check.d.ts +43 -0
- package/dist/rest/contract-check.js +217 -0
- package/dist/rest/cookie-jar.d.ts +62 -0
- package/dist/rest/cookie-jar.js +262 -0
- package/dist/rest/cookies.d.ts +6 -22
- package/dist/rest/cookies.js +6 -42
- package/dist/rest/curl.js +5 -1
- package/dist/rest/events.d.ts +12 -0
- package/dist/rest/events.js +1 -0
- package/dist/rest/expand.d.ts +6 -1
- package/dist/rest/expand.js +29 -11
- package/dist/rest/files.d.ts +439 -0
- package/dist/rest/files.js +107 -0
- package/dist/rest/json-form.d.ts +97 -0
- package/dist/rest/json-form.js +396 -0
- package/dist/rest/model.d.ts +35 -24
- package/dist/rest/model.js +6 -9
- package/dist/rest/module.d.ts +2 -0
- package/dist/rest/module.js +13 -0
- package/dist/rest/openapi/cache.d.ts +7 -2
- package/dist/rest/openapi/cache.js +2 -2
- package/dist/rest/openapi/import.d.ts +11 -16
- package/dist/rest/openapi/import.js +6 -2
- package/dist/rest/openapi/map.d.ts +38 -1
- package/dist/rest/openapi/map.js +151 -41
- package/dist/rest/openapi/match.d.ts +20 -0
- package/dist/rest/openapi/match.js +117 -0
- package/dist/rest/openapi/model.d.ts +33 -45
- package/dist/rest/openapi/parse.d.ts +3 -12
- package/dist/rest/openapi/parse.js +138 -67
- package/dist/rest/openapi/responses.d.ts +23 -0
- package/dist/rest/openapi/responses.js +59 -0
- package/dist/rest/openapi/runtime-expression.d.ts +69 -0
- package/dist/rest/openapi/runtime-expression.js +213 -0
- package/dist/rest/openapi/update.d.ts +116 -0
- package/dist/rest/openapi/update.js +456 -0
- package/dist/rest/postman/map.d.ts +1 -0
- package/dist/rest/postman/map.js +66 -4
- package/dist/rest/postman/model.d.ts +9 -0
- package/dist/rest/postman/parse.js +33 -10
- package/dist/rest/response.d.ts +2 -23
- package/dist/rest/response.js +3 -75
- package/dist/rest/run.d.ts +56 -0
- package/dist/rest/run.js +395 -0
- package/dist/rest/script-types.d.ts +7 -0
- package/dist/rest/script-types.js +83 -0
- package/dist/rest/scripting.d.ts +38 -0
- package/dist/rest/scripting.js +282 -0
- package/dist/rest/send-input.d.ts +54 -0
- package/dist/rest/send-input.js +73 -0
- package/dist/rest/send.d.ts +77 -4
- package/dist/rest/send.js +128 -7
- package/dist/rest/sse-transcript.d.ts +25 -0
- package/dist/rest/sse-transcript.js +95 -0
- package/dist/rest/sse.d.ts +43 -0
- package/dist/rest/sse.js +195 -0
- package/dist/rest/storage.d.ts +26 -0
- package/dist/rest/storage.js +262 -0
- package/dist/rest/url.d.ts +10 -4
- package/dist/rest/url.js +38 -5
- package/dist/run/baseline-update.d.ts +35 -0
- package/dist/run/baseline-update.js +97 -0
- package/dist/run/baseline.d.ts +42 -0
- package/dist/run/baseline.js +93 -0
- package/dist/run/context.d.ts +86 -0
- package/dist/run/context.js +31 -0
- package/dist/run/current-values.d.ts +32 -0
- package/dist/run/current-values.js +43 -0
- package/dist/run/event-queue.d.ts +14 -0
- package/dist/run/event-queue.js +46 -0
- package/dist/run/exchange.d.ts +62 -0
- package/dist/run/exchange.js +65 -0
- package/dist/run/host.d.ts +89 -0
- package/dist/run/host.js +1 -0
- package/dist/run/index.d.ts +20 -7
- package/dist/run/index.js +12 -4
- package/dist/run/oauth2-token.d.ts +42 -0
- package/dist/run/oauth2-token.js +92 -0
- package/dist/run/open.d.ts +12 -0
- package/dist/run/open.js +16 -0
- package/dist/run/run.d.ts +124 -4
- package/dist/run/run.js +293 -134
- package/dist/run/scope.d.ts +11 -0
- package/dist/run/scope.js +26 -0
- package/dist/run/script-support.d.ts +53 -0
- package/dist/run/script-support.js +68 -0
- package/dist/run/secret-needs.d.ts +11 -4
- package/dist/run/secret-needs.js +48 -96
- package/dist/run/select.d.ts +34 -25
- package/dist/run/select.js +45 -54
- package/dist/run/send-helpers.d.ts +93 -0
- package/dist/run/send-helpers.js +255 -0
- package/dist/run/tree.d.ts +50 -0
- package/dist/run/tree.js +54 -0
- package/dist/script/api/postman.d.ts +10 -0
- package/dist/script/api/postman.js +264 -0
- package/dist/script/api/prelude.d.ts +20 -0
- package/dist/script/api/prelude.js +215 -0
- package/dist/script/apply.d.ts +44 -0
- package/dist/script/apply.js +120 -0
- package/dist/script/check/host.d.ts +41 -0
- package/dist/script/check/host.js +143 -0
- package/dist/script/check/service.d.ts +52 -0
- package/dist/script/check/service.js +195 -0
- package/dist/script/check/worker.d.ts +1 -0
- package/dist/script/check/worker.js +40 -0
- package/dist/script/index.d.ts +16 -0
- package/dist/script/index.js +10 -0
- package/dist/script/lookup.d.ts +10 -0
- package/dist/script/lookup.js +23 -0
- package/dist/script/model.d.ts +82 -0
- package/dist/script/model.js +18 -0
- package/dist/script/props.d.ts +8 -0
- package/dist/script/props.js +28 -0
- package/dist/script/request-scripts.d.ts +83 -0
- package/dist/script/request-scripts.js +160 -0
- package/dist/script/run.d.ts +47 -0
- package/dist/script/run.js +146 -0
- package/dist/script/sandbox/execute.d.ts +26 -0
- package/dist/script/sandbox/execute.js +212 -0
- package/dist/script/sandbox/host-api.d.ts +27 -0
- package/dist/script/sandbox/host-api.js +101 -0
- package/dist/script/sandbox/host.d.ts +18 -0
- package/dist/script/sandbox/host.js +172 -0
- package/dist/script/sandbox/model.d.ts +69 -0
- package/dist/script/sandbox/model.js +24 -0
- package/dist/script/sandbox/worker.d.ts +1 -0
- package/dist/script/sandbox/worker.js +20 -0
- package/dist/script/send.d.ts +27 -0
- package/dist/script/send.js +76 -0
- package/dist/script/strip.d.ts +5 -0
- package/dist/script/strip.js +43 -0
- package/dist/script/types/api.d.ts +38 -0
- package/dist/script/types/api.js +113 -0
- package/dist/script/types/json-schema.d.ts +26 -0
- package/dist/script/types/json-schema.js +206 -0
- package/dist/secrets/env-names.d.ts +9 -1
- package/dist/secrets/env-names.js +17 -1
- package/dist/secrets/resolve.d.ts +44 -4
- package/dist/secrets/resolve.js +58 -1
- package/dist/secrets/scan/apply.d.ts +36 -0
- package/dist/secrets/scan/apply.js +194 -0
- package/dist/secrets/scan/rules.d.ts +32 -0
- package/dist/secrets/scan/rules.js +346 -0
- package/dist/secrets/scan/scan.d.ts +6 -0
- package/dist/secrets/scan/scan.js +57 -0
- package/dist/secrets/scan/walk.d.ts +70 -0
- package/dist/secrets/scan/walk.js +156 -0
- package/dist/secrets/secret-refs.d.ts +8 -0
- package/dist/secrets/secret-refs.js +25 -0
- package/dist/secrets/secret-token.d.ts +17 -0
- package/dist/secrets/secret-token.js +25 -0
- package/dist/sequence/file.d.ts +169 -0
- package/dist/sequence/file.js +237 -0
- package/dist/sequence/index.d.ts +7 -0
- package/dist/sequence/index.js +5 -0
- package/dist/sequence/load.d.ts +32 -0
- package/dist/sequence/load.js +56 -0
- package/dist/sequence/model.d.ts +115 -0
- package/dist/sequence/model.js +53 -0
- package/dist/sequence/run.d.ts +131 -0
- package/dist/sequence/run.js +191 -0
- package/dist/sequence/transfer.d.ts +24 -0
- package/dist/sequence/transfer.js +75 -0
- package/dist/server-api/audit.d.ts +455 -0
- package/dist/server-api/audit.js +186 -0
- package/dist/server-api/ci-tokens.d.ts +50 -0
- package/dist/server-api/ci-tokens.js +35 -0
- package/dist/server-api/hooks.d.ts +337 -0
- package/dist/server-api/hooks.js +152 -0
- package/dist/server-api/identity.d.ts +210 -0
- package/dist/server-api/identity.js +115 -0
- package/dist/server-api/licensing.d.ts +80 -0
- package/dist/server-api/licensing.js +53 -0
- package/dist/server-api/live.d.ts +132 -0
- package/dist/server-api/live.js +102 -0
- package/dist/server-api/meta.d.ts +31 -0
- package/dist/server-api/meta.js +21 -0
- package/dist/server-api/sync.d.ts +179 -0
- package/dist/server-api/sync.js +124 -0
- package/dist/server-api/teams.d.ts +306 -0
- package/dist/server-api/teams.js +113 -0
- package/dist/snapshot/diff.d.ts +30 -0
- package/dist/snapshot/diff.js +75 -0
- package/dist/snapshot/format.d.ts +17 -0
- package/dist/snapshot/format.js +40 -0
- package/dist/snapshot/golden-file.d.ts +45 -0
- package/dist/snapshot/golden-file.js +173 -0
- package/dist/snapshot/ignore.d.ts +14 -0
- package/dist/snapshot/ignore.js +79 -0
- package/dist/snapshot/index.d.ts +9 -0
- package/dist/snapshot/index.js +9 -0
- package/dist/snapshot/json-diff.d.ts +3 -0
- package/dist/snapshot/json-diff.js +93 -0
- package/dist/snapshot/xml-diff.d.ts +10 -0
- package/dist/snapshot/xml-diff.js +194 -0
- package/dist/soap/auth.d.ts +26 -0
- package/dist/soap/auth.js +54 -0
- package/dist/soap/curl.d.ts +20 -0
- package/dist/soap/curl.js +161 -0
- package/dist/soap/expand.d.ts +24 -0
- package/dist/soap/expand.js +95 -0
- package/dist/soap/files.d.ts +384 -0
- package/dist/soap/files.js +114 -0
- package/dist/soap/form-request.d.ts +13 -0
- package/dist/soap/form-request.js +2 -2
- package/dist/soap/generate.d.ts +12 -0
- package/dist/{generate.js → soap/generate.js} +4 -4
- package/dist/{import.d.ts → soap/import.d.ts} +4 -4
- package/dist/{import.js → soap/import.js} +13 -13
- package/dist/soap/json-operation.d.ts +35 -0
- package/dist/soap/json-operation.js +225 -0
- package/dist/soap/legacy-project/env-refs.d.ts +19 -0
- package/dist/soap/legacy-project/env-refs.js +105 -0
- package/dist/soap/legacy-project/map.d.ts +2 -2
- package/dist/soap/legacy-project/map.js +6 -0
- package/dist/soap/mime/multipart.d.ts +2 -2
- package/dist/soap/mime/multipart.js +2 -5
- package/dist/soap/mime/send-pipeline.d.ts +1 -1
- package/dist/soap/mime/send-pipeline.js +1 -1
- package/dist/soap/mime/types.d.ts +1 -3
- package/dist/soap/module.d.ts +2 -0
- package/dist/soap/module.js +13 -0
- package/dist/soap/namespace-scope.js +1 -1
- package/dist/soap/operations.d.ts +12 -0
- package/dist/{operations.js → soap/operations.js} +4 -4
- package/dist/soap/run.d.ts +70 -0
- package/dist/soap/run.js +549 -0
- package/dist/soap/script-types.d.ts +65 -0
- package/dist/soap/script-types.js +379 -0
- package/dist/soap/scripting.d.ts +45 -0
- package/dist/soap/scripting.js +221 -0
- package/dist/soap/send-input.d.ts +61 -0
- package/dist/{send-options.js → soap/send-input.js} +5 -109
- package/dist/{send.d.ts → soap/send.d.ts} +1 -1
- package/dist/{send.js → soap/send.js} +28 -12
- package/dist/soap/storage.d.ts +9 -0
- package/dist/soap/storage.js +237 -0
- package/dist/soap/transforms.d.ts +3 -12
- package/dist/soap/transforms.js +3 -14
- package/dist/{types.d.ts → soap/types.d.ts} +34 -84
- package/dist/sync/git-cli.d.ts +202 -0
- package/dist/sync/git-cli.js +684 -0
- package/dist/sync/three-way-merge.d.ts +41 -0
- package/dist/sync/three-way-merge.js +85 -0
- package/dist/sync/tree-paths.d.ts +34 -0
- package/dist/sync/tree-paths.js +131 -0
- package/dist/team-secrets/envelope.d.ts +10 -0
- package/dist/team-secrets/envelope.js +121 -0
- package/dist/team-secrets/errors.d.ts +26 -0
- package/dist/team-secrets/errors.js +27 -0
- package/dist/team-secrets/index.d.ts +14 -0
- package/dist/team-secrets/index.js +8 -0
- package/dist/team-secrets/keys.d.ts +52 -0
- package/dist/team-secrets/keys.js +158 -0
- package/dist/team-secrets/log.d.ts +48 -0
- package/dist/team-secrets/log.js +175 -0
- package/dist/team-secrets/resolve-conflict.d.ts +7 -0
- package/dist/team-secrets/resolve-conflict.js +14 -0
- package/dist/team-secrets/schema.d.ts +97 -0
- package/dist/team-secrets/schema.js +157 -0
- package/dist/team-secrets/sign.d.ts +24 -0
- package/dist/team-secrets/sign.js +71 -0
- package/dist/team-secrets/vault.d.ts +49 -0
- package/dist/team-secrets/vault.js +148 -0
- package/dist/validate/wsi/run-message.d.ts +2 -2
- package/dist/validate/wsi/run-message.js +1 -1
- package/dist/validate/wsi/run-wsdl.d.ts +2 -2
- package/dist/validate/wsi/run-wsdl.js +1 -1
- package/dist/validate/wsi/types.d.ts +1 -1
- package/dist/webhooks/model.d.ts +138 -0
- package/dist/webhooks/model.js +150 -0
- package/dist/workspace/commit-message.d.ts +1 -1
- package/dist/workspace/commit-message.js +6 -1
- package/dist/workspace/environments.d.ts +11 -4
- package/dist/workspace/environments.js +12 -0
- package/dist/workspace/index.d.ts +3 -3
- package/dist/workspace/index.js +2 -2
- package/dist/workspace/paths.d.ts +5 -2
- package/dist/workspace/paths.js +5 -2
- package/dist/workspace/schema.d.ts +7 -3
- package/dist/workspace/schema.js +24 -3
- package/dist/workspace/share.d.ts +30 -11
- package/dist/workspace/share.js +32 -6
- package/dist/ws/call.d.ts +1 -1
- package/dist/ws/call.js +2 -2
- package/dist/ws/connect.d.ts +60 -0
- package/dist/ws/connect.js +131 -0
- package/dist/ws/events.d.ts +17 -0
- package/dist/ws/events.js +1 -0
- package/dist/ws/expand.d.ts +1 -1
- package/dist/ws/expand.js +1 -1
- package/dist/ws/files.d.ts +284 -0
- package/dist/ws/files.js +71 -0
- package/dist/ws/history-entry.d.ts +44 -0
- package/dist/ws/history-entry.js +93 -0
- package/dist/ws/model.d.ts +44 -3
- package/dist/ws/model.js +3 -0
- package/dist/ws/module.d.ts +2 -0
- package/dist/ws/module.js +11 -0
- package/dist/ws/run.d.ts +63 -0
- package/dist/ws/run.js +470 -0
- package/dist/ws/session.d.ts +18 -0
- package/dist/ws/session.js +52 -25
- package/dist/ws/storage.d.ts +9 -0
- package/dist/ws/storage.js +176 -0
- package/dist/ws/transcript.d.ts +3 -4
- package/dist/ws/transcript.js +26 -17
- package/dist/ws/url.d.ts +1 -1
- package/dist/wsdl/cache.js +1 -1
- package/dist/wsdl/docs-generator.d.ts +3 -3
- package/dist/wsdl/docs-generator.js +1 -1
- package/dist/wsdl/export-definition.js +1 -1
- package/dist/wsdl/qname.d.ts +2 -5
- package/dist/wsdl/resolver.d.ts +4 -11
- package/dist/wsdl/resolver.js +3 -3
- package/dist/wsdl/update-definition.d.ts +5 -5
- package/dist/wsdl/update-definition.js +6 -6
- package/dist/wss/apply.js +1 -1
- package/dist/{project/wss-configs.d.ts → wss/configs.d.ts} +2 -2
- package/dist/{project/wss-configs.js → wss/configs.js} +2 -2
- package/dist/wss/incoming/decrypt.d.ts +1 -1
- package/dist/wss/incoming/index.js +1 -1
- package/dist/wss/incoming/verify.d.ts +1 -1
- package/dist/wss/incoming/verify.js +1 -1
- package/dist/wss/key-identifiers.js +1 -1
- package/dist/wss/model.d.ts +1 -1
- package/dist/wss/outgoing/encryption.d.ts +1 -1
- package/dist/wss/outgoing/signature.d.ts +1 -1
- package/dist/xml/decode.d.ts +15 -0
- package/dist/xml/decode.js +22 -0
- package/dist/xml/entitize.d.ts +17 -0
- package/dist/xml/entitize.js +19 -0
- package/dist/xml/index.d.ts +1 -1
- package/dist/xml/index.js +1 -1
- package/dist/xml/locate.d.ts +39 -0
- package/dist/xml/locate.js +117 -0
- package/dist/xml/qname.d.ts +12 -0
- package/dist/xml/qname.js +8 -0
- package/dist/xpath/evaluate-async.d.ts +19 -0
- package/dist/xpath/evaluate-async.js +31 -11
- package/dist/xpath/evaluate.d.ts +1 -1
- package/dist/xpath/namespaces.js +1 -1
- package/dist/xpath/worker.d.ts +11 -5
- package/dist/xpath/worker.js +24 -7
- package/dist/xsd/form-model.d.ts +19 -2
- package/dist/xsd/form-model.js +14 -2
- package/dist/xsd/json-bridge.d.ts +152 -0
- package/dist/xsd/json-bridge.js +1213 -0
- package/dist/xsd/locate.d.ts +2 -30
- package/dist/xsd/locate.js +1 -109
- package/dist/xsd/xml-scan.d.ts +2 -0
- package/dist/xsd/xml-scan.js +1 -1
- package/dist/xsd/xml-writer.d.ts +2 -0
- package/dist/xsd/xml-writer.js +4 -0
- package/package.json +12 -1
- package/dist/generate.d.ts +0 -12
- package/dist/operations.d.ts +0 -12
- package/dist/run/effective-auth.d.ts +0 -10
- package/dist/run/effective-auth.js +0 -19
- package/dist/run/prepare.d.ts +0 -43
- package/dist/run/prepare.js +0 -280
- package/dist/send-options.d.ts +0 -141
- package/dist/wsdl/fetch.d.ts +0 -13
- /package/dist/{soap → http}/charset.d.ts +0 -0
- /package/dist/{soap → http}/charset.js +0 -0
- /package/dist/{wsdl → http}/ref-policy.d.ts +0 -0
- /package/dist/{wsdl → http}/ref-policy.js +0 -0
- /package/dist/{wss/keystore → keystore}/certificate.d.ts +0 -0
- /package/dist/{wss/keystore → keystore}/certificate.js +0 -0
- /package/dist/{wss/keystore → keystore}/index.d.ts +0 -0
- /package/dist/{wss/keystore → keystore}/model.d.ts +0 -0
- /package/dist/{wss/keystore → keystore}/model.js +0 -0
- /package/dist/{wss/keystore → keystore}/pem.d.ts +0 -0
- /package/dist/{wss/keystore → keystore}/pkcs12.d.ts +0 -0
- /package/dist/{wsdl → project}/cache-naming.d.ts +0 -0
- /package/dist/{types.js → soap/types.js} +0 -0
- /package/dist/{soap → xml}/prefixes.d.ts +0 -0
- /package/dist/{soap → xml}/prefixes.js +0 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The SOAP files of a project folder: `interfaces/<slug>/interface.yaml` and each
|
|
3
|
+
* `operations/<slug>/<name>.request.yaml` under it (spec §3.2). The shared pieces and the
|
|
4
|
+
* strictness policy are `project/schema-parts.ts`'s.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { assertionsSchema } from '../assert/schema.js';
|
|
8
|
+
import { attachmentSourceSchema, nonEmpty, scriptsSchema, soapOwnerAuthSchema } from '../project/schema-parts.js';
|
|
9
|
+
const endpointSchema = z.looseObject({
|
|
10
|
+
id: nonEmpty,
|
|
11
|
+
name: z.string(),
|
|
12
|
+
url: z.string(),
|
|
13
|
+
auth: soapOwnerAuthSchema.optional(),
|
|
14
|
+
authMode: z.enum(['override', 'complement']),
|
|
15
|
+
trustInvalid: z.boolean().optional(),
|
|
16
|
+
});
|
|
17
|
+
/**
|
|
18
|
+
* A stored WS-Addressing configuration. Every field beyond `enabled` is optional so a project
|
|
19
|
+
* written before the WS-Addressing task — which only ever held `{ enabled, version? }` — still
|
|
20
|
+
* loads; `normalizeWsa` fills the rest in with the v1 defaults.
|
|
21
|
+
*/
|
|
22
|
+
const wsaSchema = z.looseObject({
|
|
23
|
+
enabled: z.boolean(),
|
|
24
|
+
version: z.enum(['2005/08', '2004/08']).optional(),
|
|
25
|
+
mustUnderstand: z.enum(['none', 'true', 'false']).optional(),
|
|
26
|
+
action: z.string().optional(),
|
|
27
|
+
to: z.string().optional(),
|
|
28
|
+
messageId: z.string().optional(),
|
|
29
|
+
replyTo: z.string().optional(),
|
|
30
|
+
from: z.string().optional(),
|
|
31
|
+
faultTo: z.string().optional(),
|
|
32
|
+
relatesTo: z.string().optional(),
|
|
33
|
+
relationshipType: z.string().optional(),
|
|
34
|
+
addDefaultAction: z.boolean().optional(),
|
|
35
|
+
addDefaultTo: z.boolean().optional(),
|
|
36
|
+
generateMessageId: z.boolean().optional(),
|
|
37
|
+
});
|
|
38
|
+
const operationEntrySchema = z.looseObject({
|
|
39
|
+
name: nonEmpty,
|
|
40
|
+
bindingName: z.string(),
|
|
41
|
+
slug: nonEmpty,
|
|
42
|
+
order: z.number().int(),
|
|
43
|
+
});
|
|
44
|
+
/** `interfaces/<slug>/interface.yaml`. */
|
|
45
|
+
export const interfaceFileSchema = z.looseObject({
|
|
46
|
+
kind: z.literal('soap'),
|
|
47
|
+
id: nonEmpty,
|
|
48
|
+
name: z.string(),
|
|
49
|
+
order: z.number().int(),
|
|
50
|
+
definitionUrl: z.string(),
|
|
51
|
+
cacheDefinition: z.boolean(),
|
|
52
|
+
targetNamespace: z.string().optional(),
|
|
53
|
+
endpoints: z.array(endpointSchema),
|
|
54
|
+
defaultEndpointId: z.string().optional(),
|
|
55
|
+
wsa: wsaSchema,
|
|
56
|
+
auth: soapOwnerAuthSchema.optional(),
|
|
57
|
+
operations: z.array(operationEntrySchema),
|
|
58
|
+
});
|
|
59
|
+
const requestPropertiesSchema = z.looseObject({
|
|
60
|
+
encoding: z.string(),
|
|
61
|
+
timeoutMs: z.number().int().nonnegative().optional(),
|
|
62
|
+
bindAddress: z.string().optional(),
|
|
63
|
+
followRedirects: z.boolean(),
|
|
64
|
+
skipSoapAction: z.boolean(),
|
|
65
|
+
enableMtom: z.boolean(),
|
|
66
|
+
forceMtom: z.boolean(),
|
|
67
|
+
inlineResponseAttachments: z.boolean(),
|
|
68
|
+
expandMtomAttachments: z.boolean(),
|
|
69
|
+
disableMultiparts: z.boolean(),
|
|
70
|
+
encodeAttachments: z.boolean(),
|
|
71
|
+
enableInlineFiles: z.boolean(),
|
|
72
|
+
removeEmptyContent: z.boolean(),
|
|
73
|
+
entitizeProperties: z.boolean(),
|
|
74
|
+
prettyPrint: z.boolean(),
|
|
75
|
+
stripWhitespaces: z.boolean(),
|
|
76
|
+
dumpFile: z.string().optional(),
|
|
77
|
+
maxSizeBytes: z.number().int().nonnegative().optional(),
|
|
78
|
+
wssPasswordType: z.enum(['text', 'digest']).optional(),
|
|
79
|
+
wssTimeToLive: z.number().int().nonnegative().optional(),
|
|
80
|
+
sslKeystoreRef: z.string().optional(),
|
|
81
|
+
});
|
|
82
|
+
const attachmentSchema = z.looseObject({
|
|
83
|
+
id: nonEmpty,
|
|
84
|
+
name: z.string(),
|
|
85
|
+
contentType: z.string(),
|
|
86
|
+
size: z.number().int().nonnegative(),
|
|
87
|
+
part: z.string().optional(),
|
|
88
|
+
type: z.enum(['XOP', 'MIME', 'SWAREF', 'CONTENT', 'UNKNOWN']),
|
|
89
|
+
contentId: z.string(),
|
|
90
|
+
cached: z.boolean(),
|
|
91
|
+
source: attachmentSourceSchema,
|
|
92
|
+
});
|
|
93
|
+
/** `interfaces/<slug>/operations/<slug>/<name>.request.yaml` (the envelope lives in the sibling `.xml`). */
|
|
94
|
+
export const requestFileSchema = z.looseObject({
|
|
95
|
+
kind: z.literal('soap'),
|
|
96
|
+
id: nonEmpty,
|
|
97
|
+
name: z.string(),
|
|
98
|
+
order: z.number().int(),
|
|
99
|
+
description: z.string().optional(),
|
|
100
|
+
endpointId: z.string().optional(),
|
|
101
|
+
endpointUrl: z.string().optional(),
|
|
102
|
+
soapVersion: z.enum(['1.1', '1.2']),
|
|
103
|
+
soapAction: z.string().optional(),
|
|
104
|
+
headers: z.array(z.looseObject({ name: z.string(), value: z.string() })),
|
|
105
|
+
attachments: z.array(attachmentSchema),
|
|
106
|
+
auth: soapOwnerAuthSchema.optional(),
|
|
107
|
+
wsa: wsaSchema.optional(),
|
|
108
|
+
wssOutgoingRef: z.string().optional(),
|
|
109
|
+
wssIncomingRef: z.string().optional(),
|
|
110
|
+
properties: requestPropertiesSchema,
|
|
111
|
+
assertions: assertionsSchema.default([]),
|
|
112
|
+
orphaned: z.boolean().optional(),
|
|
113
|
+
scripts: scriptsSchema.optional(),
|
|
114
|
+
});
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* envelope, its namespace declarations, any headers — is never touched.
|
|
7
7
|
*/
|
|
8
8
|
import type { BuildFormOptions, FormNode, TextRange } from '../xsd/form-model.js';
|
|
9
|
+
import type { ScannedElement } from '../xsd/xml-scan.js';
|
|
9
10
|
import type { OperationRef, RequestBuildInput } from './request-builder.js';
|
|
10
11
|
/** What {@link buildRequestForm} returns. */
|
|
11
12
|
export interface RequestForm {
|
|
@@ -16,6 +17,18 @@ export interface RequestForm {
|
|
|
16
17
|
/** Everything that could not be modelled; the view falls back to "Edit in XML" for those parts. */
|
|
17
18
|
readonly problems: readonly string[];
|
|
18
19
|
}
|
|
20
|
+
/** Depth-first search for the `soapenv:Body` element, whichever SOAP version declares it. */
|
|
21
|
+
export declare function findBody(elements: readonly ScannedElement[]): ScannedElement | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* Every `xmlns:prefix="uri"` declared anywhere in the envelope. A body fragment
|
|
24
|
+
* sliced out of it carries none of its own (the request builder hoists them all
|
|
25
|
+
* onto `soapenv:Envelope`), so the form model needs both directions: `byUri` to
|
|
26
|
+
* name a new element, `byPrefix` to resolve the ones already written.
|
|
27
|
+
*/
|
|
28
|
+
export declare function namespacesInScope(text: string): {
|
|
29
|
+
byUri: Record<string, string>;
|
|
30
|
+
byPrefix: Record<string, string>;
|
|
31
|
+
};
|
|
19
32
|
/**
|
|
20
33
|
* Models the Body of `envelopeXml` for one binding operation.
|
|
21
34
|
*
|
|
@@ -12,7 +12,7 @@ import { buildForm, buildFormForType } from '../xsd/form-model.js';
|
|
|
12
12
|
import { scanXml } from '../xsd/xml-scan.js';
|
|
13
13
|
const ENVELOPE_NAMESPACES = new Set([NS.SOAP11_ENV, NS.SOAP12_ENV]);
|
|
14
14
|
/** Depth-first search for the `soapenv:Body` element, whichever SOAP version declares it. */
|
|
15
|
-
function findBody(elements) {
|
|
15
|
+
export function findBody(elements) {
|
|
16
16
|
for (const element of elements) {
|
|
17
17
|
if (element.localName === 'Body' && ENVELOPE_NAMESPACES.has(element.namespaceUri)) {
|
|
18
18
|
return element;
|
|
@@ -30,7 +30,7 @@ function findBody(elements) {
|
|
|
30
30
|
* onto `soapenv:Envelope`), so the form model needs both directions: `byUri` to
|
|
31
31
|
* name a new element, `byPrefix` to resolve the ones already written.
|
|
32
32
|
*/
|
|
33
|
-
function namespacesInScope(text) {
|
|
33
|
+
export function namespacesInScope(text) {
|
|
34
34
|
const byUri = {};
|
|
35
35
|
const byPrefix = {};
|
|
36
36
|
const re = /xmlns:([A-Za-z_][\w.-]*)\s*=\s*"([^"]*)"/g;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convenience wrappers around `buildSampleRequest`/`buildEmptyRequest` that
|
|
3
|
+
* take a {@link WsdlImportResult} directly, so callers don't have to thread
|
|
4
|
+
* `definition`/`schemaSet` through by hand.
|
|
5
|
+
*/
|
|
6
|
+
import type { GeneratedRequest, OperationRef, RequestBuildOptions } from './request-builder.js';
|
|
7
|
+
import type { GenerateOptions } from '../xsd/sample-generator.js';
|
|
8
|
+
import type { WsdlImportResult } from './types.js';
|
|
9
|
+
/** Builds the sample SOAP request for one operation of an imported definition. */
|
|
10
|
+
export declare function generateSoapRequest(result: WsdlImportResult, op: OperationRef, genOptions?: Partial<GenerateOptions>, options?: RequestBuildOptions): GeneratedRequest;
|
|
11
|
+
/** Builds an empty SOAP request (empty `Header`/`Body`) for one operation of an imported definition. */
|
|
12
|
+
export declare function generateEmptySoapRequest(result: WsdlImportResult, op: OperationRef, options?: RequestBuildOptions): GeneratedRequest;
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Convenience wrappers around `buildSampleRequest`/`buildEmptyRequest` that
|
|
3
|
-
* take
|
|
3
|
+
* take a {@link WsdlImportResult} directly, so callers don't have to thread
|
|
4
4
|
* `definition`/`schemaSet` through by hand.
|
|
5
5
|
*/
|
|
6
|
-
import { buildEmptyRequest, buildSampleRequest } from './
|
|
6
|
+
import { buildEmptyRequest, buildSampleRequest } from './request-builder.js';
|
|
7
7
|
/** Builds the sample SOAP request for one operation of an imported definition. */
|
|
8
|
-
export function
|
|
8
|
+
export function generateSoapRequest(result, op, genOptions, options) {
|
|
9
9
|
return buildSampleRequest({ definition: result.definition, schemaSet: result.schemaSet }, op, genOptions, options);
|
|
10
10
|
}
|
|
11
11
|
/** Builds an empty SOAP request (empty `Header`/`Body`) for one operation of an imported definition. */
|
|
12
|
-
export function
|
|
12
|
+
export function generateEmptySoapRequest(result, op, options) {
|
|
13
13
|
return buildEmptyRequest({ definition: result.definition, schemaSet: result.schemaSet }, op, options);
|
|
14
14
|
}
|
|
@@ -3,18 +3,18 @@
|
|
|
3
3
|
* merged WSDL, compile the schema set, and summarize the operations a user
|
|
4
4
|
* can pick from.
|
|
5
5
|
*/
|
|
6
|
-
import type {
|
|
6
|
+
import type { WsdlImportOptions, WsdlImportResult, WsdlImportSource } from './types.js';
|
|
7
7
|
/**
|
|
8
8
|
* Imports a WSDL definition from a URL, file path, or inline text: resolves
|
|
9
9
|
* its full import graph, parses the merged WSDL, compiles the schema set,
|
|
10
10
|
* and summarizes its operations for a picker UI.
|
|
11
11
|
*
|
|
12
12
|
* Never throws for a modelling problem in the definition itself — those are
|
|
13
|
-
* reported in {@link
|
|
14
|
-
* `
|
|
13
|
+
* reported in {@link WsdlImportResult.problems}. It does throw for a malformed
|
|
14
|
+
* `WsdlImportSource` (an invalid URL) or when the root document cannot be
|
|
15
15
|
* fetched at all.
|
|
16
16
|
*
|
|
17
17
|
* @param source where the WSDL comes from
|
|
18
18
|
* @param options fetch override, Basic auth for fetching, abort signal, progress callback, definition cache
|
|
19
19
|
*/
|
|
20
|
-
export declare function
|
|
20
|
+
export declare function importWsdl(source: WsdlImportSource, options?: WsdlImportOptions): Promise<WsdlImportResult>;
|
|
@@ -4,15 +4,15 @@
|
|
|
4
4
|
* can pick from.
|
|
5
5
|
*/
|
|
6
6
|
import { pathToFileURL } from 'node:url';
|
|
7
|
-
import { HttpError, ProjectError, WsdlParseError } from '
|
|
8
|
-
import {
|
|
9
|
-
import { summarizeWsa } from '
|
|
10
|
-
import { readDefinitionCache, writeDefinitionCache } from '
|
|
11
|
-
import { createDefaultFetchDocument } from '
|
|
12
|
-
import { parseWsdlBundle } from '
|
|
13
|
-
import { resolveDefinition } from '
|
|
14
|
-
import { buildSchemaSet } from '
|
|
15
|
-
/** Turns
|
|
7
|
+
import { HttpError, ProjectError, WsdlParseError } from '../errors.js';
|
|
8
|
+
import { summarizeSoapOperations } from './operations.js';
|
|
9
|
+
import { summarizeWsa } from '../wsa/policy-detect.js';
|
|
10
|
+
import { readDefinitionCache, writeDefinitionCache } from '../wsdl/cache.js';
|
|
11
|
+
import { createDefaultFetchDocument } from '../http/fetch-document.js';
|
|
12
|
+
import { parseWsdlBundle } from '../wsdl/merge.js';
|
|
13
|
+
import { resolveDefinition } from '../wsdl/resolver.js';
|
|
14
|
+
import { buildSchemaSet } from '../xsd/schema-set.js';
|
|
15
|
+
/** Turns a {@link WsdlImportSource} into the `DefinitionSource` the resolver understands. */
|
|
16
16
|
function toDefinitionSource(source) {
|
|
17
17
|
if (source.kind === 'file') {
|
|
18
18
|
return { location: pathToFileURL(source.path).href };
|
|
@@ -124,14 +124,14 @@ async function resolveWithCache(definitionSource, fetchDocument, signal, cache,
|
|
|
124
124
|
* and summarizes its operations for a picker UI.
|
|
125
125
|
*
|
|
126
126
|
* Never throws for a modelling problem in the definition itself — those are
|
|
127
|
-
* reported in {@link
|
|
128
|
-
* `
|
|
127
|
+
* reported in {@link WsdlImportResult.problems}. It does throw for a malformed
|
|
128
|
+
* `WsdlImportSource` (an invalid URL) or when the root document cannot be
|
|
129
129
|
* fetched at all.
|
|
130
130
|
*
|
|
131
131
|
* @param source where the WSDL comes from
|
|
132
132
|
* @param options fetch override, Basic auth for fetching, abort signal, progress callback, definition cache
|
|
133
133
|
*/
|
|
134
|
-
export async function
|
|
134
|
+
export async function importWsdl(source, options) {
|
|
135
135
|
const signal = options?.signal;
|
|
136
136
|
const baseFetch = options?.fetchDocument ?? createDefaultFetchDocument();
|
|
137
137
|
const fetchDocument = options?.auth !== undefined ? withBasicAuth(baseFetch, options.auth) : baseFetch;
|
|
@@ -149,7 +149,7 @@ export async function importDefinition(source, options) {
|
|
|
149
149
|
...definition.problems.map((p) => ({ source: 'wsdl', ...p })),
|
|
150
150
|
...schemaSet.problems.map((p) => ({ source: 'schema', ...p })),
|
|
151
151
|
];
|
|
152
|
-
const operations =
|
|
152
|
+
const operations = summarizeSoapOperations(definition);
|
|
153
153
|
options?.onProgress?.({ phase: 'done' });
|
|
154
154
|
return {
|
|
155
155
|
definition,
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A SOAP operation's body as JSON (#33 spec §3.1, §4.1, §5). One document/literal element part is
|
|
3
|
+
* that element's content; any other shape is one property per part, inside the rpc wrapper element
|
|
4
|
+
* for rpc. The envelope's transport (version, action) is the one a new request of the operation has.
|
|
5
|
+
*/
|
|
6
|
+
import type { MessageDirection } from '../validate/index.js';
|
|
7
|
+
import type { JsonFromXmlResult, JsonSchemaObject } from '../xsd/json-bridge.js';
|
|
8
|
+
import type { SoapEnvelopeVersion } from './envelope.js';
|
|
9
|
+
import type { OperationRef, RequestBuildInput } from './request-builder.js';
|
|
10
|
+
export interface OperationSchema {
|
|
11
|
+
readonly schema: JsonSchemaObject;
|
|
12
|
+
readonly notes: readonly string[];
|
|
13
|
+
}
|
|
14
|
+
export interface JsonEnvelope {
|
|
15
|
+
readonly envelopeXml: string;
|
|
16
|
+
readonly soapVersion: SoapEnvelopeVersion;
|
|
17
|
+
readonly soapAction?: string;
|
|
18
|
+
readonly notes: readonly string[];
|
|
19
|
+
/** Why no body could be written; nothing may be sent when any. */
|
|
20
|
+
readonly problems: readonly string[];
|
|
21
|
+
}
|
|
22
|
+
/** The JSON Schema of an operation's input (or output) body, `$defs` shared across its parts. */
|
|
23
|
+
export declare function operationJsonSchema(input: RequestBuildInput, op: OperationRef, direction?: MessageDirection): OperationSchema;
|
|
24
|
+
/**
|
|
25
|
+
* The request envelope for `args`: the body written through the form model, in an envelope with no
|
|
26
|
+
* indentation (`createEnvelope` indents every line of the body, which would change a multi-line value).
|
|
27
|
+
*/
|
|
28
|
+
export declare function envelopeFromJson(input: RequestBuildInput, op: OperationRef, args: Readonly<Record<string, unknown>>): JsonEnvelope;
|
|
29
|
+
/** An envelope's body read back as the JSON {@link envelopeFromJson} takes. */
|
|
30
|
+
export declare function jsonFromEnvelope(input: RequestBuildInput, op: OperationRef, xml: string, direction?: MessageDirection): JsonFromXmlResult;
|
|
31
|
+
/**
|
|
32
|
+
* A fault's `detail` as JSON, when its first element is the element of a fault message part the
|
|
33
|
+
* operation declares; undefined otherwise (the caller keeps the XML).
|
|
34
|
+
*/
|
|
35
|
+
export declare function faultDetailJson(input: RequestBuildInput, op: OperationRef, detailXml: string): JsonFromXmlResult | undefined;
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { bindingContextFor } from '../validate/index.js';
|
|
2
|
+
import { findBinding, findMessage, findPortType } from '../wsdl/model.js';
|
|
3
|
+
import { qnameToString } from '../wsdl/qname.js';
|
|
4
|
+
import { NS } from '../xml/namespaces.js';
|
|
5
|
+
import { prefixForNamespace } from '../xml/prefixes.js';
|
|
6
|
+
import { createJsonSchemaWriter, freeKey, jsonFromXml, targetType, xmlFromJson } from '../xsd/json-bridge.js';
|
|
7
|
+
import { scanXml } from '../xsd/xml-scan.js';
|
|
8
|
+
import { escapeAttribute } from '../xsd/xml-writer.js';
|
|
9
|
+
import { createEnvelope } from './envelope.js';
|
|
10
|
+
import { findBody, namespacesInScope } from './form-request.js';
|
|
11
|
+
import { buildEmptyRequest } from './request-builder.js';
|
|
12
|
+
const ANY_TYPE = { namespaceUri: NS.XSD, localName: 'anyType' };
|
|
13
|
+
function bodyShape(input, op, direction) {
|
|
14
|
+
const binding = bindingContextFor(input.definition, op, direction);
|
|
15
|
+
if (binding === undefined) {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
const parts = binding.parts.map((part) => ({
|
|
19
|
+
name: part.name,
|
|
20
|
+
target: part.element !== undefined
|
|
21
|
+
? { element: part.element }
|
|
22
|
+
: { name: { namespaceUri: '', localName: part.name }, type: part.type ?? ANY_TYPE },
|
|
23
|
+
}));
|
|
24
|
+
const [first] = parts;
|
|
25
|
+
if (binding.style === 'document') {
|
|
26
|
+
return { single: parts.length === 1 && first !== undefined && 'element' in first.target, parts };
|
|
27
|
+
}
|
|
28
|
+
const operation = findBinding(input.definition, op.bindingName)?.operations.find((candidate) => candidate.name === op.operationName);
|
|
29
|
+
const body = direction === 'request' ? operation?.input?.body : operation?.output?.body;
|
|
30
|
+
return {
|
|
31
|
+
single: false,
|
|
32
|
+
parts,
|
|
33
|
+
wrapper: {
|
|
34
|
+
namespaceUri: body?.namespace ?? input.definition.targetNamespace,
|
|
35
|
+
localName: direction === 'request' ? op.operationName : `${op.operationName}Response`,
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Whether a body element's content is a value rather than an object (a simple type, `anyType`, a
|
|
41
|
+
* SOAP-encoded array): its one argument is then `#text`. Decided by the resolved type, so the schema,
|
|
42
|
+
* the writer and the reader agree whatever shape the generated schema takes.
|
|
43
|
+
*/
|
|
44
|
+
function textBodied(set, target) {
|
|
45
|
+
const kind = targetType(set, target)?.kind;
|
|
46
|
+
return kind !== undefined && kind !== 'complex';
|
|
47
|
+
}
|
|
48
|
+
const DEFS_REF = '#/$defs/';
|
|
49
|
+
/** A root that came out as a `$ref` (a type that refers back to itself), as the definition it names. */
|
|
50
|
+
function inlineRoot(content, defs) {
|
|
51
|
+
const ref = content['$ref'];
|
|
52
|
+
if (typeof ref !== 'string' || !ref.startsWith(DEFS_REF) || defs === undefined) {
|
|
53
|
+
return content;
|
|
54
|
+
}
|
|
55
|
+
const def = defs[ref.slice(DEFS_REF.length).replaceAll('~1', '/').replaceAll('~0', '~')];
|
|
56
|
+
return typeof def === 'object' && def !== null && !Array.isArray(def) ? def : content;
|
|
57
|
+
}
|
|
58
|
+
const OBJECT_OF_NOTHING = { type: 'object', properties: {}, additionalProperties: false };
|
|
59
|
+
/** The JSON Schema of an operation's input (or output) body, `$defs` shared across its parts. */
|
|
60
|
+
export function operationJsonSchema(input, op, direction = 'request') {
|
|
61
|
+
const shape = bodyShape(input, op, direction);
|
|
62
|
+
if (shape === undefined) {
|
|
63
|
+
return {
|
|
64
|
+
schema: OBJECT_OF_NOTHING,
|
|
65
|
+
notes: [`${op.operationName}: the binding has no SOAP operation of that name`],
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
const writer = createJsonSchemaWriter(input.schemaSet);
|
|
69
|
+
let schema;
|
|
70
|
+
const [first] = shape.parts;
|
|
71
|
+
if (shape.single && first !== undefined) {
|
|
72
|
+
const content = writer.schemaOf(first.target);
|
|
73
|
+
schema = textBodied(input.schemaSet, first.target)
|
|
74
|
+
? { type: 'object', properties: { '#text': content }, required: ['#text'], additionalProperties: false }
|
|
75
|
+
: inlineRoot(content, writer.defs());
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
schema = {
|
|
79
|
+
type: 'object',
|
|
80
|
+
properties: Object.fromEntries(shape.parts.map((part) => [part.name, writer.schemaOf(part.target)])),
|
|
81
|
+
...(shape.parts.length > 0 ? { required: shape.parts.map((part) => part.name) } : {}),
|
|
82
|
+
additionalProperties: false,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
const defs = writer.defs();
|
|
86
|
+
return { schema: defs === undefined ? schema : { ...schema, $defs: defs }, notes: writer.notes() };
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* The request envelope for `args`: the body written through the form model, in an envelope with no
|
|
90
|
+
* indentation (`createEnvelope` indents every line of the body, which would change a multi-line value).
|
|
91
|
+
*/
|
|
92
|
+
export function envelopeFromJson(input, op, args) {
|
|
93
|
+
const empty = buildEmptyRequest(input, op);
|
|
94
|
+
const notes = empty.problems.map((problem) => problem.message);
|
|
95
|
+
const transport = {
|
|
96
|
+
soapVersion: empty.soapVersion,
|
|
97
|
+
...(empty.soapAction !== undefined ? { soapAction: empty.soapAction } : {}),
|
|
98
|
+
};
|
|
99
|
+
const shape = bodyShape(input, op, 'request');
|
|
100
|
+
if (shape === undefined) {
|
|
101
|
+
return {
|
|
102
|
+
envelopeXml: '',
|
|
103
|
+
...transport,
|
|
104
|
+
notes,
|
|
105
|
+
problems: [`${op.operationName}: the binding has no SOAP operation of that name`],
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
const problems = [];
|
|
109
|
+
const write = (target, value) => {
|
|
110
|
+
const written = xmlFromJson(input.schemaSet, target, value);
|
|
111
|
+
notes.push(...written.notes);
|
|
112
|
+
problems.push(...written.problems);
|
|
113
|
+
return written.xml;
|
|
114
|
+
};
|
|
115
|
+
const [first] = shape.parts;
|
|
116
|
+
let bodyXml;
|
|
117
|
+
if (shape.single && first !== undefined) {
|
|
118
|
+
bodyXml = write(first.target, textBodied(input.schemaSet, first.target) ? args['#text'] : args);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
const pieces = shape.parts.map((part) => write(part.target, args[part.name])).filter((piece) => piece !== '');
|
|
122
|
+
const wrapper = shape.wrapper;
|
|
123
|
+
if (wrapper === undefined) {
|
|
124
|
+
bodyXml = pieces.join('\n');
|
|
125
|
+
}
|
|
126
|
+
else if (wrapper.namespaceUri === '') {
|
|
127
|
+
bodyXml = [`<${wrapper.localName}>`, ...pieces, `</${wrapper.localName}>`].join('\n');
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
const prefix = prefixForNamespace(wrapper.namespaceUri, new Set());
|
|
131
|
+
const name = `${prefix}:${wrapper.localName}`;
|
|
132
|
+
bodyXml = [`<${name} xmlns:${prefix}="${escapeAttribute(wrapper.namespaceUri)}">`, ...pieces, `</${name}>`].join('\n');
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
if (problems.length > 0) {
|
|
136
|
+
return { envelopeXml: '', ...transport, notes, problems };
|
|
137
|
+
}
|
|
138
|
+
return { envelopeXml: createEnvelope(empty.soapVersion, { bodyXml }, { indent: '' }), ...transport, notes, problems };
|
|
139
|
+
}
|
|
140
|
+
function matches(element, name) {
|
|
141
|
+
return element.localName === name.localName && element.namespaceUri === name.namespaceUri;
|
|
142
|
+
}
|
|
143
|
+
const nameOf = (element) => qnameToString({ namespaceUri: element.namespaceUri, localName: element.localName });
|
|
144
|
+
/** An envelope's body read back as the JSON {@link envelopeFromJson} takes. */
|
|
145
|
+
export function jsonFromEnvelope(input, op, xml, direction = 'response') {
|
|
146
|
+
const shape = bodyShape(input, op, direction);
|
|
147
|
+
const body = findBody(scanXml(xml).elements);
|
|
148
|
+
if (shape === undefined || body === undefined) {
|
|
149
|
+
return { value: undefined, notes: ['the message has no SOAP Body this operation describes'] };
|
|
150
|
+
}
|
|
151
|
+
const inScope = namespacesInScope(xml).byPrefix;
|
|
152
|
+
const slice = (element) => xml.slice(element.range.start, element.range.end);
|
|
153
|
+
const read = (target, element) => jsonFromXml(input.schemaSet, target, slice(element), { inScope });
|
|
154
|
+
const [first] = shape.parts;
|
|
155
|
+
const [child, ...rest] = body.children;
|
|
156
|
+
const notes = rest.map((extra) => `the SOAP Body holds ${nameOf(extra)} after the body element; not read`);
|
|
157
|
+
/** The element the body should start with: the single part's (or a substitute), or the rpc wrapper. */
|
|
158
|
+
const expected = shape.single && first !== undefined && 'element' in first.target ? first.target.element : shape.wrapper;
|
|
159
|
+
if (expected === undefined) {
|
|
160
|
+
return readParts(op, shape.parts, body.children, read, slice);
|
|
161
|
+
}
|
|
162
|
+
if (child === undefined) {
|
|
163
|
+
return { value: undefined, notes: ['the SOAP Body is empty'] };
|
|
164
|
+
}
|
|
165
|
+
const named = matches(child, expected) ||
|
|
166
|
+
(shape.single && input.schemaSet.substitutionsFor(expected).some((decl) => matches(child, decl.name)));
|
|
167
|
+
if (!named) {
|
|
168
|
+
return {
|
|
169
|
+
value: slice(child),
|
|
170
|
+
notes: [`the SOAP Body holds ${nameOf(child)}, not ${qnameToString(expected)}; kept as its XML`, ...notes],
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
if (shape.single && first !== undefined) {
|
|
174
|
+
const result = read(first.target, child);
|
|
175
|
+
const value = textBodied(input.schemaSet, first.target) && result.value !== undefined
|
|
176
|
+
? { '#text': result.value }
|
|
177
|
+
: result.value;
|
|
178
|
+
return { value, notes: [...result.notes, ...notes] };
|
|
179
|
+
}
|
|
180
|
+
const parts = readParts(op, shape.parts, child.children, read, slice);
|
|
181
|
+
return { value: parts.value, notes: [...parts.notes, ...notes] };
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* One property per part, each read from the child of its element name (rpc: its part name); a part
|
|
185
|
+
* with no child is noted, and a child no part names is kept under its local name as its XML (§5).
|
|
186
|
+
*/
|
|
187
|
+
function readParts(op, parts, children, read, slice) {
|
|
188
|
+
const value = {};
|
|
189
|
+
const notes = [];
|
|
190
|
+
const unread = new Set(children);
|
|
191
|
+
for (const part of parts) {
|
|
192
|
+
const element = children.find((candidate) => unread.has(candidate) &&
|
|
193
|
+
('element' in part.target ? matches(candidate, part.target.element) : candidate.localName === part.name));
|
|
194
|
+
if (element === undefined) {
|
|
195
|
+
notes.push(`${part.name}: the message has no element for this part`);
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
unread.delete(element);
|
|
199
|
+
const result = read(part.target, element);
|
|
200
|
+
value[part.name] = result.value;
|
|
201
|
+
notes.push(...result.notes);
|
|
202
|
+
}
|
|
203
|
+
for (const element of unread) {
|
|
204
|
+
value[freeKey(value, element.localName)] = slice(element);
|
|
205
|
+
notes.push(`${element.localName}: not a part of ${op.operationName}; kept as its XML`);
|
|
206
|
+
}
|
|
207
|
+
return { value, notes };
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* A fault's `detail` as JSON, when its first element is the element of a fault message part the
|
|
211
|
+
* operation declares; undefined otherwise (the caller keeps the XML).
|
|
212
|
+
*/
|
|
213
|
+
export function faultDetailJson(input, op, detailXml) {
|
|
214
|
+
const binding = findBinding(input.definition, op.bindingName);
|
|
215
|
+
const operation = binding === undefined
|
|
216
|
+
? undefined
|
|
217
|
+
: findPortType(input.definition, binding.type)?.operations.find((candidate) => candidate.name === op.operationName);
|
|
218
|
+
const declared = (operation?.faults ?? []).flatMap((fault) => findMessage(input.definition, fault.message)?.parts.flatMap((part) => part.element !== undefined ? [part.element] : []) ?? []);
|
|
219
|
+
const first = scanXml(detailXml).elements[0];
|
|
220
|
+
const element = first === undefined ? undefined : declared.find((name) => matches(first, name));
|
|
221
|
+
if (first === undefined || element === undefined) {
|
|
222
|
+
return undefined;
|
|
223
|
+
}
|
|
224
|
+
return jsonFromXml(input.schemaSet, { element }, detailXml.slice(first.range.start, first.range.end));
|
|
225
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A pre-pass over a parsed legacy project that rewrites `${#Project#name}` references to `${name}`
|
|
3
|
+
* when an imported environment defines `name` as a property. In the source tool, environment
|
|
4
|
+
* properties override project properties, so such a reference already changes with the active
|
|
5
|
+
* environment there; in Wirebench `${#Project#name}` only ever reads the project scope. Rewriting it
|
|
6
|
+
* to the shorthand `${name}` (which resolves Env -> Project -> Workspace -> Global, see
|
|
7
|
+
* `project/properties.ts`) makes the imported request behave the same way it did before the import,
|
|
8
|
+
* silently — this is not a mapping loss, so it is never reported.
|
|
9
|
+
*
|
|
10
|
+
* Pure and byte-identical when nothing needs rewriting: a project with no environments (or none
|
|
11
|
+
* defining any properties) is returned as the same object.
|
|
12
|
+
*/
|
|
13
|
+
import type { LegacyProject } from './model.js';
|
|
14
|
+
/**
|
|
15
|
+
* Rewrites every `${#Project#<name>}` reference to `${<name>}` throughout `project`, for every
|
|
16
|
+
* `<name>` that at least one imported environment defines as a property. Returns `project` itself
|
|
17
|
+
* (same object) when there is nothing to rewrite, e.g. a project with no environments.
|
|
18
|
+
*/
|
|
19
|
+
export declare function rewriteProjectRefsToEnv(project: LegacyProject): LegacyProject;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A pre-pass over a parsed legacy project that rewrites `${#Project#name}` references to `${name}`
|
|
3
|
+
* when an imported environment defines `name` as a property. In the source tool, environment
|
|
4
|
+
* properties override project properties, so such a reference already changes with the active
|
|
5
|
+
* environment there; in Wirebench `${#Project#name}` only ever reads the project scope. Rewriting it
|
|
6
|
+
* to the shorthand `${name}` (which resolves Env -> Project -> Workspace -> Global, see
|
|
7
|
+
* `project/properties.ts`) makes the imported request behave the same way it did before the import,
|
|
8
|
+
* silently — this is not a mapping loss, so it is never reported.
|
|
9
|
+
*
|
|
10
|
+
* Pure and byte-identical when nothing needs rewriting: a project with no environments (or none
|
|
11
|
+
* defining any properties) is returned as the same object.
|
|
12
|
+
*/
|
|
13
|
+
const PROJECT_REF = /\$\{#Project#([^${}]+)\}/g;
|
|
14
|
+
/** Rewrites `${#Project#<name>}` to `${<name>}` in `text` for every `<name>` in `names`. Leaves everything else, including unrecognized `${...}` expressions, byte-identical. */
|
|
15
|
+
function rewrite(text, names) {
|
|
16
|
+
return text.replace(PROJECT_REF, (whole, name) => (names.has(name) ? `\${${name}}` : whole));
|
|
17
|
+
}
|
|
18
|
+
function rewriteOptional(text, names) {
|
|
19
|
+
return text === undefined ? undefined : rewrite(text, names);
|
|
20
|
+
}
|
|
21
|
+
function rewriteCall(call, names) {
|
|
22
|
+
const endpoint = rewriteOptional(call.endpoint, names);
|
|
23
|
+
const envelope = rewriteOptional(call.envelope, names);
|
|
24
|
+
const username = rewriteOptional(call.credentials.username, names);
|
|
25
|
+
if (endpoint === call.endpoint && envelope === call.envelope && username === call.credentials.username) {
|
|
26
|
+
return call;
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
...call,
|
|
30
|
+
...(endpoint !== undefined ? { endpoint } : {}),
|
|
31
|
+
...(envelope !== undefined ? { envelope } : {}),
|
|
32
|
+
credentials: username === call.credentials.username || username === undefined
|
|
33
|
+
? call.credentials
|
|
34
|
+
: { ...call.credentials, username },
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function rewriteOperation(operation, names) {
|
|
38
|
+
const calls = operation.calls.map((call) => rewriteCall(call, names));
|
|
39
|
+
if (calls.every((call, index) => call === operation.calls[index])) {
|
|
40
|
+
return operation;
|
|
41
|
+
}
|
|
42
|
+
return { ...operation, calls };
|
|
43
|
+
}
|
|
44
|
+
function rewriteInterface(iface, names) {
|
|
45
|
+
const endpoints = iface.endpoints.map((url) => rewrite(url, names));
|
|
46
|
+
const operations = iface.operations.map((operation) => rewriteOperation(operation, names));
|
|
47
|
+
const endpointsChanged = endpoints.some((url, index) => url !== iface.endpoints[index]);
|
|
48
|
+
const operationsChanged = operations.some((operation, index) => operation !== iface.operations[index]);
|
|
49
|
+
if (!endpointsChanged && !operationsChanged) {
|
|
50
|
+
return iface;
|
|
51
|
+
}
|
|
52
|
+
return { ...iface, ...(endpointsChanged ? { endpoints } : {}), ...(operationsChanged ? { operations } : {}) };
|
|
53
|
+
}
|
|
54
|
+
function rewriteProperty(property, names) {
|
|
55
|
+
const value = rewrite(property.value, names);
|
|
56
|
+
return value === property.value ? property : { ...property, value };
|
|
57
|
+
}
|
|
58
|
+
function rewriteEnvironment(env, names) {
|
|
59
|
+
const properties = env.properties.map((property) => rewriteProperty(property, names));
|
|
60
|
+
const endpoints = env.endpoints.map((override) => {
|
|
61
|
+
const url = rewrite(override.url, names);
|
|
62
|
+
return url === override.url ? override : { ...override, url };
|
|
63
|
+
});
|
|
64
|
+
const propertiesChanged = properties.some((property, index) => property !== env.properties[index]);
|
|
65
|
+
const endpointsChanged = endpoints.some((override, index) => override !== env.endpoints[index]);
|
|
66
|
+
if (!propertiesChanged && !endpointsChanged) {
|
|
67
|
+
return env;
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
...env,
|
|
71
|
+
...(propertiesChanged ? { properties } : {}),
|
|
72
|
+
...(endpointsChanged ? { endpoints } : {}),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Rewrites every `${#Project#<name>}` reference to `${<name>}` throughout `project`, for every
|
|
77
|
+
* `<name>` that at least one imported environment defines as a property. Returns `project` itself
|
|
78
|
+
* (same object) when there is nothing to rewrite, e.g. a project with no environments.
|
|
79
|
+
*/
|
|
80
|
+
export function rewriteProjectRefsToEnv(project) {
|
|
81
|
+
const names = new Set();
|
|
82
|
+
for (const env of project.environments) {
|
|
83
|
+
for (const property of env.properties) {
|
|
84
|
+
names.add(property.name);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (names.size === 0) {
|
|
88
|
+
return project;
|
|
89
|
+
}
|
|
90
|
+
const interfaces = project.interfaces.map((iface) => rewriteInterface(iface, names));
|
|
91
|
+
const environments = project.environments.map((env) => rewriteEnvironment(env, names));
|
|
92
|
+
const properties = project.properties.map((property) => rewriteProperty(property, names));
|
|
93
|
+
const interfacesChanged = interfaces.some((iface, index) => iface !== project.interfaces[index]);
|
|
94
|
+
const environmentsChanged = environments.some((env, index) => env !== project.environments[index]);
|
|
95
|
+
const propertiesChanged = properties.some((property, index) => property !== project.properties[index]);
|
|
96
|
+
if (!interfacesChanged && !environmentsChanged && !propertiesChanged) {
|
|
97
|
+
return project;
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
...project,
|
|
101
|
+
...(interfacesChanged ? { interfaces } : {}),
|
|
102
|
+
...(environmentsChanged ? { environments } : {}),
|
|
103
|
+
...(propertiesChanged ? { properties } : {}),
|
|
104
|
+
};
|
|
105
|
+
}
|