@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,737 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zod schemas for every YAML document in a project folder.
|
|
3
|
+
*
|
|
4
|
+
* Every object schema is `z.looseObject`: unknown keys are accepted and
|
|
5
|
+
* IGNORED on load (the loader only ever reads the fields it knows about), and
|
|
6
|
+
* `saveProject` only ever writes known fields back out, so a 1.x build reading
|
|
7
|
+
* a file written by a newer 1.x build silently drops fields it does not
|
|
8
|
+
* understand rather than refusing to open the project. A breaking change to a
|
|
9
|
+
* document's shape bumps `formatVersion` instead of relying on strictness
|
|
10
|
+
* here. `formatVersion` itself stays a `z.literal` so an out-of-range value is
|
|
11
|
+
* still caught explicitly (see `migrate.ts`).
|
|
12
|
+
*
|
|
13
|
+
* The policy that follows from that, stated once so nobody has to rediscover
|
|
14
|
+
* it: **any additive field bumps `formatVersion`.** Since an unknown key is
|
|
15
|
+
* dropped on load and never written back, a field added inside the current
|
|
16
|
+
* version does not merely go unread by older builds — it is deleted from the
|
|
17
|
+
* project the first time an older build saves. "Additive is safe" is true of
|
|
18
|
+
* formats that round-trip unknown keys; this one deliberately does not. See
|
|
19
|
+
* ADR-0003.
|
|
20
|
+
*/
|
|
21
|
+
import { z } from 'zod';
|
|
22
|
+
import { assertionsSchema } from '../assert/schema.js';
|
|
23
|
+
import { ProjectError } from '../errors.js';
|
|
24
|
+
import { FORMAT_VERSION } from './model.js';
|
|
25
|
+
import { DEFAULT_WSS_ENCRYPTION_PARTS, DEFAULT_WSS_SIGNATURE_PARTS } from '../wss/model.js';
|
|
26
|
+
const nonEmpty = z.string().min(1);
|
|
27
|
+
const propertyMapSchema = z.record(z.string(), z.string());
|
|
28
|
+
/**
|
|
29
|
+
* A committed, human-chosen name for a secret reference — not the secret itself — used to build
|
|
30
|
+
* the environment variable a CI run reads it from (see `secrets/env-names.ts`).
|
|
31
|
+
*/
|
|
32
|
+
const envName = z
|
|
33
|
+
.string()
|
|
34
|
+
.regex(/^[A-Z][A-Z0-9_]*$/)
|
|
35
|
+
.optional();
|
|
36
|
+
/**
|
|
37
|
+
* Credentials as persisted: usernames and a `secretRef`, never a password
|
|
38
|
+
* value. Unlike every other schema here, a plaintext `password` key is
|
|
39
|
+
* explicitly rejected rather than merely ignored — secrets must never be
|
|
40
|
+
* written to a project file, in any format.
|
|
41
|
+
*/
|
|
42
|
+
export const endpointAuthSchema = z
|
|
43
|
+
.looseObject({
|
|
44
|
+
type: z.enum(['none', 'basic', 'ntlm']),
|
|
45
|
+
username: z.string().optional(),
|
|
46
|
+
passwordRef: z.string().optional(),
|
|
47
|
+
passwordEnv: envName,
|
|
48
|
+
domain: z.string().optional(),
|
|
49
|
+
workstation: z.string().optional(),
|
|
50
|
+
preemptive: z.boolean().optional(),
|
|
51
|
+
})
|
|
52
|
+
.refine((value) => !('password' in value), {
|
|
53
|
+
message: 'endpoint auth must not contain a plaintext "password" field; use passwordRef',
|
|
54
|
+
path: ['password'],
|
|
55
|
+
});
|
|
56
|
+
/**
|
|
57
|
+
* Keys that would hold a credential *value* rather than a reference to one. A project file must
|
|
58
|
+
* never carry one, in any authentication scheme, so they are rejected outright rather than
|
|
59
|
+
* ignored — the same rule `endpointAuthSchema` applies to `password`, stated once for the
|
|
60
|
+
* schemes added with the REST client (ADR-0004).
|
|
61
|
+
*/
|
|
62
|
+
const PLAINTEXT_SECRET_KEYS = [
|
|
63
|
+
'password',
|
|
64
|
+
'token',
|
|
65
|
+
'secret',
|
|
66
|
+
'clientSecret',
|
|
67
|
+
'client_secret',
|
|
68
|
+
'apiKey',
|
|
69
|
+
'refreshToken',
|
|
70
|
+
];
|
|
71
|
+
/** Adds the {@link PLAINTEXT_SECRET_KEYS} rejection to one authentication schema. */
|
|
72
|
+
function refuseSecretValues(schema) {
|
|
73
|
+
return schema.superRefine((value, ctx) => {
|
|
74
|
+
for (const key of PLAINTEXT_SECRET_KEYS) {
|
|
75
|
+
if (key in value) {
|
|
76
|
+
ctx.addIssue({
|
|
77
|
+
code: 'custom',
|
|
78
|
+
path: [key],
|
|
79
|
+
message: `auth must not contain a plaintext "${key}" field; use a secretRef`,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
const inheritAuthSchema = z.looseObject({ type: z.literal('inherit') });
|
|
86
|
+
const bearerAuthSchema = refuseSecretValues(z.looseObject({
|
|
87
|
+
type: z.literal('bearer'),
|
|
88
|
+
tokenRef: z.string().optional(),
|
|
89
|
+
tokenEnv: envName,
|
|
90
|
+
scheme: z.string().optional(),
|
|
91
|
+
}));
|
|
92
|
+
const apiKeyAuthSchema = refuseSecretValues(z.looseObject({
|
|
93
|
+
type: z.literal('api-key'),
|
|
94
|
+
name: z.string(),
|
|
95
|
+
valueRef: z.string().optional(),
|
|
96
|
+
valueEnv: envName,
|
|
97
|
+
in: z.enum(['header', 'query']),
|
|
98
|
+
}));
|
|
99
|
+
const oauth2AuthSchema = refuseSecretValues(z.looseObject({
|
|
100
|
+
type: z.literal('oauth2'),
|
|
101
|
+
grant: z.enum(['client-credentials', 'authorization-code']),
|
|
102
|
+
tokenUrl: z.string(),
|
|
103
|
+
authorizationUrl: z.string().optional(),
|
|
104
|
+
clientId: z.string(),
|
|
105
|
+
clientSecretRef: z.string().optional(),
|
|
106
|
+
clientSecretEnv: envName,
|
|
107
|
+
scopes: z.array(z.string()).default([]),
|
|
108
|
+
audience: z.string().optional(),
|
|
109
|
+
clientAuth: z.enum(['basic', 'body']).default('basic'),
|
|
110
|
+
pkce: z.boolean().default(true),
|
|
111
|
+
refreshTokenRef: z.string().optional(),
|
|
112
|
+
}));
|
|
113
|
+
/**
|
|
114
|
+
* Authentication as persisted anywhere a project configures it. `endpointAuthSchema` is one arm,
|
|
115
|
+
* so a file written before the REST client — which only ever held `none`/`basic`/`ntlm` — parses
|
|
116
|
+
* unchanged. `inherit` is accepted here and rejected by the SOAP schemas that reuse
|
|
117
|
+
* `endpointAuthSchema` instead, since an interface has nothing to inherit from.
|
|
118
|
+
*/
|
|
119
|
+
export const authConfigSchema = z.union([
|
|
120
|
+
endpointAuthSchema,
|
|
121
|
+
inheritAuthSchema,
|
|
122
|
+
bearerAuthSchema,
|
|
123
|
+
apiKeyAuthSchema,
|
|
124
|
+
oauth2AuthSchema,
|
|
125
|
+
]);
|
|
126
|
+
const endpointSchema = z.looseObject({
|
|
127
|
+
id: nonEmpty,
|
|
128
|
+
name: z.string(),
|
|
129
|
+
url: z.string(),
|
|
130
|
+
auth: endpointAuthSchema.optional(),
|
|
131
|
+
authMode: z.enum(['override', 'complement']),
|
|
132
|
+
trustInvalid: z.boolean().optional(),
|
|
133
|
+
});
|
|
134
|
+
/**
|
|
135
|
+
* A stored WS-Addressing configuration. Every field beyond `enabled` is optional so a project
|
|
136
|
+
* written before the WS-Addressing task — which only ever held `{ enabled, version? }` — still
|
|
137
|
+
* loads; `normalizeWsa` fills the rest in with the v1 defaults.
|
|
138
|
+
*/
|
|
139
|
+
const wsaSchema = z.looseObject({
|
|
140
|
+
enabled: z.boolean(),
|
|
141
|
+
version: z.enum(['2005/08', '2004/08']).optional(),
|
|
142
|
+
mustUnderstand: z.enum(['none', 'true', 'false']).optional(),
|
|
143
|
+
action: z.string().optional(),
|
|
144
|
+
to: z.string().optional(),
|
|
145
|
+
messageId: z.string().optional(),
|
|
146
|
+
replyTo: z.string().optional(),
|
|
147
|
+
from: z.string().optional(),
|
|
148
|
+
faultTo: z.string().optional(),
|
|
149
|
+
relatesTo: z.string().optional(),
|
|
150
|
+
relationshipType: z.string().optional(),
|
|
151
|
+
addDefaultAction: z.boolean().optional(),
|
|
152
|
+
addDefaultTo: z.boolean().optional(),
|
|
153
|
+
generateMessageId: z.boolean().optional(),
|
|
154
|
+
});
|
|
155
|
+
const operationEntrySchema = z.looseObject({
|
|
156
|
+
name: nonEmpty,
|
|
157
|
+
bindingName: z.string(),
|
|
158
|
+
slug: nonEmpty,
|
|
159
|
+
order: z.number().int(),
|
|
160
|
+
});
|
|
161
|
+
/** `wirebench.yaml`. */
|
|
162
|
+
export const manifestSchema = z.looseObject({
|
|
163
|
+
formatVersion: z.literal(FORMAT_VERSION),
|
|
164
|
+
id: nonEmpty,
|
|
165
|
+
name: z.string(),
|
|
166
|
+
description: z.string().optional(),
|
|
167
|
+
settings: z.looseObject({
|
|
168
|
+
cacheDefinitions: z.boolean(),
|
|
169
|
+
defaultTimeoutMs: z.number().int().positive(),
|
|
170
|
+
resourceRoot: z.string().optional(),
|
|
171
|
+
prettyPrintResponses: z.boolean(),
|
|
172
|
+
}),
|
|
173
|
+
properties: propertyMapSchema,
|
|
174
|
+
/** Names of `properties` entries switched off; absent means none. See `model.ts`'s `Project.disabledProperties`. */
|
|
175
|
+
disabled: z.array(z.string()).optional(),
|
|
176
|
+
activeEnvironmentId: z.string().optional(),
|
|
177
|
+
/** Name of the Wirebench build that last wrote this manifest; informational only. */
|
|
178
|
+
writtenBy: z.string().optional(),
|
|
179
|
+
});
|
|
180
|
+
/** `interfaces/<slug>/interface.yaml`. */
|
|
181
|
+
export const interfaceFileSchema = z.looseObject({
|
|
182
|
+
kind: z.literal('soap'),
|
|
183
|
+
id: nonEmpty,
|
|
184
|
+
name: z.string(),
|
|
185
|
+
order: z.number().int(),
|
|
186
|
+
definitionUrl: z.string(),
|
|
187
|
+
cacheDefinition: z.boolean(),
|
|
188
|
+
targetNamespace: z.string().optional(),
|
|
189
|
+
endpoints: z.array(endpointSchema),
|
|
190
|
+
defaultEndpointId: z.string().optional(),
|
|
191
|
+
wsa: wsaSchema,
|
|
192
|
+
auth: endpointAuthSchema.optional(),
|
|
193
|
+
operations: z.array(operationEntrySchema),
|
|
194
|
+
});
|
|
195
|
+
const requestPropertiesSchema = z.looseObject({
|
|
196
|
+
encoding: z.string(),
|
|
197
|
+
timeoutMs: z.number().int().nonnegative().optional(),
|
|
198
|
+
bindAddress: z.string().optional(),
|
|
199
|
+
followRedirects: z.boolean(),
|
|
200
|
+
skipSoapAction: z.boolean(),
|
|
201
|
+
enableMtom: z.boolean(),
|
|
202
|
+
forceMtom: z.boolean(),
|
|
203
|
+
inlineResponseAttachments: z.boolean(),
|
|
204
|
+
expandMtomAttachments: z.boolean(),
|
|
205
|
+
disableMultiparts: z.boolean(),
|
|
206
|
+
encodeAttachments: z.boolean(),
|
|
207
|
+
enableInlineFiles: z.boolean(),
|
|
208
|
+
removeEmptyContent: z.boolean(),
|
|
209
|
+
entitizeProperties: z.boolean(),
|
|
210
|
+
prettyPrint: z.boolean(),
|
|
211
|
+
stripWhitespaces: z.boolean(),
|
|
212
|
+
dumpFile: z.string().optional(),
|
|
213
|
+
maxSizeBytes: z.number().int().nonnegative().optional(),
|
|
214
|
+
wssPasswordType: z.enum(['text', 'digest']).optional(),
|
|
215
|
+
wssTimeToLive: z.number().int().nonnegative().optional(),
|
|
216
|
+
sslKeystoreRef: z.string().optional(),
|
|
217
|
+
});
|
|
218
|
+
/** Where a file's bytes live: the project's content-addressed cache, or a path on disk. */
|
|
219
|
+
export const attachmentSourceSchema = z.union([
|
|
220
|
+
z.looseObject({ kind: z.literal('cache'), sha256: nonEmpty }),
|
|
221
|
+
z.looseObject({ kind: z.literal('path'), path: nonEmpty }),
|
|
222
|
+
]);
|
|
223
|
+
const attachmentSchema = z.looseObject({
|
|
224
|
+
id: nonEmpty,
|
|
225
|
+
name: z.string(),
|
|
226
|
+
contentType: z.string(),
|
|
227
|
+
size: z.number().int().nonnegative(),
|
|
228
|
+
part: z.string().optional(),
|
|
229
|
+
type: z.enum(['XOP', 'MIME', 'SWAREF', 'CONTENT', 'UNKNOWN']),
|
|
230
|
+
contentId: z.string(),
|
|
231
|
+
cached: z.boolean(),
|
|
232
|
+
source: attachmentSourceSchema,
|
|
233
|
+
});
|
|
234
|
+
/** `interfaces/<slug>/operations/<slug>/<name>.request.yaml` (the envelope lives in the sibling `.xml`). */
|
|
235
|
+
export const requestFileSchema = z.looseObject({
|
|
236
|
+
kind: z.literal('soap'),
|
|
237
|
+
id: nonEmpty,
|
|
238
|
+
name: z.string(),
|
|
239
|
+
order: z.number().int(),
|
|
240
|
+
description: z.string().optional(),
|
|
241
|
+
endpointId: z.string().optional(),
|
|
242
|
+
endpointUrl: z.string().optional(),
|
|
243
|
+
soapVersion: z.enum(['1.1', '1.2']),
|
|
244
|
+
soapAction: z.string().optional(),
|
|
245
|
+
headers: z.array(z.looseObject({ name: z.string(), value: z.string() })),
|
|
246
|
+
attachments: z.array(attachmentSchema),
|
|
247
|
+
auth: endpointAuthSchema.optional(),
|
|
248
|
+
wsa: wsaSchema.optional(),
|
|
249
|
+
wssOutgoingRef: z.string().optional(),
|
|
250
|
+
wssIncomingRef: z.string().optional(),
|
|
251
|
+
properties: requestPropertiesSchema,
|
|
252
|
+
assertions: assertionsSchema.default([]),
|
|
253
|
+
orphaned: z.boolean().optional(),
|
|
254
|
+
});
|
|
255
|
+
/**
|
|
256
|
+
* One table row as persisted. `enabled` is written only when `false`, so a missing key means
|
|
257
|
+
* enabled; names may repeat and their order is the wire order.
|
|
258
|
+
*/
|
|
259
|
+
export const keyValueEntrySchema = z.looseObject({
|
|
260
|
+
name: z.string(),
|
|
261
|
+
value: z.string(),
|
|
262
|
+
enabled: z.boolean().default(true),
|
|
263
|
+
description: z.string().optional(),
|
|
264
|
+
});
|
|
265
|
+
/**
|
|
266
|
+
* An HTTP method: any RFC 9110 token, not just the seven the editor names. A service that speaks
|
|
267
|
+
* `PURGE` or `REPORT` is not a malformed project.
|
|
268
|
+
*/
|
|
269
|
+
const methodSchema = z
|
|
270
|
+
.string()
|
|
271
|
+
.min(1)
|
|
272
|
+
.regex(/^[A-Za-z0-9!#$%&'*+.^_`|~-]+$/, 'a method must be an HTTP token');
|
|
273
|
+
const multipartPartSchema = z.union([
|
|
274
|
+
z.looseObject({
|
|
275
|
+
kind: z.literal('text'),
|
|
276
|
+
name: z.string(),
|
|
277
|
+
value: z.string(),
|
|
278
|
+
enabled: z.boolean().default(true),
|
|
279
|
+
contentType: z.string().optional(),
|
|
280
|
+
}),
|
|
281
|
+
z.looseObject({
|
|
282
|
+
kind: z.literal('file'),
|
|
283
|
+
name: z.string(),
|
|
284
|
+
source: attachmentSourceSchema,
|
|
285
|
+
enabled: z.boolean().default(true),
|
|
286
|
+
fileName: z.string().optional(),
|
|
287
|
+
contentType: z.string().optional(),
|
|
288
|
+
}),
|
|
289
|
+
]);
|
|
290
|
+
/**
|
|
291
|
+
* A request body as persisted. A raw body names its sibling file rather than carrying its text:
|
|
292
|
+
* `file` is a bare file name in the request's own directory, validated as a path segment before
|
|
293
|
+
* anything is read or written (ADR-0005).
|
|
294
|
+
*/
|
|
295
|
+
export const restBodySchema = z.union([
|
|
296
|
+
z.looseObject({ kind: z.literal('none') }),
|
|
297
|
+
z.looseObject({
|
|
298
|
+
kind: z.literal('raw'),
|
|
299
|
+
language: z.enum(['json', 'xml', 'text', 'html', 'javascript']),
|
|
300
|
+
contentType: z.string().optional(),
|
|
301
|
+
file: nonEmpty,
|
|
302
|
+
}),
|
|
303
|
+
z.looseObject({ kind: z.literal('form'), fields: z.array(keyValueEntrySchema).default([]) }),
|
|
304
|
+
z.looseObject({ kind: z.literal('multipart'), parts: z.array(multipartPartSchema).default([]) }),
|
|
305
|
+
z.looseObject({ kind: z.literal('binary'), source: attachmentSourceSchema, contentType: z.string() }),
|
|
306
|
+
]);
|
|
307
|
+
const restSettingsSchema = z.looseObject({
|
|
308
|
+
timeoutMs: z.number().int().nonnegative().optional(),
|
|
309
|
+
followRedirects: z.boolean().optional(),
|
|
310
|
+
maxRedirects: z.number().int().nonnegative().optional(),
|
|
311
|
+
keepBodyOnRedirect: z.boolean().optional(),
|
|
312
|
+
encodeUrl: z.boolean().optional(),
|
|
313
|
+
trustInvalid: z.boolean().optional(),
|
|
314
|
+
sslKeystoreRef: z.string().optional(),
|
|
315
|
+
bindAddress: z.string().optional(),
|
|
316
|
+
maxSizeBytes: z.number().int().nonnegative().optional(),
|
|
317
|
+
sendCookies: z.boolean().optional(),
|
|
318
|
+
escapeProperties: z.boolean().optional(),
|
|
319
|
+
});
|
|
320
|
+
/** `apis/<slug>/requests/[<folder>/…]<name>.request.yaml`. */
|
|
321
|
+
export const restRequestFileSchema = z.looseObject({
|
|
322
|
+
kind: z.literal('rest'),
|
|
323
|
+
id: nonEmpty,
|
|
324
|
+
name: z.string(),
|
|
325
|
+
order: z.number().int(),
|
|
326
|
+
description: z.string().optional(),
|
|
327
|
+
method: methodSchema,
|
|
328
|
+
url: z.string(),
|
|
329
|
+
pathParams: z.array(keyValueEntrySchema).default([]),
|
|
330
|
+
query: z.array(keyValueEntrySchema).default([]),
|
|
331
|
+
headers: z.array(keyValueEntrySchema).default([]),
|
|
332
|
+
body: restBodySchema.default({ kind: 'none' }),
|
|
333
|
+
auth: authConfigSchema.default({ type: 'inherit' }),
|
|
334
|
+
settings: restSettingsSchema.default({}),
|
|
335
|
+
assertions: assertionsSchema.default([]),
|
|
336
|
+
orphaned: z.boolean().optional(),
|
|
337
|
+
});
|
|
338
|
+
/** `apis/<slug>/requests/[<folder>/…]folder.yaml`. */
|
|
339
|
+
export const restFolderFileSchema = z.looseObject({
|
|
340
|
+
id: nonEmpty,
|
|
341
|
+
name: z.string(),
|
|
342
|
+
order: z.number().int(),
|
|
343
|
+
description: z.string().optional(),
|
|
344
|
+
auth: authConfigSchema.optional(),
|
|
345
|
+
});
|
|
346
|
+
/** `apis/<slug>/api.yaml`. */
|
|
347
|
+
export const apiFileSchema = z.looseObject({
|
|
348
|
+
kind: z.literal('rest'),
|
|
349
|
+
id: nonEmpty,
|
|
350
|
+
name: z.string(),
|
|
351
|
+
order: z.number().int(),
|
|
352
|
+
description: z.string().optional(),
|
|
353
|
+
baseUrl: z.string(),
|
|
354
|
+
servers: z.array(z.looseObject({ url: z.string(), description: z.string().optional() })).default([]),
|
|
355
|
+
auth: authConfigSchema.optional(),
|
|
356
|
+
definition: z
|
|
357
|
+
.looseObject({ source: nonEmpty, cache: z.boolean().default(true), version: z.string().default('') })
|
|
358
|
+
.optional(),
|
|
359
|
+
});
|
|
360
|
+
const grpcSettingsSchema = z.looseObject({
|
|
361
|
+
timeoutMs: z.number().int().nonnegative().optional(),
|
|
362
|
+
trustInvalid: z.boolean().optional(),
|
|
363
|
+
sslKeystoreRef: z.string().optional(),
|
|
364
|
+
bindAddress: z.string().optional(),
|
|
365
|
+
maxSizeBytes: z.number().int().nonnegative().optional(),
|
|
366
|
+
escapeProperties: z.boolean().optional(),
|
|
367
|
+
});
|
|
368
|
+
/** The four shapes a gRPC method can take. */
|
|
369
|
+
export const grpcMethodKindSchema = z.enum(['unary', 'server-streaming', 'client-streaming', 'bidi-streaming']);
|
|
370
|
+
/**
|
|
371
|
+
* `apis/<slug>/requests/[<folder>/…]<name>.request.yaml` for a gRPC request. The message text lives
|
|
372
|
+
* in the sibling file `message` names, validated as a path segment before it is read (ADR-0005),
|
|
373
|
+
* so a JSON message is a JSON file in git like a REST raw body.
|
|
374
|
+
*/
|
|
375
|
+
export const grpcRequestFileSchema = z.looseObject({
|
|
376
|
+
kind: z.literal('grpc'),
|
|
377
|
+
id: nonEmpty,
|
|
378
|
+
name: z.string(),
|
|
379
|
+
order: z.number().int(),
|
|
380
|
+
description: z.string().optional(),
|
|
381
|
+
service: z.string(),
|
|
382
|
+
method: z.string(),
|
|
383
|
+
methodKind: grpcMethodKindSchema.default('unary'),
|
|
384
|
+
metadata: z.array(keyValueEntrySchema).default([]),
|
|
385
|
+
message: nonEmpty.optional(),
|
|
386
|
+
auth: authConfigSchema.default({ type: 'inherit' }),
|
|
387
|
+
settings: grpcSettingsSchema.default({}),
|
|
388
|
+
orphaned: z.boolean().optional(),
|
|
389
|
+
});
|
|
390
|
+
/** `apis/<slug>/api.yaml` for a gRPC API. */
|
|
391
|
+
export const grpcApiFileSchema = z.looseObject({
|
|
392
|
+
kind: z.literal('grpc'),
|
|
393
|
+
id: nonEmpty,
|
|
394
|
+
name: z.string(),
|
|
395
|
+
order: z.number().int(),
|
|
396
|
+
description: z.string().optional(),
|
|
397
|
+
target: z.string(),
|
|
398
|
+
tls: z.boolean().default(false),
|
|
399
|
+
metadata: z.array(keyValueEntrySchema).default([]),
|
|
400
|
+
auth: authConfigSchema.optional(),
|
|
401
|
+
definition: z
|
|
402
|
+
.looseObject({
|
|
403
|
+
// Absent in every project written before server reflection, which is an imported set.
|
|
404
|
+
kind: z.enum(['proto', 'reflection']).default('proto'),
|
|
405
|
+
source: nonEmpty,
|
|
406
|
+
cache: z.boolean().default(true),
|
|
407
|
+
roots: z.array(nonEmpty).default([]),
|
|
408
|
+
reflectionVersion: z.enum(['auto', 'v1', 'v1alpha']).optional(),
|
|
409
|
+
trustInvalid: z.boolean().optional(),
|
|
410
|
+
})
|
|
411
|
+
.optional(),
|
|
412
|
+
});
|
|
413
|
+
const wsSettingsSchema = z.looseObject({
|
|
414
|
+
handshakeTimeoutMs: z.number().int().nonnegative().optional(),
|
|
415
|
+
trustInvalid: z.boolean().optional(),
|
|
416
|
+
sslKeystoreRef: z.string().optional(),
|
|
417
|
+
bindAddress: z.string().optional(),
|
|
418
|
+
maxMessageBytes: z.number().int().nonnegative().optional(),
|
|
419
|
+
escapeProperties: z.boolean().optional(),
|
|
420
|
+
});
|
|
421
|
+
/**
|
|
422
|
+
* One saved message as persisted: its text (or, for `binary`, base64) lives in the sibling file
|
|
423
|
+
* `file` names, validated as a path segment before it is read (ADR-0005) — the same convention a
|
|
424
|
+
* gRPC message or a REST raw body follows.
|
|
425
|
+
*/
|
|
426
|
+
const wsSavedMessageSchema = z.looseObject({
|
|
427
|
+
id: nonEmpty,
|
|
428
|
+
name: z.string(),
|
|
429
|
+
format: z.enum(['text', 'binary']).default('text'),
|
|
430
|
+
file: nonEmpty,
|
|
431
|
+
});
|
|
432
|
+
/**
|
|
433
|
+
* `apis/<slug>/requests/[<folder>/…]<name>.request.yaml` for a WebSocket request. Each saved
|
|
434
|
+
* message's own text lives in its own sibling file, so a JSON message is a JSON file in git.
|
|
435
|
+
*/
|
|
436
|
+
export const wsRequestFileSchema = z.looseObject({
|
|
437
|
+
kind: z.literal('websocket'),
|
|
438
|
+
id: nonEmpty,
|
|
439
|
+
name: z.string(),
|
|
440
|
+
order: z.number().int(),
|
|
441
|
+
description: z.string().optional(),
|
|
442
|
+
url: z.string(),
|
|
443
|
+
query: z.array(keyValueEntrySchema).default([]),
|
|
444
|
+
headers: z.array(keyValueEntrySchema).default([]),
|
|
445
|
+
subprotocols: z.array(z.string()).default([]),
|
|
446
|
+
auth: authConfigSchema.default({ type: 'inherit' }),
|
|
447
|
+
settings: wsSettingsSchema.default({}),
|
|
448
|
+
messages: z.array(wsSavedMessageSchema).default([]),
|
|
449
|
+
});
|
|
450
|
+
/** `apis/<slug>/api.yaml` for a WebSocket API. */
|
|
451
|
+
export const wsApiFileSchema = z.looseObject({
|
|
452
|
+
kind: z.literal('websocket'),
|
|
453
|
+
id: nonEmpty,
|
|
454
|
+
name: z.string(),
|
|
455
|
+
order: z.number().int(),
|
|
456
|
+
description: z.string().optional(),
|
|
457
|
+
url: z.string(),
|
|
458
|
+
headers: z.array(keyValueEntrySchema).default([]),
|
|
459
|
+
auth: authConfigSchema.optional(),
|
|
460
|
+
definition: z
|
|
461
|
+
.looseObject({ kind: z.literal('asyncapi'), source: nonEmpty, cache: z.boolean().default(true) })
|
|
462
|
+
.optional(),
|
|
463
|
+
});
|
|
464
|
+
/** Every protocol this build can load. A `kind` outside this list is refused by name, never guessed at. */
|
|
465
|
+
const SUPPORTED_KINDS = ['soap', 'rest', 'grpc', 'websocket'];
|
|
466
|
+
/**
|
|
467
|
+
* Refuses a document whose `kind` this build does not know how to honour — a protocol a later
|
|
468
|
+
* release adds, or a typo — before schema validation, so the error says what is actually wrong
|
|
469
|
+
* ("this build cannot open a graphql document") instead of "expected 'rest', received 'graphql'",
|
|
470
|
+
* and so a project written by a future build fails loudly rather than losing its requests to a
|
|
471
|
+
* dropped unknown key. `grpc` was the reserved name this guard existed for until the gRPC client
|
|
472
|
+
* arrived; it stays for whatever comes next.
|
|
473
|
+
*
|
|
474
|
+
* @throws ProjectError `project-kind-not-supported`
|
|
475
|
+
*/
|
|
476
|
+
export function assertSupportedKind(document, file) {
|
|
477
|
+
if (typeof document !== 'object' || document === null || Array.isArray(document)) {
|
|
478
|
+
return;
|
|
479
|
+
}
|
|
480
|
+
const kind = document['kind'];
|
|
481
|
+
if (typeof kind !== 'string' || SUPPORTED_KINDS.includes(kind)) {
|
|
482
|
+
return;
|
|
483
|
+
}
|
|
484
|
+
throw new ProjectError('project-kind-not-supported', `${file} is a "${kind}" document, which this build cannot open`, {
|
|
485
|
+
details: { file, kind, supported: SUPPORTED_KINDS },
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
/** The `kind` of an `api.yaml`, read ahead of full validation so the loader knows which schema applies. */
|
|
489
|
+
export function apiKindOf(document) {
|
|
490
|
+
const kind = typeof document === 'object' && document !== null ? document['kind'] : undefined;
|
|
491
|
+
if (kind === 'grpc' || kind === 'websocket') {
|
|
492
|
+
return kind;
|
|
493
|
+
}
|
|
494
|
+
return 'rest';
|
|
495
|
+
}
|
|
496
|
+
/** `environments/<slug>.yaml`. */
|
|
497
|
+
export const environmentFileSchema = z.looseObject({
|
|
498
|
+
id: nonEmpty,
|
|
499
|
+
name: z.string(),
|
|
500
|
+
order: z.number().int(),
|
|
501
|
+
endpoints: z.record(z.string(), z.string()),
|
|
502
|
+
properties: propertyMapSchema,
|
|
503
|
+
/** Names of `properties` entries switched off; absent means none. */
|
|
504
|
+
disabled: z.array(z.string()).optional(),
|
|
505
|
+
});
|
|
506
|
+
/** A `wsu:Timestamp` entry inside an outgoing configuration. */
|
|
507
|
+
const wssTimestampEntrySchema = z.looseObject({
|
|
508
|
+
kind: z.literal('timestamp'),
|
|
509
|
+
timeToLiveSeconds: z.number().int().nonnegative(),
|
|
510
|
+
millisecondPrecision: z.boolean(),
|
|
511
|
+
});
|
|
512
|
+
/**
|
|
513
|
+
* A `wsse:UsernameToken` entry. As with `endpointAuthSchema`, a plaintext `password` key is
|
|
514
|
+
* rejected outright rather than merely ignored: WS-Security passwords live in the secret store.
|
|
515
|
+
*/
|
|
516
|
+
const wssUsernameTokenEntrySchema = z
|
|
517
|
+
.looseObject({
|
|
518
|
+
kind: z.literal('username-token'),
|
|
519
|
+
username: z.string(),
|
|
520
|
+
passwordRef: z.string().optional(),
|
|
521
|
+
passwordType: z.enum(['text', 'digest', 'none']),
|
|
522
|
+
addNonce: z.boolean(),
|
|
523
|
+
addCreated: z.boolean(),
|
|
524
|
+
})
|
|
525
|
+
.refine((value) => !('password' in value), {
|
|
526
|
+
message: 'a WS-Security username token must not contain a plaintext "password" field; use passwordRef',
|
|
527
|
+
path: ['password'],
|
|
528
|
+
});
|
|
529
|
+
/** One `{name, namespace, encode}` message part a signature covers. */
|
|
530
|
+
const wssPartSchema = z.looseObject({
|
|
531
|
+
name: z.string(),
|
|
532
|
+
namespace: z.string(),
|
|
533
|
+
encode: z.enum(['Content', 'Element']),
|
|
534
|
+
});
|
|
535
|
+
/**
|
|
536
|
+
* A signature entry: the signing key, how its certificate is referenced, and what it covers.
|
|
537
|
+
*
|
|
538
|
+
* Every field but `kind` defaults, so a bare `{kind:'signature'}` — a Task 37-era file, or one
|
|
539
|
+
* a foreign tool wrote with only the fields it cared about — loads as a complete, if useless,
|
|
540
|
+
* signature entry rather than being rejected outright; the editor is expected to fill in a real
|
|
541
|
+
* `keystoreRef` before the entry can actually be applied.
|
|
542
|
+
*/
|
|
543
|
+
const wssSignatureEntrySchema = z.looseObject({
|
|
544
|
+
kind: z.literal('signature'),
|
|
545
|
+
keystoreRef: z.string().default(''),
|
|
546
|
+
alias: z.string().optional(),
|
|
547
|
+
keyPasswordRef: z.string().optional(),
|
|
548
|
+
keyIdentifierType: z
|
|
549
|
+
.enum(['BinarySecurityToken', 'IssuerSerial', 'SubjectKeyIdentifier', 'X509KeyIdentifier', 'Thumbprint'])
|
|
550
|
+
.default('BinarySecurityToken'),
|
|
551
|
+
signatureAlgorithm: z.enum(['rsa-sha256', 'rsa-sha1']).default('rsa-sha256'),
|
|
552
|
+
digestAlgorithm: z.enum(['sha256', 'sha1']).default('sha256'),
|
|
553
|
+
canonicalization: z.literal('exc-c14n').default('exc-c14n'),
|
|
554
|
+
useSingleCertificate: z.boolean().default(true),
|
|
555
|
+
parts: z
|
|
556
|
+
.array(wssPartSchema)
|
|
557
|
+
.default(DEFAULT_WSS_SIGNATURE_PARTS),
|
|
558
|
+
});
|
|
559
|
+
/**
|
|
560
|
+
* An encryption entry. Tolerant the same way the signature entry is: every field defaults, so a
|
|
561
|
+
* document written by hand (or by an older build) still loads as a usable entry rather than
|
|
562
|
+
* falling through the union to "unsupported".
|
|
563
|
+
*/
|
|
564
|
+
const wssEncryptionEntrySchema = z.looseObject({
|
|
565
|
+
kind: z.literal('encryption'),
|
|
566
|
+
keystoreRef: z.string().default(''),
|
|
567
|
+
alias: z.string().optional(),
|
|
568
|
+
keyIdentifierType: z
|
|
569
|
+
.enum(['BinarySecurityToken', 'IssuerSerial', 'SubjectKeyIdentifier', 'X509KeyIdentifier', 'Thumbprint'])
|
|
570
|
+
.default('BinarySecurityToken'),
|
|
571
|
+
symmetricAlgorithm: z.enum(['aes128-cbc', 'aes256-cbc', 'aes128-gcm', 'aes256-gcm']).default('aes256-gcm'),
|
|
572
|
+
keyTransportAlgorithm: z.enum(['rsa-oaep', 'rsa-1_5']).default('rsa-oaep'),
|
|
573
|
+
embedKey: z.boolean().default(false),
|
|
574
|
+
encryptSymmetricKey: z.boolean().default(true),
|
|
575
|
+
parts: z
|
|
576
|
+
.array(wssPartSchema)
|
|
577
|
+
.default(DEFAULT_WSS_ENCRYPTION_PARTS),
|
|
578
|
+
});
|
|
579
|
+
/**
|
|
580
|
+
* One entry as *persisted*. Deliberately loose about the entry's own shape — a `signature`
|
|
581
|
+
* entry written by a later build, or a document a foreign tool wrote, must survive a load/save
|
|
582
|
+
* round trip through this build — but a plaintext `password` is rejected outright, wherever in
|
|
583
|
+
* an entry it appears.
|
|
584
|
+
*/
|
|
585
|
+
const wssStoredEntrySchema = z.looseObject({}).refine((value) => !('password' in value), {
|
|
586
|
+
message: 'a WS-Security entry must not contain a plaintext "password" field; use passwordRef',
|
|
587
|
+
path: ['password'],
|
|
588
|
+
});
|
|
589
|
+
/** One entry of an outgoing WS-Security configuration, as this build understands it. */
|
|
590
|
+
export const wssEntrySchema = z.union([
|
|
591
|
+
wssTimestampEntrySchema,
|
|
592
|
+
wssUsernameTokenEntrySchema,
|
|
593
|
+
wssSignatureEntrySchema,
|
|
594
|
+
wssEncryptionEntrySchema,
|
|
595
|
+
]);
|
|
596
|
+
/** `wss/outgoing/<name>.yaml`. */
|
|
597
|
+
export const wssOutgoingFileSchema = z.looseObject({
|
|
598
|
+
id: nonEmpty,
|
|
599
|
+
name: z.string(),
|
|
600
|
+
defaultAlias: z.string().optional(),
|
|
601
|
+
defaultPasswordRef: z.string().optional(),
|
|
602
|
+
actor: z.string().optional(),
|
|
603
|
+
mustUnderstand: z.boolean().optional(),
|
|
604
|
+
entries: z.array(wssStoredEntrySchema).optional(),
|
|
605
|
+
});
|
|
606
|
+
/**
|
|
607
|
+
* `wss/incoming/<name>.yaml`. Tolerant in the same way the outgoing entries are: every field
|
|
608
|
+
* but `id`/`name` defaults, so a document written by an older build (which had only the two
|
|
609
|
+
* keystore refs) loads as a complete configuration rather than being rejected.
|
|
610
|
+
*/
|
|
611
|
+
export const wssIncomingFileSchema = z.looseObject({
|
|
612
|
+
id: nonEmpty,
|
|
613
|
+
name: z.string(),
|
|
614
|
+
decryptKeystoreRef: z.string().optional(),
|
|
615
|
+
decryptAlias: z.string().optional(),
|
|
616
|
+
decryptKeyPasswordRef: z.string().optional(),
|
|
617
|
+
signatureKeystoreRef: z.string().optional(),
|
|
618
|
+
requireSignature: z.boolean().optional(),
|
|
619
|
+
requireTimestamp: z.boolean().optional(),
|
|
620
|
+
timestampSkewSeconds: z.number().int().nonnegative().optional(),
|
|
621
|
+
verifyChain: z.boolean().optional(),
|
|
622
|
+
});
|
|
623
|
+
/**
|
|
624
|
+
* One `wss/keystores.yaml` entry: mirrors the engine's `KeystoreDef`. `looseObject` so a field
|
|
625
|
+
* a later build adds survives a load/save round trip through this one. Never a password — only
|
|
626
|
+
* a `secretRef` the host resolves through `safeStorage`.
|
|
627
|
+
*/
|
|
628
|
+
export const keystoreEntrySchema = z.looseObject({
|
|
629
|
+
id: nonEmpty,
|
|
630
|
+
name: z.string(),
|
|
631
|
+
path: nonEmpty,
|
|
632
|
+
type: z.enum(['pkcs12', 'pem']),
|
|
633
|
+
passwordSecretRef: z.string().optional(),
|
|
634
|
+
passwordEnv: envName,
|
|
635
|
+
defaultAlias: z.string().optional(),
|
|
636
|
+
});
|
|
637
|
+
/** `wss/keystores.yaml` — the project's client keystore registry. */
|
|
638
|
+
export const keystoresFileSchema = z.looseObject({
|
|
639
|
+
keystores: z.array(keystoreEntrySchema),
|
|
640
|
+
});
|
|
641
|
+
/** One document entry inside `interfaces/<slug>/definition/manifest.yaml`. */
|
|
642
|
+
const definitionCacheDocumentSchema = z.looseObject({
|
|
643
|
+
file: nonEmpty,
|
|
644
|
+
location: nonEmpty,
|
|
645
|
+
requestedLocation: z.string().optional(),
|
|
646
|
+
kind: z.enum(['wsdl', 'xsd']),
|
|
647
|
+
sha256: nonEmpty,
|
|
648
|
+
bytes: z.number().int().nonnegative(),
|
|
649
|
+
importedBy: z.string().optional(),
|
|
650
|
+
namespace: z.string().optional(),
|
|
651
|
+
chameleonFor: z.string().optional(),
|
|
652
|
+
});
|
|
653
|
+
/** `interfaces/<slug>/definition/manifest.yaml`. */
|
|
654
|
+
export const definitionCacheManifestSchema = z.looseObject({
|
|
655
|
+
formatVersion: z.literal(1),
|
|
656
|
+
rootLocation: nonEmpty,
|
|
657
|
+
fetchedAt: nonEmpty,
|
|
658
|
+
documents: z.array(definitionCacheDocumentSchema),
|
|
659
|
+
});
|
|
660
|
+
/** One entry of `apis/<slug>/definition/manifest.yaml`. */
|
|
661
|
+
const apiDefinitionCacheDocumentSchema = z.looseObject({
|
|
662
|
+
file: nonEmpty,
|
|
663
|
+
location: nonEmpty,
|
|
664
|
+
requestedLocation: z.string().optional(),
|
|
665
|
+
sha256: nonEmpty,
|
|
666
|
+
bytes: z.number().int().nonnegative(),
|
|
667
|
+
});
|
|
668
|
+
/**
|
|
669
|
+
* `apis/<slug>/definition/manifest.yaml`. Its own schema rather than the WSDL one because an
|
|
670
|
+
* OpenAPI document has no `kind`, `namespace` or `importedBy` to record — a JSON or YAML file
|
|
671
|
+
* references its siblings by location and nothing else.
|
|
672
|
+
*/
|
|
673
|
+
export const apiDefinitionCacheManifestSchema = z.looseObject({
|
|
674
|
+
formatVersion: z.literal(1),
|
|
675
|
+
rootLocation: nonEmpty,
|
|
676
|
+
fetchedAt: nonEmpty,
|
|
677
|
+
/** The `openapi` string the root document declared, so the API tab can show it without parsing. */
|
|
678
|
+
declaredVersion: z.string().optional(),
|
|
679
|
+
documents: z.array(apiDefinitionCacheDocumentSchema),
|
|
680
|
+
});
|
|
681
|
+
/** One `.proto` file of `apis/<slug>/definition/manifest.yaml` for a gRPC API. */
|
|
682
|
+
const protoDefinitionCacheFileSchema = z.looseObject({
|
|
683
|
+
/** The import path, which is also the path under `definition/protos/`. */
|
|
684
|
+
path: nonEmpty,
|
|
685
|
+
sha256: nonEmpty,
|
|
686
|
+
bytes: z.number().int().nonnegative(),
|
|
687
|
+
});
|
|
688
|
+
/**
|
|
689
|
+
* `apis/<slug>/definition/manifest.yaml` for a gRPC API: the `.proto` files an import was made of,
|
|
690
|
+
* each stored byte-exact under `protos/` at its import path so the set loads again exactly as the
|
|
691
|
+
* imports spell it. The `kind` tells a reader which of the two API manifests it has.
|
|
692
|
+
*/
|
|
693
|
+
export const protoDefinitionCacheManifestSchema = z.looseObject({
|
|
694
|
+
formatVersion: z.literal(1),
|
|
695
|
+
kind: z.literal('proto'),
|
|
696
|
+
/** Where the files came from, as the user gave it. */
|
|
697
|
+
source: nonEmpty,
|
|
698
|
+
fetchedAt: nonEmpty,
|
|
699
|
+
roots: z.array(nonEmpty),
|
|
700
|
+
files: z.array(protoDefinitionCacheFileSchema),
|
|
701
|
+
});
|
|
702
|
+
/**
|
|
703
|
+
* `apis/<slug>/definition/manifest.yaml` for a gRPC API discovered by server reflection: one binary
|
|
704
|
+
* `FileDescriptorSet` beside it, because a server describes itself in the compiler's own output and
|
|
705
|
+
* there is no `.proto` text to keep. The `kind` is what tells the two gRPC manifests apart.
|
|
706
|
+
*/
|
|
707
|
+
export const descriptorDefinitionCacheManifestSchema = z.looseObject({
|
|
708
|
+
formatVersion: z.literal(1),
|
|
709
|
+
kind: z.literal('descriptors'),
|
|
710
|
+
/** The target the server was asked at, as the user gave it. */
|
|
711
|
+
source: nonEmpty,
|
|
712
|
+
fetchedAt: nonEmpty,
|
|
713
|
+
/** The descriptor files declaring the services, which the set is loaded from. */
|
|
714
|
+
roots: z.array(nonEmpty).default([]),
|
|
715
|
+
/** The reflection protocol version that answered. */
|
|
716
|
+
reflectionVersion: z.enum(['v1', 'v1alpha']).optional(),
|
|
717
|
+
/** The descriptor set itself: its path under `definition/`, its SHA-256 and its size. */
|
|
718
|
+
file: protoDefinitionCacheFileSchema,
|
|
719
|
+
});
|
|
720
|
+
/**
|
|
721
|
+
* Validates `value` against `schema`, raising
|
|
722
|
+
* `ProjectError('project-file-invalid')` carrying the file path and the
|
|
723
|
+
* individual zod issues when it does not match.
|
|
724
|
+
*/
|
|
725
|
+
export function parseFile(schema, value, file) {
|
|
726
|
+
const result = schema.safeParse(value);
|
|
727
|
+
if (result.success) {
|
|
728
|
+
return result.data;
|
|
729
|
+
}
|
|
730
|
+
const issues = result.error.issues.map((issue) => ({
|
|
731
|
+
path: issue.path.join('.'),
|
|
732
|
+
message: issue.message,
|
|
733
|
+
}));
|
|
734
|
+
throw new ProjectError('project-file-invalid', `Invalid project file ${file}`, {
|
|
735
|
+
details: { file, issues },
|
|
736
|
+
});
|
|
737
|
+
}
|