@demlik/tea 0.13.0 → 0.15.0

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 (373) hide show
  1. package/README.md +11 -9
  2. package/dist/agent/index.d.ts +638 -45
  3. package/dist/agent/index.js +9 -19
  4. package/dist/{chunk-RH5EFRVJ.js → chunk-22POWGFA.js} +31 -5
  5. package/dist/chunk-22POWGFA.js.map +1 -0
  6. package/dist/{chunk-DMYGQB4O.js → chunk-3B5X7SBB.js} +23 -6
  7. package/dist/chunk-3B5X7SBB.js.map +1 -0
  8. package/dist/chunk-66PY5WYF.js +1816 -0
  9. package/dist/chunk-66PY5WYF.js.map +1 -0
  10. package/dist/{chunk-25LBDCBC.js → chunk-6IQPODUF.js} +2 -2
  11. package/dist/{chunk-25LBDCBC.js.map → chunk-6IQPODUF.js.map} +1 -1
  12. package/dist/chunk-AYS5N6WY.js +505 -0
  13. package/dist/chunk-AYS5N6WY.js.map +1 -0
  14. package/dist/{chunk-EWJP3YYP.js → chunk-HWVW4AXC.js} +3 -3
  15. package/dist/chunk-HWVW4AXC.js.map +1 -0
  16. package/dist/{chunk-O4MVQTEJ.js → chunk-L3TND7LA.js} +20 -16
  17. package/dist/chunk-L3TND7LA.js.map +1 -0
  18. package/dist/{chunk-J6527VRQ.js → chunk-LFZUK6J2.js} +3 -3
  19. package/dist/chunk-LFZUK6J2.js.map +1 -0
  20. package/dist/{chunk-D736QUGF.js → chunk-MYXFNWAJ.js} +4 -5
  21. package/dist/chunk-MYXFNWAJ.js.map +1 -0
  22. package/dist/{chunk-K575PT4S.js → chunk-PR6TB3BL.js} +15 -4
  23. package/dist/chunk-PR6TB3BL.js.map +1 -0
  24. package/dist/{chunk-YUXP55T2.js → chunk-Q5CQTBFA.js} +57 -7
  25. package/dist/chunk-Q5CQTBFA.js.map +1 -0
  26. package/dist/{batch-window/index.js → chunk-QPEVCJ5Q.js} +4 -8
  27. package/dist/chunk-QPEVCJ5Q.js.map +1 -0
  28. package/dist/chunk-TCLBCERH.js +1480 -0
  29. package/dist/chunk-TCLBCERH.js.map +1 -0
  30. package/dist/{chunk-FV3Z5MBE.js → chunk-TXN2KFHF.js} +14 -4
  31. package/dist/chunk-TXN2KFHF.js.map +1 -0
  32. package/dist/{chunk-MUUROGIH.js → chunk-V46HSVCK.js} +62 -12
  33. package/dist/chunk-V46HSVCK.js.map +1 -0
  34. package/dist/{chunk-Q2UM7BXU.js → chunk-VBDU4JL6.js} +2 -2
  35. package/dist/chunk-VBDU4JL6.js.map +1 -0
  36. package/dist/{chunk-ZVJZ72HY.js → chunk-VTQI2NHP.js} +25 -11
  37. package/dist/chunk-VTQI2NHP.js.map +1 -0
  38. package/dist/{core-Co0LWkIA.d.ts → core-DnzqWy6u.d.ts} +72 -23
  39. package/dist/devtools/index.d.ts +2 -2
  40. package/dist/devtools/index.js +207 -2
  41. package/dist/devtools/index.js.map +1 -1
  42. package/dist/do/index.d.ts +43 -29
  43. package/dist/do/index.js +36 -25
  44. package/dist/do/index.js.map +1 -1
  45. package/dist/{durable-effects-C6uwzjb5.d.ts → durable-effects-CWzA-o2B.d.ts} +2 -2
  46. package/dist/extension/index.d.ts +300 -3
  47. package/dist/extension/index.js +596 -5
  48. package/dist/extension/index.js.map +1 -1
  49. package/dist/flow/index.d.ts +1284 -0
  50. package/dist/flow/index.js +732 -0
  51. package/dist/flow/index.js.map +1 -0
  52. package/dist/idempotency/index.d.ts +90 -116
  53. package/dist/idempotency/index.js +4 -1
  54. package/dist/index-Bc40JWVl.d.ts +131 -0
  55. package/dist/{batch-window/index.d.ts → index-C2DwkjlP.d.ts} +7 -12
  56. package/dist/index-CA_7I5g9.d.ts +806 -0
  57. package/dist/index-CSyMYDAB.d.ts +69 -0
  58. package/dist/{fan-out/index.d.ts → index-CuNO9m8i.d.ts} +7 -9
  59. package/dist/{debounce/index.d.ts → index-DHSUmQTR.d.ts} +7 -7
  60. package/dist/{recorder/index.d.ts → index-DrIRb_Ch.d.ts} +4 -7
  61. package/dist/index-HSYgG2Yt.d.ts +380 -0
  62. package/dist/{monitored-run/index.d.ts → index-KXqTRJyb.d.ts} +37 -13
  63. package/dist/{snapshot/index.d.ts → index-ZCMhnVKN.d.ts} +15 -78
  64. package/dist/index.d.ts +771 -6
  65. package/dist/index.js +1 -2
  66. package/dist/jev/index.d.ts +646 -0
  67. package/dist/jev/index.js +485 -0
  68. package/dist/jev/index.js.map +1 -0
  69. package/dist/machine-DGlPWCWI.d.ts +1781 -0
  70. package/dist/machine-viz/index.d.ts +1 -1
  71. package/dist/machine-viz/index.js +12 -5
  72. package/dist/machine-viz/index.js.map +1 -1
  73. package/dist/mem/index.d.ts +18 -3
  74. package/dist/mem/index.js +22 -2
  75. package/dist/mem/index.js.map +1 -1
  76. package/dist/node/index.d.ts +104 -6
  77. package/dist/node/index.js +132 -9
  78. package/dist/node/index.js.map +1 -1
  79. package/dist/{paginator → paginate}/index.d.ts +140 -6
  80. package/dist/paginate/index.js +7 -0
  81. package/dist/parity/index.d.ts +4 -10
  82. package/dist/parity/index.js +4 -7
  83. package/dist/parity/index.js.map +1 -1
  84. package/dist/pbt/index.d.ts +247 -5
  85. package/dist/pbt/index.js +124 -5
  86. package/dist/pbt/index.js.map +1 -1
  87. package/dist/{trace-replay → persistence}/index.d.ts +7 -5
  88. package/dist/persistence/index.js +6 -0
  89. package/dist/{protocol-B5YmJr0d.d.ts → protocol-D8VbH-VH.d.ts} +10 -1
  90. package/dist/react/index.d.ts +2 -2
  91. package/dist/react/index.js +1 -2
  92. package/dist/react/index.js.map +1 -1
  93. package/dist/resilience/index.d.ts +744 -0
  94. package/dist/resilience/index.js +657 -0
  95. package/dist/resilience/index.js.map +1 -0
  96. package/dist/retry-backoff/index.d.ts +3 -2
  97. package/dist/retry-backoff/index.js +1 -1
  98. package/dist/runtime-types-CMF13BBh.d.ts +998 -0
  99. package/dist/testing/index.d.ts +147 -3
  100. package/dist/testing/index.js +95 -3
  101. package/dist/testing/index.js.map +1 -1
  102. package/dist/{throttled-input → timing}/index.d.ts +143 -12
  103. package/dist/{throttled-input → timing}/index.js +57 -12
  104. package/dist/timing/index.js.map +1 -0
  105. package/dist/{types-XS_miRnB.d.ts → types-BseNPIhr.d.ts} +1 -1
  106. package/dist/work-queue/index.d.ts +130 -54
  107. package/dist/work-queue/index.js +3 -2
  108. package/dist/work-queue/index.js.map +1 -1
  109. package/package.json +45 -218
  110. package/dist/authed-call/index.d.ts +0 -120
  111. package/dist/authed-call/index.js +0 -134
  112. package/dist/authed-call/index.js.map +0 -1
  113. package/dist/await-terminal/index.d.ts +0 -101
  114. package/dist/await-terminal/index.js +0 -76
  115. package/dist/await-terminal/index.js.map +0 -1
  116. package/dist/batch-window/index.js.map +0 -1
  117. package/dist/cache/index.d.ts +0 -152
  118. package/dist/cache/index.js +0 -8
  119. package/dist/chart/index.d.ts +0 -218
  120. package/dist/chart/index.js +0 -16
  121. package/dist/chart/index.js.map +0 -1
  122. package/dist/chart/inspect/index.d.ts +0 -86
  123. package/dist/chart/inspect/index.js +0 -5
  124. package/dist/chart/inspect/react.d.ts +0 -113
  125. package/dist/chart/inspect/react.js +0 -11
  126. package/dist/chart/inspect/react.js.map +0 -1
  127. package/dist/chart/inspect/styles.css +0 -286
  128. package/dist/chart/lane/index.d.ts +0 -362
  129. package/dist/chart/lane/index.js +0 -9
  130. package/dist/chart/lane/index.js.map +0 -1
  131. package/dist/chart/lane/react.d.ts +0 -84
  132. package/dist/chart/lane/react.js +0 -559
  133. package/dist/chart/lane/react.js.map +0 -1
  134. package/dist/chart/lane/server.d.ts +0 -148
  135. package/dist/chart/lane/server.js +0 -209
  136. package/dist/chart/lane/server.js.map +0 -1
  137. package/dist/chart/lane/styles.css +0 -498
  138. package/dist/chart/lane/viewer/assets/abnfDiagram-N423BO3Z-C729LI31.js +0 -1
  139. package/dist/chart/lane/viewer/assets/architectureDiagram-T3A2C74G-C729LI31.js +0 -1
  140. package/dist/chart/lane/viewer/assets/blockDiagram-VBNYF7ZC-C729LI31.js +0 -1
  141. package/dist/chart/lane/viewer/assets/c4Diagram-5PPSVZJV-C729LI31.js +0 -1
  142. package/dist/chart/lane/viewer/assets/chunk-2GRJ4B5K-HdDf8SI3.js +0 -1
  143. package/dist/chart/lane/viewer/assets/chunk-5RXB4S5H-CcNtpUd7.js +0 -231
  144. package/dist/chart/lane/viewer/assets/chunk-5VM5RSS4-BP4fRS_5.js +0 -15
  145. package/dist/chart/lane/viewer/assets/chunk-KBJHAD2P-DZOw7xU6.js +0 -1
  146. package/dist/chart/lane/viewer/assets/chunk-NSK5VX7P-CBCyTZMs.js +0 -128
  147. package/dist/chart/lane/viewer/assets/classDiagram-JCYQIIEL-C729LI31.js +0 -1
  148. package/dist/chart/lane/viewer/assets/classDiagram-v2-OCEON4UE-D4uAiFr8.js +0 -206
  149. package/dist/chart/lane/viewer/assets/cose-bilkent-JH36ORCC-DOwCrGXH.js +0 -1
  150. package/dist/chart/lane/viewer/assets/cynefinDiagram-MW4NZA55-C729LI31.js +0 -1
  151. package/dist/chart/lane/viewer/assets/dagre-K_PewWfS.js +0 -1
  152. package/dist/chart/lane/viewer/assets/dagre-VZM6K2ZE-831qZcA8.js +0 -4
  153. package/dist/chart/lane/viewer/assets/diagram-7IWD3JNH-C729LI31.js +0 -1
  154. package/dist/chart/lane/viewer/assets/diagram-B4RE2ZJO-C729LI31.js +0 -1
  155. package/dist/chart/lane/viewer/assets/diagram-LBJQPF4R-C729LI31.js +0 -1
  156. package/dist/chart/lane/viewer/assets/diagram-Q27KOJAE-C729LI31.js +0 -1
  157. package/dist/chart/lane/viewer/assets/diagram-UB23O5K3-C729LI31.js +0 -1
  158. package/dist/chart/lane/viewer/assets/ebnfDiagram-BXEA7PRR-C729LI31.js +0 -1
  159. package/dist/chart/lane/viewer/assets/erDiagram-JOGREHBK-C729LI31.js +0 -1
  160. package/dist/chart/lane/viewer/assets/flowDiagram-UKHOOZJN-C729LI31.js +0 -1
  161. package/dist/chart/lane/viewer/assets/ganttDiagram-PKOTCBZU-C729LI31.js +0 -1
  162. package/dist/chart/lane/viewer/assets/gitGraphDiagram-DS77QQ5N-C729LI31.js +0 -1
  163. package/dist/chart/lane/viewer/assets/index-9SkH5NA3.css +0 -1
  164. package/dist/chart/lane/viewer/assets/index-Bgt4sXpW.js +0 -195
  165. package/dist/chart/lane/viewer/assets/infoDiagram-6WML65LV-C729LI31.js +0 -1
  166. package/dist/chart/lane/viewer/assets/ishikawaDiagram-WSZJBQD7-C729LI31.js +0 -1
  167. package/dist/chart/lane/viewer/assets/journeyDiagram-NVQOT4AX-C729LI31.js +0 -1
  168. package/dist/chart/lane/viewer/assets/kanban-definition-27J2QSJJ-G7PaPzy-.js +0 -89
  169. package/dist/chart/lane/viewer/assets/katex-DOwCrGXH.js +0 -1
  170. package/dist/chart/lane/viewer/assets/mindmap-definition-FAOFIHXS-CGj9nrVk.js +0 -96
  171. package/dist/chart/lane/viewer/assets/path-fybaL0A-.js +0 -1
  172. package/dist/chart/lane/viewer/assets/pegDiagram-VL7TDLO6-C729LI31.js +0 -1
  173. package/dist/chart/lane/viewer/assets/pieDiagram-7S7Q4E2Y-C729LI31.js +0 -1
  174. package/dist/chart/lane/viewer/assets/quadrantDiagram-CIZ2JOQS-C729LI31.js +0 -1
  175. package/dist/chart/lane/viewer/assets/railroadDiagram-AXF67PYL-C729LI31.js +0 -1
  176. package/dist/chart/lane/viewer/assets/requirementDiagram-LRYGKXZP-C729LI31.js +0 -1
  177. package/dist/chart/lane/viewer/assets/sankeyDiagram-W5VNT64P-C729LI31.js +0 -1
  178. package/dist/chart/lane/viewer/assets/sequenceDiagram-SI44F4Z6-C729LI31.js +0 -1
  179. package/dist/chart/lane/viewer/assets/stateDiagram-OKZ733FA-B_88AzBS.js +0 -1
  180. package/dist/chart/lane/viewer/assets/stateDiagram-v2-UEYNNEHI-CR5gcgq6.js +0 -1
  181. package/dist/chart/lane/viewer/assets/swimlanes-SLNWSIFB-B4xK-rwg.js +0 -1
  182. package/dist/chart/lane/viewer/assets/swimlanesDiagram-ULZ7WXOC-C729LI31.js +0 -1
  183. package/dist/chart/lane/viewer/assets/timeline-definition-Z64GVDOM-CCv52MfY.js +0 -120
  184. package/dist/chart/lane/viewer/assets/vennDiagram-T6HMQDX7-C729LI31.js +0 -1
  185. package/dist/chart/lane/viewer/assets/wardleyDiagram-T6FBY63Y-C729LI31.js +0 -1
  186. package/dist/chart/lane/viewer/assets/xychartDiagram-ELKLHX3M-C729LI31.js +0 -1
  187. package/dist/chart/lane/viewer/index.html +0 -15
  188. package/dist/chart/report/index.d.ts +0 -117
  189. package/dist/chart/report/index.js +0 -32
  190. package/dist/chart/report/index.js.map +0 -1
  191. package/dist/chunk-2YFLOCWX.js +0 -15
  192. package/dist/chunk-2YFLOCWX.js.map +0 -1
  193. package/dist/chunk-3I52QZZ5.js +0 -519
  194. package/dist/chunk-3I52QZZ5.js.map +0 -1
  195. package/dist/chunk-3ZAFFRRB.js +0 -457
  196. package/dist/chunk-3ZAFFRRB.js.map +0 -1
  197. package/dist/chunk-4EQZ76JC.js +0 -33
  198. package/dist/chunk-4EQZ76JC.js.map +0 -1
  199. package/dist/chunk-4KLG43GY.js +0 -223
  200. package/dist/chunk-4KLG43GY.js.map +0 -1
  201. package/dist/chunk-7FRZ2CT2.js +0 -424
  202. package/dist/chunk-7FRZ2CT2.js.map +0 -1
  203. package/dist/chunk-AZZLE7XR.js +0 -62
  204. package/dist/chunk-AZZLE7XR.js.map +0 -1
  205. package/dist/chunk-BYQUGDD3.js +0 -16
  206. package/dist/chunk-BYQUGDD3.js.map +0 -1
  207. package/dist/chunk-CIQG5L42.js +0 -685
  208. package/dist/chunk-CIQG5L42.js.map +0 -1
  209. package/dist/chunk-CLM6ERNO.js +0 -61
  210. package/dist/chunk-CLM6ERNO.js.map +0 -1
  211. package/dist/chunk-COS5MSTO.js +0 -88
  212. package/dist/chunk-COS5MSTO.js.map +0 -1
  213. package/dist/chunk-CRPZJVD2.js +0 -71
  214. package/dist/chunk-CRPZJVD2.js.map +0 -1
  215. package/dist/chunk-D62FDQKE.js +0 -53
  216. package/dist/chunk-D62FDQKE.js.map +0 -1
  217. package/dist/chunk-D736QUGF.js.map +0 -1
  218. package/dist/chunk-DGE4PV4A.js +0 -26
  219. package/dist/chunk-DGE4PV4A.js.map +0 -1
  220. package/dist/chunk-DMYGQB4O.js.map +0 -1
  221. package/dist/chunk-EWJP3YYP.js.map +0 -1
  222. package/dist/chunk-FV3Z5MBE.js.map +0 -1
  223. package/dist/chunk-HCEVHFJ7.js +0 -54
  224. package/dist/chunk-HCEVHFJ7.js.map +0 -1
  225. package/dist/chunk-J6527VRQ.js.map +0 -1
  226. package/dist/chunk-JELSZN25.js +0 -47
  227. package/dist/chunk-JELSZN25.js.map +0 -1
  228. package/dist/chunk-K575PT4S.js.map +0 -1
  229. package/dist/chunk-L57ZOT5K.js +0 -184
  230. package/dist/chunk-L57ZOT5K.js.map +0 -1
  231. package/dist/chunk-MU6MCIAC.js +0 -15
  232. package/dist/chunk-MU6MCIAC.js.map +0 -1
  233. package/dist/chunk-MUUROGIH.js.map +0 -1
  234. package/dist/chunk-NR7BU22N.js +0 -758
  235. package/dist/chunk-NR7BU22N.js.map +0 -1
  236. package/dist/chunk-O4MVQTEJ.js.map +0 -1
  237. package/dist/chunk-OOYD44JI.js +0 -317
  238. package/dist/chunk-OOYD44JI.js.map +0 -1
  239. package/dist/chunk-Q2UM7BXU.js.map +0 -1
  240. package/dist/chunk-RH5EFRVJ.js.map +0 -1
  241. package/dist/chunk-S2EGRPCM.js +0 -47
  242. package/dist/chunk-S2EGRPCM.js.map +0 -1
  243. package/dist/chunk-SINXE47Y.js +0 -55
  244. package/dist/chunk-SINXE47Y.js.map +0 -1
  245. package/dist/chunk-UF4MZSLT.js +0 -53
  246. package/dist/chunk-UF4MZSLT.js.map +0 -1
  247. package/dist/chunk-UOC2PL46.js +0 -13
  248. package/dist/chunk-UOC2PL46.js.map +0 -1
  249. package/dist/chunk-VYFAZN3F.js +0 -372
  250. package/dist/chunk-VYFAZN3F.js.map +0 -1
  251. package/dist/chunk-WRAA7GVZ.js +0 -209
  252. package/dist/chunk-WRAA7GVZ.js.map +0 -1
  253. package/dist/chunk-XGELA764.js +0 -163
  254. package/dist/chunk-XGELA764.js.map +0 -1
  255. package/dist/chunk-YUXP55T2.js.map +0 -1
  256. package/dist/chunk-YWIKDKHY.js +0 -307
  257. package/dist/chunk-YWIKDKHY.js.map +0 -1
  258. package/dist/chunk-ZJ5AOYBH.js +0 -8
  259. package/dist/chunk-ZJ5AOYBH.js.map +0 -1
  260. package/dist/chunk-ZSUUOEPL.js +0 -731
  261. package/dist/chunk-ZSUUOEPL.js.map +0 -1
  262. package/dist/chunk-ZVJZ72HY.js.map +0 -1
  263. package/dist/circuit-breaker/index.d.ts +0 -197
  264. package/dist/circuit-breaker/index.js +0 -3
  265. package/dist/circuit-breaker/index.js.map +0 -1
  266. package/dist/deadline/index.d.ts +0 -199
  267. package/dist/deadline/index.js +0 -6
  268. package/dist/deadline/index.js.map +0 -1
  269. package/dist/debounce/index.js +0 -3
  270. package/dist/debounce/index.js.map +0 -1
  271. package/dist/extension/react.d.ts +0 -121
  272. package/dist/extension/react.js +0 -75
  273. package/dist/extension/react.js.map +0 -1
  274. package/dist/extension/subs/index.d.ts +0 -45
  275. package/dist/extension/subs/index.js +0 -80
  276. package/dist/extension/subs/index.js.map +0 -1
  277. package/dist/extension/test-utils.d.ts +0 -128
  278. package/dist/extension/test-utils.js +0 -277
  279. package/dist/extension/test-utils.js.map +0 -1
  280. package/dist/fan-out/index.js +0 -5
  281. package/dist/fan-out/index.js.map +0 -1
  282. package/dist/fold-BJPdjc9w.d.ts +0 -435
  283. package/dist/graph-B3L5e0N1.d.ts +0 -923
  284. package/dist/idempotency/adapter.d.ts +0 -62
  285. package/dist/idempotency/adapter.js +0 -4
  286. package/dist/idempotency/adapter.js.map +0 -1
  287. package/dist/idempotent-intake/index.d.ts +0 -188
  288. package/dist/idempotent-intake/index.js +0 -7
  289. package/dist/idempotent-intake/index.js.map +0 -1
  290. package/dist/journal/index.d.ts +0 -373
  291. package/dist/journal/index.js +0 -3
  292. package/dist/journal/index.js.map +0 -1
  293. package/dist/llm-call/index.d.ts +0 -311
  294. package/dist/llm-call/index.js +0 -16
  295. package/dist/llm-call/index.js.map +0 -1
  296. package/dist/machine-BtFWQmmq.d.ts +0 -804
  297. package/dist/monitored-run/index.js +0 -10
  298. package/dist/monitored-run/index.js.map +0 -1
  299. package/dist/paginated-walk/index.d.ts +0 -235
  300. package/dist/paginated-walk/index.js +0 -16
  301. package/dist/paginated-walk/index.js.map +0 -1
  302. package/dist/paginator/index.js +0 -3
  303. package/dist/paginator/index.js.map +0 -1
  304. package/dist/pbt/arbitraries/index.d.ts +0 -136
  305. package/dist/pbt/arbitraries/index.js +0 -3
  306. package/dist/pbt/arbitraries/index.js.map +0 -1
  307. package/dist/pbt/runners/index.d.ts +0 -118
  308. package/dist/pbt/runners/index.js +0 -5
  309. package/dist/pbt/runners/index.js.map +0 -1
  310. package/dist/poller/index.d.ts +0 -352
  311. package/dist/poller/index.js +0 -115
  312. package/dist/poller/index.js.map +0 -1
  313. package/dist/prediction/index.d.ts +0 -131
  314. package/dist/prediction/index.js +0 -4
  315. package/dist/prediction/index.js.map +0 -1
  316. package/dist/pure/index.d.ts +0 -3
  317. package/dist/pure/index.js +0 -4
  318. package/dist/pure/index.js.map +0 -1
  319. package/dist/rate-limit/index.d.ts +0 -115
  320. package/dist/rate-limit/index.js +0 -3
  321. package/dist/rate-limit/index.js.map +0 -1
  322. package/dist/reconciler/index.d.ts +0 -193
  323. package/dist/reconciler/index.js +0 -164
  324. package/dist/reconciler/index.js.map +0 -1
  325. package/dist/recorder/index.js +0 -3
  326. package/dist/recorder/index.js.map +0 -1
  327. package/dist/reducer-4GNR6b8B.d.ts +0 -447
  328. package/dist/resilient-call/index.d.ts +0 -320
  329. package/dist/resilient-call/index.js +0 -14
  330. package/dist/resilient-call/index.js.map +0 -1
  331. package/dist/retry-to-success/index.d.ts +0 -109
  332. package/dist/retry-to-success/index.js +0 -37
  333. package/dist/retry-to-success/index.js.map +0 -1
  334. package/dist/run-pAcmBpah.d.ts +0 -713
  335. package/dist/runtime-types-CNLmhWif.d.ts +0 -517
  336. package/dist/saga/index.d.ts +0 -241
  337. package/dist/saga/index.js +0 -150
  338. package/dist/saga/index.js.map +0 -1
  339. package/dist/samples-B3My5oh2.d.ts +0 -59
  340. package/dist/snapshot/index.js +0 -5
  341. package/dist/snapshot/index.js.map +0 -1
  342. package/dist/subs/index.d.ts +0 -472
  343. package/dist/subs/index.js +0 -7
  344. package/dist/subs/index.js.map +0 -1
  345. package/dist/throttle/index.d.ts +0 -134
  346. package/dist/throttle/index.js +0 -3
  347. package/dist/throttle/index.js.map +0 -1
  348. package/dist/throttled-input/index.js.map +0 -1
  349. package/dist/token-refresh/index.d.ts +0 -216
  350. package/dist/token-refresh/index.js +0 -6
  351. package/dist/token-refresh/index.js.map +0 -1
  352. package/dist/trace-replay/index.js +0 -6
  353. package/dist/trace-replay/index.js.map +0 -1
  354. package/dist/with-deadline/index.d.ts +0 -197
  355. package/dist/with-deadline/index.js +0 -111
  356. package/dist/with-deadline/index.js.map +0 -1
  357. package/dist/with-resilience/index.d.ts +0 -225
  358. package/dist/with-resilience/index.js +0 -240
  359. package/dist/with-resilience/index.js.map +0 -1
  360. package/dist/with-telemetry/index.d.ts +0 -150
  361. package/dist/with-telemetry/index.js +0 -70
  362. package/dist/with-telemetry/index.js.map +0 -1
  363. package/dist/work-queue/adapter.d.ts +0 -84
  364. package/dist/work-queue/adapter.js +0 -4
  365. package/dist/work-queue/adapter.js.map +0 -1
  366. package/dist/work-queue/ops.d.ts +0 -71
  367. package/dist/work-queue/ops.js +0 -3
  368. package/dist/work-queue/ops.js.map +0 -1
  369. package/dist/workflow/index.d.ts +0 -485
  370. package/dist/workflow/index.js +0 -244
  371. package/dist/workflow/index.js.map +0 -1
  372. /package/dist/{cache → paginate}/index.js.map +0 -0
  373. /package/dist/{chart/inspect → persistence}/index.js.map +0 -0
@@ -1,128 +0,0 @@
1
- /**
2
- * In-memory `chrome.*` mock for tests in this package and any downstream
3
- * consumer that wants to test against `chromeStorageStore` behavior without
4
- * a real chrome environment.
5
- *
6
- * Currently exposes `chrome.storage.local`, `chrome.runtime` (sendMessage +
7
- * onMessage), and `chrome.tabs` (sendMessage). The `runtime` and `tabs`
8
- * surfaces are used by the runtime-bridge tests (`bridge.ts`) to round-trip
9
- * envelopes between a host runtime and a surface client (sw↔surface) and
10
- * between a sw client and a per-tab content-script runtime (sw↔content).
11
- *
12
- * Extend additional surfaces (alarms, windows, …) only when real consumer
13
- * tests reach for them — earn each surface through a concrete need.
14
- */
15
- type StorageChangeListener = (changes: Record<string, chrome.storage.StorageChange>, areaName: chrome.storage.AreaName) => void;
16
- type AlarmListener = (alarm: chrome.alarms.Alarm) => void;
17
- type TabActivatedListener = (info: chrome.tabs.OnActivatedInfo) => void;
18
- type TabUpdatedListener = (tabId: number, changeInfo: chrome.tabs.OnUpdatedInfo, tab: chrome.tabs.Tab) => void;
19
- type TabRemovedListener = (tabId: number, removeInfo: chrome.tabs.OnRemovedInfo) => void;
20
- interface FakeChrome {
21
- storage: {
22
- local: chrome.storage.StorageArea;
23
- /**
24
- * Top-level `chrome.storage.onChanged` event. Fires for ANY area; consumer
25
- * filters by the `areaName` arg. Real chrome semantics: every `set` /
26
- * `remove` / `clear` that materially changes a key emits a single
27
- * `changes` map keyed by the changed keys.
28
- */
29
- onChanged: {
30
- addListener(listener: StorageChangeListener): void;
31
- removeListener(listener: StorageChangeListener): void;
32
- hasListener(listener: StorageChangeListener): boolean;
33
- hasListeners(): boolean;
34
- };
35
- };
36
- runtime: {
37
- sendMessage: typeof chrome.runtime.sendMessage;
38
- onMessage: typeof chrome.runtime.onMessage;
39
- };
40
- tabs: {
41
- sendMessage: typeof chrome.tabs.sendMessage;
42
- /**
43
- * `chrome.tabs.onActivated` — fires when the active tab in a window
44
- * changes. The fake only models the listener registry; tests drive
45
- * fires via `__test.fireTabActivated(info)`.
46
- */
47
- onActivated: {
48
- addListener(listener: TabActivatedListener): void;
49
- removeListener(listener: TabActivatedListener): void;
50
- hasListener(listener: TabActivatedListener): boolean;
51
- hasListeners(): boolean;
52
- };
53
- /**
54
- * `chrome.tabs.onUpdated` — fires when a tab is updated (url, title,
55
- * status, etc.). Tests drive fires via `__test.fireTabUpdated(...)`.
56
- */
57
- onUpdated: {
58
- addListener(listener: TabUpdatedListener): void;
59
- removeListener(listener: TabUpdatedListener): void;
60
- hasListener(listener: TabUpdatedListener): boolean;
61
- hasListeners(): boolean;
62
- };
63
- /**
64
- * `chrome.tabs.onRemoved` — fires when a tab is closed. Tests drive
65
- * fires via `__test.fireTabRemoved(...)`.
66
- */
67
- onRemoved: {
68
- addListener(listener: TabRemovedListener): void;
69
- removeListener(listener: TabRemovedListener): void;
70
- hasListener(listener: TabRemovedListener): boolean;
71
- hasListeners(): boolean;
72
- };
73
- };
74
- /**
75
- * `chrome.alarms` — the MV3 periodic timer primitive. The fake tracks
76
- * created alarms in a Map keyed by name, models `create` (dedupe by
77
- * name) + `clear` (remove from map), and exposes `onAlarm` as a
78
- * standard listener registry. Tests drive fires via
79
- * `__test.fireAlarm(name)`.
80
- */
81
- alarms: {
82
- create(name: string, alarmInfo: chrome.alarms.AlarmCreateInfo): void;
83
- /**
84
- * `chrome.alarms.get(name)` — resolves to the Alarm shape Chrome would
85
- * return (with `scheduledTime` synthesized at lookup time), or
86
- * undefined if no alarm with that name exists. Mirrors the contract
87
- * the `ensureQueueAlarm` SW-module-top-level helper checks ("is this
88
- * alarm already present with the right period?") — see
89
- * the extension's background entrypoint.
90
- */
91
- get(name: string): Promise<chrome.alarms.Alarm | undefined>;
92
- clear(name: string): Promise<boolean>;
93
- onAlarm: {
94
- addListener(listener: AlarmListener): void;
95
- removeListener(listener: AlarmListener): void;
96
- hasListener(listener: AlarmListener): boolean;
97
- hasListeners(): boolean;
98
- };
99
- };
100
- /**
101
- * Test helpers — not part of the real chrome surface. Lets tests
102
- * simulate a content script issuing `chrome.runtime.sendMessage` from
103
- * inside a specific tab (chrome auto-tags `sender.tab.id` in that
104
- * direction) and remove a tab so `chrome.tabs.sendMessage` rejects
105
- * the way real chrome does when the receiver is gone.
106
- */
107
- __test: {
108
- /** Simulate a content-script broadcast tagged with `sender.tab.id`. */
109
- sendFromTab(tabId: number, message: unknown): Promise<unknown>;
110
- /** Mark a tab as gone — `chrome.tabs.sendMessage(tabId, …)` will reject. */
111
- removeTab(tabId: number): void;
112
- /** Mark a tab as alive (default for any tabId that hasn't been removed). */
113
- addTab(tabId: number): void;
114
- /** Fire an alarm — invokes every onAlarm listener with `{ name, ...}`. */
115
- fireAlarm(name: string): void;
116
- /** Snapshot the alarm registry — tests assert on created/cleared alarms. */
117
- getAlarms(): readonly string[];
118
- /** Fire `chrome.tabs.onActivated` — drives every listener. */
119
- fireTabActivated(info: chrome.tabs.OnActivatedInfo): void;
120
- /** Fire `chrome.tabs.onUpdated` — drives every listener. */
121
- fireTabUpdated(tabId: number, changeInfo: chrome.tabs.OnUpdatedInfo, tab: chrome.tabs.Tab): void;
122
- /** Fire `chrome.tabs.onRemoved` — drives every listener. */
123
- fireTabRemoved(tabId: number, removeInfo: chrome.tabs.OnRemovedInfo): void;
124
- };
125
- }
126
- declare function fakeChrome(): FakeChrome;
127
-
128
- export { type FakeChrome, fakeChrome };
@@ -1,277 +0,0 @@
1
- // src/extension/test-utils.ts
2
- function fakeChrome() {
3
- const data = /* @__PURE__ */ new Map();
4
- const storageListeners = /* @__PURE__ */ new Set();
5
- function deepEqual(a, b) {
6
- if (a === b) return true;
7
- if (typeof a !== typeof b) return false;
8
- if (typeof a !== "object" || a === null || b === null) return false;
9
- return JSON.stringify(a) === JSON.stringify(b);
10
- }
11
- function fireStorageChange(changes) {
12
- if (Object.keys(changes).length === 0) return;
13
- for (const listener of Array.from(storageListeners)) {
14
- listener(changes, "local");
15
- }
16
- }
17
- const partial = {
18
- async get(keys) {
19
- if (keys === void 0 || keys === null) {
20
- return Object.fromEntries(data);
21
- }
22
- if (typeof keys === "string") {
23
- const v = data.get(keys);
24
- return v === void 0 ? {} : { [keys]: v };
25
- }
26
- if (Array.isArray(keys)) {
27
- return Object.fromEntries(
28
- keys.flatMap((k) => data.has(k) ? [[k, data.get(k)]] : [])
29
- );
30
- }
31
- const out = {};
32
- for (const [k, def] of Object.entries(keys)) {
33
- out[k] = data.has(k) ? data.get(k) : def;
34
- }
35
- return out;
36
- },
37
- async set(items) {
38
- const changes = {};
39
- for (const [k, v] of Object.entries(items)) {
40
- const prev = data.get(k);
41
- if (deepEqual(prev, v)) continue;
42
- const change = { newValue: v };
43
- if (data.has(k)) change.oldValue = prev;
44
- changes[k] = change;
45
- data.set(k, v);
46
- }
47
- fireStorageChange(changes);
48
- },
49
- async remove(keys) {
50
- const arr = Array.isArray(keys) ? keys : [keys];
51
- const changes = {};
52
- for (const k of arr) {
53
- if (!data.has(k)) continue;
54
- changes[k] = { oldValue: data.get(k) };
55
- data.delete(k);
56
- }
57
- fireStorageChange(changes);
58
- },
59
- async clear() {
60
- const changes = {};
61
- for (const [k, v] of data) changes[k] = { oldValue: v };
62
- data.clear();
63
- fireStorageChange(changes);
64
- }
65
- };
66
- const local = partial;
67
- const runtimeListeners = /* @__PURE__ */ new Set();
68
- const removedTabs = /* @__PURE__ */ new Set();
69
- const dispatch = (message, sender) => {
70
- return new Promise((resolve, reject) => {
71
- let responded = false;
72
- const sendResponse = (response) => {
73
- if (responded) return;
74
- responded = true;
75
- resolve(response);
76
- };
77
- const snapshot = Array.from(runtimeListeners);
78
- let willRespondAsync = false;
79
- for (const listener of snapshot) {
80
- const r = listener(message, sender, sendResponse);
81
- if (r === true) willRespondAsync = true;
82
- if (responded) return;
83
- }
84
- if (willRespondAsync) return;
85
- reject(
86
- new Error(
87
- "Could not establish connection. Receiving end does not exist."
88
- )
89
- );
90
- });
91
- };
92
- const extensionSender = {};
93
- const runtimePartial = {
94
- sendMessage(message) {
95
- return dispatch(message, extensionSender);
96
- },
97
- onMessage: {
98
- addListener(listener) {
99
- runtimeListeners.add(listener);
100
- },
101
- removeListener(listener) {
102
- runtimeListeners.delete(listener);
103
- },
104
- hasListener(listener) {
105
- return runtimeListeners.has(listener);
106
- },
107
- hasListeners() {
108
- return runtimeListeners.size > 0;
109
- }
110
- }
111
- };
112
- const runtime = runtimePartial;
113
- const tabsPartial = {
114
- sendMessage(tabId, message) {
115
- if (removedTabs.has(tabId)) {
116
- return Promise.reject(
117
- new Error(
118
- `Could not establish connection. Receiving end does not exist. (tabId=${tabId})`
119
- )
120
- );
121
- }
122
- return dispatch(message, extensionSender);
123
- }
124
- };
125
- const tabActivatedListeners = /* @__PURE__ */ new Set();
126
- const tabUpdatedListeners = /* @__PURE__ */ new Set();
127
- const tabRemovedListeners = /* @__PURE__ */ new Set();
128
- const tabsFull = {
129
- ...tabsPartial,
130
- onActivated: {
131
- addListener(listener) {
132
- tabActivatedListeners.add(listener);
133
- },
134
- removeListener(listener) {
135
- tabActivatedListeners.delete(listener);
136
- },
137
- hasListener(listener) {
138
- return tabActivatedListeners.has(listener);
139
- },
140
- hasListeners() {
141
- return tabActivatedListeners.size > 0;
142
- }
143
- },
144
- onUpdated: {
145
- addListener(listener) {
146
- tabUpdatedListeners.add(listener);
147
- },
148
- removeListener(listener) {
149
- tabUpdatedListeners.delete(listener);
150
- },
151
- hasListener(listener) {
152
- return tabUpdatedListeners.has(listener);
153
- },
154
- hasListeners() {
155
- return tabUpdatedListeners.size > 0;
156
- }
157
- },
158
- onRemoved: {
159
- addListener(listener) {
160
- tabRemovedListeners.add(listener);
161
- },
162
- removeListener(listener) {
163
- tabRemovedListeners.delete(listener);
164
- },
165
- hasListener(listener) {
166
- return tabRemovedListeners.has(listener);
167
- },
168
- hasListeners() {
169
- return tabRemovedListeners.size > 0;
170
- }
171
- }
172
- };
173
- const tabs = tabsFull;
174
- const alarmMap = /* @__PURE__ */ new Map();
175
- const alarmListeners = /* @__PURE__ */ new Set();
176
- const alarms = {
177
- create(name, alarmInfo) {
178
- alarmMap.set(name, alarmInfo);
179
- },
180
- async get(name) {
181
- const info = alarmMap.get(name);
182
- if (info === void 0) return void 0;
183
- return {
184
- name,
185
- scheduledTime: Date.now(),
186
- periodInMinutes: info.periodInMinutes
187
- };
188
- },
189
- async clear(name) {
190
- return alarmMap.delete(name);
191
- },
192
- onAlarm: {
193
- addListener(listener) {
194
- alarmListeners.add(listener);
195
- },
196
- removeListener(listener) {
197
- alarmListeners.delete(listener);
198
- },
199
- hasListener(listener) {
200
- return alarmListeners.has(listener);
201
- },
202
- hasListeners() {
203
- return alarmListeners.size > 0;
204
- }
205
- }
206
- };
207
- return {
208
- storage: {
209
- local,
210
- onChanged: {
211
- addListener(listener) {
212
- storageListeners.add(listener);
213
- },
214
- removeListener(listener) {
215
- storageListeners.delete(listener);
216
- },
217
- hasListener(listener) {
218
- return storageListeners.has(listener);
219
- },
220
- hasListeners() {
221
- return storageListeners.size > 0;
222
- }
223
- }
224
- },
225
- runtime,
226
- tabs,
227
- alarms,
228
- __test: {
229
- sendFromTab(tabId, message) {
230
- const taggedSender = {
231
- tab: { id: tabId }
232
- };
233
- return dispatch(message, taggedSender);
234
- },
235
- removeTab(tabId) {
236
- removedTabs.add(tabId);
237
- },
238
- addTab(tabId) {
239
- removedTabs.delete(tabId);
240
- },
241
- fireAlarm(name) {
242
- const info = alarmMap.get(name);
243
- if (info === void 0) return;
244
- const alarm = {
245
- name,
246
- scheduledTime: Date.now(),
247
- periodInMinutes: info.periodInMinutes
248
- };
249
- for (const listener of Array.from(alarmListeners)) {
250
- listener(alarm);
251
- }
252
- },
253
- getAlarms() {
254
- return Array.from(alarmMap.keys());
255
- },
256
- fireTabActivated(info) {
257
- for (const listener of Array.from(tabActivatedListeners)) {
258
- listener(info);
259
- }
260
- },
261
- fireTabUpdated(tabId, changeInfo, tab) {
262
- for (const listener of Array.from(tabUpdatedListeners)) {
263
- listener(tabId, changeInfo, tab);
264
- }
265
- },
266
- fireTabRemoved(tabId, removeInfo) {
267
- for (const listener of Array.from(tabRemovedListeners)) {
268
- listener(tabId, removeInfo);
269
- }
270
- }
271
- }
272
- };
273
- }
274
-
275
- export { fakeChrome };
276
- //# sourceMappingURL=test-utils.js.map
277
- //# sourceMappingURL=test-utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/extension/test-utils.ts"],"names":[],"mappings":"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","file":"test-utils.js","sourcesContent":["/**\n * In-memory `chrome.*` mock for tests in this package and any downstream\n * consumer that wants to test against `chromeStorageStore` behavior without\n * a real chrome environment.\n *\n * Currently exposes `chrome.storage.local`, `chrome.runtime` (sendMessage +\n * onMessage), and `chrome.tabs` (sendMessage). The `runtime` and `tabs`\n * surfaces are used by the runtime-bridge tests (`bridge.ts`) to round-trip\n * envelopes between a host runtime and a surface client (sw↔surface) and\n * between a sw client and a per-tab content-script runtime (sw↔content).\n *\n * Extend additional surfaces (alarms, windows, …) only when real consumer\n * tests reach for them — earn each surface through a concrete need.\n */\n\ntype RuntimeListener = (\n message: unknown,\n sender: chrome.runtime.MessageSender,\n sendResponse: (response: unknown) => void,\n // biome-ignore lint/suspicious/noConfusingVoidType: mirrors the chrome.runtime.onMessage listener return type (boolean | undefined | void)\n) => boolean | undefined | void;\n\ntype StorageChangeListener = (\n changes: Record<string, chrome.storage.StorageChange>,\n areaName: chrome.storage.AreaName,\n) => void;\n\ntype AlarmListener = (alarm: chrome.alarms.Alarm) => void;\n\ntype TabActivatedListener = (info: chrome.tabs.OnActivatedInfo) => void;\ntype TabUpdatedListener = (\n tabId: number,\n changeInfo: chrome.tabs.OnUpdatedInfo,\n tab: chrome.tabs.Tab,\n) => void;\ntype TabRemovedListener = (\n tabId: number,\n removeInfo: chrome.tabs.OnRemovedInfo,\n) => void;\n\nexport interface FakeChrome {\n storage: {\n local: chrome.storage.StorageArea;\n /**\n * Top-level `chrome.storage.onChanged` event. Fires for ANY area; consumer\n * filters by the `areaName` arg. Real chrome semantics: every `set` /\n * `remove` / `clear` that materially changes a key emits a single\n * `changes` map keyed by the changed keys.\n */\n onChanged: {\n addListener(listener: StorageChangeListener): void;\n removeListener(listener: StorageChangeListener): void;\n hasListener(listener: StorageChangeListener): boolean;\n hasListeners(): boolean;\n };\n };\n // Subset of `typeof chrome.runtime` covered by the fake — chrome's\n // ambient typings don't export a single `Runtime` interface, so we\n // declare the surface inline. Extend when tests reach for more.\n runtime: {\n sendMessage: typeof chrome.runtime.sendMessage;\n onMessage: typeof chrome.runtime.onMessage;\n };\n tabs: {\n sendMessage: typeof chrome.tabs.sendMessage;\n /**\n * `chrome.tabs.onActivated` — fires when the active tab in a window\n * changes. The fake only models the listener registry; tests drive\n * fires via `__test.fireTabActivated(info)`.\n */\n onActivated: {\n addListener(listener: TabActivatedListener): void;\n removeListener(listener: TabActivatedListener): void;\n hasListener(listener: TabActivatedListener): boolean;\n hasListeners(): boolean;\n };\n /**\n * `chrome.tabs.onUpdated` — fires when a tab is updated (url, title,\n * status, etc.). Tests drive fires via `__test.fireTabUpdated(...)`.\n */\n onUpdated: {\n addListener(listener: TabUpdatedListener): void;\n removeListener(listener: TabUpdatedListener): void;\n hasListener(listener: TabUpdatedListener): boolean;\n hasListeners(): boolean;\n };\n /**\n * `chrome.tabs.onRemoved` — fires when a tab is closed. Tests drive\n * fires via `__test.fireTabRemoved(...)`.\n */\n onRemoved: {\n addListener(listener: TabRemovedListener): void;\n removeListener(listener: TabRemovedListener): void;\n hasListener(listener: TabRemovedListener): boolean;\n hasListeners(): boolean;\n };\n };\n /**\n * `chrome.alarms` — the MV3 periodic timer primitive. The fake tracks\n * created alarms in a Map keyed by name, models `create` (dedupe by\n * name) + `clear` (remove from map), and exposes `onAlarm` as a\n * standard listener registry. Tests drive fires via\n * `__test.fireAlarm(name)`.\n */\n alarms: {\n create(name: string, alarmInfo: chrome.alarms.AlarmCreateInfo): void;\n /**\n * `chrome.alarms.get(name)` — resolves to the Alarm shape Chrome would\n * return (with `scheduledTime` synthesized at lookup time), or\n * undefined if no alarm with that name exists. Mirrors the contract\n * the `ensureQueueAlarm` SW-module-top-level helper checks (\"is this\n * alarm already present with the right period?\") — see\n * the extension's background entrypoint.\n */\n get(name: string): Promise<chrome.alarms.Alarm | undefined>;\n clear(name: string): Promise<boolean>;\n onAlarm: {\n addListener(listener: AlarmListener): void;\n removeListener(listener: AlarmListener): void;\n hasListener(listener: AlarmListener): boolean;\n hasListeners(): boolean;\n };\n };\n /**\n * Test helpers — not part of the real chrome surface. Lets tests\n * simulate a content script issuing `chrome.runtime.sendMessage` from\n * inside a specific tab (chrome auto-tags `sender.tab.id` in that\n * direction) and remove a tab so `chrome.tabs.sendMessage` rejects\n * the way real chrome does when the receiver is gone.\n */\n __test: {\n /** Simulate a content-script broadcast tagged with `sender.tab.id`. */\n sendFromTab(tabId: number, message: unknown): Promise<unknown>;\n /** Mark a tab as gone — `chrome.tabs.sendMessage(tabId, …)` will reject. */\n removeTab(tabId: number): void;\n /** Mark a tab as alive (default for any tabId that hasn't been removed). */\n addTab(tabId: number): void;\n /** Fire an alarm — invokes every onAlarm listener with `{ name, ...}`. */\n fireAlarm(name: string): void;\n /** Snapshot the alarm registry — tests assert on created/cleared alarms. */\n getAlarms(): readonly string[];\n /** Fire `chrome.tabs.onActivated` — drives every listener. */\n fireTabActivated(info: chrome.tabs.OnActivatedInfo): void;\n /** Fire `chrome.tabs.onUpdated` — drives every listener. */\n fireTabUpdated(\n tabId: number,\n changeInfo: chrome.tabs.OnUpdatedInfo,\n tab: chrome.tabs.Tab,\n ): void;\n /** Fire `chrome.tabs.onRemoved` — drives every listener. */\n fireTabRemoved(tabId: number, removeInfo: chrome.tabs.OnRemovedInfo): void;\n };\n}\n\nexport function fakeChrome(): FakeChrome {\n const data = new Map<string, unknown>();\n\n // ─── chrome.storage.onChanged — top-level event ───────────────────────\n //\n // Real chrome emits `changes` keyed by every key that actually changed\n // (oldValue / newValue present). Unchanged keys aren't included. The\n // fake mirrors that: build the change map inside set/remove/clear, fire\n // listeners only if the map is non-empty. AreaName is \"local\" here —\n // the fake only models storage.local; if a future test reaches for\n // session/sync, add a per-area fake with its own onChanged.\n const storageListeners = new Set<StorageChangeListener>();\n function deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== typeof b) return false;\n if (typeof a !== \"object\" || a === null || b === null) return false;\n return JSON.stringify(a) === JSON.stringify(b);\n }\n function fireStorageChange(\n changes: Record<string, chrome.storage.StorageChange>,\n ): void {\n if (Object.keys(changes).length === 0) return;\n for (const listener of Array.from(storageListeners)) {\n listener(changes, \"local\");\n }\n }\n\n const partial = {\n async get(\n keys?: string | string[] | Record<string, unknown> | null,\n ): Promise<Record<string, unknown>> {\n // get() → all entries\n // get(\"k\") → { k: v } if present, {} otherwise\n // get([\"k1\",\"k2\"]) → { k: v } for present keys\n // get({ k: default}) → { k: v ?? default } per key\n if (keys === undefined || keys === null) {\n return Object.fromEntries(data);\n }\n if (typeof keys === \"string\") {\n const v = data.get(keys);\n return v === undefined ? {} : { [keys]: v };\n }\n if (Array.isArray(keys)) {\n return Object.fromEntries(\n keys.flatMap((k) => (data.has(k) ? [[k, data.get(k)]] : [])),\n );\n }\n const out: Record<string, unknown> = {};\n for (const [k, def] of Object.entries(keys)) {\n out[k] = data.has(k) ? data.get(k) : def;\n }\n return out;\n },\n async set(items: Record<string, unknown>): Promise<void> {\n const changes: Record<string, chrome.storage.StorageChange> = {};\n for (const [k, v] of Object.entries(items)) {\n const prev = data.get(k);\n // Real chrome only fires onChanged when the value actually\n // changes — match that to avoid spurious re-renders in tests.\n if (deepEqual(prev, v)) continue;\n const change: chrome.storage.StorageChange = { newValue: v };\n if (data.has(k)) change.oldValue = prev;\n changes[k] = change;\n data.set(k, v);\n }\n fireStorageChange(changes);\n },\n async remove(keys: string | string[]): Promise<void> {\n const arr = Array.isArray(keys) ? keys : [keys];\n const changes: Record<string, chrome.storage.StorageChange> = {};\n for (const k of arr) {\n if (!data.has(k)) continue;\n changes[k] = { oldValue: data.get(k) };\n data.delete(k);\n }\n fireStorageChange(changes);\n },\n async clear(): Promise<void> {\n const changes: Record<string, chrome.storage.StorageChange> = {};\n for (const [k, v] of data) changes[k] = { oldValue: v };\n data.clear();\n fireStorageChange(changes);\n },\n };\n\n // The full `chrome.storage.StorageArea` contract has more surface\n // (getBytesInUse, getKeys, onChanged event, setAccessLevel) than real\n // consumer tests currently exercise. The cast is local to this test util;\n // src/index.ts never casts. If a test needs more surface, implement it\n // here instead of widening the cast.\n const local = partial as unknown as chrome.storage.StorageArea;\n\n // ─── chrome.runtime — sendMessage + onMessage round-trip ───────────────\n //\n // The fake mirrors MV3 semantics that matter for the bridge:\n // - sendMessage delivers to EVERY onMessage listener in arrival order.\n // - The first listener that returns `true` (or calls sendResponse\n // synchronously) \"wins\" — its sendResponse value resolves the\n // sendMessage promise. Listeners that return false/undefined are\n // passed over.\n // - If no listener handles the message, sendMessage rejects with the\n // same shape chrome uses (\"Could not establish connection.\n // Receiving end does not exist.\"). The bridge's broadcast path\n // swallows this.\n const runtimeListeners = new Set<RuntimeListener>();\n\n // Tracks tabs that are \"alive\" from `chrome.tabs.sendMessage`'s point of\n // view. Unknown tabIds are treated as alive by default (matches the\n // common test path: assign a number, send to it). Tests can `removeTab`\n // to simulate disconnection.\n const removedTabs = new Set<number>();\n\n /**\n * Internal dispatch helper. Real chrome distinguishes:\n * - `chrome.runtime.sendMessage(msg)` — sender is the extension origin,\n * `sender.tab` is undefined; all `chrome.runtime.onMessage` listeners\n * hear it.\n * - `chrome.tabs.sendMessage(tabId, msg)` — sender is the extension\n * origin (still no `sender.tab` on the receiving end's view here, but\n * the routing is by tab); only listeners IN that tab receive it. Our\n * fake collapses to the same listener set since tests run a single\n * \"tab\" of listeners at a time. The routing assertion is enforced by\n * callers reading the envelope/tabId pair they sent.\n * - Content-script `chrome.runtime.sendMessage(msg)` (the `sendFromTab`\n * helper) — chrome auto-tags `sender.tab.id`. SW-side listeners use\n * this to filter cross-tab broadcasts.\n *\n * `sender` controls which sender object the listeners see.\n */\n const dispatch = (\n message: unknown,\n sender: chrome.runtime.MessageSender,\n ): Promise<unknown> => {\n return new Promise((resolve, reject) => {\n let responded = false;\n const sendResponse = (response: unknown): void => {\n if (responded) return;\n responded = true;\n resolve(response);\n };\n const snapshot = Array.from(runtimeListeners);\n let willRespondAsync = false;\n for (const listener of snapshot) {\n const r = listener(message, sender, sendResponse);\n if (r === true) willRespondAsync = true;\n if (responded) return;\n }\n if (willRespondAsync) return;\n reject(\n new Error(\n \"Could not establish connection. Receiving end does not exist.\",\n ),\n );\n });\n };\n\n const extensionSender: chrome.runtime.MessageSender =\n {} as chrome.runtime.MessageSender;\n\n const runtimePartial = {\n sendMessage(message: unknown): Promise<unknown> {\n return dispatch(message, extensionSender);\n },\n onMessage: {\n addListener(listener: RuntimeListener): void {\n runtimeListeners.add(listener);\n },\n removeListener(listener: RuntimeListener): void {\n runtimeListeners.delete(listener);\n },\n hasListener(listener: RuntimeListener): boolean {\n return runtimeListeners.has(listener);\n },\n hasListeners(): boolean {\n return runtimeListeners.size > 0;\n },\n },\n };\n\n const runtime = runtimePartial as unknown as FakeChrome[\"runtime\"];\n\n // ─── chrome.tabs.sendMessage — SW → content-script routing ─────────────\n //\n // Real chrome routes by tabId; the receiving content script's\n // `chrome.runtime.onMessage` fires with `sender` representing the\n // extension (no `sender.tab`). The fake collapses to the shared listener\n // set since tests run one runtime per process, but enforces the\n // \"tab gone\" reject so consumers can verify their fire-and-forget\n // posture.\n const tabsPartial = {\n sendMessage(tabId: number, message: unknown): Promise<unknown> {\n if (removedTabs.has(tabId)) {\n return Promise.reject(\n new Error(\n `Could not establish connection. Receiving end does not exist. (tabId=${tabId})`,\n ),\n );\n }\n return dispatch(message, extensionSender);\n },\n };\n\n // ─── chrome.tabs.on{Activated,Updated,Removed} — listener registries ────\n //\n // Tests drive fires via the __test helpers below. Production-code Sub\n // factories register/unregister; the fake only models the registry +\n // dispatch, not the chrome events themselves (no real tabs to observe).\n const tabActivatedListeners = new Set<TabActivatedListener>();\n const tabUpdatedListeners = new Set<TabUpdatedListener>();\n const tabRemovedListeners = new Set<TabRemovedListener>();\n\n const tabsFull = {\n ...tabsPartial,\n onActivated: {\n addListener(listener: TabActivatedListener): void {\n tabActivatedListeners.add(listener);\n },\n removeListener(listener: TabActivatedListener): void {\n tabActivatedListeners.delete(listener);\n },\n hasListener(listener: TabActivatedListener): boolean {\n return tabActivatedListeners.has(listener);\n },\n hasListeners(): boolean {\n return tabActivatedListeners.size > 0;\n },\n },\n onUpdated: {\n addListener(listener: TabUpdatedListener): void {\n tabUpdatedListeners.add(listener);\n },\n removeListener(listener: TabUpdatedListener): void {\n tabUpdatedListeners.delete(listener);\n },\n hasListener(listener: TabUpdatedListener): boolean {\n return tabUpdatedListeners.has(listener);\n },\n hasListeners(): boolean {\n return tabUpdatedListeners.size > 0;\n },\n },\n onRemoved: {\n addListener(listener: TabRemovedListener): void {\n tabRemovedListeners.add(listener);\n },\n removeListener(listener: TabRemovedListener): void {\n tabRemovedListeners.delete(listener);\n },\n hasListener(listener: TabRemovedListener): boolean {\n return tabRemovedListeners.has(listener);\n },\n hasListeners(): boolean {\n return tabRemovedListeners.size > 0;\n },\n },\n };\n\n const tabs = tabsFull as unknown as FakeChrome[\"tabs\"];\n\n // ─── chrome.alarms — listener registry + name-keyed alarm map ─────────\n //\n // create(name, info) stores `info` keyed by name (dedupe on repeat —\n // matches real chrome's behavior of replacing the prior alarm). clear()\n // removes from the map and resolves to `true` if the alarm existed,\n // `false` otherwise (matches real chrome's contract). onAlarm is a\n // standard listener registry. The fake does NOT auto-fire alarms based\n // on `periodInMinutes` — tests drive fires deterministically via\n // `__test.fireAlarm(name)`.\n const alarmMap = new Map<string, chrome.alarms.AlarmCreateInfo>();\n const alarmListeners = new Set<AlarmListener>();\n\n const alarms: FakeChrome[\"alarms\"] = {\n create(name: string, alarmInfo: chrome.alarms.AlarmCreateInfo): void {\n alarmMap.set(name, alarmInfo);\n },\n async get(name: string): Promise<chrome.alarms.Alarm | undefined> {\n const info = alarmMap.get(name);\n if (info === undefined) return undefined;\n return {\n name,\n scheduledTime: Date.now(),\n periodInMinutes: info.periodInMinutes,\n };\n },\n async clear(name: string): Promise<boolean> {\n return alarmMap.delete(name);\n },\n onAlarm: {\n addListener(listener: AlarmListener): void {\n alarmListeners.add(listener);\n },\n removeListener(listener: AlarmListener): void {\n alarmListeners.delete(listener);\n },\n hasListener(listener: AlarmListener): boolean {\n return alarmListeners.has(listener);\n },\n hasListeners(): boolean {\n return alarmListeners.size > 0;\n },\n },\n };\n\n return {\n storage: {\n local,\n onChanged: {\n addListener(listener: StorageChangeListener): void {\n storageListeners.add(listener);\n },\n removeListener(listener: StorageChangeListener): void {\n storageListeners.delete(listener);\n },\n hasListener(listener: StorageChangeListener): boolean {\n return storageListeners.has(listener);\n },\n hasListeners(): boolean {\n return storageListeners.size > 0;\n },\n },\n },\n runtime,\n tabs,\n alarms,\n __test: {\n sendFromTab(tabId: number, message: unknown): Promise<unknown> {\n const taggedSender = {\n tab: { id: tabId },\n } as chrome.runtime.MessageSender;\n return dispatch(message, taggedSender);\n },\n removeTab(tabId: number): void {\n removedTabs.add(tabId);\n },\n addTab(tabId: number): void {\n removedTabs.delete(tabId);\n },\n fireAlarm(name: string): void {\n const info = alarmMap.get(name);\n if (info === undefined) return;\n // Real chrome's Alarm shape carries `name`, `scheduledTime`, and\n // `periodInMinutes`. The fake stamps `scheduledTime` at fire time\n // and forwards the period from the create call.\n const alarm: chrome.alarms.Alarm = {\n name,\n scheduledTime: Date.now(),\n periodInMinutes: info.periodInMinutes,\n };\n for (const listener of Array.from(alarmListeners)) {\n listener(alarm);\n }\n },\n getAlarms(): readonly string[] {\n return Array.from(alarmMap.keys());\n },\n fireTabActivated(info: chrome.tabs.OnActivatedInfo): void {\n for (const listener of Array.from(tabActivatedListeners)) {\n listener(info);\n }\n },\n fireTabUpdated(\n tabId: number,\n changeInfo: chrome.tabs.OnUpdatedInfo,\n tab: chrome.tabs.Tab,\n ): void {\n for (const listener of Array.from(tabUpdatedListeners)) {\n listener(tabId, changeInfo, tab);\n }\n },\n fireTabRemoved(\n tabId: number,\n removeInfo: chrome.tabs.OnRemovedInfo,\n ): void {\n for (const listener of Array.from(tabRemovedListeners)) {\n listener(tabId, removeInfo);\n }\n },\n },\n };\n}\n"]}
@@ -1,5 +0,0 @@
1
- export { createFanOut, initFanOut, isComplete } from '../chunk-D736QUGF.js';
2
- import '../chunk-MU6MCIAC.js';
3
- import '../chunk-FV3Z5MBE.js';
4
- //# sourceMappingURL=index.js.map
5
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}