@wirebench/engine 2.1.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/LICENSE +201 -0
- package/README.md +3 -0
- package/dist/assert/contract.d.ts +3 -0
- package/dist/assert/contract.js +17 -0
- package/dist/assert/index.d.ts +4 -0
- package/dist/assert/index.js +27 -0
- package/dist/assert/match.d.ts +3 -0
- package/dist/assert/match.js +58 -0
- package/dist/assert/model.d.ts +73 -0
- package/dist/assert/model.js +8 -0
- package/dist/assert/schema.d.ts +34 -0
- package/dist/assert/schema.js +46 -0
- package/dist/assert/sla.d.ts +3 -0
- package/dist/assert/sla.js +8 -0
- package/dist/assert/soap-fault.d.ts +3 -0
- package/dist/assert/soap-fault.js +20 -0
- package/dist/assert/status.d.ts +3 -0
- package/dist/assert/status.js +14 -0
- package/dist/errors.d.ts +77 -0
- package/dist/errors.js +121 -0
- package/dist/fs.d.ts +35 -0
- package/dist/fs.js +64 -0
- package/dist/generate.d.ts +12 -0
- package/dist/generate.js +14 -0
- package/dist/grpc/browser.d.ts +11 -0
- package/dist/grpc/browser.js +9 -0
- package/dist/grpc/cache.d.ts +113 -0
- package/dist/grpc/cache.js +244 -0
- package/dist/grpc/call.d.ts +64 -0
- package/dist/grpc/call.js +72 -0
- package/dist/grpc/codec.d.ts +29 -0
- package/dist/grpc/codec.js +416 -0
- package/dist/grpc/command.d.ts +23 -0
- package/dist/grpc/command.js +91 -0
- package/dist/grpc/expand.d.ts +25 -0
- package/dist/grpc/expand.js +52 -0
- package/dist/grpc/framing.d.ts +28 -0
- package/dist/grpc/framing.js +61 -0
- package/dist/grpc/import.d.ts +47 -0
- package/dist/grpc/import.js +88 -0
- package/dist/grpc/model.d.ts +179 -0
- package/dist/grpc/model.js +91 -0
- package/dist/grpc/proto/describe.d.ts +92 -0
- package/dist/grpc/proto/describe.js +205 -0
- package/dist/grpc/proto/load.d.ts +35 -0
- package/dist/grpc/proto/load.js +112 -0
- package/dist/grpc/proto/sample.d.ts +21 -0
- package/dist/grpc/proto/sample.js +79 -0
- package/dist/grpc/proto/well-known.d.ts +42 -0
- package/dist/grpc/proto/well-known.js +143 -0
- package/dist/grpc/reconcile.d.ts +42 -0
- package/dist/grpc/reconcile.js +153 -0
- package/dist/grpc/reflection/client.d.ts +70 -0
- package/dist/grpc/reflection/client.js +197 -0
- package/dist/grpc/reflection/descriptors.d.ts +69 -0
- package/dist/grpc/reflection/descriptors.js +140 -0
- package/dist/grpc/reflection/proto.d.ts +33 -0
- package/dist/grpc/reflection/proto.js +144 -0
- package/dist/grpc/send.d.ts +132 -0
- package/dist/grpc/send.js +435 -0
- package/dist/grpc/shape.d.ts +29 -0
- package/dist/grpc/shape.js +36 -0
- package/dist/grpc/status.d.ts +21 -0
- package/dist/grpc/status.js +62 -0
- package/dist/grpc/target.d.ts +21 -0
- package/dist/grpc/target.js +66 -0
- package/dist/http/auth/apply.d.ts +37 -0
- package/dist/http/auth/apply.js +74 -0
- package/dist/http/auth/basic.d.ts +36 -0
- package/dist/http/auth/basic.js +69 -0
- package/dist/http/auth/md4.d.ts +13 -0
- package/dist/http/auth/md4.js +81 -0
- package/dist/http/auth/ntlm-transport.d.ts +61 -0
- package/dist/http/auth/ntlm-transport.js +97 -0
- package/dist/http/auth/ntlm.d.ts +190 -0
- package/dist/http/auth/ntlm.js +377 -0
- package/dist/http/client.d.ts +73 -0
- package/dist/http/client.js +403 -0
- package/dist/http/curl-flags.d.ts +15 -0
- package/dist/http/curl-flags.js +95 -0
- package/dist/http/curl.d.ts +94 -0
- package/dist/http/curl.js +245 -0
- package/dist/http/decompress.d.ts +7 -0
- package/dist/http/decompress.js +22 -0
- package/dist/http/errors.d.ts +22 -0
- package/dist/http/errors.js +144 -0
- package/dist/http/failed-request.d.ts +27 -0
- package/dist/http/failed-request.js +48 -0
- package/dist/http/headers.d.ts +15 -0
- package/dist/http/headers.js +50 -0
- package/dist/http/heredoc.d.ts +25 -0
- package/dist/http/heredoc.js +74 -0
- package/dist/http/proxy.d.ts +103 -0
- package/dist/http/proxy.js +168 -0
- package/dist/http/raw-capture.d.ts +23 -0
- package/dist/http/raw-capture.js +57 -0
- package/dist/http/timings.d.ts +79 -0
- package/dist/http/timings.js +212 -0
- package/dist/http/tls.d.ts +111 -0
- package/dist/http/tls.js +167 -0
- package/dist/http/types.d.ts +125 -0
- package/dist/http/types.js +6 -0
- package/dist/import-detect.d.ts +26 -0
- package/dist/import-detect.js +169 -0
- package/dist/import.d.ts +20 -0
- package/dist/import.js +163 -0
- package/dist/index.d.ts +272 -0
- package/dist/index.js +157 -0
- package/dist/json/cursor.d.ts +43 -0
- package/dist/json/cursor.js +168 -0
- package/dist/operations.d.ts +12 -0
- package/dist/operations.js +52 -0
- package/dist/project/attachments-cache.d.ts +80 -0
- package/dist/project/attachments-cache.js +186 -0
- package/dist/project/endpoints.d.ts +23 -0
- package/dist/project/endpoints.js +47 -0
- package/dist/project/environments.d.ts +68 -0
- package/dist/project/environments.js +124 -0
- package/dist/project/fs.d.ts +45 -0
- package/dist/project/fs.js +78 -0
- package/dist/project/history.d.ts +171 -0
- package/dist/project/history.js +179 -0
- package/dist/project/keystores.d.ts +24 -0
- package/dist/project/keystores.js +66 -0
- package/dist/project/load.d.ts +44 -0
- package/dist/project/load.js +634 -0
- package/dist/project/migrate.d.ts +27 -0
- package/dist/project/migrate.js +46 -0
- package/dist/project/model.d.ts +401 -0
- package/dist/project/model.js +126 -0
- package/dist/project/paths.d.ts +134 -0
- package/dist/project/paths.js +259 -0
- package/dist/project/preferences.d.ts +318 -0
- package/dist/project/preferences.js +239 -0
- package/dist/project/properties.d.ts +97 -0
- package/dist/project/properties.js +356 -0
- package/dist/project/save.d.ts +65 -0
- package/dist/project/save.js +295 -0
- package/dist/project/schema.d.ts +1329 -0
- package/dist/project/schema.js +737 -0
- package/dist/project/serialize.d.ts +42 -0
- package/dist/project/serialize.js +385 -0
- package/dist/project/wss-configs.d.ts +40 -0
- package/dist/project/wss-configs.js +142 -0
- package/dist/project/yaml.d.ts +17 -0
- package/dist/project/yaml.js +39 -0
- package/dist/redact/index.d.ts +77 -0
- package/dist/redact/index.js +328 -0
- package/dist/redact/literal.d.ts +12 -0
- package/dist/redact/literal.js +68 -0
- package/dist/rest/auth.d.ts +53 -0
- package/dist/rest/auth.js +80 -0
- package/dist/rest/body.d.ts +61 -0
- package/dist/rest/body.js +184 -0
- package/dist/rest/browser.d.ts +12 -0
- package/dist/rest/browser.js +11 -0
- package/dist/rest/cookies.d.ts +41 -0
- package/dist/rest/cookies.js +102 -0
- package/dist/rest/curl.d.ts +75 -0
- package/dist/rest/curl.js +417 -0
- package/dist/rest/expand.d.ts +35 -0
- package/dist/rest/expand.js +104 -0
- package/dist/rest/model.d.ts +247 -0
- package/dist/rest/model.js +118 -0
- package/dist/rest/oauth2.d.ts +118 -0
- package/dist/rest/oauth2.js +212 -0
- package/dist/rest/openapi/cache.d.ts +54 -0
- package/dist/rest/openapi/cache.js +128 -0
- package/dist/rest/openapi/import.d.ts +67 -0
- package/dist/rest/openapi/import.js +91 -0
- package/dist/rest/openapi/map.d.ts +102 -0
- package/dist/rest/openapi/map.js +477 -0
- package/dist/rest/openapi/model.d.ts +203 -0
- package/dist/rest/openapi/model.js +37 -0
- package/dist/rest/openapi/parse.d.ts +44 -0
- package/dist/rest/openapi/parse.js +1530 -0
- package/dist/rest/openapi/refs.d.ts +63 -0
- package/dist/rest/openapi/refs.js +258 -0
- package/dist/rest/openapi/sample.d.ts +68 -0
- package/dist/rest/openapi/sample.js +336 -0
- package/dist/rest/postman/import.d.ts +21 -0
- package/dist/rest/postman/import.js +47 -0
- package/dist/rest/postman/index.d.ts +7 -0
- package/dist/rest/postman/index.js +7 -0
- package/dist/rest/postman/map.d.ts +28 -0
- package/dist/rest/postman/map.js +427 -0
- package/dist/rest/postman/model.d.ts +118 -0
- package/dist/rest/postman/model.js +7 -0
- package/dist/rest/postman/parse.d.ts +29 -0
- package/dist/rest/postman/parse.js +518 -0
- package/dist/rest/response.d.ts +72 -0
- package/dist/rest/response.js +221 -0
- package/dist/rest/send.d.ts +102 -0
- package/dist/rest/send.js +148 -0
- package/dist/rest/url.d.ts +92 -0
- package/dist/rest/url.js +213 -0
- package/dist/run/effective-auth.d.ts +10 -0
- package/dist/run/effective-auth.js +19 -0
- package/dist/run/index.d.ts +8 -0
- package/dist/run/index.js +4 -0
- package/dist/run/prepare.d.ts +43 -0
- package/dist/run/prepare.js +280 -0
- package/dist/run/run.d.ts +53 -0
- package/dist/run/run.js +223 -0
- package/dist/run/secret-needs.d.ts +13 -0
- package/dist/run/secret-needs.js +125 -0
- package/dist/run/select.d.ts +34 -0
- package/dist/run/select.js +76 -0
- package/dist/secrets/env-names.d.ts +27 -0
- package/dist/secrets/env-names.js +40 -0
- package/dist/secrets/resolve.d.ts +58 -0
- package/dist/secrets/resolve.js +136 -0
- package/dist/send-options.d.ts +141 -0
- package/dist/send-options.js +228 -0
- package/dist/send.d.ts +53 -0
- package/dist/send.js +210 -0
- package/dist/soap/body-builder.d.ts +38 -0
- package/dist/soap/body-builder.js +250 -0
- package/dist/soap/build-problems.d.ts +12 -0
- package/dist/soap/build-problems.js +2 -0
- package/dist/soap/charset.d.ts +23 -0
- package/dist/soap/charset.js +47 -0
- package/dist/soap/envelope.d.ts +44 -0
- package/dist/soap/envelope.js +76 -0
- package/dist/soap/fault.d.ts +46 -0
- package/dist/soap/fault.js +129 -0
- package/dist/soap/form-request.d.ts +34 -0
- package/dist/soap/form-request.js +251 -0
- package/dist/soap/legacy-project/definition-fetcher.d.ts +21 -0
- package/dist/soap/legacy-project/definition-fetcher.js +43 -0
- package/dist/soap/legacy-project/format.d.ts +18 -0
- package/dist/soap/legacy-project/format.js +24 -0
- package/dist/soap/legacy-project/import.d.ts +21 -0
- package/dist/soap/legacy-project/import.js +46 -0
- package/dist/soap/legacy-project/index.d.ts +9 -0
- package/dist/soap/legacy-project/index.js +5 -0
- package/dist/soap/legacy-project/map.d.ts +91 -0
- package/dist/soap/legacy-project/map.js +290 -0
- package/dist/soap/legacy-project/model.d.ts +98 -0
- package/dist/soap/legacy-project/model.js +5 -0
- package/dist/soap/legacy-project/parse.d.ts +16 -0
- package/dist/soap/legacy-project/parse.js +325 -0
- package/dist/soap/mime/cid-scan.d.ts +36 -0
- package/dist/soap/mime/cid-scan.js +52 -0
- package/dist/soap/mime/inline-files.d.ts +39 -0
- package/dist/soap/mime/inline-files.js +71 -0
- package/dist/soap/mime/mtom.d.ts +74 -0
- package/dist/soap/mime/mtom.js +134 -0
- package/dist/soap/mime/multipart.d.ts +66 -0
- package/dist/soap/mime/multipart.js +329 -0
- package/dist/soap/mime/send-pipeline.d.ts +61 -0
- package/dist/soap/mime/send-pipeline.js +145 -0
- package/dist/soap/mime/swa.d.ts +45 -0
- package/dist/soap/mime/swa.js +62 -0
- package/dist/soap/mime/types.d.ts +69 -0
- package/dist/soap/mime/types.js +10 -0
- package/dist/soap/namespace-scope.d.ts +32 -0
- package/dist/soap/namespace-scope.js +85 -0
- package/dist/soap/prefixes.d.ts +24 -0
- package/dist/soap/prefixes.js +70 -0
- package/dist/soap/recreate.d.ts +28 -0
- package/dist/soap/recreate.js +168 -0
- package/dist/soap/request-builder.d.ts +63 -0
- package/dist/soap/request-builder.js +161 -0
- package/dist/soap/response-parser.d.ts +29 -0
- package/dist/soap/response-parser.js +71 -0
- package/dist/soap/soap-action.d.ts +31 -0
- package/dist/soap/soap-action.js +28 -0
- package/dist/soap/transforms.d.ts +52 -0
- package/dist/soap/transforms.js +164 -0
- package/dist/types.d.ts +307 -0
- package/dist/types.js +6 -0
- package/dist/validate/index.d.ts +61 -0
- package/dist/validate/index.js +72 -0
- package/dist/validate/schema-file-set.d.ts +51 -0
- package/dist/validate/schema-file-set.js +288 -0
- package/dist/validate/schema-validator.d.ts +53 -0
- package/dist/validate/schema-validator.js +251 -0
- package/dist/validate/soap-structure.d.ts +34 -0
- package/dist/validate/soap-structure.js +255 -0
- package/dist/validate/types.d.ts +47 -0
- package/dist/validate/types.js +8 -0
- package/dist/validate/wsi/assertions/helpers.d.ts +145 -0
- package/dist/validate/wsi/assertions/helpers.js +387 -0
- package/dist/validate/wsi/assertions/index.d.ts +44 -0
- package/dist/validate/wsi/assertions/index.js +77 -0
- package/dist/validate/wsi/assertions/message/helpers.d.ts +63 -0
- package/dist/validate/wsi/assertions/message/helpers.js +168 -0
- package/dist/validate/wsi/assertions/message/index.d.ts +39 -0
- package/dist/validate/wsi/assertions/message/index.js +62 -0
- package/dist/validate/wsi/assertions/message/r1001.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1001.js +38 -0
- package/dist/validate/wsi/assertions/message/r1003.d.ts +14 -0
- package/dist/validate/wsi/assertions/message/r1003.js +45 -0
- package/dist/validate/wsi/assertions/message/r1005.d.ts +12 -0
- package/dist/validate/wsi/assertions/message/r1005.js +37 -0
- package/dist/validate/wsi/assertions/message/r1006.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1006.js +49 -0
- package/dist/validate/wsi/assertions/message/r1007.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1007.js +30 -0
- package/dist/validate/wsi/assertions/message/r1011.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1011.js +33 -0
- package/dist/validate/wsi/assertions/message/r1012.d.ts +13 -0
- package/dist/validate/wsi/assertions/message/r1012.js +37 -0
- package/dist/validate/wsi/assertions/message/r1013.d.ts +9 -0
- package/dist/validate/wsi/assertions/message/r1013.js +42 -0
- package/dist/validate/wsi/assertions/message/r1014.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1014.js +30 -0
- package/dist/validate/wsi/assertions/message/r1015.d.ts +12 -0
- package/dist/validate/wsi/assertions/message/r1015.js +36 -0
- package/dist/validate/wsi/assertions/message/r1017.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1017.js +30 -0
- package/dist/validate/wsi/assertions/message/r1100.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1100.js +39 -0
- package/dist/validate/wsi/assertions/message/r1101.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1101.js +37 -0
- package/dist/validate/wsi/assertions/message/r1102.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1102.js +41 -0
- package/dist/validate/wsi/assertions/message/r1103.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1103.js +28 -0
- package/dist/validate/wsi/assertions/message/r1107.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1107.js +38 -0
- package/dist/validate/wsi/assertions/message/r1109.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1109.js +32 -0
- package/dist/validate/wsi/assertions/message/r1124.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1124.js +31 -0
- package/dist/validate/wsi/assertions/message/r1132.d.ts +9 -0
- package/dist/validate/wsi/assertions/message/r1132.js +23 -0
- package/dist/validate/wsi/assertions/message/r1140.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1140.js +42 -0
- package/dist/validate/wsi/assertions/message/r1141.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1141.js +32 -0
- package/dist/validate/wsi/assertions/message/r2113.d.ts +11 -0
- package/dist/validate/wsi/assertions/message/r2113.js +33 -0
- package/dist/validate/wsi/assertions/message/r2211.d.ts +7 -0
- package/dist/validate/wsi/assertions/message/r2211.js +42 -0
- package/dist/validate/wsi/assertions/r2001.d.ts +15 -0
- package/dist/validate/wsi/assertions/r2001.js +47 -0
- package/dist/validate/wsi/assertions/r2002.d.ts +11 -0
- package/dist/validate/wsi/assertions/r2002.js +38 -0
- package/dist/validate/wsi/assertions/r2003.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2003.js +32 -0
- package/dist/validate/wsi/assertions/r2005.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2005.js +40 -0
- package/dist/validate/wsi/assertions/r2101.d.ts +14 -0
- package/dist/validate/wsi/assertions/r2101.js +65 -0
- package/dist/validate/wsi/assertions/r2102.d.ts +10 -0
- package/dist/validate/wsi/assertions/r2102.js +41 -0
- package/dist/validate/wsi/assertions/r2105.d.ts +8 -0
- package/dist/validate/wsi/assertions/r2105.js +39 -0
- package/dist/validate/wsi/assertions/r2110.d.ts +8 -0
- package/dist/validate/wsi/assertions/r2110.js +38 -0
- package/dist/validate/wsi/assertions/r2111.d.ts +6 -0
- package/dist/validate/wsi/assertions/r2111.js +30 -0
- package/dist/validate/wsi/assertions/r2112.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2112.js +35 -0
- package/dist/validate/wsi/assertions/r2201.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2201.js +28 -0
- package/dist/validate/wsi/assertions/r2203.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2203.js +30 -0
- package/dist/validate/wsi/assertions/r2204.d.ts +6 -0
- package/dist/validate/wsi/assertions/r2204.js +29 -0
- package/dist/validate/wsi/assertions/r2205.d.ts +8 -0
- package/dist/validate/wsi/assertions/r2205.js +46 -0
- package/dist/validate/wsi/assertions/r2206.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2206.js +36 -0
- package/dist/validate/wsi/assertions/r2209.d.ts +12 -0
- package/dist/validate/wsi/assertions/r2209.js +37 -0
- package/dist/validate/wsi/assertions/r2210.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2210.js +30 -0
- package/dist/validate/wsi/assertions/r2303.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2303.js +44 -0
- package/dist/validate/wsi/assertions/r2304.d.ts +6 -0
- package/dist/validate/wsi/assertions/r2304.js +32 -0
- package/dist/validate/wsi/assertions/r2401.d.ts +12 -0
- package/dist/validate/wsi/assertions/r2401.js +31 -0
- package/dist/validate/wsi/assertions/r2701.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2701.js +28 -0
- package/dist/validate/wsi/assertions/r2702.d.ts +6 -0
- package/dist/validate/wsi/assertions/r2702.js +26 -0
- package/dist/validate/wsi/assertions/r2705.d.ts +11 -0
- package/dist/validate/wsi/assertions/r2705.js +31 -0
- package/dist/validate/wsi/assertions/r2706.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2706.js +29 -0
- package/dist/validate/wsi/assertions/r2710.d.ts +13 -0
- package/dist/validate/wsi/assertions/r2710.js +37 -0
- package/dist/validate/wsi/assertions/r2716.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2716.js +29 -0
- package/dist/validate/wsi/assertions/r2717.d.ts +9 -0
- package/dist/validate/wsi/assertions/r2717.js +31 -0
- package/dist/validate/wsi/assertions/r2718.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2718.js +41 -0
- package/dist/validate/wsi/assertions/r2720.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2720.js +29 -0
- package/dist/validate/wsi/assertions/r2721.d.ts +6 -0
- package/dist/validate/wsi/assertions/r2721.js +27 -0
- package/dist/validate/wsi/assertions/r2722.d.ts +6 -0
- package/dist/validate/wsi/assertions/r2722.js +29 -0
- package/dist/validate/wsi/assertions/r2801.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2801.js +39 -0
- package/dist/validate/wsi/assertions/r2803.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2803.js +29 -0
- package/dist/validate/wsi/docs.d.ts +29 -0
- package/dist/validate/wsi/docs.js +167 -0
- package/dist/validate/wsi/index.d.ts +16 -0
- package/dist/validate/wsi/index.js +11 -0
- package/dist/validate/wsi/report-html.d.ts +36 -0
- package/dist/validate/wsi/report-html.js +135 -0
- package/dist/validate/wsi/run-message.d.ts +50 -0
- package/dist/validate/wsi/run-message.js +190 -0
- package/dist/validate/wsi/run-wsdl.d.ts +48 -0
- package/dist/validate/wsi/run-wsdl.js +99 -0
- package/dist/validate/wsi/types.d.ts +173 -0
- package/dist/validate/wsi/types.js +17 -0
- package/dist/workspace/commit-message.d.ts +47 -0
- package/dist/workspace/commit-message.js +195 -0
- package/dist/workspace/environments.d.ts +79 -0
- package/dist/workspace/environments.js +115 -0
- package/dist/workspace/index.d.ts +28 -0
- package/dist/workspace/index.js +19 -0
- package/dist/workspace/load.d.ts +45 -0
- package/dist/workspace/load.js +155 -0
- package/dist/workspace/local-state.d.ts +37 -0
- package/dist/workspace/local-state.js +59 -0
- package/dist/workspace/migrate.d.ts +38 -0
- package/dist/workspace/migrate.js +50 -0
- package/dist/workspace/model.d.ts +86 -0
- package/dist/workspace/model.js +54 -0
- package/dist/workspace/paths.d.ts +64 -0
- package/dist/workspace/paths.js +97 -0
- package/dist/workspace/reidentify.d.ts +22 -0
- package/dist/workspace/reidentify.js +122 -0
- package/dist/workspace/save.d.ts +31 -0
- package/dist/workspace/save.js +84 -0
- package/dist/workspace/schema.d.ts +93 -0
- package/dist/workspace/schema.js +115 -0
- package/dist/workspace/serialize.d.ts +24 -0
- package/dist/workspace/serialize.js +60 -0
- package/dist/workspace/share.d.ts +52 -0
- package/dist/workspace/share.js +89 -0
- package/dist/ws/browser.d.ts +13 -0
- package/dist/ws/browser.js +11 -0
- package/dist/ws/call.d.ts +53 -0
- package/dist/ws/call.js +106 -0
- package/dist/ws/command.d.ts +19 -0
- package/dist/ws/command.js +28 -0
- package/dist/ws/expand.d.ts +38 -0
- package/dist/ws/expand.js +76 -0
- package/dist/ws/model.d.ts +191 -0
- package/dist/ws/model.js +83 -0
- package/dist/ws/pretty.d.ts +12 -0
- package/dist/ws/pretty.js +25 -0
- package/dist/ws/session.d.ts +50 -0
- package/dist/ws/session.js +333 -0
- package/dist/ws/shape.d.ts +18 -0
- package/dist/ws/shape.js +28 -0
- package/dist/ws/transcript.d.ts +14 -0
- package/dist/ws/transcript.js +29 -0
- package/dist/ws/url.d.ts +3 -0
- package/dist/ws/url.js +44 -0
- package/dist/wsa/headers.d.ts +78 -0
- package/dist/wsa/headers.js +244 -0
- package/dist/wsa/model.d.ts +66 -0
- package/dist/wsa/model.js +52 -0
- package/dist/wsa/policy-detect.d.ts +81 -0
- package/dist/wsa/policy-detect.js +245 -0
- package/dist/wsdl/cache-naming.d.ts +39 -0
- package/dist/wsdl/cache-naming.js +90 -0
- package/dist/wsdl/cache.d.ts +48 -0
- package/dist/wsdl/cache.js +141 -0
- package/dist/wsdl/docs-generator.d.ts +47 -0
- package/dist/wsdl/docs-generator.js +439 -0
- package/dist/wsdl/dom-utils.d.ts +15 -0
- package/dist/wsdl/dom-utils.js +50 -0
- package/dist/wsdl/export-definition.d.ts +38 -0
- package/dist/wsdl/export-definition.js +100 -0
- package/dist/wsdl/fetch.d.ts +13 -0
- package/dist/wsdl/fetch.js +60 -0
- package/dist/wsdl/merge.d.ts +17 -0
- package/dist/wsdl/merge.js +57 -0
- package/dist/wsdl/model.d.ts +176 -0
- package/dist/wsdl/model.js +17 -0
- package/dist/wsdl/parse-binding.d.ts +6 -0
- package/dist/wsdl/parse-binding.js +150 -0
- package/dist/wsdl/parse-wsdl.d.ts +47 -0
- package/dist/wsdl/parse-wsdl.js +161 -0
- package/dist/wsdl/qname.d.ts +28 -0
- package/dist/wsdl/qname.js +41 -0
- package/dist/wsdl/ref-policy.d.ts +54 -0
- package/dist/wsdl/ref-policy.js +87 -0
- package/dist/wsdl/resolver.d.ts +81 -0
- package/dist/wsdl/resolver.js +276 -0
- package/dist/wsdl/update-definition.d.ts +106 -0
- package/dist/wsdl/update-definition.js +314 -0
- package/dist/wss/apply.d.ts +40 -0
- package/dist/wss/apply.js +212 -0
- package/dist/wss/c14n-prefixes.d.ts +27 -0
- package/dist/wss/c14n-prefixes.js +95 -0
- package/dist/wss/incoming/decrypt.d.ts +35 -0
- package/dist/wss/incoming/decrypt.js +57 -0
- package/dist/wss/incoming/index.d.ts +56 -0
- package/dist/wss/incoming/index.js +189 -0
- package/dist/wss/incoming/verify.d.ts +74 -0
- package/dist/wss/incoming/verify.js +440 -0
- package/dist/wss/key-identifiers.d.ts +76 -0
- package/dist/wss/key-identifiers.js +139 -0
- package/dist/wss/keystore/certificate.d.ts +45 -0
- package/dist/wss/keystore/certificate.js +134 -0
- package/dist/wss/keystore/index.d.ts +50 -0
- package/dist/wss/keystore/index.js +80 -0
- package/dist/wss/keystore/model.d.ts +83 -0
- package/dist/wss/keystore/model.js +27 -0
- package/dist/wss/keystore/pem.d.ts +21 -0
- package/dist/wss/keystore/pem.js +140 -0
- package/dist/wss/keystore/pkcs12.d.ts +21 -0
- package/dist/wss/keystore/pkcs12.js +125 -0
- package/dist/wss/model.d.ts +160 -0
- package/dist/wss/model.js +37 -0
- package/dist/wss/outgoing/encryption.d.ts +76 -0
- package/dist/wss/outgoing/encryption.js +618 -0
- package/dist/wss/outgoing/signature.d.ts +73 -0
- package/dist/wss/outgoing/signature.js +239 -0
- package/dist/wss/outgoing/timestamp.d.ts +29 -0
- package/dist/wss/outgoing/timestamp.js +39 -0
- package/dist/wss/outgoing/username-token.d.ts +36 -0
- package/dist/wss/outgoing/username-token.js +68 -0
- package/dist/wss/security-header.d.ts +31 -0
- package/dist/wss/security-header.js +83 -0
- package/dist/xml/index.d.ts +7 -0
- package/dist/xml/index.js +7 -0
- package/dist/xml/namespaces.d.ts +36 -0
- package/dist/xml/namespaces.js +60 -0
- package/dist/xml/parse.d.ts +79 -0
- package/dist/xml/parse.js +109 -0
- package/dist/xml/positions.d.ts +26 -0
- package/dist/xml/positions.js +71 -0
- package/dist/xml/pretty.d.ts +37 -0
- package/dist/xml/pretty.js +137 -0
- package/dist/xml/serialize.d.ts +6 -0
- package/dist/xml/serialize.js +8 -0
- package/dist/xml/tolerant-tree.d.ts +56 -0
- package/dist/xml/tolerant-tree.js +134 -0
- package/dist/xpath/evaluate-async.d.ts +31 -0
- package/dist/xpath/evaluate-async.js +81 -0
- package/dist/xpath/evaluate.d.ts +98 -0
- package/dist/xpath/evaluate.js +340 -0
- package/dist/xpath/jsonpath.d.ts +40 -0
- package/dist/xpath/jsonpath.js +109 -0
- package/dist/xpath/namespaces.d.ts +29 -0
- package/dist/xpath/namespaces.js +101 -0
- package/dist/xpath/worker.d.ts +7 -0
- package/dist/xpath/worker.js +26 -0
- package/dist/xsd/builtins.d.ts +36 -0
- package/dist/xsd/builtins.js +108 -0
- package/dist/xsd/check-references.d.ts +25 -0
- package/dist/xsd/check-references.js +145 -0
- package/dist/xsd/form-edits.d.ts +57 -0
- package/dist/xsd/form-edits.js +153 -0
- package/dist/xsd/form-model.d.ts +153 -0
- package/dist/xsd/form-model.js +691 -0
- package/dist/xsd/locate.d.ts +42 -0
- package/dist/xsd/locate.js +249 -0
- package/dist/xsd/model.d.ts +249 -0
- package/dist/xsd/model.js +1 -0
- package/dist/xsd/parse-particles.d.ts +48 -0
- package/dist/xsd/parse-particles.js +320 -0
- package/dist/xsd/parse-schema.d.ts +21 -0
- package/dist/xsd/parse-schema.js +143 -0
- package/dist/xsd/resolve-content.d.ts +18 -0
- package/dist/xsd/resolve-content.js +242 -0
- package/dist/xsd/sample-generator.d.ts +51 -0
- package/dist/xsd/sample-generator.js +291 -0
- package/dist/xsd/sample-types.d.ts +21 -0
- package/dist/xsd/sample-types.js +69 -0
- package/dist/xsd/sample-values.d.ts +54 -0
- package/dist/xsd/sample-values.js +267 -0
- package/dist/xsd/schema-set.d.ts +51 -0
- package/dist/xsd/schema-set.js +203 -0
- package/dist/xsd/xml-scan.d.ts +64 -0
- package/dist/xsd/xml-scan.js +286 -0
- package/dist/xsd/xml-writer.d.ts +56 -0
- package/dist/xsd/xml-writer.js +103 -0
- package/package.json +69 -0
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "Update Definition": re-import a WSDL and reconcile an existing
|
|
3
|
+
* project against it.
|
|
4
|
+
*
|
|
5
|
+
* The two halves are deliberately separate. {@link planUpdate} is a pure diff of
|
|
6
|
+
* two {@link ImportResult}s — what a preview dialog shows before the user commits
|
|
7
|
+
* to anything. {@link applyUpdate} then rewrites the project model per the
|
|
8
|
+
* options the user ticked, and is equally pure: it returns the next `Project`
|
|
9
|
+
* plus the relative paths of the `.xml.bak` backups the save layer should write
|
|
10
|
+
* (see `project/save.ts`'s `backups` option), and never touches a file system
|
|
11
|
+
* itself.
|
|
12
|
+
*
|
|
13
|
+
* Nothing is ever deleted. Requests belonging to an operation the new definition
|
|
14
|
+
* no longer has are kept and flagged {@link RequestDef.orphaned} rather than
|
|
15
|
+
* removed — the user decides whether a vanished operation means "clean
|
|
16
|
+
* this up" or "the new WSDL is wrong".
|
|
17
|
+
*/
|
|
18
|
+
import { generateRequest } from '../generate.js';
|
|
19
|
+
import { createRequest, generateId } from '../project/model.js';
|
|
20
|
+
import { INTERFACES_DIR, OPERATIONS_DIR, uniqueSlug } from '../project/paths.js';
|
|
21
|
+
import { recreateRequest } from '../soap/recreate.js';
|
|
22
|
+
import { generateElement, generateType } from '../xsd/sample-generator.js';
|
|
23
|
+
import { findBinding, findPortType } from './model.js';
|
|
24
|
+
import { qnameToString } from './qname.js';
|
|
25
|
+
/**
|
|
26
|
+
* Generation options the diff compares envelopes under. Optional content is
|
|
27
|
+
* deliberately *included*: an added `minOccurs="0"` element is a real schema
|
|
28
|
+
* change the user must be told about, even though the default sample envelope
|
|
29
|
+
* would not show it.
|
|
30
|
+
*/
|
|
31
|
+
const DIFF_GENERATE_OPTIONS = { includeOptional: true, typeComments: false, sampleValues: false };
|
|
32
|
+
/** An operation's identity across two definitions: its binding's expanded name plus its own name. */
|
|
33
|
+
function operationKey(ref) {
|
|
34
|
+
return `${qnameToString(ref.bindingName)}#${ref.operationName}`;
|
|
35
|
+
}
|
|
36
|
+
function refOf(summary) {
|
|
37
|
+
return { bindingName: summary.bindingName, operationName: summary.operationName };
|
|
38
|
+
}
|
|
39
|
+
/** Every `soap:address` the definition exposes, deduplicated, in document order. */
|
|
40
|
+
function addressesOf(summary) {
|
|
41
|
+
const seen = new Set();
|
|
42
|
+
for (const operation of summary) {
|
|
43
|
+
for (const port of operation.ports) {
|
|
44
|
+
if (port.address !== undefined) {
|
|
45
|
+
seen.add(port.address);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return [...seen];
|
|
50
|
+
}
|
|
51
|
+
/** The generated sample envelope for one operation, or `undefined` when it cannot be built. */
|
|
52
|
+
function envelopeOf(result, ref) {
|
|
53
|
+
try {
|
|
54
|
+
return generateRequest(result, ref, DIFF_GENERATE_OPTIONS).envelopeXml;
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* A structural fingerprint of one operation's output message: every part, with
|
|
62
|
+
* the sample fragment its element/type would generate. There is no response
|
|
63
|
+
* builder in the engine, so this stands in for "the response shape changed".
|
|
64
|
+
*/
|
|
65
|
+
function outputSignature(definition, schemaSet, ref) {
|
|
66
|
+
const binding = findBinding(definition, ref.bindingName);
|
|
67
|
+
if (binding === undefined) {
|
|
68
|
+
return '';
|
|
69
|
+
}
|
|
70
|
+
const portType = findPortType(definition, binding.type);
|
|
71
|
+
const operation = portType?.operations.find((candidate) => candidate.name === ref.operationName);
|
|
72
|
+
const output = operation?.output;
|
|
73
|
+
if (output === undefined) {
|
|
74
|
+
return '';
|
|
75
|
+
}
|
|
76
|
+
const message = definition.messages.find((candidate) => qnameToString(candidate.name) === qnameToString(output.message));
|
|
77
|
+
if (message === undefined) {
|
|
78
|
+
return qnameToString(output.message);
|
|
79
|
+
}
|
|
80
|
+
const parts = message.parts.map((part) => {
|
|
81
|
+
try {
|
|
82
|
+
if (part.element !== undefined) {
|
|
83
|
+
return `${part.name}=${generateElement(schemaSet, part.element, DIFF_GENERATE_OPTIONS).xml}`;
|
|
84
|
+
}
|
|
85
|
+
if (part.type !== undefined) {
|
|
86
|
+
const name = { namespaceUri: '', localName: part.name };
|
|
87
|
+
return `${part.name}=${generateType(schemaSet, name, part.type, DIFF_GENERATE_OPTIONS).xml}`;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
/* An unresolvable part contributes its declared name only. */
|
|
92
|
+
}
|
|
93
|
+
return `${part.name}=?`;
|
|
94
|
+
});
|
|
95
|
+
return parts.join('\n');
|
|
96
|
+
}
|
|
97
|
+
/** The first reason `next` differs from `previous`, or `undefined` when they match. */
|
|
98
|
+
function changeReason(oldImport, newImport, previous, next) {
|
|
99
|
+
if (previous.soapAction !== next.soapAction) {
|
|
100
|
+
return 'soap-action';
|
|
101
|
+
}
|
|
102
|
+
if (previous.style !== next.style) {
|
|
103
|
+
return 'style';
|
|
104
|
+
}
|
|
105
|
+
if (previous.soapVersion !== next.soapVersion) {
|
|
106
|
+
return 'binding';
|
|
107
|
+
}
|
|
108
|
+
if (envelopeOf(oldImport, refOf(previous)) !== envelopeOf(newImport, refOf(next))) {
|
|
109
|
+
return 'input-schema';
|
|
110
|
+
}
|
|
111
|
+
const ref = refOf(next);
|
|
112
|
+
if (outputSignature(oldImport.definition, oldImport.schemaSet, ref) !==
|
|
113
|
+
outputSignature(newImport.definition, newImport.schemaSet, ref)) {
|
|
114
|
+
return 'output-schema';
|
|
115
|
+
}
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Diffs two imports of the same interface: what the new definition adds, drops
|
|
120
|
+
* and changes. Operation identity is the binding's expanded name plus the
|
|
121
|
+
* operation name, so a renamed binding reads as "every operation removed, every
|
|
122
|
+
* operation added" — which is what it is.
|
|
123
|
+
*
|
|
124
|
+
* Pure and deterministic: the lists follow the new definition's document order
|
|
125
|
+
* (removed operations follow the old one's).
|
|
126
|
+
*
|
|
127
|
+
* @param oldImport the definition the project was built from
|
|
128
|
+
* @param newImport the freshly fetched definition
|
|
129
|
+
*/
|
|
130
|
+
export function planUpdate(oldImport, newImport) {
|
|
131
|
+
const oldByKey = new Map(oldImport.operations.map((op) => [operationKey(refOf(op)), op]));
|
|
132
|
+
const newByKey = new Map(newImport.operations.map((op) => [operationKey(refOf(op)), op]));
|
|
133
|
+
const newOperations = [];
|
|
134
|
+
const changedOperations = [];
|
|
135
|
+
for (const [key, next] of newByKey) {
|
|
136
|
+
const previous = oldByKey.get(key);
|
|
137
|
+
if (previous === undefined) {
|
|
138
|
+
newOperations.push(refOf(next));
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
const reason = changeReason(oldImport, newImport, previous, next);
|
|
142
|
+
if (reason !== undefined) {
|
|
143
|
+
changedOperations.push({ ref: refOf(next), reason });
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
const removedOperations = [];
|
|
147
|
+
for (const [key, previous] of oldByKey) {
|
|
148
|
+
if (!newByKey.has(key)) {
|
|
149
|
+
removedOperations.push(refOf(previous));
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
const oldAddresses = addressesOf(oldImport.operations);
|
|
153
|
+
const newAddresses = addressesOf(newImport.operations);
|
|
154
|
+
return {
|
|
155
|
+
newOperations,
|
|
156
|
+
removedOperations,
|
|
157
|
+
changedOperations,
|
|
158
|
+
endpointsAdded: newAddresses.filter((address) => !oldAddresses.includes(address)),
|
|
159
|
+
endpointsRemoved: oldAddresses.filter((address) => !newAddresses.includes(address)),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
function requireInterface(project, interfaceId) {
|
|
163
|
+
const iface = project.interfaces.find((candidate) => candidate.id === interfaceId);
|
|
164
|
+
if (iface === undefined) {
|
|
165
|
+
throw new Error(`No interface with id "${interfaceId}"`);
|
|
166
|
+
}
|
|
167
|
+
return iface;
|
|
168
|
+
}
|
|
169
|
+
/** The `.xml.bak` path of one saved request, relative to the project root. */
|
|
170
|
+
function backupPath(iface, operation, request) {
|
|
171
|
+
return `${INTERFACES_DIR}/${iface.slug}/${OPERATIONS_DIR}/${operation.slug}/${request.slug}.xml.bak`;
|
|
172
|
+
}
|
|
173
|
+
/** The operation summary for `ref` in the new import, if the new definition still has it. */
|
|
174
|
+
function summaryFor(result, key) {
|
|
175
|
+
return result.operations.find((op) => operationKey(refOf(op)) === key);
|
|
176
|
+
}
|
|
177
|
+
/** Adds the endpoints `plan.endpointsAdded` names, skipping URLs the interface already has. */
|
|
178
|
+
function withAddedEndpoints(iface, plan, newId) {
|
|
179
|
+
const known = new Set(iface.endpoints.map((endpoint) => endpoint.url));
|
|
180
|
+
const added = plan.endpointsAdded
|
|
181
|
+
.filter((url) => !known.has(url))
|
|
182
|
+
.map((url) => ({ id: newId(), name: url, url, authMode: 'complement' }));
|
|
183
|
+
if (added.length === 0) {
|
|
184
|
+
return iface;
|
|
185
|
+
}
|
|
186
|
+
const endpoints = [...iface.endpoints, ...added];
|
|
187
|
+
return {
|
|
188
|
+
...iface,
|
|
189
|
+
endpoints,
|
|
190
|
+
...(iface.defaultEndpointId === undefined && endpoints[0] !== undefined
|
|
191
|
+
? { defaultEndpointId: endpoints[0].id }
|
|
192
|
+
: {}),
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Applies `plan` to one interface of `project`, per `options`.
|
|
197
|
+
*
|
|
198
|
+
* Never deletes anything: a removed operation's requests stay exactly where they
|
|
199
|
+
* are with `orphaned: true`, and an operation the new definition brought back has
|
|
200
|
+
* that flag cleared again.
|
|
201
|
+
*
|
|
202
|
+
* @param project the model to update; never mutated
|
|
203
|
+
* @param interfaceId the interface the plan belongs to
|
|
204
|
+
* @param plan the diff from {@link planUpdate}
|
|
205
|
+
* @param newImport the freshly imported definition the plan was built against
|
|
206
|
+
* @param options which of the update behaviours to perform
|
|
207
|
+
* @throws Error when `interfaceId` names no interface of `project`
|
|
208
|
+
*/
|
|
209
|
+
export function applyUpdate(project, interfaceId, plan, newImport, options) {
|
|
210
|
+
const newId = options.newId ?? generateId;
|
|
211
|
+
let iface = requireInterface(project, interfaceId);
|
|
212
|
+
const requestsCreated = [];
|
|
213
|
+
const requestsRecreated = [];
|
|
214
|
+
const requestsOrphaned = [];
|
|
215
|
+
const backups = [];
|
|
216
|
+
const removedKeys = new Set(plan.removedOperations.map(operationKey));
|
|
217
|
+
const changedByKey = new Map(plan.changedOperations.map((changed) => [operationKey(changed.ref), changed]));
|
|
218
|
+
const generateOptions = { includeOptional: options.recreateOptional };
|
|
219
|
+
// Pass 1: orphan flags and recreated envelopes, operation by operation.
|
|
220
|
+
const operations = iface.operations.map((operation) => {
|
|
221
|
+
const key = `${operation.bindingName}#${operation.name}`;
|
|
222
|
+
const orphaned = removedKeys.has(key);
|
|
223
|
+
const recreate = options.recreateRequests && changedByKey.has(key);
|
|
224
|
+
const requests = operation.requests.map((request) => {
|
|
225
|
+
let next = request;
|
|
226
|
+
if (orphaned) {
|
|
227
|
+
if (request.orphaned !== true) {
|
|
228
|
+
requestsOrphaned.push(request.id);
|
|
229
|
+
}
|
|
230
|
+
next = { ...next, orphaned: true };
|
|
231
|
+
}
|
|
232
|
+
else if (request.orphaned === true) {
|
|
233
|
+
// `exactOptionalPropertyTypes`: the flag is *absent* again, not `undefined`.
|
|
234
|
+
next = Object.fromEntries(Object.entries(next).filter(([key]) => key !== 'orphaned'));
|
|
235
|
+
}
|
|
236
|
+
if (recreate) {
|
|
237
|
+
const summary = summaryFor(newImport, key);
|
|
238
|
+
if (summary !== undefined) {
|
|
239
|
+
const generated = generateRequest(newImport, refOf(summary), generateOptions);
|
|
240
|
+
const merged = recreateRequest(next.envelopeXml, generated.envelopeXml, {
|
|
241
|
+
keepValues: options.keepExisting,
|
|
242
|
+
keepHeaders: options.keepSoapHeaders,
|
|
243
|
+
});
|
|
244
|
+
if (options.createBackups) {
|
|
245
|
+
backups.push(backupPath(iface, operation, request));
|
|
246
|
+
}
|
|
247
|
+
requestsRecreated.push(request.id);
|
|
248
|
+
next = {
|
|
249
|
+
...next,
|
|
250
|
+
envelopeXml: merged.xml,
|
|
251
|
+
soapVersion: generated.soapVersion,
|
|
252
|
+
...(generated.soapAction !== undefined ? { soapAction: generated.soapAction } : {}),
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return next;
|
|
257
|
+
});
|
|
258
|
+
return { ...operation, requests };
|
|
259
|
+
});
|
|
260
|
+
iface = { ...iface, operations };
|
|
261
|
+
// Pass 2: an operation folder (and its first request) for everything the new definition adds.
|
|
262
|
+
if (options.createNewRequests) {
|
|
263
|
+
for (const ref of plan.newOperations) {
|
|
264
|
+
const summary = summaryFor(newImport, operationKey(ref));
|
|
265
|
+
if (summary === undefined) {
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
const bindingName = qnameToString(ref.bindingName);
|
|
269
|
+
const existing = iface.operations.find((op) => op.bindingName === bindingName && op.name === ref.operationName);
|
|
270
|
+
const operation = existing ?? {
|
|
271
|
+
name: ref.operationName,
|
|
272
|
+
bindingName,
|
|
273
|
+
slug: uniqueSlug(ref.operationName, new Set(iface.operations.map((op) => op.slug))),
|
|
274
|
+
order: iface.operations.length,
|
|
275
|
+
requests: [],
|
|
276
|
+
};
|
|
277
|
+
const generated = generateRequest(newImport, ref, generateOptions);
|
|
278
|
+
const name = 'Request 1';
|
|
279
|
+
const request = createRequest(name, {
|
|
280
|
+
id: newId(),
|
|
281
|
+
envelopeXml: generated.envelopeXml,
|
|
282
|
+
soapVersion: generated.soapVersion,
|
|
283
|
+
slug: uniqueSlug(name, new Set(operation.requests.map((r) => r.slug))),
|
|
284
|
+
order: operation.requests.length,
|
|
285
|
+
...(generated.soapAction !== undefined ? { soapAction: generated.soapAction } : {}),
|
|
286
|
+
...(iface.defaultEndpointId !== undefined ? { endpointId: iface.defaultEndpointId } : {}),
|
|
287
|
+
});
|
|
288
|
+
requestsCreated.push(request.id);
|
|
289
|
+
const withRequest = { ...operation, requests: [...operation.requests, request] };
|
|
290
|
+
iface = {
|
|
291
|
+
...iface,
|
|
292
|
+
operations: existing === undefined
|
|
293
|
+
? [...iface.operations, withRequest]
|
|
294
|
+
: iface.operations.map((op) => (op === existing ? withRequest : op)),
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
iface = withAddedEndpoints(iface, plan, newId);
|
|
299
|
+
iface = {
|
|
300
|
+
...iface,
|
|
301
|
+
definitionUrl: newImport.bundle.root.location,
|
|
302
|
+
...(newImport.definition.targetNamespace !== '' ? { targetNamespace: newImport.definition.targetNamespace } : {}),
|
|
303
|
+
};
|
|
304
|
+
return {
|
|
305
|
+
project: {
|
|
306
|
+
...project,
|
|
307
|
+
interfaces: project.interfaces.map((candidate) => (candidate.id === interfaceId ? iface : candidate)),
|
|
308
|
+
},
|
|
309
|
+
requestsCreated,
|
|
310
|
+
requestsRecreated,
|
|
311
|
+
requestsOrphaned,
|
|
312
|
+
backups,
|
|
313
|
+
};
|
|
314
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Applies (and removes) an outgoing WS-Security header on a SOAP envelope: the
|
|
3
|
+
* `wsse:Security` block, its `mustUnderstand`/actor attributes, and the configured entries in
|
|
4
|
+
* configuration order.
|
|
5
|
+
*/
|
|
6
|
+
import type { WssContext, WssOutgoingConfig } from './model.js';
|
|
7
|
+
/** Request-level properties that override an entry's own settings for one send. */
|
|
8
|
+
export interface WssRequestProperties {
|
|
9
|
+
readonly wssPasswordType?: 'text' | 'digest';
|
|
10
|
+
readonly wssTimeToLive?: number;
|
|
11
|
+
}
|
|
12
|
+
/** Options accepted by {@link applyOutgoingWss}. */
|
|
13
|
+
export interface ApplyOutgoingWssOptions {
|
|
14
|
+
readonly requestProperties?: WssRequestProperties;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Applies `config` to `envelopeXml`, returning the new envelope.
|
|
18
|
+
*
|
|
19
|
+
* The `soap:Header` is created (before the `Body`) when missing, the `wsse:Security` block
|
|
20
|
+
* addressed to `config.actor` is reused when one already exists, and the entries are appended
|
|
21
|
+
* to it in configuration order. Request-level `wssPasswordType`/`wssTimeToLive` override the
|
|
22
|
+
* matching entry fields for this application only.
|
|
23
|
+
*
|
|
24
|
+
* @param envelopeXml the envelope to secure
|
|
25
|
+
* @param config the outgoing configuration
|
|
26
|
+
* @param ctx the injected keystore/secret/clock/entropy capabilities
|
|
27
|
+
* @param options request-level property overrides
|
|
28
|
+
* @returns the serialized, secured envelope
|
|
29
|
+
* @throws WssError `wss-not-an-envelope`, or `wss-entry-unsupported` for an unknown entry kind
|
|
30
|
+
*/
|
|
31
|
+
export declare function applyOutgoingWss(envelopeXml: string, config: WssOutgoingConfig, ctx: WssContext, options?: ApplyOutgoingWssOptions): Promise<string>;
|
|
32
|
+
/**
|
|
33
|
+
* Removes the `wsse:Security` header addressed to `actor` (the ultimate receiver's when
|
|
34
|
+
* `actor` is omitted), plus the `soap:Header` if that emptied it.
|
|
35
|
+
*
|
|
36
|
+
* @param envelopeXml the envelope to clean
|
|
37
|
+
* @param actor the actor/role whose Security block to remove
|
|
38
|
+
* @returns the envelope without that header; unchanged when there is nothing to remove
|
|
39
|
+
*/
|
|
40
|
+
export declare function removeOutgoingWss(envelopeXml: string, actor?: string): string;
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Applies (and removes) an outgoing WS-Security header on a SOAP envelope: the
|
|
3
|
+
* `wsse:Security` block, its `mustUnderstand`/actor attributes, and the configured entries in
|
|
4
|
+
* configuration order.
|
|
5
|
+
*/
|
|
6
|
+
import { WssError } from '../errors.js';
|
|
7
|
+
import { parseXml } from '../xml/parse.js';
|
|
8
|
+
import { serializeXml } from '../xml/serialize.js';
|
|
9
|
+
import { NS } from '../xml/namespaces.js';
|
|
10
|
+
import { detectEnvelopeVersion, envelopeNamespace } from '../soap/envelope.js';
|
|
11
|
+
import { buildTimestamp } from './outgoing/timestamp.js';
|
|
12
|
+
import { buildUsernameToken } from './outgoing/username-token.js';
|
|
13
|
+
import { signEnvelope } from './outgoing/signature.js';
|
|
14
|
+
import { encryptEnvelope } from './outgoing/encryption.js';
|
|
15
|
+
import { selectAlias } from './keystore/index.js';
|
|
16
|
+
import { actorAttribute, childElement, mustUnderstandValue, securityHeaders, securityActor, } from './security-header.js';
|
|
17
|
+
/** The namespace `xmlns:*` declarations themselves live in. */
|
|
18
|
+
const XMLNS = 'http://www.w3.org/2000/xmlns/';
|
|
19
|
+
/** True when `header` has no element children and only whitespace (or no) text content. */
|
|
20
|
+
function headerHasOnlyWhitespace(header) {
|
|
21
|
+
for (let node = header.firstChild; node !== null; node = node.nextSibling) {
|
|
22
|
+
if (node.nodeType === 1) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
if (node.nodeType === 3 && (node.nodeValue ?? '').trim() !== '') {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
/** Parses `envelopeXml`, rejecting anything that is not a SOAP envelope. */
|
|
32
|
+
function parseEnvelope(envelopeXml) {
|
|
33
|
+
const doc = parseXml(envelopeXml, { location: 'envelope' });
|
|
34
|
+
const version = detectEnvelopeVersion(doc);
|
|
35
|
+
const root = doc.documentElement;
|
|
36
|
+
if (version === undefined || root === null) {
|
|
37
|
+
throw new WssError('wss-not-an-envelope', 'WS-Security can only be applied to a SOAP envelope.');
|
|
38
|
+
}
|
|
39
|
+
return { doc, root, version };
|
|
40
|
+
}
|
|
41
|
+
/** The prefix the envelope binds its SOAP namespace to (`soapenv` when it uses a default namespace). */
|
|
42
|
+
function envelopePrefix(root) {
|
|
43
|
+
const prefix = root.prefix;
|
|
44
|
+
return prefix === null || prefix === '' ? 'soapenv' : prefix;
|
|
45
|
+
}
|
|
46
|
+
/** Finds or creates the `soap:Header`, always placing a new one before the `Body`. */
|
|
47
|
+
function ensureHeader(doc, root, version) {
|
|
48
|
+
const namespace = envelopeNamespace(version);
|
|
49
|
+
const existing = childElement(root, namespace, 'Header');
|
|
50
|
+
if (existing !== undefined) {
|
|
51
|
+
return existing;
|
|
52
|
+
}
|
|
53
|
+
const header = doc.createElementNS(namespace, `${envelopePrefix(root)}:Header`);
|
|
54
|
+
const body = childElement(root, namespace, 'Body');
|
|
55
|
+
root.insertBefore(header, body ?? null);
|
|
56
|
+
return header;
|
|
57
|
+
}
|
|
58
|
+
/** Finds or creates the `wsse:Security` block addressed to `actor`. */
|
|
59
|
+
function ensureSecurity(doc, root, header, version, config) {
|
|
60
|
+
const existing = securityHeaders(header).find((element) => securityActor(element, version) === config.actor);
|
|
61
|
+
const security = existing ?? doc.createElementNS(NS.WSSE, 'wsse:Security');
|
|
62
|
+
if (existing === undefined) {
|
|
63
|
+
// `wsse` comes from the element's own name; `wsu` is declared here through the xmlns
|
|
64
|
+
// namespace (not as a plain attribute) so xmldom records it in the element's namespace map
|
|
65
|
+
// and the entries below inherit the prefix instead of re-declaring it on every child.
|
|
66
|
+
security.setAttributeNS(XMLNS, 'xmlns:wsu', NS.WSU);
|
|
67
|
+
header.appendChild(security);
|
|
68
|
+
}
|
|
69
|
+
const prefix = envelopePrefix(root);
|
|
70
|
+
const envelopeNs = envelopeNamespace(version);
|
|
71
|
+
if (config.actor !== undefined && config.actor !== '') {
|
|
72
|
+
security.setAttributeNS(envelopeNs, `${prefix}:${actorAttribute(version)}`, config.actor);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
security.removeAttributeNS(envelopeNs, actorAttribute(version));
|
|
76
|
+
}
|
|
77
|
+
if (config.mustUnderstand) {
|
|
78
|
+
security.setAttributeNS(envelopeNs, `${prefix}:mustUnderstand`, mustUnderstandValue(version));
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
security.removeAttributeNS(envelopeNs, 'mustUnderstand');
|
|
82
|
+
}
|
|
83
|
+
return security;
|
|
84
|
+
}
|
|
85
|
+
/** The password type an entry effectively uses, after the request-level override. */
|
|
86
|
+
function effectivePasswordType(entry, override) {
|
|
87
|
+
// 'none' is a deliberate "send no password"; a request property never turns it back on.
|
|
88
|
+
return entry.passwordType === 'none' ? 'none' : (override ?? entry.passwordType);
|
|
89
|
+
}
|
|
90
|
+
/** Builds the element for one entry, resolving its secret through `ctx`. */
|
|
91
|
+
async function buildEntry(entry, config, ctx, properties) {
|
|
92
|
+
if (entry.kind === 'timestamp') {
|
|
93
|
+
return buildTimestamp({
|
|
94
|
+
ttlSeconds: properties?.wssTimeToLive ?? entry.timeToLiveSeconds,
|
|
95
|
+
millisecondPrecision: entry.millisecondPrecision,
|
|
96
|
+
clock: ctx.clock,
|
|
97
|
+
uuid: ctx.uuid,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
if (entry.kind === 'username-token') {
|
|
101
|
+
const passwordType = effectivePasswordType(entry, properties?.wssPasswordType);
|
|
102
|
+
const ref = entry.passwordRef ?? config.defaultPasswordRef;
|
|
103
|
+
const password = passwordType === 'none' || ref === undefined ? undefined : await ctx.secrets(ref);
|
|
104
|
+
return buildUsernameToken({
|
|
105
|
+
username: entry.username,
|
|
106
|
+
...(password !== undefined ? { password } : {}),
|
|
107
|
+
passwordType,
|
|
108
|
+
addNonce: entry.addNonce,
|
|
109
|
+
addCreated: entry.addCreated,
|
|
110
|
+
clock: ctx.clock,
|
|
111
|
+
nonce: ctx.nonce,
|
|
112
|
+
uuid: ctx.uuid,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
throw new WssError('wss-entry-unsupported', `WS-Security "${entry.kind}" entries are not supported yet.`, {
|
|
116
|
+
details: { kind: entry.kind },
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
/** Loads the keystore a signature or encryption entry names and picks its alias. */
|
|
120
|
+
async function resolveKeystoreAlias(entry, config, ctx) {
|
|
121
|
+
const keystore = await ctx.keystores(entry.keystoreRef);
|
|
122
|
+
if (keystore === undefined) {
|
|
123
|
+
throw new WssError('wss-keystore-missing', 'The keystore this entry needs is not available.', {
|
|
124
|
+
details: { keystoreRef: entry.keystoreRef },
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
keystore,
|
|
129
|
+
alias: selectAlias(keystore, entry.alias ?? config.defaultAlias),
|
|
130
|
+
...(config.actor !== undefined ? { actor: config.actor } : {}),
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Applies `config` to `envelopeXml`, returning the new envelope.
|
|
135
|
+
*
|
|
136
|
+
* The `soap:Header` is created (before the `Body`) when missing, the `wsse:Security` block
|
|
137
|
+
* addressed to `config.actor` is reused when one already exists, and the entries are appended
|
|
138
|
+
* to it in configuration order. Request-level `wssPasswordType`/`wssTimeToLive` override the
|
|
139
|
+
* matching entry fields for this application only.
|
|
140
|
+
*
|
|
141
|
+
* @param envelopeXml the envelope to secure
|
|
142
|
+
* @param config the outgoing configuration
|
|
143
|
+
* @param ctx the injected keystore/secret/clock/entropy capabilities
|
|
144
|
+
* @param options request-level property overrides
|
|
145
|
+
* @returns the serialized, secured envelope
|
|
146
|
+
* @throws WssError `wss-not-an-envelope`, or `wss-entry-unsupported` for an unknown entry kind
|
|
147
|
+
*/
|
|
148
|
+
export async function applyOutgoingWss(envelopeXml, config, ctx, options) {
|
|
149
|
+
const { doc, version } = parseEnvelope(envelopeXml);
|
|
150
|
+
for (const entry of config.entries) {
|
|
151
|
+
// The header is re-resolved every iteration because signing re-serializes the whole
|
|
152
|
+
// document (xml-crypto only speaks strings), which invalidates any element held across it.
|
|
153
|
+
const root = doc.documentElement;
|
|
154
|
+
if (root === null) {
|
|
155
|
+
throw new WssError('wss-not-an-envelope', 'WS-Security can only be applied to a SOAP envelope.');
|
|
156
|
+
}
|
|
157
|
+
const header = ensureHeader(doc, root, version);
|
|
158
|
+
const security = ensureSecurity(doc, root, header, version, config);
|
|
159
|
+
if (entry.kind === 'signature') {
|
|
160
|
+
await signEnvelope(doc, entry, await resolveKeystoreAlias(entry, config, ctx), ctx);
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
if (entry.kind === 'encryption') {
|
|
164
|
+
encryptEnvelope(doc, entry, await resolveKeystoreAlias(entry, config, ctx), ctx);
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
security.appendChild(doc.importNode(await buildEntry(entry, config, ctx, options?.requestProperties), true));
|
|
168
|
+
}
|
|
169
|
+
if (config.entries.length === 0) {
|
|
170
|
+
const root = doc.documentElement;
|
|
171
|
+
if (root !== null) {
|
|
172
|
+
ensureSecurity(doc, root, ensureHeader(doc, root, version), version, config);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return serializeXml(doc);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Removes the `wsse:Security` header addressed to `actor` (the ultimate receiver's when
|
|
179
|
+
* `actor` is omitted), plus the `soap:Header` if that emptied it.
|
|
180
|
+
*
|
|
181
|
+
* @param envelopeXml the envelope to clean
|
|
182
|
+
* @param actor the actor/role whose Security block to remove
|
|
183
|
+
* @returns the envelope without that header; unchanged when there is nothing to remove
|
|
184
|
+
*/
|
|
185
|
+
export function removeOutgoingWss(envelopeXml, actor) {
|
|
186
|
+
let parsed;
|
|
187
|
+
try {
|
|
188
|
+
parsed = parseEnvelope(envelopeXml);
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
return envelopeXml;
|
|
192
|
+
}
|
|
193
|
+
const { doc, root, version } = parsed;
|
|
194
|
+
const header = childElement(root, envelopeNamespace(version), 'Header');
|
|
195
|
+
if (header === undefined) {
|
|
196
|
+
return envelopeXml;
|
|
197
|
+
}
|
|
198
|
+
let removed = false;
|
|
199
|
+
for (const security of securityHeaders(header)) {
|
|
200
|
+
if (securityActor(security, version) === actor) {
|
|
201
|
+
header.removeChild(security);
|
|
202
|
+
removed = true;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (!removed) {
|
|
206
|
+
return envelopeXml;
|
|
207
|
+
}
|
|
208
|
+
if (childElement(header, NS.WSSE, 'Security') === undefined && headerHasOnlyWhitespace(header)) {
|
|
209
|
+
root.removeChild(header);
|
|
210
|
+
}
|
|
211
|
+
return serializeXml(doc);
|
|
212
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `InclusiveNamespaces PrefixList` exclusive canonicalization needs to be told about.
|
|
3
|
+
*
|
|
4
|
+
* Exclusive c14n's "visible utilization" rule only looks at element and attribute *names*, so a
|
|
5
|
+
* prefix a subtree uses only inside an attribute value or in text — `xsi:type="tns:Foo"`, a
|
|
6
|
+
* WSDL/XSD `ref`, a `QName` element body — loses its declaration and the canonical form stops
|
|
7
|
+
* meaning what it said. Both `outgoing/signature.ts` (per-reference transforms) and
|
|
8
|
+
* `outgoing/encryption.ts` (the plaintext it canonicalizes before encrypting) need the same
|
|
9
|
+
* list, so the rule lives here once.
|
|
10
|
+
*/
|
|
11
|
+
import type { Element } from '@xmldom/xmldom';
|
|
12
|
+
/**
|
|
13
|
+
* The `InclusiveNamespaces PrefixList` exclusive c14n of `element` needs: every prefix
|
|
14
|
+
* `element`'s subtree references only through attribute-value or text QName content — a use
|
|
15
|
+
* exclusive c14n's "visible utilization" rule does not see — plus `envelopePrefix` when one is
|
|
16
|
+
* given.
|
|
17
|
+
*
|
|
18
|
+
* A prefix `element` already declares on itself is left out: exclusive c14n renders that
|
|
19
|
+
* declaration regardless, so listing it again would be redundant, not wrong.
|
|
20
|
+
*
|
|
21
|
+
* @param element the element about to be canonicalized
|
|
22
|
+
* @param envelopePrefix the SOAP envelope's own prefix when the canonical form has to stand on
|
|
23
|
+
* its own inside the envelope (a signature reference), or `null` when it does not (an
|
|
24
|
+
* encrypted plaintext, which is self-contained by construction)
|
|
25
|
+
* @returns the prefixes to list, sorted, so the value is stable
|
|
26
|
+
*/
|
|
27
|
+
export declare function inclusiveNamespacePrefixList(element: Element, envelopePrefix: string | null): string[];
|