@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,288 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds the in-memory libxml2 file set one bundle's schema documents compile into: every XSD
|
|
3
|
+
* (and every WSDL-embedded `<types>` schema) as its own synthetic file, one glue file per target
|
|
4
|
+
* namespace (so a namespace split across several documents can still be `xs:import`ed with a
|
|
5
|
+
* single reference), and the wrapper schema helpers that pull every namespace into one document
|
|
6
|
+
* a Body child can be validated against.
|
|
7
|
+
*
|
|
8
|
+
* Split out of `schema-validator.ts` (Task 42 fix round 1, minor 9): that module now only
|
|
9
|
+
* orchestrates validating a fragment against the set this one builds.
|
|
10
|
+
*/
|
|
11
|
+
import { NS } from '../xml/namespaces.js';
|
|
12
|
+
import { serializeXml } from '../xml/serialize.js';
|
|
13
|
+
import { childElements, firstChildElement } from '../wsdl/dom-utils.js';
|
|
14
|
+
import { escapeAttribute } from '../xsd/xml-writer.js';
|
|
15
|
+
/**
|
|
16
|
+
* Per-bundle cache of the built file set. Keyed by bundle identity, so a
|
|
17
|
+
* re-import (a new bundle object) rebuilds and the old entry is collected.
|
|
18
|
+
*/
|
|
19
|
+
const fileSetCache = new WeakMap();
|
|
20
|
+
/** The `xmlns`/`xmlns:*` declarations in scope at `element` from its ancestors, nearest first. */
|
|
21
|
+
function inheritedNamespaceDeclarations(element) {
|
|
22
|
+
const declarations = new Map();
|
|
23
|
+
let current = element.parentNode;
|
|
24
|
+
while (current !== null) {
|
|
25
|
+
if (current.nodeType === 1) {
|
|
26
|
+
const ancestor = current;
|
|
27
|
+
for (let index = 0; index < ancestor.attributes.length; index += 1) {
|
|
28
|
+
const attribute = ancestor.attributes.item(index);
|
|
29
|
+
if (attribute === null) {
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
if ((attribute.name === 'xmlns' || attribute.name.startsWith('xmlns:')) && !declarations.has(attribute.name)) {
|
|
33
|
+
declarations.set(attribute.name, attribute.value);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
current = current.parentNode;
|
|
38
|
+
}
|
|
39
|
+
return declarations;
|
|
40
|
+
}
|
|
41
|
+
/** The `xs:import`/`xs:include`/`xs:redefine` elements of a schema, at any depth (they are top-level in practice). */
|
|
42
|
+
function referenceElements(schema) {
|
|
43
|
+
return ['import', 'include', 'redefine'].flatMap((name) => childElements(schema, NS.XSD, name));
|
|
44
|
+
}
|
|
45
|
+
/** The index of the `>` that closes the (opening) tag starting at `text[0]`, skipping any `>`
|
|
46
|
+
* that appears inside a quoted attribute value (a raw `>` needs no escaping there, so it is
|
|
47
|
+
* legal — `indexOf('>')` would stop at the first one and truncate the tag). Returns `-1` when
|
|
48
|
+
* the tag never closes (should not happen for a serializer's own output). */
|
|
49
|
+
function endOfStartTag(text) {
|
|
50
|
+
let quote;
|
|
51
|
+
for (let index = 0; index < text.length; index += 1) {
|
|
52
|
+
const char = text[index];
|
|
53
|
+
if (quote !== undefined) {
|
|
54
|
+
if (char === quote) {
|
|
55
|
+
quote = undefined;
|
|
56
|
+
}
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (char === '"' || char === "'") {
|
|
60
|
+
quote = char;
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (char === '>') {
|
|
64
|
+
return index;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return -1;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Clones `schema`, hoists the namespace declarations it inherited from its
|
|
71
|
+
* WSDL ancestors (prefixes used in `type="s:int"` attribute values would
|
|
72
|
+
* otherwise dangle), and rewrites every `schemaLocation` to the synthetic
|
|
73
|
+
* file name the referenced document was given.
|
|
74
|
+
*/
|
|
75
|
+
function synthesizeSchema(schema, base, fileNameFor) {
|
|
76
|
+
const clone = schema.cloneNode(true);
|
|
77
|
+
for (const reference of referenceElements(clone)) {
|
|
78
|
+
const location = reference.getAttribute('schemaLocation');
|
|
79
|
+
if (location === null || location === '') {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
let resolved;
|
|
83
|
+
try {
|
|
84
|
+
resolved = new URL(location, base).toString();
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
resolved = location;
|
|
88
|
+
}
|
|
89
|
+
const fileName = fileNameFor.get(resolved);
|
|
90
|
+
if (fileName === undefined) {
|
|
91
|
+
// The bundle never resolved this reference; dropping the location leaves
|
|
92
|
+
// a namespace-only import, which libxml2 treats as "assume it is declared
|
|
93
|
+
// elsewhere" instead of failing to compile the whole set.
|
|
94
|
+
reference.removeAttribute('schemaLocation');
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
reference.setAttribute('schemaLocation', fileName);
|
|
98
|
+
}
|
|
99
|
+
// The namespace declarations are injected into the serialized text rather than
|
|
100
|
+
// set as attributes: xmldom's serializer emits a declaration for the element's
|
|
101
|
+
// own prefix by itself, and setting the same one as an attribute would produce
|
|
102
|
+
// a duplicate (which libxml2 rejects as not well formed).
|
|
103
|
+
const text = serializeXml(clone);
|
|
104
|
+
const insertAt = text.search(/[\s/>]/);
|
|
105
|
+
const tagEnd = endOfStartTag(text);
|
|
106
|
+
const head = text.slice(0, tagEnd === -1 ? text.length : tagEnd);
|
|
107
|
+
const extra = [...inheritedNamespaceDeclarations(schema)]
|
|
108
|
+
.filter(([name]) => !new RegExp(`[\\s<]${name.replace(':', '\\:')}\\s*=`).test(head))
|
|
109
|
+
.map(([name, value]) => ` ${name}="${escapeAttribute(value)}"`)
|
|
110
|
+
.join('');
|
|
111
|
+
return `${text.slice(0, insertAt)}${extra}${text.slice(insertAt)}`;
|
|
112
|
+
}
|
|
113
|
+
/** Every `xs:schema` a bundled document contributes, with the document it came from. */
|
|
114
|
+
function schemaElementsOf(document) {
|
|
115
|
+
const root = document.document.documentElement;
|
|
116
|
+
if (root === null) {
|
|
117
|
+
return [];
|
|
118
|
+
}
|
|
119
|
+
if (document.kind === 'xsd') {
|
|
120
|
+
return root.namespaceURI === NS.XSD && root.localName === 'schema' ? [root] : [];
|
|
121
|
+
}
|
|
122
|
+
const types = firstChildElement(root, NS.WSDL, 'types');
|
|
123
|
+
return types === undefined ? [] : childElements(types, NS.XSD, 'schema');
|
|
124
|
+
}
|
|
125
|
+
/** Builds (or returns the cached) libxml2 file set for `bundle`. */
|
|
126
|
+
export function buildSchemaFileSet(bundle) {
|
|
127
|
+
const cached = fileSetCache.get(bundle);
|
|
128
|
+
if (cached !== undefined) {
|
|
129
|
+
return cached;
|
|
130
|
+
}
|
|
131
|
+
// Pass 1: name every document, so pass 2 can rewrite references to those names.
|
|
132
|
+
const fileNameFor = new Map();
|
|
133
|
+
const sources = [];
|
|
134
|
+
let index = 0;
|
|
135
|
+
for (const document of bundle.documents) {
|
|
136
|
+
const schemas = schemaElementsOf(document);
|
|
137
|
+
schemas.forEach((schema, ordinal) => {
|
|
138
|
+
index += 1;
|
|
139
|
+
const fileName = document.kind === 'wsdl' ? `embedded-${String(index)}.xsd` : `doc-${String(index)}.xsd`;
|
|
140
|
+
if (ordinal === 0) {
|
|
141
|
+
fileNameFor.set(document.location, fileName);
|
|
142
|
+
fileNameFor.set(document.requestedLocation, fileName);
|
|
143
|
+
}
|
|
144
|
+
sources.push({
|
|
145
|
+
schema,
|
|
146
|
+
base: document.location,
|
|
147
|
+
fileName,
|
|
148
|
+
chameleon: document.chameleonFor !== undefined,
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
// Pass 2: synthesize each schema, and group them by their own target namespace.
|
|
153
|
+
const files = [];
|
|
154
|
+
const byNamespace = new Map();
|
|
155
|
+
const noNamespace = [];
|
|
156
|
+
const documentOf = new Map();
|
|
157
|
+
for (const source of sources) {
|
|
158
|
+
files.push({ fileName: source.fileName, contents: synthesizeSchema(source.schema, source.base, fileNameFor) });
|
|
159
|
+
documentOf.set(source.fileName, source.base);
|
|
160
|
+
const targetNamespace = source.schema.getAttribute('targetNamespace');
|
|
161
|
+
if (targetNamespace === null || targetNamespace === '') {
|
|
162
|
+
// A chameleon include has no namespace of its own and is already pulled in
|
|
163
|
+
// by the schema that includes it; adding it again at the top level would
|
|
164
|
+
// redeclare its components.
|
|
165
|
+
if (!source.chameleon) {
|
|
166
|
+
noNamespace.push(source.fileName);
|
|
167
|
+
}
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
const bucket = byNamespace.get(targetNamespace);
|
|
171
|
+
if (bucket === undefined) {
|
|
172
|
+
byNamespace.set(targetNamespace, [source.fileName]);
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
bucket.push(source.fileName);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// Pass 3: one glue schema per namespace, so a namespace split across several
|
|
179
|
+
// documents can still be imported by a wrapper with a single `xs:import`.
|
|
180
|
+
const glue = new Map();
|
|
181
|
+
let glueIndex = 0;
|
|
182
|
+
for (const [namespace, members] of byNamespace) {
|
|
183
|
+
glueIndex += 1;
|
|
184
|
+
const fileName = `ns-${String(glueIndex)}.xsd`;
|
|
185
|
+
const includes = members.map((member) => ` <xs:include schemaLocation="${escapeAttribute(member)}"/>`).join('\n');
|
|
186
|
+
files.push({
|
|
187
|
+
fileName,
|
|
188
|
+
contents: `<xs:schema xmlns:xs="${NS.XSD}" targetNamespace="${escapeAttribute(namespace)}">\n${includes}\n</xs:schema>`,
|
|
189
|
+
});
|
|
190
|
+
glue.set(namespace, fileName);
|
|
191
|
+
}
|
|
192
|
+
const fileSet = { files, glue, noNamespace, documentOf };
|
|
193
|
+
fileSetCache.set(bundle, fileSet);
|
|
194
|
+
return fileSet;
|
|
195
|
+
}
|
|
196
|
+
/** The `xs:import`/`xs:include` lines a wrapper needs to see every namespace but `own`. */
|
|
197
|
+
function wrapperReferences(fileSet, own) {
|
|
198
|
+
const lines = [];
|
|
199
|
+
for (const [namespace, fileName] of fileSet.glue) {
|
|
200
|
+
lines.push(namespace === own
|
|
201
|
+
? ` <xs:include schemaLocation="${escapeAttribute(fileName)}"/>`
|
|
202
|
+
: ` <xs:import namespace="${escapeAttribute(namespace)}" schemaLocation="${escapeAttribute(fileName)}"/>`);
|
|
203
|
+
}
|
|
204
|
+
for (const fileName of fileSet.noNamespace) {
|
|
205
|
+
lines.push(` <xs:include schemaLocation="${escapeAttribute(fileName)}"/>`);
|
|
206
|
+
}
|
|
207
|
+
return lines.join('\n');
|
|
208
|
+
}
|
|
209
|
+
/** The wrapper schema for `document` style: no declarations of its own, just every namespace. */
|
|
210
|
+
export function documentWrapper(fileSet) {
|
|
211
|
+
return `<xs:schema xmlns:xs="${NS.XSD}">\n${wrapperReferences(fileSet, undefined)}\n</xs:schema>`;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* The wrapper schema for `rpc` style: the body child is the operation wrapper
|
|
215
|
+
* element, which no schema declares, so one is synthesized here with a child
|
|
216
|
+
* per `wsdl:part`. `xs:all` rather than `xs:sequence`, because `parameterOrder`
|
|
217
|
+
* (and sample generation) may order the parts differently from the
|
|
218
|
+
* `wsdl:message`, and part order is not something this validator should police.
|
|
219
|
+
*/
|
|
220
|
+
export function rpcWrapper(fileSet, namespace, elementName, binding) {
|
|
221
|
+
const prefixes = new Map([[NS.XSD, 'xs']]);
|
|
222
|
+
const prefixFor = (uri) => {
|
|
223
|
+
const existing = prefixes.get(uri);
|
|
224
|
+
if (existing !== undefined) {
|
|
225
|
+
return existing;
|
|
226
|
+
}
|
|
227
|
+
if (!fileSet.glue.has(uri)) {
|
|
228
|
+
return undefined;
|
|
229
|
+
}
|
|
230
|
+
const prefix = `p${String(prefixes.size)}`;
|
|
231
|
+
prefixes.set(uri, prefix);
|
|
232
|
+
return prefix;
|
|
233
|
+
};
|
|
234
|
+
const particles = binding.parts.map((part) => {
|
|
235
|
+
const name = escapeAttribute(part.name);
|
|
236
|
+
if (part.element !== undefined) {
|
|
237
|
+
const prefix = prefixFor(part.element.namespaceUri);
|
|
238
|
+
if (prefix !== undefined) {
|
|
239
|
+
return ` <xs:element ref="${prefix}:${escapeAttribute(part.element.localName)}"/>`;
|
|
240
|
+
}
|
|
241
|
+
return ` <xs:element name="${name}"/>`;
|
|
242
|
+
}
|
|
243
|
+
if (part.type !== undefined) {
|
|
244
|
+
const prefix = prefixFor(part.type.namespaceUri);
|
|
245
|
+
if (prefix !== undefined) {
|
|
246
|
+
return ` <xs:element name="${name}" type="${prefix}:${escapeAttribute(part.type.localName)}"/>`;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
// An unknown part type must not fail the whole compile: accept anything.
|
|
250
|
+
return ` <xs:element name="${name}"/>`;
|
|
251
|
+
});
|
|
252
|
+
const declarations = [...prefixes].map(([uri, prefix]) => `xmlns:${prefix}="${escapeAttribute(uri)}"`).join(' ');
|
|
253
|
+
const content = particles.length === 0
|
|
254
|
+
? ' <xs:complexType/>'
|
|
255
|
+
: ` <xs:complexType>\n <xs:all>\n${particles.join('\n')}\n </xs:all>\n </xs:complexType>`;
|
|
256
|
+
return [
|
|
257
|
+
`<xs:schema ${declarations} targetNamespace="${escapeAttribute(namespace)}" elementFormDefault="unqualified">`,
|
|
258
|
+
wrapperReferences(fileSet, namespace),
|
|
259
|
+
` <xs:element name="${escapeAttribute(elementName)}">`,
|
|
260
|
+
content,
|
|
261
|
+
' </xs:element>',
|
|
262
|
+
'</xs:schema>',
|
|
263
|
+
].join('\n');
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Human-readable label for every synthetic file name a diagnostic might mention: the original
|
|
267
|
+
* document's location for a document file, or "the schema set" for anything this module
|
|
268
|
+
* invented (a glue file, or the caller's own wrapper/body files).
|
|
269
|
+
*/
|
|
270
|
+
export function fileSetLabels(fileSet) {
|
|
271
|
+
const labels = new Map();
|
|
272
|
+
for (const [fileName, location] of fileSet.documentOf) {
|
|
273
|
+
labels.set(fileName, location);
|
|
274
|
+
}
|
|
275
|
+
for (const fileName of fileSet.glue.values()) {
|
|
276
|
+
if (!labels.has(fileName)) {
|
|
277
|
+
labels.set(fileName, 'the schema set');
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
for (const fileName of fileSet.noNamespace) {
|
|
281
|
+
if (!labels.has(fileName)) {
|
|
282
|
+
labels.set(fileName, 'the schema set');
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
labels.set('wrapper.xsd', 'the schema set');
|
|
286
|
+
labels.set('body.xml', 'the message');
|
|
287
|
+
return labels;
|
|
288
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* XSD validation of a SOAP message body against the interface's schema set,
|
|
3
|
+
* using libxml2 compiled to WebAssembly (`xmllint-wasm`).
|
|
4
|
+
*
|
|
5
|
+
* The envelope itself is never validated against the XSD — no schema in a
|
|
6
|
+
* WSDL describes `soapenv:Envelope` — so this module extracts each child of
|
|
7
|
+
* `Body` as its own little document and validates that. The extraction keeps
|
|
8
|
+
* the original source offsets: the fragment is padded with as many blank
|
|
9
|
+
* lines as precede it in the envelope, so every line number libxml2 reports
|
|
10
|
+
* is already a line number in the envelope the user is editing.
|
|
11
|
+
*
|
|
12
|
+
* `xmllint-wasm` runs libxml2 inside its own Node worker thread, so a
|
|
13
|
+
* validation never blocks the caller's event loop (measured: a 500 KB body
|
|
14
|
+
* validates in ~50 ms with a worst-case event-loop gap of ~6 ms). No extra
|
|
15
|
+
* worker of our own is needed; a wall-clock timeout guards against a
|
|
16
|
+
* pathological schema instead.
|
|
17
|
+
*
|
|
18
|
+
* Building the libxml2 file set itself — one synthetic file per schema
|
|
19
|
+
* document, the per-namespace glue files, and the `document`/`rpc` wrapper
|
|
20
|
+
* schemas — lives in `schema-file-set.ts`; this module only orchestrates
|
|
21
|
+
* validating one fragment against what that one builds.
|
|
22
|
+
*/
|
|
23
|
+
import type { DefinitionBundle } from '../wsdl/resolver.js';
|
|
24
|
+
import type { SchemaSet } from '../xsd/schema-set.js';
|
|
25
|
+
import type { ValidationBinding, ValidationProblem } from './types.js';
|
|
26
|
+
/** Default wall-clock budget for one validation, in milliseconds. */
|
|
27
|
+
export declare const DEFAULT_VALIDATION_TIMEOUT_MS = 10000;
|
|
28
|
+
/** What the schema validator validates against: the compiled set plus the raw documents behind it. */
|
|
29
|
+
export interface SchemaValidationTarget {
|
|
30
|
+
readonly schemaSet: SchemaSet;
|
|
31
|
+
readonly bundle: DefinitionBundle;
|
|
32
|
+
}
|
|
33
|
+
/** Options for {@link validateAgainstSchemaSet}. */
|
|
34
|
+
export interface SchemaValidationOptions {
|
|
35
|
+
/** The operation being validated; required for `rpc` style, where no global element declares the body. */
|
|
36
|
+
readonly binding?: ValidationBinding;
|
|
37
|
+
/** Wall-clock budget for the whole validation; defaults to {@link DEFAULT_VALIDATION_TIMEOUT_MS}. */
|
|
38
|
+
readonly timeoutMs?: number;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Validates the `Body` children of a SOAP envelope against an interface's
|
|
42
|
+
* schema set with libxml2.
|
|
43
|
+
*
|
|
44
|
+
* Never throws: a message that cannot be tokenized, an empty body, or a schema
|
|
45
|
+
* set with no components all yield an empty list (the structure checks own
|
|
46
|
+
* those reports). Positions in the returned problems are lines in `xml`.
|
|
47
|
+
*
|
|
48
|
+
* @param xml the whole envelope text
|
|
49
|
+
* @param target the compiled schema set plus the bundle the raw schema documents come from
|
|
50
|
+
* @param options the binding context (required for `rpc` style) and the timeout
|
|
51
|
+
* @returns every schema finding, in body order
|
|
52
|
+
*/
|
|
53
|
+
export declare function validateAgainstSchemaSet(xml: string, target: SchemaValidationTarget, options?: SchemaValidationOptions): Promise<readonly ValidationProblem[]>;
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* XSD validation of a SOAP message body against the interface's schema set,
|
|
3
|
+
* using libxml2 compiled to WebAssembly (`xmllint-wasm`).
|
|
4
|
+
*
|
|
5
|
+
* The envelope itself is never validated against the XSD — no schema in a
|
|
6
|
+
* WSDL describes `soapenv:Envelope` — so this module extracts each child of
|
|
7
|
+
* `Body` as its own little document and validates that. The extraction keeps
|
|
8
|
+
* the original source offsets: the fragment is padded with as many blank
|
|
9
|
+
* lines as precede it in the envelope, so every line number libxml2 reports
|
|
10
|
+
* is already a line number in the envelope the user is editing.
|
|
11
|
+
*
|
|
12
|
+
* `xmllint-wasm` runs libxml2 inside its own Node worker thread, so a
|
|
13
|
+
* validation never blocks the caller's event loop (measured: a 500 KB body
|
|
14
|
+
* validates in ~50 ms with a worst-case event-loop gap of ~6 ms). No extra
|
|
15
|
+
* worker of our own is needed; a wall-clock timeout guards against a
|
|
16
|
+
* pathological schema instead.
|
|
17
|
+
*
|
|
18
|
+
* Building the libxml2 file set itself — one synthetic file per schema
|
|
19
|
+
* document, the per-namespace glue files, and the `document`/`rpc` wrapper
|
|
20
|
+
* schemas — lives in `schema-file-set.ts`; this module only orchestrates
|
|
21
|
+
* validating one fragment against what that one builds.
|
|
22
|
+
*/
|
|
23
|
+
import { validateXML } from 'xmllint-wasm';
|
|
24
|
+
import { localNameOf, tokenizeXml, buildRangeTree } from '../xml/tolerant-tree.js';
|
|
25
|
+
import { escapeAttribute } from '../xsd/xml-writer.js';
|
|
26
|
+
import { buildSchemaFileSet, documentWrapper, fileSetLabels, rpcWrapper } from './schema-file-set.js';
|
|
27
|
+
/** Default wall-clock budget for one validation, in milliseconds. */
|
|
28
|
+
export const DEFAULT_VALIDATION_TIMEOUT_MS = 10_000;
|
|
29
|
+
/**
|
|
30
|
+
* Bundles whose most recent schema validation timed out and is still running in the background,
|
|
31
|
+
* mapped to the still-outstanding `validateXML` call. A new validation for the same bundle
|
|
32
|
+
* refuses to start a second libxml2 instance while one is stuck (minor 4 of the Task 42 fix
|
|
33
|
+
* round): a runaway schema would otherwise spawn one WASM instance per keystroke. The entry is
|
|
34
|
+
* removed as soon as the stale call finally settles, one way or the other.
|
|
35
|
+
*/
|
|
36
|
+
const staleByBundle = new WeakMap();
|
|
37
|
+
/** The `xmlns`/`xmlns:*` declarations a range node carries, parsed out of its raw attribute text. */
|
|
38
|
+
function declarationsOf(node) {
|
|
39
|
+
const declarations = new Map();
|
|
40
|
+
const pattern = /(xmlns(?::[\w.-]+)?)\s*=\s*"([^"]*)"|(xmlns(?::[\w.-]+)?)\s*=\s*'([^']*)'/g;
|
|
41
|
+
let match;
|
|
42
|
+
while ((match = pattern.exec(node.rawAttrs)) !== null) {
|
|
43
|
+
const name = match[1] ?? match[3];
|
|
44
|
+
const value = match[2] ?? match[4];
|
|
45
|
+
if (name !== undefined && value !== undefined) {
|
|
46
|
+
declarations.set(name, value);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return declarations;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Extracts every child element of `Body` as its own document. Returns an empty
|
|
53
|
+
* list when the envelope cannot be tokenized (a half-typed document): the
|
|
54
|
+
* structure checks already report that, and guessing here would only produce
|
|
55
|
+
* bogus markers.
|
|
56
|
+
*/
|
|
57
|
+
function bodyFragments(xml) {
|
|
58
|
+
const tokens = tokenizeXml(xml);
|
|
59
|
+
const roots = tokens === undefined ? undefined : buildRangeTree(tokens);
|
|
60
|
+
const envelope = roots?.find((node) => localNameOf(node.name) === 'Envelope');
|
|
61
|
+
const body = envelope?.children.find((node) => localNameOf(node.name) === 'Body');
|
|
62
|
+
if (envelope === undefined || body === undefined) {
|
|
63
|
+
return [];
|
|
64
|
+
}
|
|
65
|
+
// Namespace declarations the fragment inherits: envelope first, then Body,
|
|
66
|
+
// so a redeclaration on the inner element wins.
|
|
67
|
+
const inherited = new Map([...declarationsOf(envelope), ...declarationsOf(body)]);
|
|
68
|
+
return body.children.map((child) => {
|
|
69
|
+
const own = declarationsOf(child);
|
|
70
|
+
const extra = [...inherited]
|
|
71
|
+
.filter(([name]) => !own.has(name))
|
|
72
|
+
.map(([name, value]) => ` ${name}="${escapeAttribute(value)}"`)
|
|
73
|
+
.join('');
|
|
74
|
+
const raw = xml.slice(child.start, child.end);
|
|
75
|
+
const insertAt = 1 + child.name.length;
|
|
76
|
+
const fragment = `${raw.slice(0, insertAt)}${extra}${raw.slice(insertAt)}`;
|
|
77
|
+
const line = xml.slice(0, child.start).split('\n').length;
|
|
78
|
+
const prefix = child.name.includes(':') ? child.name.slice(0, child.name.indexOf(':')) : '';
|
|
79
|
+
const namespaceUri = (prefix === '' ? inherited.get('xmlns') : inherited.get(`xmlns:${prefix}`)) ??
|
|
80
|
+
own.get(prefix === '' ? 'xmlns' : `xmlns:${prefix}`) ??
|
|
81
|
+
'';
|
|
82
|
+
const declared = own.get(prefix === '' ? 'xmlns' : `xmlns:${prefix}`);
|
|
83
|
+
return {
|
|
84
|
+
name: child.name,
|
|
85
|
+
namespaceUri: declared ?? namespaceUri,
|
|
86
|
+
// Blank-line padding keeps libxml2's line numbers aligned with the envelope.
|
|
87
|
+
contents: `${'\n'.repeat(line - 1)}${fragment}`,
|
|
88
|
+
line,
|
|
89
|
+
};
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
/** Strips libxml2's "Schemas validity error : " prefix from a message, and every synthetic file
|
|
93
|
+
* name the file set might mention (`labels`) with a name the user actually recognizes. */
|
|
94
|
+
function cleanMessage(message, labels) {
|
|
95
|
+
let cleaned = message.replace(/^Schemas\s+\w+\s+(?:error|warning)\s*:\s*/i, '').trim();
|
|
96
|
+
for (const [fileName, label] of labels) {
|
|
97
|
+
if (cleaned.includes(fileName)) {
|
|
98
|
+
cleaned = cleaned.split(fileName).join(label);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return cleaned;
|
|
102
|
+
}
|
|
103
|
+
/** Runs `promise`, resolving to `fallback` when it takes longer than `ms`. */
|
|
104
|
+
async function withTimeout(promise, ms, fallback) {
|
|
105
|
+
let timer;
|
|
106
|
+
try {
|
|
107
|
+
return await Promise.race([
|
|
108
|
+
promise,
|
|
109
|
+
new Promise((resolve) => {
|
|
110
|
+
timer = setTimeout(() => {
|
|
111
|
+
resolve(fallback);
|
|
112
|
+
}, ms);
|
|
113
|
+
}),
|
|
114
|
+
]);
|
|
115
|
+
}
|
|
116
|
+
finally {
|
|
117
|
+
if (timer !== undefined) {
|
|
118
|
+
clearTimeout(timer);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/** Validates one body fragment against `wrapper`, mapping libxml2's output to problems. */
|
|
123
|
+
async function validateFragment(fragment, wrapper, fileSet, timeoutMs, bundle) {
|
|
124
|
+
const path = `/Envelope/Body/${fragment.name}`;
|
|
125
|
+
const labels = fileSetLabels(fileSet);
|
|
126
|
+
const timedOut = [
|
|
127
|
+
{
|
|
128
|
+
severity: 'warning',
|
|
129
|
+
code: 'schema-timeout',
|
|
130
|
+
message: `Schema validation of <${fragment.name}> timed out after ${String(timeoutMs)} ms`,
|
|
131
|
+
source: 'schema',
|
|
132
|
+
line: fragment.line,
|
|
133
|
+
path,
|
|
134
|
+
},
|
|
135
|
+
];
|
|
136
|
+
const stale = staleByBundle.get(bundle);
|
|
137
|
+
if (stale !== undefined) {
|
|
138
|
+
// A previous validation for this interface is still stuck in libxml2; starting another one
|
|
139
|
+
// now would pile a second WASM instance on top of it. Refuse immediately, and let the stale
|
|
140
|
+
// call keep running in the background — see the `.then` below for when it clears.
|
|
141
|
+
return [
|
|
142
|
+
{
|
|
143
|
+
severity: 'warning',
|
|
144
|
+
code: 'schema-timeout',
|
|
145
|
+
message: `Schema validation of <${fragment.name}> was skipped: the interface's previous validation has not finished yet`,
|
|
146
|
+
source: 'schema',
|
|
147
|
+
line: fragment.line,
|
|
148
|
+
path,
|
|
149
|
+
},
|
|
150
|
+
];
|
|
151
|
+
}
|
|
152
|
+
const call = validateXML({
|
|
153
|
+
xml: [{ fileName: 'body.xml', contents: fragment.contents }],
|
|
154
|
+
schema: [{ fileName: 'wrapper.xsd', contents: wrapper }],
|
|
155
|
+
preload: fileSet.files.map((file) => ({ fileName: file.fileName, contents: file.contents })),
|
|
156
|
+
});
|
|
157
|
+
let result;
|
|
158
|
+
try {
|
|
159
|
+
result = await withTimeout(call, timeoutMs, undefined);
|
|
160
|
+
}
|
|
161
|
+
catch (cause) {
|
|
162
|
+
// A schema set that does not compile is a problem with the definition, not
|
|
163
|
+
// with the message: report it once, as a warning, with no position.
|
|
164
|
+
return [
|
|
165
|
+
{
|
|
166
|
+
severity: 'warning',
|
|
167
|
+
code: 'schema-unavailable',
|
|
168
|
+
message: `The interface's schemas could not be compiled: ${cause instanceof Error ? cleanMessage(cause.message, labels) : String(cause)}`,
|
|
169
|
+
source: 'schema',
|
|
170
|
+
},
|
|
171
|
+
];
|
|
172
|
+
}
|
|
173
|
+
if (result === undefined) {
|
|
174
|
+
// Timed out: track the still-running call so a second validation for this interface refuses
|
|
175
|
+
// to start another libxml2 instance until this one settles, one way or the other, and
|
|
176
|
+
// terminate the tracking (not the call itself — libxml2 gives us no handle for that) once
|
|
177
|
+
// it does.
|
|
178
|
+
staleByBundle.set(bundle, call);
|
|
179
|
+
call.then(() => {
|
|
180
|
+
if (staleByBundle.get(bundle) === call) {
|
|
181
|
+
staleByBundle.delete(bundle);
|
|
182
|
+
}
|
|
183
|
+
}, () => {
|
|
184
|
+
if (staleByBundle.get(bundle) === call) {
|
|
185
|
+
staleByBundle.delete(bundle);
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
return timedOut;
|
|
189
|
+
}
|
|
190
|
+
if (result.valid) {
|
|
191
|
+
return [];
|
|
192
|
+
}
|
|
193
|
+
return result.errors.flatMap((error) => {
|
|
194
|
+
const message = cleanMessage(error.message, labels);
|
|
195
|
+
const isBody = error.loc?.fileName === 'body.xml';
|
|
196
|
+
if (!isBody) {
|
|
197
|
+
// libxml2 warns when a namespace reachable through two files is imported
|
|
198
|
+
// twice — an artefact of the glue schemas, not a finding about the message.
|
|
199
|
+
if (/Schemas\s+\w+\s+warning\s*:/i.test(error.rawMessage)) {
|
|
200
|
+
return [];
|
|
201
|
+
}
|
|
202
|
+
return {
|
|
203
|
+
severity: 'warning',
|
|
204
|
+
code: 'schema-unavailable',
|
|
205
|
+
message,
|
|
206
|
+
source: 'schema',
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
return {
|
|
210
|
+
severity: 'error',
|
|
211
|
+
code: message.includes('No matching global declaration') ? 'schema-unknown-element' : 'schema-invalid',
|
|
212
|
+
message,
|
|
213
|
+
source: 'schema',
|
|
214
|
+
line: error.loc?.lineNumber ?? fragment.line,
|
|
215
|
+
path,
|
|
216
|
+
};
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Validates the `Body` children of a SOAP envelope against an interface's
|
|
221
|
+
* schema set with libxml2.
|
|
222
|
+
*
|
|
223
|
+
* Never throws: a message that cannot be tokenized, an empty body, or a schema
|
|
224
|
+
* set with no components all yield an empty list (the structure checks own
|
|
225
|
+
* those reports). Positions in the returned problems are lines in `xml`.
|
|
226
|
+
*
|
|
227
|
+
* @param xml the whole envelope text
|
|
228
|
+
* @param target the compiled schema set plus the bundle the raw schema documents come from
|
|
229
|
+
* @param options the binding context (required for `rpc` style) and the timeout
|
|
230
|
+
* @returns every schema finding, in body order
|
|
231
|
+
*/
|
|
232
|
+
export async function validateAgainstSchemaSet(xml, target, options) {
|
|
233
|
+
if (target.schemaSet.elements.size === 0 && target.schemaSet.types.size === 0) {
|
|
234
|
+
return [];
|
|
235
|
+
}
|
|
236
|
+
const fragments = bodyFragments(xml);
|
|
237
|
+
if (fragments.length === 0) {
|
|
238
|
+
return [];
|
|
239
|
+
}
|
|
240
|
+
const fileSet = buildSchemaFileSet(target.bundle);
|
|
241
|
+
const timeoutMs = options?.timeoutMs ?? DEFAULT_VALIDATION_TIMEOUT_MS;
|
|
242
|
+
const binding = options?.binding;
|
|
243
|
+
const problems = [];
|
|
244
|
+
for (const fragment of fragments) {
|
|
245
|
+
const wrapper = binding?.style === 'rpc'
|
|
246
|
+
? rpcWrapper(fileSet, fragment.namespaceUri, localNameOf(fragment.name), binding)
|
|
247
|
+
: documentWrapper(fileSet);
|
|
248
|
+
problems.push(...(await validateFragment(fragment, wrapper, fileSet, timeoutMs, target.bundle)));
|
|
249
|
+
}
|
|
250
|
+
return problems;
|
|
251
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SOAP envelope structure checks — everything the XSD schema set cannot say
|
|
3
|
+
* about a message, because the envelope itself is never validated against it:
|
|
4
|
+
* the envelope namespace (and therefore the SOAP version), the
|
|
5
|
+
* `Header`/`Body` shape, the `Fault` shape, `mustUnderstand` values, and the
|
|
6
|
+
* agreement between the transport metadata (`Content-Type`, `SOAPAction`) and
|
|
7
|
+
* the version in the envelope.
|
|
8
|
+
*
|
|
9
|
+
* Tolerant by design: a document that is not well formed yields exactly one
|
|
10
|
+
* `xml-not-well-formed` problem (with the parser's position) instead of
|
|
11
|
+
* throwing, so a half-typed envelope still produces a usable marker.
|
|
12
|
+
*/
|
|
13
|
+
import type { SoapEnvelopeVersion } from '../soap/envelope.js';
|
|
14
|
+
import type { ValidationProblem } from './types.js';
|
|
15
|
+
/** What {@link checkSoapStructure} compares the message against. */
|
|
16
|
+
export interface SoapStructureOptions {
|
|
17
|
+
/** The SOAP version the binding declares; an envelope in the other version's namespace is an error. */
|
|
18
|
+
readonly expectedVersion: SoapEnvelopeVersion;
|
|
19
|
+
/** The `SOAPAction` the request sends (1.1) or the action the binding declares (1.2). */
|
|
20
|
+
readonly soapAction?: string;
|
|
21
|
+
/** The `Content-Type` header the message is sent with (or was received with). */
|
|
22
|
+
readonly contentType?: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Checks the SOAP-level structure of `xml` against the binding's expectations.
|
|
26
|
+
*
|
|
27
|
+
* Never throws: a parse failure is reported as a single `xml-not-well-formed`
|
|
28
|
+
* problem carrying the parser's line/column.
|
|
29
|
+
*
|
|
30
|
+
* @param xml the whole envelope text, as typed in the editor
|
|
31
|
+
* @param options the binding's SOAP version, plus the transport metadata to cross-check
|
|
32
|
+
* @returns every finding, in document order (transport findings last)
|
|
33
|
+
*/
|
|
34
|
+
export declare function checkSoapStructure(xml: string, options: SoapStructureOptions): readonly ValidationProblem[];
|