@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,173 @@
1
+ /**
2
+ * Reads and writes a request's golden response: the `<slug>.golden.yaml` sidecar beside its request
3
+ * file (snapshot regression, #34). Shared by the desktop's Snapshot tab and the runner's `--baseline`
4
+ * (#36) and `--update-baseline` (#217), so the file is read and written one way. Uses `node:fs`, so it is exported from the main entry only —
5
+ * never from the `@wirebench/engine/snapshot` subpath, which the renderer imports.
6
+ *
7
+ * An ancestor folder swapped for a symlink between the containment check and the rename is not
8
+ * guarded: Node has no `openat` (#219).
9
+ */
10
+ import { randomUUID } from 'node:crypto';
11
+ import { constants, existsSync } from 'node:fs';
12
+ import { lstat, open, realpath, rename, rm, writeFile } from 'node:fs/promises';
13
+ import { basename, dirname, isAbsolute, join, relative, sep } from 'node:path';
14
+ import { Document, parse as parseYamlText } from 'yaml';
15
+ import { z } from 'zod';
16
+ import { requestFileLocation } from '../project/request-location.js';
17
+ const goldenFileSchema = z.object({
18
+ contentType: z.string().optional(),
19
+ savedAt: z.string(),
20
+ ignore: z.array(z.string()),
21
+ body: z.string(),
22
+ });
23
+ const NONE = { status: 'none' };
24
+ const NOT_A_FILE = { status: 'unreadable', reason: 'not-a-file' };
25
+ const MALFORMED = { status: 'unreadable', reason: 'malformed' };
26
+ /** Read-only, never through a link, never blocking on a FIFO; Windows defines neither extra flag. */
27
+ const OPEN_FLAGS = constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0) | (constants.O_NONBLOCK ?? 0);
28
+ /** `path` with `realpath` resolved through whatever prefix of it exists, so a symlink cannot hide an escape. */
29
+ async function realpathOfPrefix(path) {
30
+ const tail = [];
31
+ let current = path;
32
+ while (!existsSync(current)) {
33
+ const parent = dirname(current);
34
+ if (parent === current)
35
+ return path;
36
+ tail.unshift(basename(current));
37
+ current = parent;
38
+ }
39
+ try {
40
+ const real = await realpath(current);
41
+ return tail.length === 0 ? real : join(real, ...tail);
42
+ }
43
+ catch {
44
+ return path;
45
+ }
46
+ }
47
+ /** True when `candidate` is `root` or below it; both real paths. */
48
+ function isInside(root, candidate) {
49
+ const rel = relative(root, candidate);
50
+ return rel !== '..' && !rel.startsWith(`..${sep}`) && !isAbsolute(rel);
51
+ }
52
+ /** Where `requestId`'s sidecar goes once containment and the request file are checked; `undefined` is "unsaved". */
53
+ async function sidecarOf(projectDir, project, requestId) {
54
+ const location = requestFileLocation(project, requestId);
55
+ if (location === undefined)
56
+ return undefined;
57
+ const folder = join(projectDir, ...location.dir.split('/'));
58
+ const requestFile = join(folder, `${location.slug}.request.yaml`);
59
+ const [root, requestReal, folderReal] = await Promise.all([
60
+ realpathOfPrefix(projectDir),
61
+ realpathOfPrefix(requestFile),
62
+ realpathOfPrefix(folder),
63
+ ]);
64
+ if (!isInside(root, requestReal) || !isInside(root, folderReal) || !existsSync(requestFile))
65
+ return undefined;
66
+ const name = `${location.slug}.golden.yaml`;
67
+ return { file: join(folderReal, name), relative: location.dir === '' ? name : `${location.dir}/${name}` };
68
+ }
69
+ /**
70
+ * The golden saved for `requestId` in the project saved at `projectDir`. `none` when the request
71
+ * has no file location, its folder leaves the project, its `*.request.yaml` is not on disk, or no
72
+ * sidecar exists. The sidecar's own name is checked with `lstat`, never followed, and read through
73
+ * the one handle that was checked.
74
+ */
75
+ export async function readGoldenFile(projectDir, project, requestId) {
76
+ const sidecar = await sidecarOf(projectDir, project, requestId);
77
+ if (sidecar === undefined)
78
+ return NONE;
79
+ const file = sidecar.file;
80
+ let checked;
81
+ try {
82
+ checked = await lstat(file);
83
+ }
84
+ catch (error) {
85
+ if (error.code === 'ENOENT')
86
+ return NONE;
87
+ throw error;
88
+ }
89
+ if (!checked.isFile())
90
+ return NOT_A_FILE;
91
+ // The path may change after the lstat: open it without following a link, then check the handle
92
+ // is the file lstat saw. Where O_NOFOLLOW is missing (Windows), a followed link fails that check.
93
+ let handle;
94
+ try {
95
+ handle = await open(file, OPEN_FLAGS);
96
+ }
97
+ catch (error) {
98
+ const code = error.code;
99
+ if (code === 'ENOENT')
100
+ return NONE;
101
+ if (code === 'ELOOP')
102
+ return NOT_A_FILE;
103
+ return MALFORMED;
104
+ }
105
+ let parsed;
106
+ try {
107
+ const opened = await handle.stat();
108
+ if (!opened.isFile() || opened.dev !== checked.dev || opened.ino !== checked.ino)
109
+ return NOT_A_FILE;
110
+ parsed = goldenFileSchema.safeParse(parseYamlText(await handle.readFile('utf8')));
111
+ }
112
+ catch {
113
+ return MALFORMED;
114
+ }
115
+ finally {
116
+ await handle.close();
117
+ }
118
+ if (!parsed.success)
119
+ return MALFORMED;
120
+ const { contentType, savedAt, ignore, body } = parsed.data;
121
+ return {
122
+ status: 'present',
123
+ golden: { ...(contentType !== undefined ? { contentType } : {}), savedAt, ignore, body },
124
+ };
125
+ }
126
+ /**
127
+ * `golden` as sidecar text, keys sorted, the body a block scalar so a golden diffs well in git. A
128
+ * block scalar cannot hold every string — a whitespace-only body such as `" \n"` reads back
129
+ * differently — so the text is parsed back, and a body that does not survive is double-quoted.
130
+ */
131
+ function goldenText(golden) {
132
+ const doc = new Document({
133
+ ...(golden.contentType !== undefined ? { contentType: golden.contentType } : {}),
134
+ savedAt: golden.savedAt,
135
+ ignore: [...golden.ignore],
136
+ body: golden.body,
137
+ }, { sortMapEntries: true });
138
+ const body = doc.get('body', true);
139
+ body.type = 'BLOCK_LITERAL';
140
+ const text = doc.toString({ lineWidth: 0 });
141
+ if (parseYamlText(text).body === golden.body)
142
+ return text;
143
+ body.type = 'QUOTE_DOUBLE';
144
+ return doc.toString({ lineWidth: 0 });
145
+ }
146
+ /**
147
+ * Saves `golden` as `requestId`'s sidecar, atomically: a uniquely named temp file, then a rename
148
+ * over it. Refuses an unsaved request, and a sidecar path that holds a symlink, a folder or
149
+ * anything but a regular file (it is never followed). A failed write removes the temp file and throws.
150
+ */
151
+ export async function writeGoldenFile(projectDir, project, requestId, golden) {
152
+ const sidecar = await sidecarOf(projectDir, project, requestId);
153
+ if (sidecar === undefined)
154
+ return { status: 'refused', reason: 'unsaved' };
155
+ try {
156
+ if (!(await lstat(sidecar.file)).isFile())
157
+ return { status: 'refused', reason: 'not-a-file' };
158
+ }
159
+ catch (error) {
160
+ if (error.code !== 'ENOENT')
161
+ throw error;
162
+ }
163
+ const temp = `${sidecar.file}.${randomUUID()}.tmp`;
164
+ try {
165
+ await writeFile(temp, goldenText(golden), { encoding: 'utf8', flag: 'wx' });
166
+ await rename(temp, sidecar.file);
167
+ }
168
+ catch (error) {
169
+ await rm(temp, { force: true });
170
+ throw error;
171
+ }
172
+ return { status: 'written', file: sidecar.relative };
173
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Splits ignore-rule text into the rules a diff applies: one per line,
3
+ * trimmed, with blank lines and `#`-comment lines skipped. The sidecar's
4
+ * `ignore` array keeps comment lines as the user typed them, so the
5
+ * Snapshot tab runs the stored lines through this only when it diffs.
6
+ */
7
+ export declare function parseIgnoreRules(text: string): string[];
8
+ /**
9
+ * Tests whether `rule` covers `path`, either directly or because `path` is a
10
+ * descendant of the path the rule names. A rule's `*` segment matches any
11
+ * one segment; a leading `//` means "at any depth"; a segment with no
12
+ * `[n]` matches every index of that name; `/` alone matches every path.
13
+ */
14
+ export declare function matchesIgnoreRule(path: string, rule: string): boolean;
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Splits ignore-rule text into the rules a diff applies: one per line,
3
+ * trimmed, with blank lines and `#`-comment lines skipped. The sidecar's
4
+ * `ignore` array keeps comment lines as the user typed them, so the
5
+ * Snapshot tab runs the stored lines through this only when it diffs.
6
+ */
7
+ export function parseIgnoreRules(text) {
8
+ return text
9
+ .split('\n')
10
+ .map((line) => line.trim())
11
+ .filter((line) => line.length > 0 && !line.startsWith('#'));
12
+ }
13
+ /** Splits a diff path or an ignore rule into its `/`-separated segments. */
14
+ function segments(path) {
15
+ return path.split('/').filter((segment) => segment.length > 0);
16
+ }
17
+ /** The local name and, if present, the 1-based `[n]` index of one path segment. */
18
+ function parseSegment(segment) {
19
+ const match = /^(.*)\[(\d+)]$/.exec(segment);
20
+ if (match === null) {
21
+ return { name: segment };
22
+ }
23
+ const index = match[2];
24
+ return index === undefined ? { name: match[1] ?? '' } : { name: match[1] ?? '', index };
25
+ }
26
+ /** Whether one path segment matches one rule segment. */
27
+ function segmentMatches(pathSegment, ruleSegment) {
28
+ if (ruleSegment === '*') {
29
+ return true;
30
+ }
31
+ const rule = parseSegment(ruleSegment);
32
+ const path = parseSegment(pathSegment);
33
+ if (rule.name !== path.name) {
34
+ return false;
35
+ }
36
+ // "A segment without [n] matches any index" — only compare the index when the
37
+ // rule itself names one.
38
+ if (rule.index === undefined) {
39
+ return true;
40
+ }
41
+ return rule.index === path.index;
42
+ }
43
+ /**
44
+ * Tests whether `rule` covers `path`, either directly or because `path` is a
45
+ * descendant of the path the rule names. A rule's `*` segment matches any
46
+ * one segment; a leading `//` means "at any depth"; a segment with no
47
+ * `[n]` matches every index of that name; `/` alone matches every path.
48
+ */
49
+ export function matchesIgnoreRule(path, rule) {
50
+ const anyDepth = rule.startsWith('//');
51
+ const ruleSegments = segments(rule);
52
+ const pathSegments = segments(path);
53
+ if (ruleSegments.length === 0) {
54
+ // `/` names the root, which every path descends from.
55
+ return rule.startsWith('/');
56
+ }
57
+ const matchesFrom = (start) => {
58
+ if (ruleSegments.length > pathSegments.length - start) {
59
+ return false;
60
+ }
61
+ for (let i = 0; i < ruleSegments.length; i += 1) {
62
+ const ruleSegment = ruleSegments[i];
63
+ const pathSegment = pathSegments[start + i];
64
+ if (ruleSegment === undefined || pathSegment === undefined || !segmentMatches(pathSegment, ruleSegment)) {
65
+ return false;
66
+ }
67
+ }
68
+ return true;
69
+ };
70
+ if (anyDepth) {
71
+ for (let start = 0; start <= pathSegments.length - ruleSegments.length; start += 1) {
72
+ if (matchesFrom(start)) {
73
+ return true;
74
+ }
75
+ }
76
+ return false;
77
+ }
78
+ return matchesFrom(0);
79
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * `@wirebench/engine/snapshot`: the pure semantic diff behind snapshot
3
+ * regression (issue #34). Compares a golden response body against a newly
4
+ * received one, structurally for JSON and XML and exactly for everything
5
+ * else, honouring per-request ignore rules.
6
+ */
7
+ export { diffSnapshot, type SnapshotFormat, type SnapshotChange, type SnapshotDiff } from './diff.js';
8
+ export { detectSnapshotFormat } from './format.js';
9
+ export { matchesIgnoreRule, parseIgnoreRules } from './ignore.js';
@@ -0,0 +1,9 @@
1
+ /**
2
+ * `@wirebench/engine/snapshot`: the pure semantic diff behind snapshot
3
+ * regression (issue #34). Compares a golden response body against a newly
4
+ * received one, structurally for JSON and XML and exactly for everything
5
+ * else, honouring per-request ignore rules.
6
+ */
7
+ export { diffSnapshot } from './diff.js';
8
+ export { detectSnapshotFormat } from './format.js';
9
+ export { matchesIgnoreRule, parseIgnoreRules } from './ignore.js';
@@ -0,0 +1,3 @@
1
+ import type { SnapshotChange } from './diff.js';
2
+ /** Semantically diffs two JSON documents, returning every change found. */
3
+ export declare function diffJson(golden: unknown, actual: unknown): SnapshotChange[];
@@ -0,0 +1,93 @@
1
+ import { truncateValue } from './format.js';
2
+ /** JSON Pointer escaping: `~` first, then `/` (RFC 6901 §4). */
3
+ function escapeToken(token) {
4
+ return token.replace(/~/g, '~0').replace(/\//g, '~1');
5
+ }
6
+ /**
7
+ * Builds a JSON Pointer from path segments (already unescaped). The root is
8
+ * `/` rather than RFC 6901's empty string, so every path a diff reports can
9
+ * be shown and saved as an ignore rule as it is.
10
+ */
11
+ function pointer(segments) {
12
+ return segments.length === 0 ? '/' : segments.map((segment) => `/${escapeToken(segment)}`).join('');
13
+ }
14
+ function kindOf(value) {
15
+ if (value === null) {
16
+ return 'null';
17
+ }
18
+ if (Array.isArray(value)) {
19
+ return 'array';
20
+ }
21
+ return typeof value;
22
+ }
23
+ function display(value) {
24
+ return truncateValue(value === undefined ? 'undefined' : JSON.stringify(value));
25
+ }
26
+ /**
27
+ * Recursively compares two parsed JSON values and appends every difference
28
+ * found to `changes`, as a JSON Pointer path plus the semantic rules from
29
+ * the "Semantic diff" spec section: key order doesn't matter, `1.0` equals
30
+ * `1`, array tails are `added`/`removed`, and a type change is one `changed`.
31
+ */
32
+ function diffValue(golden, actual, path, changes) {
33
+ const goldenKind = kindOf(golden);
34
+ const actualKind = kindOf(actual);
35
+ if (goldenKind !== actualKind) {
36
+ changes.push({ kind: 'changed', path: pointer(path), expected: display(golden), actual: display(actual) });
37
+ return;
38
+ }
39
+ switch (goldenKind) {
40
+ case 'array': {
41
+ const goldenArray = golden;
42
+ const actualArray = actual;
43
+ const shared = Math.min(goldenArray.length, actualArray.length);
44
+ for (let i = 0; i < shared; i += 1) {
45
+ diffValue(goldenArray[i], actualArray[i], [...path, String(i)], changes);
46
+ }
47
+ for (let i = shared; i < goldenArray.length; i += 1) {
48
+ changes.push({ kind: 'removed', path: pointer([...path, String(i)]), expected: display(goldenArray[i]) });
49
+ }
50
+ for (let i = shared; i < actualArray.length; i += 1) {
51
+ changes.push({ kind: 'added', path: pointer([...path, String(i)]), actual: display(actualArray[i]) });
52
+ }
53
+ return;
54
+ }
55
+ case 'object': {
56
+ const goldenObject = golden;
57
+ const actualObject = actual;
58
+ const keys = new Set([...Object.keys(goldenObject), ...Object.keys(actualObject)]);
59
+ for (const key of keys) {
60
+ const inGolden = Object.hasOwn(goldenObject, key);
61
+ const inActual = Object.hasOwn(actualObject, key);
62
+ if (inGolden && inActual) {
63
+ diffValue(goldenObject[key], actualObject[key], [...path, key], changes);
64
+ }
65
+ else if (inGolden) {
66
+ changes.push({ kind: 'removed', path: pointer([...path, key]), expected: display(goldenObject[key]) });
67
+ }
68
+ else {
69
+ changes.push({ kind: 'added', path: pointer([...path, key]), actual: display(actualObject[key]) });
70
+ }
71
+ }
72
+ return;
73
+ }
74
+ case 'number': {
75
+ // Compared by value, so `1.0` and `1` — indistinguishable once parsed — are equal.
76
+ if (golden !== actual) {
77
+ changes.push({ kind: 'changed', path: pointer(path), expected: display(golden), actual: display(actual) });
78
+ }
79
+ return;
80
+ }
81
+ default: {
82
+ if (golden !== actual) {
83
+ changes.push({ kind: 'changed', path: pointer(path), expected: display(golden), actual: display(actual) });
84
+ }
85
+ }
86
+ }
87
+ }
88
+ /** Semantically diffs two JSON documents, returning every change found. */
89
+ export function diffJson(golden, actual) {
90
+ const changes = [];
91
+ diffValue(golden, actual, [], changes);
92
+ return changes;
93
+ }
@@ -0,0 +1,10 @@
1
+ import type { SnapshotChange } from './diff.js';
2
+ /**
3
+ * Semantically diffs two XML documents per the "Semantic diff" spec
4
+ * section: elements/attributes compared by namespace URI + local name (so
5
+ * prefixes don't matter), `xmlns` declarations/attribute order/comments/PIs
6
+ * ignored, whitespace-only text ignored and other text trimmed, and
7
+ * repeated same-name siblings paired in order (so an earlier sibling with a
8
+ * different name doesn't shift the rest).
9
+ */
10
+ export declare function diffXml(golden: string, actual: string): SnapshotChange[];
@@ -0,0 +1,194 @@
1
+ import { truncateValue } from './format.js';
2
+ import { parseXml } from '../xml/parse.js';
3
+ const ELEMENT_NODE = 1;
4
+ const TEXT_NODE = 3;
5
+ const CDATA_SECTION_NODE = 4;
6
+ const XMLNS_NS = 'http://www.w3.org/2000/xmlns/';
7
+ /** The (namespace URI, local name) pair elements and attributes are compared by. */
8
+ function nameKey(namespaceURI, localName) {
9
+ return `${namespaceURI ?? ''}|${localName}`;
10
+ }
11
+ function isElement(node) {
12
+ return node.nodeType === ELEMENT_NODE;
13
+ }
14
+ function childElements(node) {
15
+ const result = [];
16
+ for (let i = 0; i < node.childNodes.length; i += 1) {
17
+ const child = node.childNodes.item(i);
18
+ if (child !== null && isElement(child)) {
19
+ result.push(child);
20
+ }
21
+ }
22
+ return result;
23
+ }
24
+ /**
25
+ * Direct text (and CDATA) children — comments, PIs and whitespace-only text ignored. In mixed
26
+ * content each run of text between child elements is trimmed on its own and the runs joined by
27
+ * one space, so indentation around a child element never reads as a text change.
28
+ */
29
+ function ownText(node) {
30
+ const runs = [];
31
+ let run = '';
32
+ const flush = () => {
33
+ const trimmed = run.trim();
34
+ if (trimmed.length > 0) {
35
+ runs.push(trimmed);
36
+ }
37
+ run = '';
38
+ };
39
+ for (let i = 0; i < node.childNodes.length; i += 1) {
40
+ const child = node.childNodes.item(i);
41
+ if (child === null) {
42
+ continue;
43
+ }
44
+ if (child.nodeType === TEXT_NODE || child.nodeType === CDATA_SECTION_NODE) {
45
+ run += child.nodeValue ?? '';
46
+ }
47
+ else if (child.nodeType === ELEMENT_NODE) {
48
+ flush();
49
+ }
50
+ }
51
+ flush();
52
+ return runs.join(' ');
53
+ }
54
+ /** An element's non-`xmlns` attributes, keyed by (namespace, local name). */
55
+ function attributesOf(node) {
56
+ const result = new Map();
57
+ for (let i = 0; i < node.attributes.length; i += 1) {
58
+ const attr = node.attributes.item(i);
59
+ if (attr === null) {
60
+ continue;
61
+ }
62
+ if (attr.namespaceURI === XMLNS_NS || attr.nodeName === 'xmlns' || attr.nodeName.startsWith('xmlns:')) {
63
+ continue;
64
+ }
65
+ result.set(nameKey(attr.namespaceURI, attr.localName ?? attr.nodeName), attr);
66
+ }
67
+ return result;
68
+ }
69
+ /** Groups an element's children by (namespace, local name), preserving document order within each group. */
70
+ function groupChildren(elements) {
71
+ const groups = new Map();
72
+ for (const element of elements) {
73
+ const key = nameKey(element.namespaceURI, element.localName ?? element.tagName);
74
+ const group = groups.get(key);
75
+ if (group === undefined) {
76
+ groups.set(key, [element]);
77
+ }
78
+ else {
79
+ group.push(element);
80
+ }
81
+ }
82
+ return groups;
83
+ }
84
+ function elementDisplay(element) {
85
+ return `<${element.localName ?? element.tagName}>`;
86
+ }
87
+ function childPath(parentPath, localName, indexInGroup, groupSize) {
88
+ const segment = groupSize > 1 ? `${localName}[${indexInGroup + 1}]` : localName;
89
+ return `${parentPath}/${segment}`;
90
+ }
91
+ function diffAttributes(golden, actual, path, changes) {
92
+ const goldenAttrs = attributesOf(golden);
93
+ const actualAttrs = attributesOf(actual);
94
+ const keys = new Set([...goldenAttrs.keys(), ...actualAttrs.keys()]);
95
+ for (const key of keys) {
96
+ const goldenAttr = goldenAttrs.get(key);
97
+ const actualAttr = actualAttrs.get(key);
98
+ const attrPath = `${path}/@${(goldenAttr ?? actualAttr)?.localName ?? (goldenAttr ?? actualAttr)?.nodeName}`;
99
+ if (goldenAttr !== undefined && actualAttr === undefined) {
100
+ changes.push({ kind: 'removed', path: attrPath, expected: truncateValue(goldenAttr.value) });
101
+ }
102
+ else if (goldenAttr === undefined && actualAttr !== undefined) {
103
+ changes.push({ kind: 'added', path: attrPath, actual: truncateValue(actualAttr.value) });
104
+ }
105
+ else if (goldenAttr !== undefined && actualAttr !== undefined && goldenAttr.value !== actualAttr.value) {
106
+ changes.push({
107
+ kind: 'changed',
108
+ path: attrPath,
109
+ expected: truncateValue(goldenAttr.value),
110
+ actual: truncateValue(actualAttr.value),
111
+ });
112
+ }
113
+ }
114
+ }
115
+ function diffChildren(golden, actual, path, changes) {
116
+ const goldenGroups = groupChildren(childElements(golden));
117
+ const actualGroups = groupChildren(childElements(actual));
118
+ const keys = new Set([...goldenGroups.keys(), ...actualGroups.keys()]);
119
+ for (const key of keys) {
120
+ const goldenGroup = goldenGroups.get(key) ?? [];
121
+ const actualGroup = actualGroups.get(key) ?? [];
122
+ const groupSize = Math.max(goldenGroup.length, actualGroup.length);
123
+ const shared = Math.min(goldenGroup.length, actualGroup.length);
124
+ const localName = (goldenGroup[0] ?? actualGroup[0])?.localName ?? (goldenGroup[0] ?? actualGroup[0])?.tagName ?? '';
125
+ for (let i = 0; i < shared; i += 1) {
126
+ const goldenChild = goldenGroup[i];
127
+ const actualChild = actualGroup[i];
128
+ if (goldenChild !== undefined && actualChild !== undefined) {
129
+ diffElement(goldenChild, actualChild, childPath(path, localName, i, groupSize), changes);
130
+ }
131
+ }
132
+ for (let i = shared; i < goldenGroup.length; i += 1) {
133
+ const goldenChild = goldenGroup[i];
134
+ if (goldenChild !== undefined) {
135
+ changes.push({
136
+ kind: 'removed',
137
+ path: childPath(path, localName, i, groupSize),
138
+ expected: elementDisplay(goldenChild),
139
+ });
140
+ }
141
+ }
142
+ for (let i = shared; i < actualGroup.length; i += 1) {
143
+ const actualChild = actualGroup[i];
144
+ if (actualChild !== undefined) {
145
+ changes.push({
146
+ kind: 'added',
147
+ path: childPath(path, localName, i, groupSize),
148
+ actual: elementDisplay(actualChild),
149
+ });
150
+ }
151
+ }
152
+ }
153
+ }
154
+ function diffElement(golden, actual, path, changes) {
155
+ diffAttributes(golden, actual, path, changes);
156
+ const goldenText = ownText(golden);
157
+ const actualText = ownText(actual);
158
+ if (goldenText !== actualText) {
159
+ changes.push({ kind: 'changed', path, expected: truncateValue(goldenText), actual: truncateValue(actualText) });
160
+ }
161
+ diffChildren(golden, actual, path, changes);
162
+ }
163
+ /**
164
+ * Semantically diffs two XML documents per the "Semantic diff" spec
165
+ * section: elements/attributes compared by namespace URI + local name (so
166
+ * prefixes don't matter), `xmlns` declarations/attribute order/comments/PIs
167
+ * ignored, whitespace-only text ignored and other text trimmed, and
168
+ * repeated same-name siblings paired in order (so an earlier sibling with a
169
+ * different name doesn't shift the rest).
170
+ */
171
+ export function diffXml(golden, actual) {
172
+ const goldenDoc = parseXml(golden);
173
+ const actualDoc = parseXml(actual);
174
+ const goldenRoot = goldenDoc.documentElement;
175
+ const actualRoot = actualDoc.documentElement;
176
+ if (goldenRoot === null || actualRoot === null) {
177
+ return [];
178
+ }
179
+ const goldenKey = nameKey(goldenRoot.namespaceURI, goldenRoot.localName ?? goldenRoot.tagName);
180
+ const actualKey = nameKey(actualRoot.namespaceURI, actualRoot.localName ?? actualRoot.tagName);
181
+ const rootName = goldenRoot.localName ?? goldenRoot.tagName;
182
+ const changes = [];
183
+ if (goldenKey !== actualKey) {
184
+ changes.push({
185
+ kind: 'changed',
186
+ path: `/${rootName}`,
187
+ expected: elementDisplay(goldenRoot),
188
+ actual: elementDisplay(actualRoot),
189
+ });
190
+ return changes;
191
+ }
192
+ diffElement(goldenRoot, actualRoot, `/${rootName}`, changes);
193
+ return changes;
194
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Token credentials on a SOAP send: Bearer, API key and OAuth2 become headers or a query
3
+ * parameter, exactly as on a REST send, so there is one implementation of each ({@link applyAuth}).
4
+ *
5
+ * Basic and NTLM are passed through as `transportAuth`, because they may need a challenge round
6
+ * trip that only the transport (`http/auth/*`) can run.
7
+ */
8
+ import type { SendAuth } from '../http/auth/send-auth.js';
9
+ /** A SOAP send's endpoint and headers with token credentials applied. */
10
+ export interface SoapAppliedAuth {
11
+ /** The endpoint to put on the wire: the input one, plus an API key's query parameter if any. */
12
+ readonly endpoint: string;
13
+ /** The caller's headers plus any credential header they did not already set. */
14
+ readonly headers: Readonly<Record<string, string>>;
15
+ /** Basic or NTLM, for `sendWithAuth`; absent for token schemes and for no auth. */
16
+ readonly transportAuth?: SendAuth;
17
+ }
18
+ /**
19
+ * Applies resolved credentials to one SOAP send.
20
+ *
21
+ * A header the caller set wins over the credential's, compared case-insensitively, so a request
22
+ * that writes its own `Authorization` keeps it — the same rule the REST send and the Basic
23
+ * transport follow. An endpoint that does not parse as a URL is returned unchanged: the send
24
+ * then fails on the URL itself, which is the clearer error.
25
+ */
26
+ export declare function applySoapAuth(endpoint: string, headers: Readonly<Record<string, string>> | undefined, auth: SendAuth | undefined): SoapAppliedAuth;
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Token credentials on a SOAP send: Bearer, API key and OAuth2 become headers or a query
3
+ * parameter, exactly as on a REST send, so there is one implementation of each ({@link applyAuth}).
4
+ *
5
+ * Basic and NTLM are passed through as `transportAuth`, because they may need a challenge round
6
+ * trip that only the transport (`http/auth/*`) can run.
7
+ */
8
+ import { applyAuth } from '../http/auth/apply-auth.js';
9
+ /**
10
+ * Applies resolved credentials to one SOAP send.
11
+ *
12
+ * A header the caller set wins over the credential's, compared case-insensitively, so a request
13
+ * that writes its own `Authorization` keeps it — the same rule the REST send and the Basic
14
+ * transport follow. An endpoint that does not parse as a URL is returned unchanged: the send
15
+ * then fails on the URL itself, which is the clearer error.
16
+ */
17
+ export function applySoapAuth(endpoint, headers, auth) {
18
+ const applied = applyAuth(auth);
19
+ const merged = { ...headers };
20
+ const taken = new Set(Object.keys(merged).map((name) => name.toLowerCase()));
21
+ for (const [name, value] of Object.entries(applied.headers)) {
22
+ if (!taken.has(name.toLowerCase())) {
23
+ merged[name] = value;
24
+ }
25
+ }
26
+ return {
27
+ endpoint: withQuery(endpoint, applied.query),
28
+ headers: merged,
29
+ ...(applied.transportAuth !== undefined ? { transportAuth: applied.transportAuth } : {}),
30
+ };
31
+ }
32
+ /**
33
+ * The endpoint with `rows` appended to its query. Built by hand rather than through
34
+ * `URL.searchParams`, which would re-serialise the whole query as form encoding: the endpoint's own
35
+ * query and fragment stay byte-for-byte as configured (an `?op` stays `?op`), as REST keeps an
36
+ * inline query. An endpoint that is not an absolute URL is returned unchanged.
37
+ */
38
+ function withQuery(endpoint, rows) {
39
+ if (rows.length === 0) {
40
+ return endpoint;
41
+ }
42
+ try {
43
+ new URL(endpoint);
44
+ }
45
+ catch {
46
+ return endpoint;
47
+ }
48
+ const hash = endpoint.indexOf('#');
49
+ const head = hash === -1 ? endpoint : endpoint.slice(0, hash);
50
+ const fragment = hash === -1 ? '' : endpoint.slice(hash);
51
+ const separator = !head.includes('?') ? '?' : /[?&]$/.test(head) ? '' : '&';
52
+ const query = rows.map((row) => `${encodeURIComponent(row.name)}=${encodeURIComponent(row.value)}`).join('&');
53
+ return `${head}${separator}${query}${fragment}`;
54
+ }