@wirebench/engine 2.2.1 → 3.1.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (566) hide show
  1. package/README.md +134 -1
  2. package/dist/account/schema.d.ts +34 -0
  3. package/dist/account/schema.js +29 -0
  4. package/dist/assert/callback.d.ts +76 -0
  5. package/dist/assert/callback.js +320 -0
  6. package/dist/assert/capture-source.d.ts +50 -0
  7. package/dist/assert/capture-source.js +89 -0
  8. package/dist/assert/check.d.ts +8 -0
  9. package/dist/assert/check.js +18 -0
  10. package/dist/assert/header.d.ts +5 -0
  11. package/dist/assert/header.js +48 -0
  12. package/dist/assert/index.d.ts +2 -2
  13. package/dist/assert/index.js +12 -0
  14. package/dist/assert/match.d.ts +6 -0
  15. package/dist/assert/match.js +13 -4
  16. package/dist/assert/model.d.ts +110 -3
  17. package/dist/assert/model.js +16 -1
  18. package/dist/assert/schema.d.ts +194 -1
  19. package/dist/assert/schema.js +154 -12
  20. package/dist/assert/status-names.d.ts +9 -0
  21. package/dist/assert/status-names.js +27 -0
  22. package/dist/assert/status.d.ts +4 -1
  23. package/dist/assert/status.js +27 -3
  24. package/dist/asyncapi/browser.d.ts +7 -0
  25. package/dist/asyncapi/browser.js +6 -0
  26. package/dist/asyncapi/frame-check-worker-host.d.ts +44 -0
  27. package/dist/asyncapi/frame-check-worker-host.js +175 -0
  28. package/dist/asyncapi/frame-check-worker.d.ts +12 -0
  29. package/dist/asyncapi/frame-check-worker.js +25 -0
  30. package/dist/asyncapi/frame-check.d.ts +25 -0
  31. package/dist/asyncapi/frame-check.js +78 -0
  32. package/dist/asyncapi/import.d.ts +25 -0
  33. package/dist/asyncapi/import.js +34 -0
  34. package/dist/asyncapi/map.d.ts +40 -0
  35. package/dist/asyncapi/map.js +230 -0
  36. package/dist/asyncapi/model.d.ts +84 -0
  37. package/dist/asyncapi/model.js +7 -0
  38. package/dist/asyncapi/normalise-2.d.ts +13 -0
  39. package/dist/asyncapi/normalise-2.js +113 -0
  40. package/dist/asyncapi/normalise-3.d.ts +14 -0
  41. package/dist/asyncapi/normalise-3.js +133 -0
  42. package/dist/asyncapi/parse.d.ts +31 -0
  43. package/dist/asyncapi/parse.js +85 -0
  44. package/dist/asyncapi/read.d.ts +35 -0
  45. package/dist/asyncapi/read.js +186 -0
  46. package/dist/asyncapi/security.d.ts +14 -0
  47. package/dist/asyncapi/security.js +55 -0
  48. package/dist/asyncapi/update.d.ts +53 -0
  49. package/dist/asyncapi/update.js +220 -0
  50. package/dist/errors.d.ts +16 -0
  51. package/dist/errors.js +22 -0
  52. package/dist/grpc/events.d.ts +22 -0
  53. package/dist/grpc/events.js +1 -0
  54. package/dist/grpc/expand.d.ts +1 -1
  55. package/dist/grpc/expand.js +15 -5
  56. package/dist/grpc/files.d.ts +271 -0
  57. package/dist/grpc/files.js +62 -0
  58. package/dist/grpc/model.d.ts +11 -1
  59. package/dist/grpc/module.d.ts +2 -0
  60. package/dist/grpc/module.js +13 -0
  61. package/dist/grpc/run.d.ts +73 -0
  62. package/dist/grpc/run.js +407 -0
  63. package/dist/grpc/script-types.d.ts +8 -0
  64. package/dist/grpc/script-types.js +149 -0
  65. package/dist/grpc/scripting.d.ts +34 -0
  66. package/dist/grpc/scripting.js +147 -0
  67. package/dist/grpc/send-input.d.ts +46 -0
  68. package/dist/grpc/send-input.js +42 -0
  69. package/dist/grpc/send.d.ts +2 -2
  70. package/dist/grpc/status.d.ts +9 -2
  71. package/dist/grpc/status.js +11 -24
  72. package/dist/grpc/storage.d.ts +9 -0
  73. package/dist/grpc/storage.js +167 -0
  74. package/dist/{rest/auth.d.ts → http/auth/apply-auth.d.ts} +4 -4
  75. package/dist/{rest/auth.js → http/auth/apply-auth.js} +1 -1
  76. package/dist/http/auth/apply.d.ts +1 -1
  77. package/dist/{rest → http/auth}/oauth2.d.ts +2 -2
  78. package/dist/{rest → http/auth}/oauth2.js +1 -1
  79. package/dist/http/auth/send-auth.d.ts +57 -0
  80. package/dist/http/auth/send-auth.js +7 -0
  81. package/dist/http/client.js +150 -8
  82. package/dist/http/cookies.d.ts +79 -0
  83. package/dist/http/cookies.js +81 -0
  84. package/dist/http/curl.d.ts +4 -14
  85. package/dist/http/curl.js +4 -154
  86. package/dist/http/decompress.d.ts +7 -0
  87. package/dist/http/decompress.js +23 -1
  88. package/dist/http/document-fetch.d.ts +42 -0
  89. package/dist/http/document-fetch.js +207 -0
  90. package/dist/http/entries.d.ts +27 -0
  91. package/dist/http/entries.js +16 -0
  92. package/dist/http/escape.d.ts +18 -0
  93. package/dist/http/escape.js +30 -0
  94. package/dist/http/fetch-document.d.ts +28 -0
  95. package/dist/{wsdl/fetch.js → http/fetch-document.js} +8 -16
  96. package/dist/http/media-type.d.ts +9 -0
  97. package/dist/http/media-type.js +12 -0
  98. package/dist/http/transcript-cap.d.ts +26 -0
  99. package/dist/http/transcript-cap.js +36 -0
  100. package/dist/http/types.d.ts +59 -0
  101. package/dist/http/webhook-signature.d.ts +81 -0
  102. package/dist/http/webhook-signature.js +227 -0
  103. package/dist/import-detect.d.ts +2 -2
  104. package/dist/import-detect.js +10 -1
  105. package/dist/index.d.ts +207 -55
  106. package/dist/index.js +129 -32
  107. package/dist/json/cursor.d.ts +2 -0
  108. package/dist/json/cursor.js +1 -0
  109. package/dist/json/pointer-range.d.ts +18 -0
  110. package/dist/json/pointer-range.js +157 -0
  111. package/dist/json/schema/model.d.ts +59 -0
  112. package/dist/json/schema/model.js +8 -0
  113. package/dist/json/schema/parse-text.d.ts +16 -0
  114. package/dist/json/schema/parse-text.js +37 -0
  115. package/dist/{rest/openapi → json/schema}/refs.d.ts +2 -2
  116. package/dist/{rest/openapi → json/schema}/refs.js +3 -3
  117. package/dist/{rest/openapi → json/schema}/sample.d.ts +4 -0
  118. package/dist/{rest/openapi → json/schema}/sample.js +2 -2
  119. package/dist/json/schema/source.d.ts +21 -0
  120. package/dist/json/schema/source.js +8 -0
  121. package/dist/json/schema-validate.d.ts +49 -0
  122. package/dist/json/schema-validate.js +557 -0
  123. package/dist/{wss/keystore → keystore}/index.js +1 -1
  124. package/dist/{wss/keystore → keystore}/pem.js +1 -1
  125. package/dist/{wss/keystore → keystore}/pkcs12.js +1 -1
  126. package/dist/project/attachments-cache.d.ts +3 -1
  127. package/dist/{wsdl → project}/cache-naming.js +1 -1
  128. package/dist/project/endpoints.d.ts +18 -8
  129. package/dist/project/endpoints.js +21 -6
  130. package/dist/project/environments.d.ts +7 -5
  131. package/dist/project/history.d.ts +105 -9
  132. package/dist/project/history.js +195 -23
  133. package/dist/project/inherit.d.ts +7 -0
  134. package/dist/project/inherit.js +9 -0
  135. package/dist/project/keystores.d.ts +1 -1
  136. package/dist/project/load-helpers.d.ts +89 -0
  137. package/dist/project/load-helpers.js +177 -0
  138. package/dist/project/load.d.ts +30 -4
  139. package/dist/project/load.js +168 -545
  140. package/dist/project/managed-files.d.ts +36 -0
  141. package/dist/project/managed-files.js +97 -0
  142. package/dist/project/migrate.d.ts +2 -2
  143. package/dist/project/migrate.js +2 -2
  144. package/dist/project/model.d.ts +92 -14
  145. package/dist/project/model.js +50 -4
  146. package/dist/project/paths.d.ts +10 -1
  147. package/dist/project/paths.js +10 -1
  148. package/dist/project/preferences.d.ts +11 -2
  149. package/dist/project/preferences.js +5 -1
  150. package/dist/project/properties.d.ts +31 -17
  151. package/dist/project/properties.js +89 -70
  152. package/dist/project/request-location.d.ts +20 -0
  153. package/dist/project/request-location.js +62 -0
  154. package/dist/project/save.d.ts +12 -2
  155. package/dist/project/save.js +186 -141
  156. package/dist/project/schema-parts.d.ts +337 -0
  157. package/dist/project/schema-parts.js +248 -0
  158. package/dist/project/schema.d.ts +72 -928
  159. package/dist/project/schema.js +17 -466
  160. package/dist/project/sequence-guards.d.ts +43 -0
  161. package/dist/project/sequence-guards.js +109 -0
  162. package/dist/project/serialize-helpers.d.ts +60 -0
  163. package/dist/project/serialize-helpers.js +108 -0
  164. package/dist/project/serialize.d.ts +7 -8
  165. package/dist/project/serialize.js +34 -293
  166. package/dist/protocol/features.d.ts +51 -0
  167. package/dist/protocol/features.js +64 -0
  168. package/dist/protocol/index.d.ts +7 -0
  169. package/dist/protocol/index.js +4 -0
  170. package/dist/protocol/module.d.ts +247 -0
  171. package/dist/protocol/module.js +48 -0
  172. package/dist/protocol/registry.d.ts +42 -0
  173. package/dist/protocol/registry.js +47 -0
  174. package/dist/protocols.d.ts +77 -0
  175. package/dist/protocols.js +40 -0
  176. package/dist/redact/index.d.ts +12 -1
  177. package/dist/redact/index.js +55 -7
  178. package/dist/redact/literal.d.ts +10 -0
  179. package/dist/redact/literal.js +110 -12
  180. package/dist/rest/body.d.ts +2 -10
  181. package/dist/rest/body.js +3 -25
  182. package/dist/rest/browser.d.ts +4 -0
  183. package/dist/rest/browser.js +5 -0
  184. package/dist/rest/contract-check-worker-host.d.ts +36 -0
  185. package/dist/rest/contract-check-worker-host.js +158 -0
  186. package/dist/rest/contract-check-worker.d.ts +7 -0
  187. package/dist/rest/contract-check-worker.js +28 -0
  188. package/dist/rest/contract-check.d.ts +43 -0
  189. package/dist/rest/contract-check.js +217 -0
  190. package/dist/rest/cookie-jar.d.ts +62 -0
  191. package/dist/rest/cookie-jar.js +262 -0
  192. package/dist/rest/cookies.d.ts +6 -22
  193. package/dist/rest/cookies.js +6 -42
  194. package/dist/rest/curl.js +5 -1
  195. package/dist/rest/events.d.ts +12 -0
  196. package/dist/rest/events.js +1 -0
  197. package/dist/rest/expand.d.ts +6 -1
  198. package/dist/rest/expand.js +29 -11
  199. package/dist/rest/files.d.ts +439 -0
  200. package/dist/rest/files.js +107 -0
  201. package/dist/rest/json-form.d.ts +97 -0
  202. package/dist/rest/json-form.js +396 -0
  203. package/dist/rest/model.d.ts +35 -24
  204. package/dist/rest/model.js +6 -9
  205. package/dist/rest/module.d.ts +2 -0
  206. package/dist/rest/module.js +13 -0
  207. package/dist/rest/openapi/cache.d.ts +7 -2
  208. package/dist/rest/openapi/cache.js +2 -2
  209. package/dist/rest/openapi/import.d.ts +11 -16
  210. package/dist/rest/openapi/import.js +6 -2
  211. package/dist/rest/openapi/map.d.ts +38 -1
  212. package/dist/rest/openapi/map.js +151 -41
  213. package/dist/rest/openapi/match.d.ts +20 -0
  214. package/dist/rest/openapi/match.js +117 -0
  215. package/dist/rest/openapi/model.d.ts +33 -45
  216. package/dist/rest/openapi/parse.d.ts +3 -12
  217. package/dist/rest/openapi/parse.js +138 -67
  218. package/dist/rest/openapi/responses.d.ts +23 -0
  219. package/dist/rest/openapi/responses.js +59 -0
  220. package/dist/rest/openapi/runtime-expression.d.ts +69 -0
  221. package/dist/rest/openapi/runtime-expression.js +213 -0
  222. package/dist/rest/openapi/update.d.ts +116 -0
  223. package/dist/rest/openapi/update.js +456 -0
  224. package/dist/rest/postman/map.d.ts +1 -0
  225. package/dist/rest/postman/map.js +66 -4
  226. package/dist/rest/postman/model.d.ts +9 -0
  227. package/dist/rest/postman/parse.js +33 -10
  228. package/dist/rest/response.d.ts +2 -23
  229. package/dist/rest/response.js +3 -75
  230. package/dist/rest/run.d.ts +56 -0
  231. package/dist/rest/run.js +395 -0
  232. package/dist/rest/script-types.d.ts +7 -0
  233. package/dist/rest/script-types.js +83 -0
  234. package/dist/rest/scripting.d.ts +38 -0
  235. package/dist/rest/scripting.js +282 -0
  236. package/dist/rest/send-input.d.ts +54 -0
  237. package/dist/rest/send-input.js +73 -0
  238. package/dist/rest/send.d.ts +77 -4
  239. package/dist/rest/send.js +128 -7
  240. package/dist/rest/sse-transcript.d.ts +25 -0
  241. package/dist/rest/sse-transcript.js +95 -0
  242. package/dist/rest/sse.d.ts +43 -0
  243. package/dist/rest/sse.js +195 -0
  244. package/dist/rest/storage.d.ts +26 -0
  245. package/dist/rest/storage.js +262 -0
  246. package/dist/rest/url.d.ts +10 -4
  247. package/dist/rest/url.js +38 -5
  248. package/dist/run/baseline-update.d.ts +35 -0
  249. package/dist/run/baseline-update.js +97 -0
  250. package/dist/run/baseline.d.ts +42 -0
  251. package/dist/run/baseline.js +93 -0
  252. package/dist/run/context.d.ts +86 -0
  253. package/dist/run/context.js +31 -0
  254. package/dist/run/current-values.d.ts +32 -0
  255. package/dist/run/current-values.js +43 -0
  256. package/dist/run/event-queue.d.ts +14 -0
  257. package/dist/run/event-queue.js +46 -0
  258. package/dist/run/exchange.d.ts +62 -0
  259. package/dist/run/exchange.js +65 -0
  260. package/dist/run/host.d.ts +89 -0
  261. package/dist/run/host.js +1 -0
  262. package/dist/run/index.d.ts +20 -7
  263. package/dist/run/index.js +12 -4
  264. package/dist/run/oauth2-token.d.ts +42 -0
  265. package/dist/run/oauth2-token.js +92 -0
  266. package/dist/run/open.d.ts +12 -0
  267. package/dist/run/open.js +16 -0
  268. package/dist/run/run.d.ts +124 -4
  269. package/dist/run/run.js +293 -134
  270. package/dist/run/scope.d.ts +11 -0
  271. package/dist/run/scope.js +26 -0
  272. package/dist/run/script-support.d.ts +53 -0
  273. package/dist/run/script-support.js +68 -0
  274. package/dist/run/secret-needs.d.ts +11 -4
  275. package/dist/run/secret-needs.js +48 -96
  276. package/dist/run/select.d.ts +34 -25
  277. package/dist/run/select.js +45 -54
  278. package/dist/run/send-helpers.d.ts +93 -0
  279. package/dist/run/send-helpers.js +255 -0
  280. package/dist/run/tree.d.ts +50 -0
  281. package/dist/run/tree.js +54 -0
  282. package/dist/script/api/postman.d.ts +10 -0
  283. package/dist/script/api/postman.js +264 -0
  284. package/dist/script/api/prelude.d.ts +20 -0
  285. package/dist/script/api/prelude.js +215 -0
  286. package/dist/script/apply.d.ts +44 -0
  287. package/dist/script/apply.js +120 -0
  288. package/dist/script/check/host.d.ts +41 -0
  289. package/dist/script/check/host.js +143 -0
  290. package/dist/script/check/service.d.ts +52 -0
  291. package/dist/script/check/service.js +195 -0
  292. package/dist/script/check/worker.d.ts +1 -0
  293. package/dist/script/check/worker.js +40 -0
  294. package/dist/script/index.d.ts +16 -0
  295. package/dist/script/index.js +10 -0
  296. package/dist/script/lookup.d.ts +10 -0
  297. package/dist/script/lookup.js +23 -0
  298. package/dist/script/model.d.ts +82 -0
  299. package/dist/script/model.js +18 -0
  300. package/dist/script/props.d.ts +8 -0
  301. package/dist/script/props.js +28 -0
  302. package/dist/script/request-scripts.d.ts +83 -0
  303. package/dist/script/request-scripts.js +160 -0
  304. package/dist/script/run.d.ts +47 -0
  305. package/dist/script/run.js +146 -0
  306. package/dist/script/sandbox/execute.d.ts +26 -0
  307. package/dist/script/sandbox/execute.js +212 -0
  308. package/dist/script/sandbox/host-api.d.ts +27 -0
  309. package/dist/script/sandbox/host-api.js +101 -0
  310. package/dist/script/sandbox/host.d.ts +18 -0
  311. package/dist/script/sandbox/host.js +172 -0
  312. package/dist/script/sandbox/model.d.ts +69 -0
  313. package/dist/script/sandbox/model.js +24 -0
  314. package/dist/script/sandbox/worker.d.ts +1 -0
  315. package/dist/script/sandbox/worker.js +20 -0
  316. package/dist/script/send.d.ts +27 -0
  317. package/dist/script/send.js +76 -0
  318. package/dist/script/strip.d.ts +5 -0
  319. package/dist/script/strip.js +43 -0
  320. package/dist/script/types/api.d.ts +38 -0
  321. package/dist/script/types/api.js +113 -0
  322. package/dist/script/types/json-schema.d.ts +26 -0
  323. package/dist/script/types/json-schema.js +206 -0
  324. package/dist/secrets/env-names.d.ts +9 -1
  325. package/dist/secrets/env-names.js +17 -1
  326. package/dist/secrets/resolve.d.ts +44 -4
  327. package/dist/secrets/resolve.js +58 -1
  328. package/dist/secrets/scan/apply.d.ts +36 -0
  329. package/dist/secrets/scan/apply.js +194 -0
  330. package/dist/secrets/scan/rules.d.ts +32 -0
  331. package/dist/secrets/scan/rules.js +346 -0
  332. package/dist/secrets/scan/scan.d.ts +6 -0
  333. package/dist/secrets/scan/scan.js +57 -0
  334. package/dist/secrets/scan/walk.d.ts +70 -0
  335. package/dist/secrets/scan/walk.js +156 -0
  336. package/dist/secrets/secret-refs.d.ts +8 -0
  337. package/dist/secrets/secret-refs.js +25 -0
  338. package/dist/secrets/secret-token.d.ts +17 -0
  339. package/dist/secrets/secret-token.js +25 -0
  340. package/dist/sequence/file.d.ts +169 -0
  341. package/dist/sequence/file.js +237 -0
  342. package/dist/sequence/index.d.ts +7 -0
  343. package/dist/sequence/index.js +5 -0
  344. package/dist/sequence/load.d.ts +32 -0
  345. package/dist/sequence/load.js +56 -0
  346. package/dist/sequence/model.d.ts +115 -0
  347. package/dist/sequence/model.js +53 -0
  348. package/dist/sequence/run.d.ts +131 -0
  349. package/dist/sequence/run.js +191 -0
  350. package/dist/sequence/transfer.d.ts +24 -0
  351. package/dist/sequence/transfer.js +75 -0
  352. package/dist/server-api/audit.d.ts +455 -0
  353. package/dist/server-api/audit.js +186 -0
  354. package/dist/server-api/ci-tokens.d.ts +50 -0
  355. package/dist/server-api/ci-tokens.js +35 -0
  356. package/dist/server-api/hooks.d.ts +337 -0
  357. package/dist/server-api/hooks.js +152 -0
  358. package/dist/server-api/identity.d.ts +210 -0
  359. package/dist/server-api/identity.js +115 -0
  360. package/dist/server-api/licensing.d.ts +80 -0
  361. package/dist/server-api/licensing.js +53 -0
  362. package/dist/server-api/live.d.ts +132 -0
  363. package/dist/server-api/live.js +102 -0
  364. package/dist/server-api/meta.d.ts +31 -0
  365. package/dist/server-api/meta.js +21 -0
  366. package/dist/server-api/sync.d.ts +179 -0
  367. package/dist/server-api/sync.js +124 -0
  368. package/dist/server-api/teams.d.ts +306 -0
  369. package/dist/server-api/teams.js +113 -0
  370. package/dist/snapshot/diff.d.ts +30 -0
  371. package/dist/snapshot/diff.js +75 -0
  372. package/dist/snapshot/format.d.ts +17 -0
  373. package/dist/snapshot/format.js +40 -0
  374. package/dist/snapshot/golden-file.d.ts +45 -0
  375. package/dist/snapshot/golden-file.js +173 -0
  376. package/dist/snapshot/ignore.d.ts +14 -0
  377. package/dist/snapshot/ignore.js +79 -0
  378. package/dist/snapshot/index.d.ts +9 -0
  379. package/dist/snapshot/index.js +9 -0
  380. package/dist/snapshot/json-diff.d.ts +3 -0
  381. package/dist/snapshot/json-diff.js +93 -0
  382. package/dist/snapshot/xml-diff.d.ts +10 -0
  383. package/dist/snapshot/xml-diff.js +194 -0
  384. package/dist/soap/auth.d.ts +26 -0
  385. package/dist/soap/auth.js +54 -0
  386. package/dist/soap/curl.d.ts +20 -0
  387. package/dist/soap/curl.js +161 -0
  388. package/dist/soap/expand.d.ts +24 -0
  389. package/dist/soap/expand.js +95 -0
  390. package/dist/soap/files.d.ts +384 -0
  391. package/dist/soap/files.js +114 -0
  392. package/dist/soap/form-request.d.ts +13 -0
  393. package/dist/soap/form-request.js +2 -2
  394. package/dist/soap/generate.d.ts +12 -0
  395. package/dist/{generate.js → soap/generate.js} +4 -4
  396. package/dist/{import.d.ts → soap/import.d.ts} +4 -4
  397. package/dist/{import.js → soap/import.js} +13 -13
  398. package/dist/soap/json-operation.d.ts +35 -0
  399. package/dist/soap/json-operation.js +225 -0
  400. package/dist/soap/legacy-project/env-refs.d.ts +19 -0
  401. package/dist/soap/legacy-project/env-refs.js +105 -0
  402. package/dist/soap/legacy-project/map.d.ts +2 -2
  403. package/dist/soap/legacy-project/map.js +6 -0
  404. package/dist/soap/mime/multipart.d.ts +2 -2
  405. package/dist/soap/mime/multipart.js +2 -5
  406. package/dist/soap/mime/send-pipeline.d.ts +1 -1
  407. package/dist/soap/mime/send-pipeline.js +1 -1
  408. package/dist/soap/mime/types.d.ts +1 -3
  409. package/dist/soap/module.d.ts +2 -0
  410. package/dist/soap/module.js +13 -0
  411. package/dist/soap/namespace-scope.js +1 -1
  412. package/dist/soap/operations.d.ts +12 -0
  413. package/dist/{operations.js → soap/operations.js} +4 -4
  414. package/dist/soap/run.d.ts +70 -0
  415. package/dist/soap/run.js +549 -0
  416. package/dist/soap/script-types.d.ts +65 -0
  417. package/dist/soap/script-types.js +379 -0
  418. package/dist/soap/scripting.d.ts +45 -0
  419. package/dist/soap/scripting.js +221 -0
  420. package/dist/soap/send-input.d.ts +61 -0
  421. package/dist/{send-options.js → soap/send-input.js} +5 -109
  422. package/dist/{send.d.ts → soap/send.d.ts} +1 -1
  423. package/dist/{send.js → soap/send.js} +28 -12
  424. package/dist/soap/storage.d.ts +9 -0
  425. package/dist/soap/storage.js +237 -0
  426. package/dist/soap/transforms.d.ts +3 -12
  427. package/dist/soap/transforms.js +3 -14
  428. package/dist/{types.d.ts → soap/types.d.ts} +34 -84
  429. package/dist/sync/git-cli.d.ts +202 -0
  430. package/dist/sync/git-cli.js +684 -0
  431. package/dist/sync/three-way-merge.d.ts +41 -0
  432. package/dist/sync/three-way-merge.js +85 -0
  433. package/dist/sync/tree-paths.d.ts +34 -0
  434. package/dist/sync/tree-paths.js +131 -0
  435. package/dist/team-secrets/envelope.d.ts +10 -0
  436. package/dist/team-secrets/envelope.js +121 -0
  437. package/dist/team-secrets/errors.d.ts +26 -0
  438. package/dist/team-secrets/errors.js +27 -0
  439. package/dist/team-secrets/index.d.ts +14 -0
  440. package/dist/team-secrets/index.js +8 -0
  441. package/dist/team-secrets/keys.d.ts +52 -0
  442. package/dist/team-secrets/keys.js +158 -0
  443. package/dist/team-secrets/log.d.ts +48 -0
  444. package/dist/team-secrets/log.js +175 -0
  445. package/dist/team-secrets/resolve-conflict.d.ts +7 -0
  446. package/dist/team-secrets/resolve-conflict.js +14 -0
  447. package/dist/team-secrets/schema.d.ts +97 -0
  448. package/dist/team-secrets/schema.js +157 -0
  449. package/dist/team-secrets/sign.d.ts +24 -0
  450. package/dist/team-secrets/sign.js +71 -0
  451. package/dist/team-secrets/vault.d.ts +49 -0
  452. package/dist/team-secrets/vault.js +148 -0
  453. package/dist/validate/wsi/run-message.d.ts +2 -2
  454. package/dist/validate/wsi/run-message.js +1 -1
  455. package/dist/validate/wsi/run-wsdl.d.ts +2 -2
  456. package/dist/validate/wsi/run-wsdl.js +1 -1
  457. package/dist/validate/wsi/types.d.ts +1 -1
  458. package/dist/webhooks/model.d.ts +138 -0
  459. package/dist/webhooks/model.js +150 -0
  460. package/dist/workspace/commit-message.d.ts +1 -1
  461. package/dist/workspace/commit-message.js +6 -1
  462. package/dist/workspace/environments.d.ts +11 -4
  463. package/dist/workspace/environments.js +12 -0
  464. package/dist/workspace/index.d.ts +3 -3
  465. package/dist/workspace/index.js +2 -2
  466. package/dist/workspace/paths.d.ts +5 -2
  467. package/dist/workspace/paths.js +5 -2
  468. package/dist/workspace/schema.d.ts +7 -3
  469. package/dist/workspace/schema.js +24 -3
  470. package/dist/workspace/share.d.ts +30 -11
  471. package/dist/workspace/share.js +32 -6
  472. package/dist/ws/call.d.ts +1 -1
  473. package/dist/ws/call.js +2 -2
  474. package/dist/ws/connect.d.ts +60 -0
  475. package/dist/ws/connect.js +131 -0
  476. package/dist/ws/events.d.ts +17 -0
  477. package/dist/ws/events.js +1 -0
  478. package/dist/ws/expand.d.ts +1 -1
  479. package/dist/ws/expand.js +1 -1
  480. package/dist/ws/files.d.ts +284 -0
  481. package/dist/ws/files.js +71 -0
  482. package/dist/ws/history-entry.d.ts +44 -0
  483. package/dist/ws/history-entry.js +93 -0
  484. package/dist/ws/model.d.ts +44 -3
  485. package/dist/ws/model.js +3 -0
  486. package/dist/ws/module.d.ts +2 -0
  487. package/dist/ws/module.js +11 -0
  488. package/dist/ws/run.d.ts +63 -0
  489. package/dist/ws/run.js +470 -0
  490. package/dist/ws/session.d.ts +18 -0
  491. package/dist/ws/session.js +52 -25
  492. package/dist/ws/storage.d.ts +9 -0
  493. package/dist/ws/storage.js +176 -0
  494. package/dist/ws/transcript.d.ts +3 -4
  495. package/dist/ws/transcript.js +26 -17
  496. package/dist/ws/url.d.ts +1 -1
  497. package/dist/wsdl/cache.js +1 -1
  498. package/dist/wsdl/docs-generator.d.ts +3 -3
  499. package/dist/wsdl/docs-generator.js +1 -1
  500. package/dist/wsdl/export-definition.js +1 -1
  501. package/dist/wsdl/qname.d.ts +2 -5
  502. package/dist/wsdl/resolver.d.ts +4 -11
  503. package/dist/wsdl/resolver.js +3 -3
  504. package/dist/wsdl/update-definition.d.ts +5 -5
  505. package/dist/wsdl/update-definition.js +6 -6
  506. package/dist/wss/apply.js +1 -1
  507. package/dist/{project/wss-configs.d.ts → wss/configs.d.ts} +2 -2
  508. package/dist/{project/wss-configs.js → wss/configs.js} +2 -2
  509. package/dist/wss/incoming/decrypt.d.ts +1 -1
  510. package/dist/wss/incoming/index.js +1 -1
  511. package/dist/wss/incoming/verify.d.ts +1 -1
  512. package/dist/wss/incoming/verify.js +1 -1
  513. package/dist/wss/key-identifiers.js +1 -1
  514. package/dist/wss/model.d.ts +1 -1
  515. package/dist/wss/outgoing/encryption.d.ts +1 -1
  516. package/dist/wss/outgoing/signature.d.ts +1 -1
  517. package/dist/xml/decode.d.ts +15 -0
  518. package/dist/xml/decode.js +22 -0
  519. package/dist/xml/entitize.d.ts +17 -0
  520. package/dist/xml/entitize.js +19 -0
  521. package/dist/xml/index.d.ts +1 -1
  522. package/dist/xml/index.js +1 -1
  523. package/dist/xml/locate.d.ts +39 -0
  524. package/dist/xml/locate.js +117 -0
  525. package/dist/xml/qname.d.ts +12 -0
  526. package/dist/xml/qname.js +8 -0
  527. package/dist/xpath/evaluate-async.d.ts +19 -0
  528. package/dist/xpath/evaluate-async.js +31 -11
  529. package/dist/xpath/evaluate.d.ts +1 -1
  530. package/dist/xpath/namespaces.js +1 -1
  531. package/dist/xpath/worker.d.ts +11 -5
  532. package/dist/xpath/worker.js +24 -7
  533. package/dist/xsd/form-model.d.ts +19 -2
  534. package/dist/xsd/form-model.js +14 -2
  535. package/dist/xsd/json-bridge.d.ts +152 -0
  536. package/dist/xsd/json-bridge.js +1213 -0
  537. package/dist/xsd/locate.d.ts +2 -30
  538. package/dist/xsd/locate.js +1 -109
  539. package/dist/xsd/xml-scan.d.ts +2 -0
  540. package/dist/xsd/xml-scan.js +1 -1
  541. package/dist/xsd/xml-writer.d.ts +2 -0
  542. package/dist/xsd/xml-writer.js +4 -0
  543. package/package.json +12 -1
  544. package/dist/generate.d.ts +0 -12
  545. package/dist/operations.d.ts +0 -12
  546. package/dist/run/effective-auth.d.ts +0 -10
  547. package/dist/run/effective-auth.js +0 -19
  548. package/dist/run/prepare.d.ts +0 -43
  549. package/dist/run/prepare.js +0 -280
  550. package/dist/send-options.d.ts +0 -141
  551. package/dist/wsdl/fetch.d.ts +0 -13
  552. /package/dist/{soap → http}/charset.d.ts +0 -0
  553. /package/dist/{soap → http}/charset.js +0 -0
  554. /package/dist/{wsdl → http}/ref-policy.d.ts +0 -0
  555. /package/dist/{wsdl → http}/ref-policy.js +0 -0
  556. /package/dist/{wss/keystore → keystore}/certificate.d.ts +0 -0
  557. /package/dist/{wss/keystore → keystore}/certificate.js +0 -0
  558. /package/dist/{wss/keystore → keystore}/index.d.ts +0 -0
  559. /package/dist/{wss/keystore → keystore}/model.d.ts +0 -0
  560. /package/dist/{wss/keystore → keystore}/model.js +0 -0
  561. /package/dist/{wss/keystore → keystore}/pem.d.ts +0 -0
  562. /package/dist/{wss/keystore → keystore}/pkcs12.d.ts +0 -0
  563. /package/dist/{wsdl → project}/cache-naming.d.ts +0 -0
  564. /package/dist/{types.js → soap/types.js} +0 -0
  565. /package/dist/{soap → xml}/prefixes.d.ts +0 -0
  566. /package/dist/{soap → xml}/prefixes.js +0 -0
@@ -0,0 +1,60 @@
1
+ /**
2
+ * What core's writer and every protocol's `storage.files` share when they turn a project into
3
+ * files: authentication and a definition record as written, a request's `scripts` key and script
4
+ * files, a table row, and the request tree an API (of any protocol) and the webhook collection
5
+ * keep under `requests/`.
6
+ *
7
+ * A protocol's storage imports this file and never `serialize.ts`, which imports the protocols.
8
+ */
9
+ import type { KeyValueEntry } from '../http/entries.js';
10
+ import type { RequestScripts } from '../script/model.js';
11
+ import type { AuthConfig, DefinitionAuth } from './model.js';
12
+ /**
13
+ * One authentication configuration as written: its own fields only, in the schema's spelling,
14
+ * with absent optionals and an empty scope list dropped. Every scheme's secret is a reference,
15
+ * so there is nothing here to redact — the values live in the keychain (ADR-0004).
16
+ */
17
+ export declare function authDocument(auth: AuthConfig): Record<string, unknown>;
18
+ /**
19
+ * A definition record as written (REST's and WebSocket's): its own fields, with the fetch
20
+ * credentials in the schema's spelling through {@link authDocument} — references only, like every
21
+ * other auth.
22
+ */
23
+ export declare function definitionDocument(definition: {
24
+ readonly auth?: DefinitionAuth;
25
+ }): Record<string, unknown>;
26
+ /**
27
+ * A request's `scripts` key as written, plus the script files beside it (#63). Each file is named
28
+ * from the slug; the key records the name only so the YAML reads on its own.
29
+ */
30
+ export declare function scriptsDocument(scripts: RequestScripts | undefined, slug: string): {
31
+ readonly document?: Record<string, unknown>;
32
+ readonly files: readonly (readonly [string, string])[];
33
+ };
34
+ /** Writes a request's script files into `files` under `dir`. */
35
+ export declare function writeScriptFiles(files: Map<string, string>, dir: string, scripts: RequestScripts | undefined, slug: string): void;
36
+ /** One table row as written: `enabled` only when `false`, so a file stays quiet about the default. */
37
+ export declare function keyValueDocuments(rows: readonly KeyValueEntry[]): Record<string, unknown>[];
38
+ /** A folder of either protocol's tree, for the writer that handles both. */
39
+ export interface FolderNode<R> {
40
+ readonly id: string;
41
+ readonly name: string;
42
+ readonly slug: string;
43
+ readonly order: number;
44
+ readonly description?: string;
45
+ readonly auth?: AuthConfig;
46
+ readonly folders: readonly FolderNode<R>[];
47
+ readonly requests: readonly R[];
48
+ }
49
+ /** Writes one request's files into `files` under `dir`: its document, and any sibling the body needs. */
50
+ export type RequestWriter<R> = (files: Map<string, string>, dir: string, request: R) => void;
51
+ /**
52
+ * Adds one folder's own file, its requests (and their body files) and, recursively, the folders
53
+ * below it.
54
+ *
55
+ * @throws ProjectError `project-path-invalid` for an unsafe slug, `project-folder-too-deep` for a
56
+ * tree deeper than {@link MAX_FOLDER_DEPTH} — before any path is built, never after.
57
+ */
58
+ export declare function addFolderFiles<R extends {
59
+ readonly slug: string;
60
+ }>(files: Map<string, string>, dir: string, node: Pick<FolderNode<R>, 'folders' | 'requests'>, depth: number, writeRequest: RequestWriter<R>, folderExtra?: (folder: FolderNode<R>) => Record<string, unknown>): void;
@@ -0,0 +1,108 @@
1
+ /**
2
+ * What core's writer and every protocol's `storage.files` share when they turn a project into
3
+ * files: authentication and a definition record as written, a request's `scripts` key and script
4
+ * files, a table row, and the request tree an API (of any protocol) and the webhook collection
5
+ * keep under `requests/`.
6
+ *
7
+ * A protocol's storage imports this file and never `serialize.ts`, which imports the protocols.
8
+ */
9
+ import { ProjectError } from '../errors.js';
10
+ import { scriptFileName } from '../script/model.js';
11
+ import { assertPathSegment, FOLDER_FILE, MAX_FOLDER_DEPTH } from './paths.js';
12
+ import { compact, stringifyYaml } from './yaml.js';
13
+ /**
14
+ * One authentication configuration as written: its own fields only, in the schema's spelling,
15
+ * with absent optionals and an empty scope list dropped. Every scheme's secret is a reference,
16
+ * so there is nothing here to redact — the values live in the keychain (ADR-0004).
17
+ */
18
+ export function authDocument(auth) {
19
+ if (auth.type === 'oauth2') {
20
+ return compact({ ...auth, scopes: auth.scopes.length > 0 ? [...auth.scopes] : undefined });
21
+ }
22
+ return compact({ ...auth });
23
+ }
24
+ /**
25
+ * A definition record as written (REST's and WebSocket's): its own fields, with the fetch
26
+ * credentials in the schema's spelling through {@link authDocument} — references only, like every
27
+ * other auth.
28
+ */
29
+ export function definitionDocument(definition) {
30
+ return compact({ ...definition, auth: definition.auth === undefined ? undefined : authDocument(definition.auth) });
31
+ }
32
+ /**
33
+ * A request's `scripts` key as written, plus the script files beside it (#63). Each file is named
34
+ * from the slug; the key records the name only so the YAML reads on its own.
35
+ */
36
+ export function scriptsDocument(scripts, slug) {
37
+ if (scripts === undefined) {
38
+ return { files: [] };
39
+ }
40
+ const files = [];
41
+ const nameOf = (phase) => {
42
+ const source = scripts[phase];
43
+ if (source === undefined) {
44
+ return undefined;
45
+ }
46
+ const name = scriptFileName(slug, phase, scripts.api);
47
+ assertPathSegment(name);
48
+ files.push([name, source.text]);
49
+ return name;
50
+ };
51
+ const pre = nameOf('pre');
52
+ const post = nameOf('post');
53
+ return {
54
+ document: compact({
55
+ pre,
56
+ post,
57
+ api: scripts.api === 'wirebench' ? undefined : scripts.api,
58
+ enabled: scripts.enabled ? undefined : false,
59
+ secrets: scripts.secrets.length > 0 ? [...scripts.secrets] : undefined,
60
+ timeoutMs: scripts.timeoutMs,
61
+ }),
62
+ files,
63
+ };
64
+ }
65
+ /** Writes a request's script files into `files` under `dir`. */
66
+ export function writeScriptFiles(files, dir, scripts, slug) {
67
+ for (const [name, text] of scriptsDocument(scripts, slug).files) {
68
+ files.set(`${dir}/${name}`, text);
69
+ }
70
+ }
71
+ /** One table row as written: `enabled` only when `false`, so a file stays quiet about the default. */
72
+ export function keyValueDocuments(rows) {
73
+ return rows.map((row) => compact({
74
+ name: row.name,
75
+ value: row.value,
76
+ enabled: row.enabled ? undefined : false,
77
+ description: row.description,
78
+ }));
79
+ }
80
+ /**
81
+ * Adds one folder's own file, its requests (and their body files) and, recursively, the folders
82
+ * below it.
83
+ *
84
+ * @throws ProjectError `project-path-invalid` for an unsafe slug, `project-folder-too-deep` for a
85
+ * tree deeper than {@link MAX_FOLDER_DEPTH} — before any path is built, never after.
86
+ */
87
+ export function addFolderFiles(files, dir, node, depth, writeRequest, folderExtra) {
88
+ for (const request of node.requests) {
89
+ assertPathSegment(request.slug);
90
+ writeRequest(files, dir, request);
91
+ }
92
+ for (const folder of node.folders) {
93
+ assertPathSegment(folder.slug);
94
+ if (depth + 1 > MAX_FOLDER_DEPTH) {
95
+ throw new ProjectError('project-folder-too-deep', `Folder "${folder.name}" would nest more than ${String(MAX_FOLDER_DEPTH)} deep`, { details: { folder: folder.slug, depth: depth + 1, max: MAX_FOLDER_DEPTH } });
96
+ }
97
+ const childDir = `${dir}/${folder.slug}`;
98
+ files.set(`${childDir}/${FOLDER_FILE}`, stringifyYaml(compact({
99
+ id: folder.id,
100
+ name: folder.name,
101
+ order: folder.order,
102
+ description: folder.description,
103
+ auth: folder.auth === undefined ? undefined : authDocument(folder.auth),
104
+ ...(folderExtra?.(folder) ?? {}),
105
+ })));
106
+ addFolderFiles(files, childDir, folder, depth + 1, writeRequest, folderExtra);
107
+ }
108
+ }
@@ -5,19 +5,15 @@
5
5
  * saver only has to diff two maps, and tests can assert on the layout without
6
6
  * touching a file system.
7
7
  */
8
- import type { AuthConfig, Project, WssRef } from './model.js';
8
+ import type { ProtocolRegistry } from '../protocol/registry.js';
9
+ import type { Project, WssRef } from './model.js';
10
+ export { authDocument } from './serialize-helpers.js';
9
11
  /** A project's files, keyed by path relative to the project root (always `/`-separated). */
10
12
  export type ProjectFiles = ReadonlyMap<string, string>;
11
13
  /** Relative path of the manifest. */
12
14
  export declare const MANIFEST_PATH = "wirebench.yaml";
13
15
  /** Relative path of the keystore registry. */
14
16
  export declare const KEYSTORES_PATH = "wss/keystores.yaml";
15
- /**
16
- * One authentication configuration as written: its own fields only, in the schema's spelling,
17
- * with absent optionals and an empty scope list dropped. Every scheme's secret is a reference,
18
- * so there is nothing here to redact — the values live in the keychain (ADR-0004).
19
- */
20
- export declare function authDocument(auth: AuthConfig): Record<string, unknown>;
21
17
  /**
22
18
  * Relative path of a WS-Security configuration file.
23
19
  *
@@ -29,9 +25,12 @@ export declare function wssRefPath(direction: 'outgoing' | 'incoming', ref: WssR
29
25
  export interface ProjectFilesOptions {
30
26
  /** Recorded in the manifest as `writtenBy`. Defaults to `'wirebench'`. */
31
27
  readonly writer?: string;
28
+ /** The protocols whose containers are written. Defaults to the built-in ones, all switched on. */
29
+ readonly registry?: ProtocolRegistry;
32
30
  }
33
31
  /**
34
- * Builds the complete `relative path -> content` map for a project.
32
+ * Builds the complete `relative path -> content` map for a project: core's own files, and every
33
+ * enabled module's `storage.files` for each of its containers (spec §5.2).
35
34
  *
36
35
  * Every slug is validated with {@link assertPathSegment} (and every
37
36
  * `WssRef.file` with {@link assertWssRelativePath}) before any path is built,
@@ -5,11 +5,13 @@
5
5
  * saver only has to diff two maps, and tests can assert on the layout without
6
6
  * touching a file system.
7
7
  */
8
- import { ProjectError } from '../errors.js';
9
- import { wsMessageFileName } from '../ws/model.js';
10
- import { RAW_LANGUAGE_EXTENSIONS } from '../rest/model.js';
11
- import { API_FILE, APIS_DIR, assertPathSegment, assertWssRelativePath, ENVIRONMENTS_DIR, FOLDER_FILE, INTERFACES_DIR, MAX_FOLDER_DEPTH, OPERATIONS_DIR, REQUEST_SUFFIX, REQUESTS_DIR, restBodyFileName, WSS_DIR, slugify, } from './paths.js';
8
+ import { defaultRegistry } from '../protocols.js';
9
+ import { signingDocument, writeRestRequest } from '../rest/storage.js';
10
+ import { sequenceDocument, sequenceFilePath } from '../sequence/file.js';
11
+ import { assertPathSegment, assertWssRelativePath, ENVIRONMENTS_DIR, REQUESTS_DIR, slugify, WEBHOOKS_DIR, WEBHOOKS_FEATURE, WEBHOOKS_FILE, WSS_DIR, } from './paths.js';
12
+ import { addFolderFiles, authDocument } from './serialize-helpers.js';
12
13
  import { compact, stringifyYaml } from './yaml.js';
14
+ export { authDocument } from './serialize-helpers.js';
13
15
  /** Relative path of the manifest. */
14
16
  export const MANIFEST_PATH = 'wirebench.yaml';
15
17
  /** Relative path of the keystore registry. */
@@ -24,278 +26,21 @@ function disabledList(disabled, properties) {
24
26
  const kept = [...new Set(disabled.filter((name) => known.has(name)))].sort();
25
27
  return kept.length > 0 ? kept : undefined;
26
28
  }
27
- /**
28
- * One authentication configuration as written: its own fields only, in the schema's spelling,
29
- * with absent optionals and an empty scope list dropped. Every scheme's secret is a reference,
30
- * so there is nothing here to redact — the values live in the keychain (ADR-0004).
31
- */
32
- export function authDocument(auth) {
33
- if (auth.type === 'oauth2') {
34
- return compact({ ...auth, scopes: auth.scopes.length > 0 ? [...auth.scopes] : undefined });
35
- }
36
- return compact({ ...auth });
37
- }
38
- function requestDocument(request) {
39
- return compact({
40
- kind: request.kind,
41
- id: request.id,
42
- name: request.name,
43
- order: request.order,
44
- description: request.description,
45
- endpointId: request.endpointId,
46
- endpointUrl: request.endpointUrl,
47
- soapVersion: request.soapVersion,
48
- soapAction: request.soapAction,
49
- headers: request.headers.map((h) => ({ name: h.name, value: h.value })),
50
- attachments: request.attachments.map((a) => compact({ ...a })),
51
- auth: request.auth === undefined ? undefined : authDocument(request.auth),
52
- wsa: request.wsa === undefined ? undefined : compact({ ...request.wsa }),
53
- wssOutgoingRef: request.wssOutgoingRef,
54
- wssIncomingRef: request.wssIncomingRef,
55
- properties: compact({ ...request.properties }),
56
- assertions: request.assertions.length > 0 ? request.assertions.map((a) => compact({ ...a })) : undefined,
57
- orphaned: request.orphaned === true ? true : undefined,
58
- });
59
- }
60
- function interfaceDocument(iface) {
61
- return compact({
62
- kind: iface.kind,
63
- id: iface.id,
64
- name: iface.name,
65
- order: iface.order,
66
- definitionUrl: iface.definitionUrl,
67
- cacheDefinition: iface.cacheDefinition,
68
- targetNamespace: iface.targetNamespace,
69
- endpoints: iface.endpoints.map((e) => compact({ ...e, auth: e.auth === undefined ? undefined : authDocument(e.auth) })),
70
- defaultEndpointId: iface.defaultEndpointId,
71
- wsa: compact({ ...iface.wsa }),
72
- auth: iface.auth === undefined ? undefined : authDocument(iface.auth),
73
- operations: iface.operations.map((op) => ({
74
- name: op.name,
75
- bindingName: op.bindingName,
76
- slug: op.slug,
77
- order: op.order,
78
- })),
79
- });
80
- }
81
- /** One table row as written: `enabled` only when `false`, so a file stays quiet about the default. */
82
- function keyValueDocuments(rows) {
83
- return rows.map((row) => compact({
84
- name: row.name,
85
- value: row.value,
86
- enabled: row.enabled ? undefined : false,
87
- description: row.description,
88
- }));
89
- }
90
- /**
91
- * A body as written, plus the sibling file a raw body needs.
92
- *
93
- * The text of a raw body is deliberately *not* in the request document: it goes to
94
- * `<slug>.body.<ext>` beside it, so a JSON payload is a JSON file in git — reviewable, searchable
95
- * and mergeable — rather than a quoted blob inside YAML.
96
- */
97
- function bodyDocument(body, requestSlug) {
98
- switch (body.kind) {
99
- case 'raw': {
100
- const name = restBodyFileName(requestSlug, RAW_LANGUAGE_EXTENSIONS[body.language]);
101
- assertPathSegment(name);
102
- return {
103
- document: compact({ kind: 'raw', language: body.language, contentType: body.contentType, file: name }),
104
- file: [name, body.text],
105
- };
106
- }
107
- case 'form':
108
- return { document: { kind: 'form', fields: keyValueDocuments(body.fields) } };
109
- case 'multipart':
110
- return {
111
- document: {
112
- kind: 'multipart',
113
- parts: body.parts.map((part) => compact({ ...part, enabled: part.enabled ? undefined : false })),
114
- },
115
- };
116
- case 'binary':
117
- return { document: { kind: 'binary', source: { ...body.source }, contentType: body.contentType } };
118
- default:
119
- return { document: { kind: 'none' } };
120
- }
121
- }
122
- function restRequestDocument(request) {
123
- const body = bodyDocument(request.body, request.slug);
124
- return compact({
125
- kind: request.kind,
126
- id: request.id,
127
- name: request.name,
128
- order: request.order,
129
- description: request.description,
130
- method: request.method,
131
- url: request.url,
132
- pathParams: request.pathParams.length > 0 ? keyValueDocuments(request.pathParams) : undefined,
133
- query: request.query.length > 0 ? keyValueDocuments(request.query) : undefined,
134
- headers: request.headers.length > 0 ? keyValueDocuments(request.headers) : undefined,
135
- body: body.document,
136
- auth: authDocument(request.auth),
137
- settings: Object.keys(request.settings).length > 0 ? compact({ ...request.settings }) : undefined,
138
- assertions: request.assertions.length > 0 ? request.assertions.map((a) => compact({ ...a })) : undefined,
139
- orphaned: request.orphaned === true ? true : undefined,
140
- });
141
- }
142
- const writeRestRequest = (files, dir, request) => {
143
- const body = bodyDocument(request.body, request.slug);
144
- files.set(`${dir}/${request.slug}${REQUEST_SUFFIX}`, stringifyYaml(restRequestDocument(request)));
145
- if (body.file !== undefined) {
146
- files.set(`${dir}/${body.file[0]}`, body.file[1]);
147
- }
148
- };
149
- /**
150
- * A gRPC request as written: the message text goes to `<slug>.body.json` beside the document, the
151
- * same convention as a REST raw body, so a message is a JSON file in git.
152
- */
153
- const writeGrpcRequest = (files, dir, request) => {
154
- const messageFile = restBodyFileName(request.slug, 'json');
155
- assertPathSegment(messageFile);
156
- files.set(`${dir}/${request.slug}${REQUEST_SUFFIX}`, stringifyYaml(compact({
157
- kind: request.kind,
158
- id: request.id,
159
- name: request.name,
160
- order: request.order,
161
- description: request.description,
162
- service: request.service,
163
- method: request.method,
164
- methodKind: request.methodKind,
165
- metadata: request.metadata.length > 0 ? keyValueDocuments(request.metadata) : undefined,
166
- message: messageFile,
167
- auth: authDocument(request.auth),
168
- settings: Object.keys(request.settings).length > 0 ? compact({ ...request.settings }) : undefined,
169
- orphaned: request.orphaned === true ? true : undefined,
29
+ /** The webhook collection's files: `webhooks/webhooks.yaml` and the request tree under it. */
30
+ function addWebhookFiles(files, webhooks) {
31
+ files.set(`${WEBHOOKS_DIR}/${WEBHOOKS_FILE}`, stringifyYaml(compact({
32
+ target: webhooks.target,
33
+ auth: webhooks.auth === undefined ? undefined : authDocument(webhooks.auth),
34
+ signing: signingDocument(webhooks.signing),
170
35
  })));
171
- files.set(`${dir}/${messageFile}`, request.message);
172
- };
173
- /**
174
- * A WebSocket request as written: each saved message goes to a sibling file, so a JSON message is a
175
- * JSON file in git. Siblings rather than a directory, because every directory here loads as a folder.
176
- *
177
- * @throws ProjectError `duplicate-slug` when two of the request's messages share a slug.
178
- */
179
- const writeWsRequest = (files, dir, request) => {
180
- const messages = request.messages.map((message) => {
181
- const file = wsMessageFileName(request.slug, message);
182
- assertPathSegment(file);
183
- if (files.has(`${dir}/${file}`)) {
184
- throw new ProjectError('duplicate-slug', `Request "${request.name}" has two messages named "${message.slug}"`, {
185
- details: { file: `${dir}/${file}` },
186
- });
187
- }
188
- files.set(`${dir}/${file}`, message.content);
189
- return compact({
190
- id: message.id,
191
- name: message.name,
192
- format: message.format === 'binary' ? 'binary' : undefined,
193
- file,
194
- });
36
+ addFolderFiles(files, `${WEBHOOKS_DIR}/${REQUESTS_DIR}`, webhooks, 0, writeRestRequest, (folder) => {
37
+ const hook = folder;
38
+ return {
39
+ target: hook.target,
40
+ source: hook.source === undefined ? undefined : { apiId: hook.source.apiId },
41
+ signing: signingDocument(hook.signing),
42
+ };
195
43
  });
196
- files.set(`${dir}/${request.slug}${REQUEST_SUFFIX}`, stringifyYaml(compact({
197
- kind: request.kind,
198
- id: request.id,
199
- name: request.name,
200
- order: request.order,
201
- description: request.description,
202
- url: request.url,
203
- query: request.query.length > 0 ? keyValueDocuments(request.query) : undefined,
204
- headers: request.headers.length > 0 ? keyValueDocuments(request.headers) : undefined,
205
- subprotocols: request.subprotocols.length > 0 ? [...request.subprotocols] : undefined,
206
- auth: authDocument(request.auth),
207
- settings: Object.keys(request.settings).length > 0 ? compact({ ...request.settings }) : undefined,
208
- messages: messages.length > 0 ? messages : undefined,
209
- })));
210
- };
211
- /**
212
- * Adds one folder's own file, its requests (and their body files) and, recursively, the folders
213
- * below it.
214
- *
215
- * @throws ProjectError `project-path-invalid` for an unsafe slug, `project-folder-too-deep` for a
216
- * tree deeper than {@link MAX_FOLDER_DEPTH} — before any path is built, never after.
217
- */
218
- function addFolderFiles(files, dir, node, depth, writeRequest) {
219
- for (const request of node.requests) {
220
- assertPathSegment(request.slug);
221
- writeRequest(files, dir, request);
222
- }
223
- for (const folder of node.folders) {
224
- assertPathSegment(folder.slug);
225
- if (depth + 1 > MAX_FOLDER_DEPTH) {
226
- throw new ProjectError('project-folder-too-deep', `Folder "${folder.name}" would nest more than ${String(MAX_FOLDER_DEPTH)} deep`, { details: { folder: folder.slug, depth: depth + 1, max: MAX_FOLDER_DEPTH } });
227
- }
228
- const childDir = `${dir}/${folder.slug}`;
229
- files.set(`${childDir}/${FOLDER_FILE}`, stringifyYaml(compact({
230
- id: folder.id,
231
- name: folder.name,
232
- order: folder.order,
233
- description: folder.description,
234
- auth: folder.auth === undefined ? undefined : authDocument(folder.auth),
235
- })));
236
- addFolderFiles(files, childDir, folder, depth + 1, writeRequest);
237
- }
238
- }
239
- /** Every file one REST API occupies, keyed by path relative to the project root. */
240
- function addApiFiles(files, api) {
241
- assertPathSegment(api.slug);
242
- const base = `${APIS_DIR}/${api.slug}`;
243
- files.set(`${base}/${API_FILE}`, stringifyYaml(compact({
244
- kind: api.kind,
245
- id: api.id,
246
- name: api.name,
247
- order: api.order,
248
- description: api.description,
249
- baseUrl: api.baseUrl,
250
- servers: api.servers.length > 0 ? api.servers.map((server) => compact({ ...server })) : undefined,
251
- auth: api.auth === undefined ? undefined : authDocument(api.auth),
252
- definition: api.definition === undefined ? undefined : compact({ ...api.definition }),
253
- })));
254
- addFolderFiles(files, `${base}/${REQUESTS_DIR}`, api, 0, writeRestRequest);
255
- }
256
- /** Every file one gRPC API occupies. It shares `apis/` with the REST ones; its `kind` says which it is. */
257
- function addGrpcApiFiles(files, api) {
258
- assertPathSegment(api.slug);
259
- const base = `${APIS_DIR}/${api.slug}`;
260
- files.set(`${base}/${API_FILE}`, stringifyYaml(compact({
261
- kind: api.kind,
262
- id: api.id,
263
- name: api.name,
264
- order: api.order,
265
- description: api.description,
266
- target: api.target,
267
- tls: api.tls,
268
- metadata: api.metadata.length > 0 ? keyValueDocuments(api.metadata) : undefined,
269
- auth: api.auth === undefined ? undefined : authDocument(api.auth),
270
- definition: api.definition === undefined
271
- ? undefined
272
- : compact({
273
- kind: api.definition.kind,
274
- source: api.definition.source,
275
- cache: api.definition.cache,
276
- roots: [...api.definition.roots],
277
- reflectionVersion: api.definition.reflectionVersion,
278
- trustInvalid: api.definition.trustInvalid,
279
- }),
280
- })));
281
- addFolderFiles(files, `${base}/${REQUESTS_DIR}`, api, 0, writeGrpcRequest);
282
- }
283
- /** Every file one WebSocket API occupies. It shares `apis/` with the others; its `kind` says which it is. */
284
- function addWsApiFiles(files, api) {
285
- assertPathSegment(api.slug);
286
- const base = `${APIS_DIR}/${api.slug}`;
287
- files.set(`${base}/${API_FILE}`, stringifyYaml(compact({
288
- kind: api.kind,
289
- id: api.id,
290
- name: api.name,
291
- order: api.order,
292
- description: api.description,
293
- url: api.url,
294
- headers: api.headers.length > 0 ? keyValueDocuments(api.headers) : undefined,
295
- auth: api.auth === undefined ? undefined : authDocument(api.auth),
296
- definition: api.definition === undefined ? undefined : compact({ ...api.definition }),
297
- })));
298
- addFolderFiles(files, `${base}/${REQUESTS_DIR}`, api, 0, writeWsRequest);
299
44
  }
300
45
  function wssDocument(ref) {
301
46
  return stringifyYaml(ref.document);
@@ -314,7 +59,8 @@ export function wssRefPath(direction, ref) {
314
59
  return `${WSS_DIR}/${direction}/${slugify(ref.name)}.yaml`;
315
60
  }
316
61
  /**
317
- * Builds the complete `relative path -> content` map for a project.
62
+ * Builds the complete `relative path -> content` map for a project: core's own files, and every
63
+ * enabled module's `storage.files` for each of its containers (spec §5.2).
318
64
  *
319
65
  * Every slug is validated with {@link assertPathSegment} (and every
320
66
  * `WssRef.file` with {@link assertWssRelativePath}) before any path is built,
@@ -325,6 +71,7 @@ export function wssRefPath(direction, ref) {
325
71
  export function projectFiles(project, options) {
326
72
  const files = new Map();
327
73
  const writer = options?.writer ?? 'wirebench';
74
+ const registry = options?.registry ?? defaultRegistry();
328
75
  files.set(MANIFEST_PATH, stringifyYaml(compact({
329
76
  formatVersion: project.formatVersion,
330
77
  id: project.id,
@@ -347,28 +94,22 @@ export function projectFiles(project, options) {
347
94
  disabled: disabledList(environment.disabledProperties, environment.properties),
348
95
  })));
349
96
  }
350
- for (const iface of project.interfaces) {
351
- assertPathSegment(iface.slug);
352
- const base = `${INTERFACES_DIR}/${iface.slug}`;
353
- files.set(`${base}/interface.yaml`, stringifyYaml(interfaceDocument(iface)));
354
- for (const operation of iface.operations) {
355
- assertPathSegment(operation.slug);
356
- const dir = `${base}/${OPERATIONS_DIR}/${operation.slug}`;
357
- for (const request of operation.requests) {
358
- assertPathSegment(request.slug);
359
- files.set(`${dir}/${request.slug}${REQUEST_SUFFIX}`, stringifyYaml(requestDocument(request)));
360
- files.set(`${dir}/${request.slug}.xml`, request.envelopeXml);
97
+ // In registration order, which is the order these files always had: interfaces, then each kind
98
+ // of API.
99
+ for (const { storage } of registry.modules) {
100
+ for (const container of storage.containers(project)) {
101
+ for (const [relative, content] of storage.files(container)) {
102
+ files.set(relative, content);
361
103
  }
362
104
  }
363
105
  }
364
- for (const api of project.apis) {
365
- addApiFiles(files, api);
366
- }
367
- for (const api of project.grpcApis) {
368
- addGrpcApiFiles(files, api);
106
+ for (const sequence of project.sequences) {
107
+ assertPathSegment(sequence.slug);
108
+ files.set(sequenceFilePath(sequence.slug), sequenceDocument(sequence));
369
109
  }
370
- for (const api of project.wsApis) {
371
- addWsApiFiles(files, api);
110
+ // REST requests in a tree of their own: written only while REST is on (spec §3.2).
111
+ if (project.webhooks !== undefined && registry.features.isEnabled(WEBHOOKS_FEATURE)) {
112
+ addWebhookFiles(files, project.webhooks);
372
113
  }
373
114
  for (const [direction, refs] of [
374
115
  ['outgoing', project.wss.outgoing],
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Features: what a host can switch off (spec §4.1). Every protocol is one; `scripts` is the first
3
+ * that is not. A feature set is immutable: a host that changes a switch creates a new set.
4
+ */
5
+ /**
6
+ * One switchable feature.
7
+ *
8
+ * @internal Exported for the engine's own hosts; not yet a plugin API (ADR-0017).
9
+ */
10
+ export interface FeatureDescriptor {
11
+ readonly id: string;
12
+ readonly title: string;
13
+ /** Whether the feature is on when no switch names it. */
14
+ readonly default: boolean;
15
+ readonly stage: 'stable' | 'experimental';
16
+ /** Features that must be on for this one to be on. */
17
+ readonly requires: readonly string[];
18
+ }
19
+ /**
20
+ * Why a feature is off.
21
+ *
22
+ * @internal Exported for the engine's own hosts; not yet a plugin API (ADR-0017).
23
+ */
24
+ export type WhyDisabled = {
25
+ readonly by: 'switch';
26
+ } | {
27
+ readonly by: 'requires';
28
+ readonly feature: string;
29
+ } | {
30
+ readonly by: 'unknown';
31
+ };
32
+ /**
33
+ * The features of one host, with its switches applied.
34
+ *
35
+ * @internal Exported for the engine's own hosts; not yet a plugin API (ADR-0017).
36
+ */
37
+ export interface FeatureSet {
38
+ readonly descriptors: readonly FeatureDescriptor[];
39
+ isEnabled(id: string): boolean;
40
+ /** Undefined when the feature is on. */
41
+ whyDisabled(id: string): WhyDisabled | undefined;
42
+ }
43
+ /**
44
+ * Builds a feature set. A feature is on when its switch says so (its `default` when no switch
45
+ * names it) and every feature it requires is on. A switch for an id with no descriptor is ignored:
46
+ * it may belong to a module this build does not have.
47
+ *
48
+ * @throws Error for a duplicate id or a `requires` cycle; both are programming errors
49
+ * @internal Exported for the engine's own hosts; not yet a plugin API (ADR-0017).
50
+ */
51
+ export declare function createFeatureSet(descriptors: readonly FeatureDescriptor[], switches?: Readonly<Record<string, boolean>>): FeatureSet;