tempest-react-sdk 0.78.0 → 0.79.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 (1585) hide show
  1. package/README.md +6 -6
  2. package/bin/lib/openapi/generate.mjs +168 -64
  3. package/bin/lib/openapi/generate.pagination.test.mjs +3 -2
  4. package/bin/lib/openapi/generate.test.mjs +263 -1
  5. package/dist/access/Can.cjs.map +1 -1
  6. package/dist/access/Can.js.map +1 -1
  7. package/dist/access/access-control-context.cjs.map +1 -1
  8. package/dist/access/access-control-context.js.map +1 -1
  9. package/dist/access/create-role-access-control.cjs.map +1 -1
  10. package/dist/access/create-role-access-control.js.map +1 -1
  11. package/dist/access/permissions-from-token.cjs.map +1 -1
  12. package/dist/access/permissions-from-token.js.map +1 -1
  13. package/dist/access/use-can.cjs.map +1 -1
  14. package/dist/access/use-can.js.map +1 -1
  15. package/dist/app/AppProviders.cjs.map +1 -1
  16. package/dist/app/AppProviders.js.map +1 -1
  17. package/dist/audio/audio-bus.cjs.map +1 -1
  18. package/dist/audio/audio-bus.js.map +1 -1
  19. package/dist/audio/audio-output.cjs.map +1 -1
  20. package/dist/audio/audio-output.js.map +1 -1
  21. package/dist/audio/audio-player.cjs.map +1 -1
  22. package/dist/audio/audio-player.js.map +1 -1
  23. package/dist/audio/audio-recorder.cjs.map +1 -1
  24. package/dist/audio/audio-recorder.js.map +1 -1
  25. package/dist/audio/duration.cjs.map +1 -1
  26. package/dist/audio/duration.js.map +1 -1
  27. package/dist/audio/level-meter.cjs.map +1 -1
  28. package/dist/audio/level-meter.js.map +1 -1
  29. package/dist/audio/media-access.cjs.map +1 -1
  30. package/dist/audio/media-access.js.map +1 -1
  31. package/dist/audio/noise-floor.cjs.map +1 -1
  32. package/dist/audio/noise-floor.js.map +1 -1
  33. package/dist/audio/sfx-pool.cjs.map +1 -1
  34. package/dist/audio/sfx-pool.js.map +1 -1
  35. package/dist/audio/use-audio-bus.cjs.map +1 -1
  36. package/dist/audio/use-audio-bus.js.map +1 -1
  37. package/dist/audio/use-audio-recorder.cjs.map +1 -1
  38. package/dist/audio/use-audio-recorder.js.map +1 -1
  39. package/dist/audio/use-audio.cjs.map +1 -1
  40. package/dist/audio/use-audio.js.map +1 -1
  41. package/dist/audio/use-microphone.cjs +1 -1
  42. package/dist/audio/use-microphone.cjs.map +1 -1
  43. package/dist/audio/use-microphone.js +1 -5
  44. package/dist/audio/use-microphone.js.map +1 -1
  45. package/dist/audio/use-sfx-pool.cjs.map +1 -1
  46. package/dist/audio/use-sfx-pool.js.map +1 -1
  47. package/dist/audio/voice-activity.cjs.map +1 -1
  48. package/dist/audio/voice-activity.js.map +1 -1
  49. package/dist/audio/voice-chain-stages.cjs.map +1 -1
  50. package/dist/audio/voice-chain-stages.js.map +1 -1
  51. package/dist/audio/voice-chain.cjs.map +1 -1
  52. package/dist/audio/voice-chain.js.map +1 -1
  53. package/dist/audio/wav.cjs.map +1 -1
  54. package/dist/audio/wav.js.map +1 -1
  55. package/dist/auth/AuthGuard.cjs.map +1 -1
  56. package/dist/auth/AuthGuard.js.map +1 -1
  57. package/dist/auth/create-auth-store.cjs.map +1 -1
  58. package/dist/auth/create-auth-store.js.map +1 -1
  59. package/dist/auth/create-tempest-auth.cjs +1 -1
  60. package/dist/auth/create-tempest-auth.cjs.map +1 -1
  61. package/dist/auth/create-tempest-auth.js +1 -3
  62. package/dist/auth/create-tempest-auth.js.map +1 -1
  63. package/dist/auth/jwt.cjs.map +1 -1
  64. package/dist/auth/jwt.js.map +1 -1
  65. package/dist/auth/lazy-with-retry.cjs.map +1 -1
  66. package/dist/auth/lazy-with-retry.js.map +1 -1
  67. package/dist/auth/passkey.cjs.map +1 -1
  68. package/dist/auth/passkey.js.map +1 -1
  69. package/dist/auth/refresh-queue.cjs.map +1 -1
  70. package/dist/auth/refresh-queue.js.map +1 -1
  71. package/dist/auth/use-passkey.cjs +1 -1
  72. package/dist/auth/use-passkey.cjs.map +1 -1
  73. package/dist/auth/use-passkey.js +1 -1
  74. package/dist/auth/use-passkey.js.map +1 -1
  75. package/dist/br/BrazilMap.cjs.map +1 -1
  76. package/dist/br/BrazilMap.js.map +1 -1
  77. package/dist/br/BrazilMap.module.cjs.map +1 -1
  78. package/dist/br/BrazilMap.module.js.map +1 -1
  79. package/dist/br/BrazilStateCitySelect.cjs.map +1 -1
  80. package/dist/br/BrazilStateCitySelect.js.map +1 -1
  81. package/dist/br/BrazilStateMap.cjs.map +1 -1
  82. package/dist/br/BrazilStateMap.js.map +1 -1
  83. package/dist/br/MapLegend.cjs.map +1 -1
  84. package/dist/br/MapLegend.js.map +1 -1
  85. package/dist/br/MapLegend.module.cjs.map +1 -1
  86. package/dist/br/MapLegend.module.js.map +1 -1
  87. package/dist/br/MapMarkers.cjs.map +1 -1
  88. package/dist/br/MapMarkers.js.map +1 -1
  89. package/dist/br/MapTooltip.cjs.map +1 -1
  90. package/dist/br/MapTooltip.js.map +1 -1
  91. package/dist/br/MunicipalitySearch.cjs +1 -1
  92. package/dist/br/MunicipalitySearch.cjs.map +1 -1
  93. package/dist/br/MunicipalitySearch.js +2 -5
  94. package/dist/br/MunicipalitySearch.js.map +1 -1
  95. package/dist/br/MunicipalitySearch.module.cjs.map +1 -1
  96. package/dist/br/MunicipalitySearch.module.js.map +1 -1
  97. package/dist/br/PixQRCode.cjs.map +1 -1
  98. package/dist/br/PixQRCode.js.map +1 -1
  99. package/dist/br/PixQRCode.module.cjs.map +1 -1
  100. package/dist/br/PixQRCode.module.js.map +1 -1
  101. package/dist/br/boleto.cjs.map +1 -1
  102. package/dist/br/boleto.js.map +1 -1
  103. package/dist/br/br-geo.cjs.map +1 -1
  104. package/dist/br/br-geo.js.map +1 -1
  105. package/dist/br/data/br-centroids.cjs.map +1 -1
  106. package/dist/br/data/br-centroids.js.map +1 -1
  107. package/dist/br/data/br-locations.cjs.map +1 -1
  108. package/dist/br/data/br-locations.js.map +1 -1
  109. package/dist/br/data/br-uf-geo.cjs.map +1 -1
  110. package/dist/br/data/br-uf-geo.js.map +1 -1
  111. package/dist/br/data/mun/AC.cjs.map +1 -1
  112. package/dist/br/data/mun/AC.js.map +1 -1
  113. package/dist/br/data/mun/AL.cjs.map +1 -1
  114. package/dist/br/data/mun/AL.js.map +1 -1
  115. package/dist/br/data/mun/AM.cjs.map +1 -1
  116. package/dist/br/data/mun/AM.js.map +1 -1
  117. package/dist/br/data/mun/AP.cjs.map +1 -1
  118. package/dist/br/data/mun/AP.js.map +1 -1
  119. package/dist/br/data/mun/BA.cjs.map +1 -1
  120. package/dist/br/data/mun/BA.js.map +1 -1
  121. package/dist/br/data/mun/CE.cjs.map +1 -1
  122. package/dist/br/data/mun/CE.js.map +1 -1
  123. package/dist/br/data/mun/DF.cjs.map +1 -1
  124. package/dist/br/data/mun/DF.js.map +1 -1
  125. package/dist/br/data/mun/ES.cjs.map +1 -1
  126. package/dist/br/data/mun/ES.js.map +1 -1
  127. package/dist/br/data/mun/GO.cjs.map +1 -1
  128. package/dist/br/data/mun/GO.js.map +1 -1
  129. package/dist/br/data/mun/MA.cjs.map +1 -1
  130. package/dist/br/data/mun/MA.js.map +1 -1
  131. package/dist/br/data/mun/MG.cjs.map +1 -1
  132. package/dist/br/data/mun/MG.js.map +1 -1
  133. package/dist/br/data/mun/MS.cjs.map +1 -1
  134. package/dist/br/data/mun/MS.js.map +1 -1
  135. package/dist/br/data/mun/MT.cjs.map +1 -1
  136. package/dist/br/data/mun/MT.js.map +1 -1
  137. package/dist/br/data/mun/PA.cjs.map +1 -1
  138. package/dist/br/data/mun/PA.js.map +1 -1
  139. package/dist/br/data/mun/PB.cjs.map +1 -1
  140. package/dist/br/data/mun/PB.js.map +1 -1
  141. package/dist/br/data/mun/PE.cjs.map +1 -1
  142. package/dist/br/data/mun/PE.js.map +1 -1
  143. package/dist/br/data/mun/PI.cjs.map +1 -1
  144. package/dist/br/data/mun/PI.js.map +1 -1
  145. package/dist/br/data/mun/PR.cjs.map +1 -1
  146. package/dist/br/data/mun/PR.js.map +1 -1
  147. package/dist/br/data/mun/RJ.cjs.map +1 -1
  148. package/dist/br/data/mun/RJ.js.map +1 -1
  149. package/dist/br/data/mun/RN.cjs.map +1 -1
  150. package/dist/br/data/mun/RN.js.map +1 -1
  151. package/dist/br/data/mun/RO.cjs.map +1 -1
  152. package/dist/br/data/mun/RO.js.map +1 -1
  153. package/dist/br/data/mun/RR.cjs.map +1 -1
  154. package/dist/br/data/mun/RR.js.map +1 -1
  155. package/dist/br/data/mun/RS.cjs.map +1 -1
  156. package/dist/br/data/mun/RS.js.map +1 -1
  157. package/dist/br/data/mun/SC.cjs.map +1 -1
  158. package/dist/br/data/mun/SC.js.map +1 -1
  159. package/dist/br/data/mun/SE.cjs.map +1 -1
  160. package/dist/br/data/mun/SE.js.map +1 -1
  161. package/dist/br/data/mun/SP.cjs.map +1 -1
  162. package/dist/br/data/mun/SP.js.map +1 -1
  163. package/dist/br/data/mun/TO.cjs.map +1 -1
  164. package/dist/br/data/mun/TO.js.map +1 -1
  165. package/dist/br/geocode.cjs.map +1 -1
  166. package/dist/br/geocode.js.map +1 -1
  167. package/dist/br/holidays.cjs.map +1 -1
  168. package/dist/br/holidays.js.map +1 -1
  169. package/dist/br/locations.cjs.map +1 -1
  170. package/dist/br/locations.js.map +1 -1
  171. package/dist/br/nfe.cjs.map +1 -1
  172. package/dist/br/nfe.js.map +1 -1
  173. package/dist/br/pix.cjs +1 -1
  174. package/dist/br/pix.cjs.map +1 -1
  175. package/dist/br/pix.js +108 -74
  176. package/dist/br/pix.js.map +1 -1
  177. package/dist/br/regions.cjs.map +1 -1
  178. package/dist/br/regions.js.map +1 -1
  179. package/dist/br/scales.cjs.map +1 -1
  180. package/dist/br/scales.js.map +1 -1
  181. package/dist/br/state-geo.cjs.map +1 -1
  182. package/dist/br/state-geo.js.map +1 -1
  183. package/dist/br/svg-utils.cjs.map +1 -1
  184. package/dist/br/svg-utils.js.map +1 -1
  185. package/dist/br/use-map-hover.cjs.map +1 -1
  186. package/dist/br/use-map-hover.js.map +1 -1
  187. package/dist/br/use-map-zoom.cjs.map +1 -1
  188. package/dist/br/use-map-zoom.js.map +1 -1
  189. package/dist/br/whatsapp.cjs.map +1 -1
  190. package/dist/br/whatsapp.js.map +1 -1
  191. package/dist/br.cjs.map +1 -1
  192. package/dist/br.d.ts +6 -2
  193. package/dist/br.js.map +1 -1
  194. package/dist/capture/barcode.cjs.map +1 -1
  195. package/dist/capture/barcode.js.map +1 -1
  196. package/dist/capture/media-recorder.cjs.map +1 -1
  197. package/dist/capture/media-recorder.js.map +1 -1
  198. package/dist/capture/use-barcode-scanner.cjs.map +1 -1
  199. package/dist/capture/use-barcode-scanner.js.map +1 -1
  200. package/dist/capture/use-screen-capture.cjs +1 -1
  201. package/dist/capture/use-screen-capture.cjs.map +1 -1
  202. package/dist/capture/use-screen-capture.js +1 -7
  203. package/dist/capture/use-screen-capture.js.map +1 -1
  204. package/dist/capture/use-speech-recognition.cjs +1 -1
  205. package/dist/capture/use-speech-recognition.cjs.map +1 -1
  206. package/dist/capture/use-speech-recognition.js +35 -36
  207. package/dist/capture/use-speech-recognition.js.map +1 -1
  208. package/dist/capture/use-torch.cjs.map +1 -1
  209. package/dist/capture/use-torch.js.map +1 -1
  210. package/dist/capture/use-video-recorder.cjs.map +1 -1
  211. package/dist/capture/use-video-recorder.js.map +1 -1
  212. package/dist/capture/video-recorder.cjs.map +1 -1
  213. package/dist/capture/video-recorder.js.map +1 -1
  214. package/dist/charts/AreaChart.cjs.map +1 -1
  215. package/dist/charts/AreaChart.js.map +1 -1
  216. package/dist/charts/BarChart.cjs.map +1 -1
  217. package/dist/charts/BarChart.js.map +1 -1
  218. package/dist/charts/LineChart.cjs.map +1 -1
  219. package/dist/charts/LineChart.js.map +1 -1
  220. package/dist/charts/PieChart.cjs.map +1 -1
  221. package/dist/charts/PieChart.js.map +1 -1
  222. package/dist/charts/RadarChart.cjs.map +1 -1
  223. package/dist/charts/RadarChart.js.map +1 -1
  224. package/dist/charts/palette.cjs.map +1 -1
  225. package/dist/charts/palette.js.map +1 -1
  226. package/dist/charts/scales.cjs.map +1 -1
  227. package/dist/charts/scales.js.map +1 -1
  228. package/dist/charts/types.cjs.map +1 -1
  229. package/dist/charts/types.js.map +1 -1
  230. package/dist/charts/use-chart-colors.cjs.map +1 -1
  231. package/dist/charts/use-chart-colors.js.map +1 -1
  232. package/dist/components/AIChat/AIChat.cjs +1 -1
  233. package/dist/components/AIChat/AIChat.cjs.map +1 -1
  234. package/dist/components/AIChat/AIChat.js +1 -5
  235. package/dist/components/AIChat/AIChat.js.map +1 -1
  236. package/dist/components/AIChat/AIChat.module.cjs.map +1 -1
  237. package/dist/components/AIChat/AIChat.module.js.map +1 -1
  238. package/dist/components/AIChat/AIChatComposer.cjs +1 -1
  239. package/dist/components/AIChat/AIChatComposer.cjs.map +1 -1
  240. package/dist/components/AIChat/AIChatComposer.js +1 -7
  241. package/dist/components/AIChat/AIChatComposer.js.map +1 -1
  242. package/dist/components/AIChat/AIChatTurn.cjs.map +1 -1
  243. package/dist/components/AIChat/AIChatTurn.js.map +1 -1
  244. package/dist/components/AIChat/ai-chat-turns.cjs.map +1 -1
  245. package/dist/components/AIChat/ai-chat-turns.js.map +1 -1
  246. package/dist/components/Accordion/Accordion.cjs.map +1 -1
  247. package/dist/components/Accordion/Accordion.js.map +1 -1
  248. package/dist/components/Accordion/Accordion.module.cjs.map +1 -1
  249. package/dist/components/Accordion/Accordion.module.js.map +1 -1
  250. package/dist/components/Alert/Alert.cjs.map +1 -1
  251. package/dist/components/Alert/Alert.js.map +1 -1
  252. package/dist/components/Alert/Alert.module.cjs.map +1 -1
  253. package/dist/components/Alert/Alert.module.js.map +1 -1
  254. package/dist/components/AppBar/AppBar.cjs.map +1 -1
  255. package/dist/components/AppBar/AppBar.js.map +1 -1
  256. package/dist/components/AppBar/AppBar.module.cjs.map +1 -1
  257. package/dist/components/AppBar/AppBar.module.js.map +1 -1
  258. package/dist/components/AppBar/use-sticky-body-warning.cjs +1 -1
  259. package/dist/components/AppBar/use-sticky-body-warning.cjs.map +1 -1
  260. package/dist/components/AppBar/use-sticky-body-warning.js +1 -1
  261. package/dist/components/AppBar/use-sticky-body-warning.js.map +1 -1
  262. package/dist/components/AppShell/AppShell.cjs.map +1 -1
  263. package/dist/components/AppShell/AppShell.js.map +1 -1
  264. package/dist/components/AppShell/AppShell.module.cjs.map +1 -1
  265. package/dist/components/AppShell/AppShell.module.js.map +1 -1
  266. package/dist/components/AspectRatio/AspectRatio.cjs.map +1 -1
  267. package/dist/components/AspectRatio/AspectRatio.js.map +1 -1
  268. package/dist/components/AspectRatio/AspectRatio.module.cjs.map +1 -1
  269. package/dist/components/AspectRatio/AspectRatio.module.js.map +1 -1
  270. package/dist/components/AudioPlayer/AudioPlayer.cjs +1 -1
  271. package/dist/components/AudioPlayer/AudioPlayer.cjs.map +1 -1
  272. package/dist/components/AudioPlayer/AudioPlayer.js +1 -7
  273. package/dist/components/AudioPlayer/AudioPlayer.js.map +1 -1
  274. package/dist/components/AudioPlayer/AudioPlayer.module.cjs.map +1 -1
  275. package/dist/components/AudioPlayer/AudioPlayer.module.js.map +1 -1
  276. package/dist/components/AudioRecorder/AudioRecorder.cjs +1 -1
  277. package/dist/components/AudioRecorder/AudioRecorder.cjs.map +1 -1
  278. package/dist/components/AudioRecorder/AudioRecorder.js +16 -21
  279. package/dist/components/AudioRecorder/AudioRecorder.js.map +1 -1
  280. package/dist/components/AudioRecorder/AudioRecorder.module.cjs.map +1 -1
  281. package/dist/components/AudioRecorder/AudioRecorder.module.js.map +1 -1
  282. package/dist/components/Avatar/Avatar.cjs.map +1 -1
  283. package/dist/components/Avatar/Avatar.js.map +1 -1
  284. package/dist/components/Avatar/Avatar.module.cjs.map +1 -1
  285. package/dist/components/Avatar/Avatar.module.js.map +1 -1
  286. package/dist/components/AvatarGroup/AvatarGroup.cjs.map +1 -1
  287. package/dist/components/AvatarGroup/AvatarGroup.js.map +1 -1
  288. package/dist/components/AvatarGroup/AvatarGroup.module.cjs.map +1 -1
  289. package/dist/components/AvatarGroup/AvatarGroup.module.js.map +1 -1
  290. package/dist/components/Badge/Badge.cjs.map +1 -1
  291. package/dist/components/Badge/Badge.js.map +1 -1
  292. package/dist/components/Badge/Badge.module.cjs.map +1 -1
  293. package/dist/components/Badge/Badge.module.js.map +1 -1
  294. package/dist/components/Banner/Banner.cjs.map +1 -1
  295. package/dist/components/Banner/Banner.js.map +1 -1
  296. package/dist/components/Banner/Banner.module.cjs.map +1 -1
  297. package/dist/components/Banner/Banner.module.js.map +1 -1
  298. package/dist/components/BarList/BarList.cjs.map +1 -1
  299. package/dist/components/BarList/BarList.js.map +1 -1
  300. package/dist/components/BarList/BarList.module.cjs.map +1 -1
  301. package/dist/components/BarList/BarList.module.js.map +1 -1
  302. package/dist/components/BarList/bar-list-model.cjs.map +1 -1
  303. package/dist/components/BarList/bar-list-model.js.map +1 -1
  304. package/dist/components/BarcodeScanner/BarcodeScanner.cjs.map +1 -1
  305. package/dist/components/BarcodeScanner/BarcodeScanner.js.map +1 -1
  306. package/dist/components/BarcodeScanner/BarcodeScanner.module.cjs.map +1 -1
  307. package/dist/components/BarcodeScanner/BarcodeScanner.module.js.map +1 -1
  308. package/dist/components/BottomNavigation/BottomNavigation.cjs.map +1 -1
  309. package/dist/components/BottomNavigation/BottomNavigation.js.map +1 -1
  310. package/dist/components/BottomNavigation/BottomNavigation.module.cjs.map +1 -1
  311. package/dist/components/BottomNavigation/BottomNavigation.module.js.map +1 -1
  312. package/dist/components/BottomSheet/BottomSheet.cjs.map +1 -1
  313. package/dist/components/BottomSheet/BottomSheet.js.map +1 -1
  314. package/dist/components/BottomSheet/BottomSheet.module.cjs.map +1 -1
  315. package/dist/components/BottomSheet/BottomSheet.module.js.map +1 -1
  316. package/dist/components/Breadcrumbs/Breadcrumbs.cjs.map +1 -1
  317. package/dist/components/Breadcrumbs/Breadcrumbs.js.map +1 -1
  318. package/dist/components/Breadcrumbs/Breadcrumbs.module.cjs.map +1 -1
  319. package/dist/components/Breadcrumbs/Breadcrumbs.module.js.map +1 -1
  320. package/dist/components/Button/Button.cjs.map +1 -1
  321. package/dist/components/Button/Button.js.map +1 -1
  322. package/dist/components/Button/Button.module.cjs.map +1 -1
  323. package/dist/components/Button/Button.module.js.map +1 -1
  324. package/dist/components/Button/ButtonContent.cjs.map +1 -1
  325. package/dist/components/Button/ButtonContent.js.map +1 -1
  326. package/dist/components/Button/ButtonSlot.cjs.map +1 -1
  327. package/dist/components/Button/ButtonSlot.js.map +1 -1
  328. package/dist/components/Button/button-class.cjs.map +1 -1
  329. package/dist/components/Button/button-class.js.map +1 -1
  330. package/dist/components/Button/link-rel.cjs.map +1 -1
  331. package/dist/components/Button/link-rel.js.map +1 -1
  332. package/dist/components/Button/slot.cjs.map +1 -1
  333. package/dist/components/Button/slot.js.map +1 -1
  334. package/dist/components/Calendar/Calendar.cjs.map +1 -1
  335. package/dist/components/Calendar/Calendar.js.map +1 -1
  336. package/dist/components/Calendar/Calendar.module.cjs.map +1 -1
  337. package/dist/components/Calendar/Calendar.module.js.map +1 -1
  338. package/dist/components/Card/Card.cjs.map +1 -1
  339. package/dist/components/Card/Card.js.map +1 -1
  340. package/dist/components/Card/Card.module.cjs.map +1 -1
  341. package/dist/components/Card/Card.module.js.map +1 -1
  342. package/dist/components/Carousel/Carousel.cjs.map +1 -1
  343. package/dist/components/Carousel/Carousel.js.map +1 -1
  344. package/dist/components/Carousel/Carousel.module.cjs.map +1 -1
  345. package/dist/components/Carousel/Carousel.module.js.map +1 -1
  346. package/dist/components/Center/Center.cjs.map +1 -1
  347. package/dist/components/Center/Center.js.map +1 -1
  348. package/dist/components/Center/Center.module.cjs.map +1 -1
  349. package/dist/components/Center/Center.module.js.map +1 -1
  350. package/dist/components/Chat/Chat.cjs.map +1 -1
  351. package/dist/components/Chat/Chat.js.map +1 -1
  352. package/dist/components/Chat/Chat.module.cjs.map +1 -1
  353. package/dist/components/Chat/Chat.module.js.map +1 -1
  354. package/dist/components/Chat/ChatActionsMenu.cjs.map +1 -1
  355. package/dist/components/Chat/ChatActionsMenu.js.map +1 -1
  356. package/dist/components/Chat/ChatAttachments.cjs.map +1 -1
  357. package/dist/components/Chat/ChatAttachments.js.map +1 -1
  358. package/dist/components/Chat/ChatBubble.cjs.map +1 -1
  359. package/dist/components/Chat/ChatBubble.js.map +1 -1
  360. package/dist/components/Chat/ChatComposer.cjs.map +1 -1
  361. package/dist/components/Chat/ChatComposer.js.map +1 -1
  362. package/dist/components/Chat/chat-groups.cjs +1 -1
  363. package/dist/components/Chat/chat-groups.cjs.map +1 -1
  364. package/dist/components/Chat/chat-groups.js +2 -6
  365. package/dist/components/Chat/chat-groups.js.map +1 -1
  366. package/dist/components/Chat/chat-receipt.cjs.map +1 -1
  367. package/dist/components/Chat/chat-receipt.js.map +1 -1
  368. package/dist/components/Checkbox/Checkbox.cjs.map +1 -1
  369. package/dist/components/Checkbox/Checkbox.js.map +1 -1
  370. package/dist/components/Checkbox/Checkbox.module.cjs.map +1 -1
  371. package/dist/components/Checkbox/Checkbox.module.js.map +1 -1
  372. package/dist/components/ChipInput/ChipInput.cjs +1 -1
  373. package/dist/components/ChipInput/ChipInput.cjs.map +1 -1
  374. package/dist/components/ChipInput/ChipInput.js +2 -12
  375. package/dist/components/ChipInput/ChipInput.js.map +1 -1
  376. package/dist/components/ChipInput/ChipInput.module.cjs.map +1 -1
  377. package/dist/components/ChipInput/ChipInput.module.js.map +1 -1
  378. package/dist/components/ClickOutside/ClickOutside.cjs.map +1 -1
  379. package/dist/components/ClickOutside/ClickOutside.js.map +1 -1
  380. package/dist/components/CodeBlock/CodeBlock.cjs.map +1 -1
  381. package/dist/components/CodeBlock/CodeBlock.js.map +1 -1
  382. package/dist/components/CodeBlock/CodeBlock.module.cjs.map +1 -1
  383. package/dist/components/CodeBlock/CodeBlock.module.js.map +1 -1
  384. package/dist/components/CodeBlock/tokenize.cjs.map +1 -1
  385. package/dist/components/CodeBlock/tokenize.js.map +1 -1
  386. package/dist/components/Collapsible/Collapsible.cjs.map +1 -1
  387. package/dist/components/Collapsible/Collapsible.js.map +1 -1
  388. package/dist/components/Collapsible/Collapsible.module.cjs.map +1 -1
  389. package/dist/components/Collapsible/Collapsible.module.js.map +1 -1
  390. package/dist/components/Combobox/Combobox.cjs.map +1 -1
  391. package/dist/components/Combobox/Combobox.js.map +1 -1
  392. package/dist/components/Combobox/Combobox.module.cjs.map +1 -1
  393. package/dist/components/Combobox/Combobox.module.js.map +1 -1
  394. package/dist/components/Combobox/use-listbox-dismiss.cjs.map +1 -1
  395. package/dist/components/Combobox/use-listbox-dismiss.js.map +1 -1
  396. package/dist/components/Command/Command.cjs +1 -1
  397. package/dist/components/Command/Command.cjs.map +1 -1
  398. package/dist/components/Command/Command.js +4 -11
  399. package/dist/components/Command/Command.js.map +1 -1
  400. package/dist/components/Command/Command.module.cjs.map +1 -1
  401. package/dist/components/Command/Command.module.js.map +1 -1
  402. package/dist/components/ConditionalWrapper/ConditionalWrapper.cjs.map +1 -1
  403. package/dist/components/ConditionalWrapper/ConditionalWrapper.js.map +1 -1
  404. package/dist/components/ConfirmDialog/ConfirmDialog.cjs.map +1 -1
  405. package/dist/components/ConfirmDialog/ConfirmDialog.js.map +1 -1
  406. package/dist/components/ContextMenu/ContextMenu.cjs +1 -1
  407. package/dist/components/ContextMenu/ContextMenu.cjs.map +1 -1
  408. package/dist/components/ContextMenu/ContextMenu.js +1 -1
  409. package/dist/components/ContextMenu/ContextMenu.js.map +1 -1
  410. package/dist/components/ContextMenu/ContextMenu.module.cjs.map +1 -1
  411. package/dist/components/ContextMenu/ContextMenu.module.js.map +1 -1
  412. package/dist/components/CopyButton/CopyButton.cjs.map +1 -1
  413. package/dist/components/CopyButton/CopyButton.js.map +1 -1
  414. package/dist/components/CopyButton/CopyButton.module.cjs.map +1 -1
  415. package/dist/components/CopyButton/CopyButton.module.js.map +1 -1
  416. package/dist/components/DataList/DataList.cjs.map +1 -1
  417. package/dist/components/DataList/DataList.js.map +1 -1
  418. package/dist/components/DataList/DataList.module.cjs.map +1 -1
  419. package/dist/components/DataList/DataList.module.js.map +1 -1
  420. package/dist/components/DataTable/DataTable.cjs +1 -1
  421. package/dist/components/DataTable/DataTable.cjs.map +1 -1
  422. package/dist/components/DataTable/DataTable.js +6 -14
  423. package/dist/components/DataTable/DataTable.js.map +1 -1
  424. package/dist/components/DataTable/DataTable.module.cjs.map +1 -1
  425. package/dist/components/DataTable/DataTable.module.js.map +1 -1
  426. package/dist/components/DataTable/EditableCell.cjs +1 -1
  427. package/dist/components/DataTable/EditableCell.cjs.map +1 -1
  428. package/dist/components/DataTable/EditableCell.js +1 -9
  429. package/dist/components/DataTable/EditableCell.js.map +1 -1
  430. package/dist/components/DataTable/LoadingRows.cjs.map +1 -1
  431. package/dist/components/DataTable/LoadingRows.js.map +1 -1
  432. package/dist/components/DataTable/edit-labels.cjs.map +1 -1
  433. package/dist/components/DataTable/edit-labels.js.map +1 -1
  434. package/dist/components/DataTable/use-dev-warnings.cjs.map +1 -1
  435. package/dist/components/DataTable/use-dev-warnings.js.map +1 -1
  436. package/dist/components/DatePicker/DatePicker.cjs.map +1 -1
  437. package/dist/components/DatePicker/DatePicker.js.map +1 -1
  438. package/dist/components/DateRangePicker/DateRangePicker.cjs.map +1 -1
  439. package/dist/components/DateRangePicker/DateRangePicker.js.map +1 -1
  440. package/dist/components/DateRangePicker/DateRangePicker.module.cjs.map +1 -1
  441. package/dist/components/DateRangePicker/DateRangePicker.module.js.map +1 -1
  442. package/dist/components/DescriptionList/DescriptionList.cjs.map +1 -1
  443. package/dist/components/DescriptionList/DescriptionList.js.map +1 -1
  444. package/dist/components/DescriptionList/DescriptionList.module.cjs.map +1 -1
  445. package/dist/components/DescriptionList/DescriptionList.module.js.map +1 -1
  446. package/dist/components/Divider/Divider.cjs.map +1 -1
  447. package/dist/components/Divider/Divider.js.map +1 -1
  448. package/dist/components/Divider/Divider.module.cjs.map +1 -1
  449. package/dist/components/Divider/Divider.module.js.map +1 -1
  450. package/dist/components/Drawer/Drawer.cjs.map +1 -1
  451. package/dist/components/Drawer/Drawer.js.map +1 -1
  452. package/dist/components/Drawer/Drawer.module.cjs.map +1 -1
  453. package/dist/components/Drawer/Drawer.module.js.map +1 -1
  454. package/dist/components/DropdownMenu/DropdownMenu.cjs +1 -1
  455. package/dist/components/DropdownMenu/DropdownMenu.cjs.map +1 -1
  456. package/dist/components/DropdownMenu/DropdownMenu.js +2 -14
  457. package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -1
  458. package/dist/components/DropdownMenu/DropdownMenu.module.cjs.map +1 -1
  459. package/dist/components/DropdownMenu/DropdownMenu.module.js.map +1 -1
  460. package/dist/components/Dropzone/Dropzone.cjs.map +1 -1
  461. package/dist/components/Dropzone/Dropzone.js.map +1 -1
  462. package/dist/components/Dropzone/Dropzone.module.cjs.map +1 -1
  463. package/dist/components/Dropzone/Dropzone.module.js.map +1 -1
  464. package/dist/components/EmptyState/EmptyState.cjs.map +1 -1
  465. package/dist/components/EmptyState/EmptyState.js.map +1 -1
  466. package/dist/components/EmptyState/EmptyState.module.cjs.map +1 -1
  467. package/dist/components/EmptyState/EmptyState.module.js.map +1 -1
  468. package/dist/components/ErrorState/ErrorState.cjs.map +1 -1
  469. package/dist/components/ErrorState/ErrorState.js.map +1 -1
  470. package/dist/components/ErrorState/ErrorState.module.cjs.map +1 -1
  471. package/dist/components/ErrorState/ErrorState.module.js.map +1 -1
  472. package/dist/components/ErrorText/ErrorText.cjs.map +1 -1
  473. package/dist/components/ErrorText/ErrorText.js.map +1 -1
  474. package/dist/components/ErrorText/ErrorText.module.cjs.map +1 -1
  475. package/dist/components/ErrorText/ErrorText.module.js.map +1 -1
  476. package/dist/components/FileUpload/FileUpload.cjs +1 -1
  477. package/dist/components/FileUpload/FileUpload.cjs.map +1 -1
  478. package/dist/components/FileUpload/FileUpload.js +7 -17
  479. package/dist/components/FileUpload/FileUpload.js.map +1 -1
  480. package/dist/components/FileUpload/FileUpload.module.cjs.map +1 -1
  481. package/dist/components/FileUpload/FileUpload.module.js.map +1 -1
  482. package/dist/components/FilterBar/FilterBar.cjs.map +1 -1
  483. package/dist/components/FilterBar/FilterBar.js.map +1 -1
  484. package/dist/components/FilterBar/FilterBar.module.cjs.map +1 -1
  485. package/dist/components/FilterBar/FilterBar.module.js.map +1 -1
  486. package/dist/components/FilterBar/filter-apply.cjs.map +1 -1
  487. package/dist/components/FilterBar/filter-apply.js.map +1 -1
  488. package/dist/components/FilterBar/filter-model.cjs.map +1 -1
  489. package/dist/components/FilterBar/filter-model.js.map +1 -1
  490. package/dist/components/FilterBar/filter-query.cjs +1 -1
  491. package/dist/components/FilterBar/filter-query.cjs.map +1 -1
  492. package/dist/components/FilterBar/filter-query.js +2 -5
  493. package/dist/components/FilterBar/filter-query.js.map +1 -1
  494. package/dist/components/FilterPanel/FilterPanel.cjs.map +1 -1
  495. package/dist/components/FilterPanel/FilterPanel.js.map +1 -1
  496. package/dist/components/FilterPanel/FilterPanel.module.cjs.map +1 -1
  497. package/dist/components/FilterPanel/FilterPanel.module.js.map +1 -1
  498. package/dist/components/FloatingActionButton/FloatingActionButton.cjs.map +1 -1
  499. package/dist/components/FloatingActionButton/FloatingActionButton.js.map +1 -1
  500. package/dist/components/FloatingActionButton/FloatingActionButton.module.cjs.map +1 -1
  501. package/dist/components/FloatingActionButton/FloatingActionButton.module.js.map +1 -1
  502. package/dist/components/For/For.cjs.map +1 -1
  503. package/dist/components/For/For.js.map +1 -1
  504. package/dist/components/Form/Form.cjs.map +1 -1
  505. package/dist/components/Form/Form.js.map +1 -1
  506. package/dist/components/Form/Form.module.cjs.map +1 -1
  507. package/dist/components/Form/Form.module.js.map +1 -1
  508. package/dist/components/HoverCard/HoverCard.cjs.map +1 -1
  509. package/dist/components/HoverCard/HoverCard.js.map +1 -1
  510. package/dist/components/HoverCard/HoverCard.module.cjs.map +1 -1
  511. package/dist/components/HoverCard/HoverCard.module.js.map +1 -1
  512. package/dist/components/Image/Image.cjs.map +1 -1
  513. package/dist/components/Image/Image.js.map +1 -1
  514. package/dist/components/Image/Image.module.cjs.map +1 -1
  515. package/dist/components/Image/Image.module.js.map +1 -1
  516. package/dist/components/ImageCropper/ImageCropper.cjs +1 -1
  517. package/dist/components/ImageCropper/ImageCropper.cjs.map +1 -1
  518. package/dist/components/ImageCropper/ImageCropper.js +4 -8
  519. package/dist/components/ImageCropper/ImageCropper.js.map +1 -1
  520. package/dist/components/ImageCropper/ImageCropper.module.cjs.map +1 -1
  521. package/dist/components/ImageCropper/ImageCropper.module.js.map +1 -1
  522. package/dist/components/ImageCropper/crop-geometry.cjs.map +1 -1
  523. package/dist/components/ImageCropper/crop-geometry.js.map +1 -1
  524. package/dist/components/Input/Input.cjs.map +1 -1
  525. package/dist/components/Input/Input.js.map +1 -1
  526. package/dist/components/Input/Input.module.cjs.map +1 -1
  527. package/dist/components/Input/Input.module.js.map +1 -1
  528. package/dist/components/InstallBanner/InstallBanner.cjs.map +1 -1
  529. package/dist/components/InstallBanner/InstallBanner.js.map +1 -1
  530. package/dist/components/InstallBanner/InstallBanner.module.cjs.map +1 -1
  531. package/dist/components/InstallBanner/InstallBanner.module.js.map +1 -1
  532. package/dist/components/InstallButton/InstallButton.cjs.map +1 -1
  533. package/dist/components/InstallButton/InstallButton.js.map +1 -1
  534. package/dist/components/InstallButton/InstallButton.module.cjs.map +1 -1
  535. package/dist/components/InstallButton/InstallButton.module.js.map +1 -1
  536. package/dist/components/InstallButton/install-hints.cjs.map +1 -1
  537. package/dist/components/InstallButton/install-hints.js.map +1 -1
  538. package/dist/components/Kanban/Kanban.cjs.map +1 -1
  539. package/dist/components/Kanban/Kanban.js.map +1 -1
  540. package/dist/components/Kanban/Kanban.module.cjs.map +1 -1
  541. package/dist/components/Kanban/Kanban.module.js.map +1 -1
  542. package/dist/components/Kbd/Kbd.cjs.map +1 -1
  543. package/dist/components/Kbd/Kbd.js.map +1 -1
  544. package/dist/components/Kbd/Kbd.module.cjs.map +1 -1
  545. package/dist/components/Kbd/Kbd.module.js.map +1 -1
  546. package/dist/components/Label/Label.cjs.map +1 -1
  547. package/dist/components/Label/Label.js.map +1 -1
  548. package/dist/components/Label/Label.module.cjs.map +1 -1
  549. package/dist/components/Label/Label.module.js.map +1 -1
  550. package/dist/components/Layout/Layout.cjs.map +1 -1
  551. package/dist/components/Layout/Layout.js.map +1 -1
  552. package/dist/components/Layout/Layout.module.cjs.map +1 -1
  553. package/dist/components/Layout/Layout.module.js.map +1 -1
  554. package/dist/components/Lightbox/Lightbox.cjs +1 -1
  555. package/dist/components/Lightbox/Lightbox.cjs.map +1 -1
  556. package/dist/components/Lightbox/Lightbox.js +1 -1
  557. package/dist/components/Lightbox/Lightbox.js.map +1 -1
  558. package/dist/components/Lightbox/Lightbox.module.cjs.map +1 -1
  559. package/dist/components/Lightbox/Lightbox.module.js.map +1 -1
  560. package/dist/components/ListTile/ListTile.cjs.map +1 -1
  561. package/dist/components/ListTile/ListTile.js.map +1 -1
  562. package/dist/components/ListTile/ListTile.module.cjs.map +1 -1
  563. package/dist/components/ListTile/ListTile.module.js.map +1 -1
  564. package/dist/components/Markdown/Markdown.cjs.map +1 -1
  565. package/dist/components/Markdown/Markdown.js.map +1 -1
  566. package/dist/components/Markdown/Markdown.module.cjs.map +1 -1
  567. package/dist/components/Markdown/Markdown.module.js.map +1 -1
  568. package/dist/components/Markdown/markdown-parse.cjs +2 -2
  569. package/dist/components/Markdown/markdown-parse.cjs.map +1 -1
  570. package/dist/components/Markdown/markdown-parse.js +8 -27
  571. package/dist/components/Markdown/markdown-parse.js.map +1 -1
  572. package/dist/components/Masonry/Masonry.cjs.map +1 -1
  573. package/dist/components/Masonry/Masonry.js.map +1 -1
  574. package/dist/components/Masonry/Masonry.module.cjs.map +1 -1
  575. package/dist/components/Masonry/Masonry.module.js.map +1 -1
  576. package/dist/components/Masonry/masonry-layout.cjs.map +1 -1
  577. package/dist/components/Masonry/masonry-layout.js.map +1 -1
  578. package/dist/components/Menubar/Menubar.cjs.map +1 -1
  579. package/dist/components/Menubar/Menubar.js.map +1 -1
  580. package/dist/components/Menubar/Menubar.module.cjs.map +1 -1
  581. package/dist/components/Menubar/Menubar.module.js.map +1 -1
  582. package/dist/components/Modal/Modal.cjs.map +1 -1
  583. package/dist/components/Modal/Modal.js.map +1 -1
  584. package/dist/components/Modal/Modal.module.cjs.map +1 -1
  585. package/dist/components/Modal/Modal.module.js.map +1 -1
  586. package/dist/components/ModalsManager/ModalsManager.cjs.map +1 -1
  587. package/dist/components/ModalsManager/ModalsManager.js.map +1 -1
  588. package/dist/components/ModalsManager/ModalsManager.module.cjs.map +1 -1
  589. package/dist/components/ModalsManager/ModalsManager.module.js.map +1 -1
  590. package/dist/components/Money/Money.cjs.map +1 -1
  591. package/dist/components/Money/Money.js.map +1 -1
  592. package/dist/components/MultiSelect/MultiSelect.cjs.map +1 -1
  593. package/dist/components/MultiSelect/MultiSelect.js.map +1 -1
  594. package/dist/components/MultiSelect/MultiSelect.module.cjs.map +1 -1
  595. package/dist/components/MultiSelect/MultiSelect.module.js.map +1 -1
  596. package/dist/components/NProgress/NProgress.cjs.map +1 -1
  597. package/dist/components/NProgress/NProgress.js.map +1 -1
  598. package/dist/components/NProgress/NProgress.module.cjs.map +1 -1
  599. package/dist/components/NProgress/NProgress.module.js.map +1 -1
  600. package/dist/components/Navbar/Navbar.cjs.map +1 -1
  601. package/dist/components/Navbar/Navbar.js.map +1 -1
  602. package/dist/components/Navbar/Navbar.module.cjs.map +1 -1
  603. package/dist/components/Navbar/Navbar.module.js.map +1 -1
  604. package/dist/components/NavigationMenu/NavigationMenu.cjs.map +1 -1
  605. package/dist/components/NavigationMenu/NavigationMenu.js.map +1 -1
  606. package/dist/components/NavigationMenu/NavigationMenu.module.cjs.map +1 -1
  607. package/dist/components/NavigationMenu/NavigationMenu.module.js.map +1 -1
  608. package/dist/components/NavigationRail/NavigationRail.cjs.map +1 -1
  609. package/dist/components/NavigationRail/NavigationRail.js.map +1 -1
  610. package/dist/components/NavigationRail/NavigationRail.module.cjs.map +1 -1
  611. package/dist/components/NavigationRail/NavigationRail.module.js.map +1 -1
  612. package/dist/components/NotificationCenter/NotificationCenter.cjs.map +1 -1
  613. package/dist/components/NotificationCenter/NotificationCenter.js.map +1 -1
  614. package/dist/components/NotificationCenter/NotificationCenter.module.cjs.map +1 -1
  615. package/dist/components/NotificationCenter/NotificationCenter.module.js.map +1 -1
  616. package/dist/components/NotificationCenter/use-notification-inbox.cjs.map +1 -1
  617. package/dist/components/NotificationCenter/use-notification-inbox.js.map +1 -1
  618. package/dist/components/OfflineIndicator/OfflineIndicator.cjs.map +1 -1
  619. package/dist/components/OfflineIndicator/OfflineIndicator.js.map +1 -1
  620. package/dist/components/OfflineIndicator/OfflineIndicator.module.cjs.map +1 -1
  621. package/dist/components/OfflineIndicator/OfflineIndicator.module.js.map +1 -1
  622. package/dist/components/Page/Page.cjs.map +1 -1
  623. package/dist/components/Page/Page.js.map +1 -1
  624. package/dist/components/Page/Page.module.cjs.map +1 -1
  625. package/dist/components/Page/Page.module.js.map +1 -1
  626. package/dist/components/Pagination/Pagination.cjs.map +1 -1
  627. package/dist/components/Pagination/Pagination.js.map +1 -1
  628. package/dist/components/Pagination/Pagination.module.cjs.map +1 -1
  629. package/dist/components/Pagination/Pagination.module.js.map +1 -1
  630. package/dist/components/PasswordInput/PasswordInput.cjs.map +1 -1
  631. package/dist/components/PasswordInput/PasswordInput.js.map +1 -1
  632. package/dist/components/PasswordInput/PasswordInput.module.cjs.map +1 -1
  633. package/dist/components/PasswordInput/PasswordInput.module.js.map +1 -1
  634. package/dist/components/PinInput/PinInput.cjs.map +1 -1
  635. package/dist/components/PinInput/PinInput.js.map +1 -1
  636. package/dist/components/PinInput/PinInput.module.cjs.map +1 -1
  637. package/dist/components/PinInput/PinInput.module.js.map +1 -1
  638. package/dist/components/Popover/Popover.cjs.map +1 -1
  639. package/dist/components/Popover/Popover.js.map +1 -1
  640. package/dist/components/Popover/Popover.module.cjs.map +1 -1
  641. package/dist/components/Popover/Popover.module.js.map +1 -1
  642. package/dist/components/Portal/Portal.cjs.map +1 -1
  643. package/dist/components/Portal/Portal.js.map +1 -1
  644. package/dist/components/Portal/anchor-position.cjs.map +1 -1
  645. package/dist/components/Portal/anchor-position.js.map +1 -1
  646. package/dist/components/Portal/escape-layer.cjs.map +1 -1
  647. package/dist/components/Portal/escape-layer.js.map +1 -1
  648. package/dist/components/Portal/portal-host.cjs.map +1 -1
  649. package/dist/components/Portal/portal-host.js.map +1 -1
  650. package/dist/components/Portal/tab-bridge.cjs +1 -1
  651. package/dist/components/Portal/tab-bridge.cjs.map +1 -1
  652. package/dist/components/Portal/tab-bridge.js +1 -5
  653. package/dist/components/Portal/tab-bridge.js.map +1 -1
  654. package/dist/components/Progress/Progress.cjs.map +1 -1
  655. package/dist/components/Progress/Progress.js.map +1 -1
  656. package/dist/components/Progress/Progress.module.cjs.map +1 -1
  657. package/dist/components/Progress/Progress.module.js.map +1 -1
  658. package/dist/components/QRCode/QRCode.cjs.map +1 -1
  659. package/dist/components/QRCode/QRCode.js.map +1 -1
  660. package/dist/components/QRCode/QRCode.module.cjs.map +1 -1
  661. package/dist/components/QRCode/QRCode.module.js.map +1 -1
  662. package/dist/components/QRCode/qr-encode.cjs +1 -1
  663. package/dist/components/QRCode/qr-encode.cjs.map +1 -1
  664. package/dist/components/QRCode/qr-encode.js +7 -13
  665. package/dist/components/QRCode/qr-encode.js.map +1 -1
  666. package/dist/components/QRCode/qr-tables.cjs.map +1 -1
  667. package/dist/components/QRCode/qr-tables.js.map +1 -1
  668. package/dist/components/Radio/Radio.cjs.map +1 -1
  669. package/dist/components/Radio/Radio.js.map +1 -1
  670. package/dist/components/Radio/Radio.module.cjs.map +1 -1
  671. package/dist/components/Radio/Radio.module.js.map +1 -1
  672. package/dist/components/RangeSlider/RangeSlider.cjs.map +1 -1
  673. package/dist/components/RangeSlider/RangeSlider.js.map +1 -1
  674. package/dist/components/RangeSlider/RangeSlider.module.cjs.map +1 -1
  675. package/dist/components/RangeSlider/RangeSlider.module.js.map +1 -1
  676. package/dist/components/RatingStars/RatingStars.cjs.map +1 -1
  677. package/dist/components/RatingStars/RatingStars.js.map +1 -1
  678. package/dist/components/RatingStars/RatingStars.module.cjs.map +1 -1
  679. package/dist/components/RatingStars/RatingStars.module.js.map +1 -1
  680. package/dist/components/RefreshIndicator/RefreshIndicator.cjs +1 -1
  681. package/dist/components/RefreshIndicator/RefreshIndicator.cjs.map +1 -1
  682. package/dist/components/RefreshIndicator/RefreshIndicator.js +10 -18
  683. package/dist/components/RefreshIndicator/RefreshIndicator.js.map +1 -1
  684. package/dist/components/RefreshIndicator/RefreshIndicator.module.cjs.map +1 -1
  685. package/dist/components/RefreshIndicator/RefreshIndicator.module.js.map +1 -1
  686. package/dist/components/RelativeTime/RelativeTime.cjs.map +1 -1
  687. package/dist/components/RelativeTime/RelativeTime.js.map +1 -1
  688. package/dist/components/Resizable/Resizable.cjs +1 -1
  689. package/dist/components/Resizable/Resizable.cjs.map +1 -1
  690. package/dist/components/Resizable/Resizable.js +1 -9
  691. package/dist/components/Resizable/Resizable.js.map +1 -1
  692. package/dist/components/Resizable/Resizable.module.cjs.map +1 -1
  693. package/dist/components/Resizable/Resizable.module.js.map +1 -1
  694. package/dist/components/Responsive/Responsive.cjs.map +1 -1
  695. package/dist/components/Responsive/Responsive.js.map +1 -1
  696. package/dist/components/Reveal/Reveal.cjs.map +1 -1
  697. package/dist/components/Reveal/Reveal.js.map +1 -1
  698. package/dist/components/Reveal/Reveal.module.cjs.map +1 -1
  699. package/dist/components/Reveal/Reveal.module.js.map +1 -1
  700. package/dist/components/Reveal/reveal-threshold.cjs.map +1 -1
  701. package/dist/components/Reveal/reveal-threshold.js.map +1 -1
  702. package/dist/components/SafeArea/SafeArea.cjs.map +1 -1
  703. package/dist/components/SafeArea/SafeArea.js.map +1 -1
  704. package/dist/components/SafeArea/SafeArea.module.cjs.map +1 -1
  705. package/dist/components/SafeArea/SafeArea.module.js.map +1 -1
  706. package/dist/components/Scheduler/Scheduler.cjs.map +1 -1
  707. package/dist/components/Scheduler/Scheduler.js.map +1 -1
  708. package/dist/components/Scheduler/Scheduler.module.cjs.map +1 -1
  709. package/dist/components/Scheduler/Scheduler.module.js.map +1 -1
  710. package/dist/components/Scheduler/scheduler-layout.cjs.map +1 -1
  711. package/dist/components/Scheduler/scheduler-layout.js.map +1 -1
  712. package/dist/components/ScrollArea/ScrollArea.cjs.map +1 -1
  713. package/dist/components/ScrollArea/ScrollArea.js.map +1 -1
  714. package/dist/components/ScrollArea/ScrollArea.module.cjs.map +1 -1
  715. package/dist/components/ScrollArea/ScrollArea.module.js.map +1 -1
  716. package/dist/components/SearchBar/SearchBar.cjs.map +1 -1
  717. package/dist/components/SearchBar/SearchBar.js.map +1 -1
  718. package/dist/components/SearchBar/SearchBar.module.cjs.map +1 -1
  719. package/dist/components/SearchBar/SearchBar.module.js.map +1 -1
  720. package/dist/components/SectionHeader/SectionHeader.cjs.map +1 -1
  721. package/dist/components/SectionHeader/SectionHeader.js.map +1 -1
  722. package/dist/components/SectionHeader/SectionHeader.module.cjs.map +1 -1
  723. package/dist/components/SectionHeader/SectionHeader.module.js.map +1 -1
  724. package/dist/components/SegmentedControl/SegmentedControl.cjs.map +1 -1
  725. package/dist/components/SegmentedControl/SegmentedControl.js.map +1 -1
  726. package/dist/components/SegmentedControl/SegmentedControl.module.cjs.map +1 -1
  727. package/dist/components/SegmentedControl/SegmentedControl.module.js.map +1 -1
  728. package/dist/components/Select/CaretIcon.cjs.map +1 -1
  729. package/dist/components/Select/CaretIcon.js.map +1 -1
  730. package/dist/components/Select/Select.cjs.map +1 -1
  731. package/dist/components/Select/Select.js.map +1 -1
  732. package/dist/components/Select/Select.module.cjs.map +1 -1
  733. package/dist/components/Select/Select.module.js.map +1 -1
  734. package/dist/components/Select/options.cjs.map +1 -1
  735. package/dist/components/Select/options.js.map +1 -1
  736. package/dist/components/Sidebar/Sidebar.cjs +1 -1
  737. package/dist/components/Sidebar/Sidebar.cjs.map +1 -1
  738. package/dist/components/Sidebar/Sidebar.js +13 -23
  739. package/dist/components/Sidebar/Sidebar.js.map +1 -1
  740. package/dist/components/Sidebar/Sidebar.module.cjs.map +1 -1
  741. package/dist/components/Sidebar/Sidebar.module.js.map +1 -1
  742. package/dist/components/Sidebar/SidebarEntry.cjs.map +1 -1
  743. package/dist/components/Sidebar/SidebarEntry.js.map +1 -1
  744. package/dist/components/Sidebar/active-nav-key.cjs.map +1 -1
  745. package/dist/components/Sidebar/active-nav-key.js.map +1 -1
  746. package/dist/components/SignaturePad/SignaturePad.cjs +1 -1
  747. package/dist/components/SignaturePad/SignaturePad.cjs.map +1 -1
  748. package/dist/components/SignaturePad/SignaturePad.js +1 -5
  749. package/dist/components/SignaturePad/SignaturePad.js.map +1 -1
  750. package/dist/components/SignaturePad/SignaturePad.module.cjs.map +1 -1
  751. package/dist/components/SignaturePad/SignaturePad.module.js.map +1 -1
  752. package/dist/components/Skeleton/Skeleton.cjs.map +1 -1
  753. package/dist/components/Skeleton/Skeleton.js.map +1 -1
  754. package/dist/components/Skeleton/Skeleton.module.cjs.map +1 -1
  755. package/dist/components/Skeleton/Skeleton.module.js.map +1 -1
  756. package/dist/components/Slider/Slider.cjs.map +1 -1
  757. package/dist/components/Slider/Slider.js.map +1 -1
  758. package/dist/components/Slider/Slider.module.cjs.map +1 -1
  759. package/dist/components/Slider/Slider.module.js.map +1 -1
  760. package/dist/components/Spacer/Spacer.cjs.map +1 -1
  761. package/dist/components/Spacer/Spacer.js.map +1 -1
  762. package/dist/components/Spacer/Spacer.module.cjs.map +1 -1
  763. package/dist/components/Spacer/Spacer.module.js.map +1 -1
  764. package/dist/components/Sparkline/Sparkline.cjs.map +1 -1
  765. package/dist/components/Sparkline/Sparkline.js.map +1 -1
  766. package/dist/components/Sparkline/Sparkline.module.cjs.map +1 -1
  767. package/dist/components/Sparkline/Sparkline.module.js.map +1 -1
  768. package/dist/components/Sparkline/sparkline-geometry.cjs.map +1 -1
  769. package/dist/components/Sparkline/sparkline-geometry.js.map +1 -1
  770. package/dist/components/Spinner/Spinner.cjs.map +1 -1
  771. package/dist/components/Spinner/Spinner.js.map +1 -1
  772. package/dist/components/Spinner/Spinner.module.cjs.map +1 -1
  773. package/dist/components/Spinner/Spinner.module.js.map +1 -1
  774. package/dist/components/Stat/Stat.cjs.map +1 -1
  775. package/dist/components/Stat/Stat.js.map +1 -1
  776. package/dist/components/Stat/Stat.module.cjs.map +1 -1
  777. package/dist/components/Stat/Stat.module.js.map +1 -1
  778. package/dist/components/Stepper/Stepper.cjs.map +1 -1
  779. package/dist/components/Stepper/Stepper.js.map +1 -1
  780. package/dist/components/Stepper/Stepper.module.cjs.map +1 -1
  781. package/dist/components/Stepper/Stepper.module.js.map +1 -1
  782. package/dist/components/StepperInput/StepperInput.cjs.map +1 -1
  783. package/dist/components/StepperInput/StepperInput.js.map +1 -1
  784. package/dist/components/StepperInput/StepperInput.module.cjs.map +1 -1
  785. package/dist/components/StepperInput/StepperInput.module.js.map +1 -1
  786. package/dist/components/Switch/Switch.cjs.map +1 -1
  787. package/dist/components/Switch/Switch.js.map +1 -1
  788. package/dist/components/Switch/Switch.module.cjs.map +1 -1
  789. package/dist/components/Switch/Switch.module.js.map +1 -1
  790. package/dist/components/SyncStatusBadge/SyncStatusBadge.cjs.map +1 -1
  791. package/dist/components/SyncStatusBadge/SyncStatusBadge.js.map +1 -1
  792. package/dist/components/SyncStatusBadge/SyncStatusBadge.module.cjs.map +1 -1
  793. package/dist/components/SyncStatusBadge/SyncStatusBadge.module.js.map +1 -1
  794. package/dist/components/Table/Table.cjs.map +1 -1
  795. package/dist/components/Table/Table.js.map +1 -1
  796. package/dist/components/Table/Table.module.cjs.map +1 -1
  797. package/dist/components/Table/Table.module.js.map +1 -1
  798. package/dist/components/Tabs/Tabs.cjs.map +1 -1
  799. package/dist/components/Tabs/Tabs.js.map +1 -1
  800. package/dist/components/Tabs/Tabs.module.cjs.map +1 -1
  801. package/dist/components/Tabs/Tabs.module.js.map +1 -1
  802. package/dist/components/Tag/Tag.cjs.map +1 -1
  803. package/dist/components/Tag/Tag.js.map +1 -1
  804. package/dist/components/Tag/Tag.module.cjs.map +1 -1
  805. package/dist/components/Tag/Tag.module.js.map +1 -1
  806. package/dist/components/Textarea/Textarea.cjs.map +1 -1
  807. package/dist/components/Textarea/Textarea.js.map +1 -1
  808. package/dist/components/Textarea/Textarea.module.cjs.map +1 -1
  809. package/dist/components/Textarea/Textarea.module.js.map +1 -1
  810. package/dist/components/TimePicker/TimePicker.cjs.map +1 -1
  811. package/dist/components/TimePicker/TimePicker.js.map +1 -1
  812. package/dist/components/TimePicker/TimePicker.module.cjs.map +1 -1
  813. package/dist/components/TimePicker/TimePicker.module.js.map +1 -1
  814. package/dist/components/Timeline/Timeline.cjs.map +1 -1
  815. package/dist/components/Timeline/Timeline.js.map +1 -1
  816. package/dist/components/Timeline/Timeline.module.cjs.map +1 -1
  817. package/dist/components/Timeline/Timeline.module.js.map +1 -1
  818. package/dist/components/Toast/Toast.module.cjs.map +1 -1
  819. package/dist/components/Toast/Toast.module.js.map +1 -1
  820. package/dist/components/Toast/ToastProvider.cjs.map +1 -1
  821. package/dist/components/Toast/ToastProvider.js.map +1 -1
  822. package/dist/components/Toggle/Toggle.cjs.map +1 -1
  823. package/dist/components/Toggle/Toggle.js.map +1 -1
  824. package/dist/components/Toggle/Toggle.module.cjs.map +1 -1
  825. package/dist/components/Toggle/Toggle.module.js.map +1 -1
  826. package/dist/components/ToggleGroup/ToggleGroup.cjs.map +1 -1
  827. package/dist/components/ToggleGroup/ToggleGroup.js.map +1 -1
  828. package/dist/components/ToggleGroup/ToggleGroup.module.cjs.map +1 -1
  829. package/dist/components/ToggleGroup/ToggleGroup.module.js.map +1 -1
  830. package/dist/components/Tooltip/Tooltip.cjs.map +1 -1
  831. package/dist/components/Tooltip/Tooltip.js.map +1 -1
  832. package/dist/components/Tooltip/Tooltip.module.cjs.map +1 -1
  833. package/dist/components/Tooltip/Tooltip.module.js.map +1 -1
  834. package/dist/components/Tour/Tour.cjs +1 -1
  835. package/dist/components/Tour/Tour.cjs.map +1 -1
  836. package/dist/components/Tour/Tour.js +1 -5
  837. package/dist/components/Tour/Tour.js.map +1 -1
  838. package/dist/components/Tour/Tour.module.cjs.map +1 -1
  839. package/dist/components/Tour/Tour.module.js.map +1 -1
  840. package/dist/components/Tour/tour-position.cjs.map +1 -1
  841. package/dist/components/Tour/tour-position.js.map +1 -1
  842. package/dist/components/Transfer/Transfer.cjs.map +1 -1
  843. package/dist/components/Transfer/Transfer.js.map +1 -1
  844. package/dist/components/Transfer/Transfer.module.cjs.map +1 -1
  845. package/dist/components/Transfer/Transfer.module.js.map +1 -1
  846. package/dist/components/Transfer/transfer-state.cjs.map +1 -1
  847. package/dist/components/Transfer/transfer-state.js.map +1 -1
  848. package/dist/components/TreeView/TreeView.cjs.map +1 -1
  849. package/dist/components/TreeView/TreeView.js.map +1 -1
  850. package/dist/components/TreeView/TreeView.module.cjs.map +1 -1
  851. package/dist/components/TreeView/TreeView.module.js.map +1 -1
  852. package/dist/components/TruncateText/TruncateText.cjs.map +1 -1
  853. package/dist/components/TruncateText/TruncateText.js.map +1 -1
  854. package/dist/components/TruncateText/TruncateText.module.cjs.map +1 -1
  855. package/dist/components/TruncateText/TruncateText.module.js.map +1 -1
  856. package/dist/components/UpdatePrompt/UpdatePrompt.cjs.map +1 -1
  857. package/dist/components/UpdatePrompt/UpdatePrompt.js.map +1 -1
  858. package/dist/components/UpdatePrompt/UpdatePrompt.module.cjs.map +1 -1
  859. package/dist/components/UpdatePrompt/UpdatePrompt.module.js.map +1 -1
  860. package/dist/components/VideoPlayer/VideoPlayer.cjs +1 -1
  861. package/dist/components/VideoPlayer/VideoPlayer.cjs.map +1 -1
  862. package/dist/components/VideoPlayer/VideoPlayer.js +1 -7
  863. package/dist/components/VideoPlayer/VideoPlayer.js.map +1 -1
  864. package/dist/components/VideoPlayer/VideoPlayer.module.cjs.map +1 -1
  865. package/dist/components/VideoPlayer/VideoPlayer.module.js.map +1 -1
  866. package/dist/components/VideoPlayer/playback-rates.cjs.map +1 -1
  867. package/dist/components/VideoPlayer/playback-rates.js.map +1 -1
  868. package/dist/components/VirtualList/VirtualList.cjs.map +1 -1
  869. package/dist/components/VirtualList/VirtualList.js.map +1 -1
  870. package/dist/components/VirtualList/VirtualList.module.cjs.map +1 -1
  871. package/dist/components/VirtualList/VirtualList.module.js.map +1 -1
  872. package/dist/components/VirtualTable/VirtualTable.cjs.map +1 -1
  873. package/dist/components/VirtualTable/VirtualTable.js.map +1 -1
  874. package/dist/components/VirtualTable/VirtualTable.module.cjs.map +1 -1
  875. package/dist/components/VirtualTable/VirtualTable.module.js.map +1 -1
  876. package/dist/components/VisuallyHidden/VisuallyHidden.cjs.map +1 -1
  877. package/dist/components/VisuallyHidden/VisuallyHidden.js.map +1 -1
  878. package/dist/components/VisuallyHidden/VisuallyHidden.module.cjs.map +1 -1
  879. package/dist/components/VisuallyHidden/VisuallyHidden.module.js.map +1 -1
  880. package/dist/components/Wizard/Wizard.cjs +1 -1
  881. package/dist/components/Wizard/Wizard.cjs.map +1 -1
  882. package/dist/components/Wizard/Wizard.js +4 -11
  883. package/dist/components/Wizard/Wizard.js.map +1 -1
  884. package/dist/components/Wizard/Wizard.module.cjs.map +1 -1
  885. package/dist/components/Wizard/Wizard.module.js.map +1 -1
  886. package/dist/data/create-data-provider.cjs.map +1 -1
  887. package/dist/data/create-data-provider.js.map +1 -1
  888. package/dist/data/data-provider-context.cjs.map +1 -1
  889. package/dist/data/data-provider-context.js.map +1 -1
  890. package/dist/data/use-resource.cjs.map +1 -1
  891. package/dist/data/use-resource.js.map +1 -1
  892. package/dist/editor/RichTextEditor.cjs.map +1 -1
  893. package/dist/editor/RichTextEditor.js.map +1 -1
  894. package/dist/editor/RichTextEditor.module.cjs.map +1 -1
  895. package/dist/editor/RichTextEditor.module.js.map +1 -1
  896. package/dist/editor.js +1 -2
  897. package/dist/error-boundary/ErrorBoundary.cjs.map +1 -1
  898. package/dist/error-boundary/ErrorBoundary.js.map +1 -1
  899. package/dist/error-boundary/use-error-handler.cjs.map +1 -1
  900. package/dist/error-boundary/use-error-handler.js.map +1 -1
  901. package/dist/feature-flags/FeatureFlagsProvider.cjs.map +1 -1
  902. package/dist/feature-flags/FeatureFlagsProvider.js.map +1 -1
  903. package/dist/feature-flags/growthbook-adapter.cjs.map +1 -1
  904. package/dist/feature-flags/growthbook-adapter.js.map +1 -1
  905. package/dist/feature-flags/in-memory-adapter.cjs.map +1 -1
  906. package/dist/feature-flags/in-memory-adapter.js.map +1 -1
  907. package/dist/feature-flags/launchdarkly-adapter.cjs.map +1 -1
  908. package/dist/feature-flags/launchdarkly-adapter.js.map +1 -1
  909. package/dist/forms/FormField.cjs.map +1 -1
  910. package/dist/forms/FormField.js.map +1 -1
  911. package/dist/forms/br-validators.cjs.map +1 -1
  912. package/dist/forms/br-validators.js.map +1 -1
  913. package/dist/forms/masked-inputs.cjs.map +1 -1
  914. package/dist/forms/masked-inputs.js.map +1 -1
  915. package/dist/forms/use-viacep.cjs.map +1 -1
  916. package/dist/forms/use-viacep.js.map +1 -1
  917. package/dist/forms/use-zod-form.cjs.map +1 -1
  918. package/dist/forms/use-zod-form.js.map +1 -1
  919. package/dist/forms/validate-form.cjs.map +1 -1
  920. package/dist/forms/validate-form.js.map +1 -1
  921. package/dist/forms/zod-resolver.cjs.map +1 -1
  922. package/dist/forms/zod-resolver.js.map +1 -1
  923. package/dist/geo/TrajectoryMap.cjs.map +1 -1
  924. package/dist/geo/TrajectoryMap.js.map +1 -1
  925. package/dist/geo/TrajectoryMap.module.cjs.map +1 -1
  926. package/dist/geo/TrajectoryMap.module.js.map +1 -1
  927. package/dist/geo/bounds.cjs.map +1 -1
  928. package/dist/geo/bounds.js.map +1 -1
  929. package/dist/geo/create-position-tracker.cjs +1 -1
  930. package/dist/geo/create-position-tracker.cjs.map +1 -1
  931. package/dist/geo/create-position-tracker.js +1 -7
  932. package/dist/geo/create-position-tracker.js.map +1 -1
  933. package/dist/geo/distance.cjs.map +1 -1
  934. package/dist/geo/distance.js.map +1 -1
  935. package/dist/geo/estimate.cjs.map +1 -1
  936. package/dist/geo/estimate.js.map +1 -1
  937. package/dist/geo/leaflet-map.cjs.map +1 -1
  938. package/dist/geo/leaflet-map.js.map +1 -1
  939. package/dist/geo/projection.cjs.map +1 -1
  940. package/dist/geo/projection.js.map +1 -1
  941. package/dist/geo/routing.cjs.map +1 -1
  942. package/dist/geo/routing.js.map +1 -1
  943. package/dist/geo/types.cjs.map +1 -1
  944. package/dist/geo/types.js.map +1 -1
  945. package/dist/geo/use-position-tracker.cjs.map +1 -1
  946. package/dist/geo/use-position-tracker.js.map +1 -1
  947. package/dist/hooks/pwa-env.cjs.map +1 -1
  948. package/dist/hooks/pwa-env.js.map +1 -1
  949. package/dist/hooks/tab-sequence.cjs.map +1 -1
  950. package/dist/hooks/tab-sequence.js.map +1 -1
  951. package/dist/hooks/use-announce.cjs +1 -1
  952. package/dist/hooks/use-announce.cjs.map +1 -1
  953. package/dist/hooks/use-announce.js +2 -2
  954. package/dist/hooks/use-announce.js.map +1 -1
  955. package/dist/hooks/use-async.cjs.map +1 -1
  956. package/dist/hooks/use-async.js.map +1 -1
  957. package/dist/hooks/use-before-install-prompt.cjs.map +1 -1
  958. package/dist/hooks/use-before-install-prompt.js.map +1 -1
  959. package/dist/hooks/use-breakpoint.cjs.map +1 -1
  960. package/dist/hooks/use-breakpoint.js.map +1 -1
  961. package/dist/hooks/use-click-outside.cjs.map +1 -1
  962. package/dist/hooks/use-click-outside.js.map +1 -1
  963. package/dist/hooks/use-client-filter.cjs.map +1 -1
  964. package/dist/hooks/use-client-filter.js.map +1 -1
  965. package/dist/hooks/use-clipboard.cjs.map +1 -1
  966. package/dist/hooks/use-clipboard.js.map +1 -1
  967. package/dist/hooks/use-countdown.cjs.map +1 -1
  968. package/dist/hooks/use-countdown.js.map +1 -1
  969. package/dist/hooks/use-counter.cjs.map +1 -1
  970. package/dist/hooks/use-counter.js.map +1 -1
  971. package/dist/hooks/use-debounce.cjs.map +1 -1
  972. package/dist/hooks/use-debounce.js.map +1 -1
  973. package/dist/hooks/use-deep-memo.cjs.map +1 -1
  974. package/dist/hooks/use-deep-memo.js.map +1 -1
  975. package/dist/hooks/use-disclosure.cjs.map +1 -1
  976. package/dist/hooks/use-disclosure.js.map +1 -1
  977. package/dist/hooks/use-document-title.cjs.map +1 -1
  978. package/dist/hooks/use-document-title.js.map +1 -1
  979. package/dist/hooks/use-document-visibility.cjs.map +1 -1
  980. package/dist/hooks/use-document-visibility.js.map +1 -1
  981. package/dist/hooks/use-draft-filters.cjs.map +1 -1
  982. package/dist/hooks/use-draft-filters.js.map +1 -1
  983. package/dist/hooks/use-event-listener.cjs.map +1 -1
  984. package/dist/hooks/use-event-listener.js.map +1 -1
  985. package/dist/hooks/use-favicon.cjs.map +1 -1
  986. package/dist/hooks/use-favicon.js.map +1 -1
  987. package/dist/hooks/use-focus-trap.cjs.map +1 -1
  988. package/dist/hooks/use-focus-trap.js.map +1 -1
  989. package/dist/hooks/use-fullscreen-element.cjs.map +1 -1
  990. package/dist/hooks/use-fullscreen-element.js.map +1 -1
  991. package/dist/hooks/use-fullscreen.cjs +1 -1
  992. package/dist/hooks/use-fullscreen.cjs.map +1 -1
  993. package/dist/hooks/use-fullscreen.js +7 -23
  994. package/dist/hooks/use-fullscreen.js.map +1 -1
  995. package/dist/hooks/use-geolocation.cjs.map +1 -1
  996. package/dist/hooks/use-geolocation.js.map +1 -1
  997. package/dist/hooks/use-hover.cjs.map +1 -1
  998. package/dist/hooks/use-hover.js.map +1 -1
  999. package/dist/hooks/use-idle.cjs.map +1 -1
  1000. package/dist/hooks/use-idle.js.map +1 -1
  1001. package/dist/hooks/use-install-prompt.cjs +1 -1
  1002. package/dist/hooks/use-install-prompt.cjs.map +1 -1
  1003. package/dist/hooks/use-install-prompt.js +1 -1
  1004. package/dist/hooks/use-install-prompt.js.map +1 -1
  1005. package/dist/hooks/use-intersection-observer.cjs.map +1 -1
  1006. package/dist/hooks/use-intersection-observer.js.map +1 -1
  1007. package/dist/hooks/use-interval.cjs.map +1 -1
  1008. package/dist/hooks/use-interval.js.map +1 -1
  1009. package/dist/hooks/use-is-first-render.cjs.map +1 -1
  1010. package/dist/hooks/use-is-first-render.js.map +1 -1
  1011. package/dist/hooks/use-keyboard-shortcut.cjs.map +1 -1
  1012. package/dist/hooks/use-keyboard-shortcut.js.map +1 -1
  1013. package/dist/hooks/use-latest-ref.cjs.map +1 -1
  1014. package/dist/hooks/use-latest-ref.js.map +1 -1
  1015. package/dist/hooks/use-list-state.cjs.map +1 -1
  1016. package/dist/hooks/use-list-state.js.map +1 -1
  1017. package/dist/hooks/use-local-storage.cjs +1 -1
  1018. package/dist/hooks/use-local-storage.cjs.map +1 -1
  1019. package/dist/hooks/use-local-storage.js +2 -5
  1020. package/dist/hooks/use-local-storage.js.map +1 -1
  1021. package/dist/hooks/use-long-press-handlers.cjs.map +1 -1
  1022. package/dist/hooks/use-long-press-handlers.js.map +1 -1
  1023. package/dist/hooks/use-long-press.cjs.map +1 -1
  1024. package/dist/hooks/use-long-press.js.map +1 -1
  1025. package/dist/hooks/use-map.cjs.map +1 -1
  1026. package/dist/hooks/use-map.js.map +1 -1
  1027. package/dist/hooks/use-media-devices.cjs.map +1 -1
  1028. package/dist/hooks/use-media-devices.js.map +1 -1
  1029. package/dist/hooks/use-media-permission.cjs +1 -1
  1030. package/dist/hooks/use-media-permission.cjs.map +1 -1
  1031. package/dist/hooks/use-media-permission.js +2 -5
  1032. package/dist/hooks/use-media-permission.js.map +1 -1
  1033. package/dist/hooks/use-media-query.cjs.map +1 -1
  1034. package/dist/hooks/use-media-query.js.map +1 -1
  1035. package/dist/hooks/use-object-url.cjs.map +1 -1
  1036. package/dist/hooks/use-object-url.js.map +1 -1
  1037. package/dist/hooks/use-online.cjs.map +1 -1
  1038. package/dist/hooks/use-online.js.map +1 -1
  1039. package/dist/hooks/use-pagination.cjs.map +1 -1
  1040. package/dist/hooks/use-pagination.js.map +1 -1
  1041. package/dist/hooks/use-previous.cjs.map +1 -1
  1042. package/dist/hooks/use-previous.js.map +1 -1
  1043. package/dist/hooks/use-push-to-talk.cjs.map +1 -1
  1044. package/dist/hooks/use-push-to-talk.js.map +1 -1
  1045. package/dist/hooks/use-queue.cjs.map +1 -1
  1046. package/dist/hooks/use-queue.js.map +1 -1
  1047. package/dist/hooks/use-resize-observer.cjs.map +1 -1
  1048. package/dist/hooks/use-resize-observer.js.map +1 -1
  1049. package/dist/hooks/use-scroll-lock.cjs.map +1 -1
  1050. package/dist/hooks/use-scroll-lock.js.map +1 -1
  1051. package/dist/hooks/use-scroll-overflow.cjs.map +1 -1
  1052. package/dist/hooks/use-scroll-overflow.js.map +1 -1
  1053. package/dist/hooks/use-service-worker-update.cjs.map +1 -1
  1054. package/dist/hooks/use-service-worker-update.js.map +1 -1
  1055. package/dist/hooks/use-set.cjs.map +1 -1
  1056. package/dist/hooks/use-set.js.map +1 -1
  1057. package/dist/hooks/use-sortable.cjs.map +1 -1
  1058. package/dist/hooks/use-sortable.js.map +1 -1
  1059. package/dist/hooks/use-stable-callback.cjs.map +1 -1
  1060. package/dist/hooks/use-stable-callback.js.map +1 -1
  1061. package/dist/hooks/use-storage-estimate.cjs.map +1 -1
  1062. package/dist/hooks/use-storage-estimate.js.map +1 -1
  1063. package/dist/hooks/use-throttle.cjs.map +1 -1
  1064. package/dist/hooks/use-throttle.js.map +1 -1
  1065. package/dist/hooks/use-timeout.cjs.map +1 -1
  1066. package/dist/hooks/use-timeout.js.map +1 -1
  1067. package/dist/hooks/use-toggle.cjs.map +1 -1
  1068. package/dist/hooks/use-toggle.js.map +1 -1
  1069. package/dist/hooks/use-typewriter.cjs.map +1 -1
  1070. package/dist/hooks/use-typewriter.js.map +1 -1
  1071. package/dist/hooks/use-window-size.cjs.map +1 -1
  1072. package/dist/hooks/use-window-size.js.map +1 -1
  1073. package/dist/http/api-client.cjs.map +1 -1
  1074. package/dist/http/api-client.js.map +1 -1
  1075. package/dist/http/build-url.cjs.map +1 -1
  1076. package/dist/http/build-url.js.map +1 -1
  1077. package/dist/http/credential-scope.cjs.map +1 -1
  1078. package/dist/http/credential-scope.js.map +1 -1
  1079. package/dist/http/csrf.cjs.map +1 -1
  1080. package/dist/http/csrf.js.map +1 -1
  1081. package/dist/http/decode-response.cjs.map +1 -1
  1082. package/dist/http/decode-response.js.map +1 -1
  1083. package/dist/http/describe-api-error.cjs.map +1 -1
  1084. package/dist/http/describe-api-error.js.map +1 -1
  1085. package/dist/http/errors.cjs.map +1 -1
  1086. package/dist/http/errors.js.map +1 -1
  1087. package/dist/http/idempotency.cjs.map +1 -1
  1088. package/dist/http/idempotency.js.map +1 -1
  1089. package/dist/http/parse-response.cjs.map +1 -1
  1090. package/dist/http/parse-response.js.map +1 -1
  1091. package/dist/http/resumable-upload.cjs.map +1 -1
  1092. package/dist/http/resumable-upload.js.map +1 -1
  1093. package/dist/http/retry.cjs.map +1 -1
  1094. package/dist/http/retry.js.map +1 -1
  1095. package/dist/http/timeout.cjs.map +1 -1
  1096. package/dist/http/timeout.js.map +1 -1
  1097. package/dist/http/upload-with-progress.cjs +1 -1
  1098. package/dist/http/upload-with-progress.cjs.map +1 -1
  1099. package/dist/http/upload-with-progress.js +2 -7
  1100. package/dist/http/upload-with-progress.js.map +1 -1
  1101. package/dist/http/use-describe-api-error.cjs.map +1 -1
  1102. package/dist/http/use-describe-api-error.js.map +1 -1
  1103. package/dist/http/use-poll.cjs +1 -1
  1104. package/dist/http/use-poll.cjs.map +1 -1
  1105. package/dist/http/use-poll.js +2 -5
  1106. package/dist/http/use-poll.js.map +1 -1
  1107. package/dist/i18n/I18nProvider.cjs.map +1 -1
  1108. package/dist/i18n/I18nProvider.js.map +1 -1
  1109. package/dist/i18n/create-i18n.cjs.map +1 -1
  1110. package/dist/i18n/create-i18n.js.map +1 -1
  1111. package/dist/icons/Icon.cjs.map +1 -1
  1112. package/dist/icons/Icon.js.map +1 -1
  1113. package/dist/icons/IconPicker.cjs.map +1 -1
  1114. package/dist/icons/IconPicker.js.map +1 -1
  1115. package/dist/icons/IconPicker.module.cjs.map +1 -1
  1116. package/dist/icons/IconPicker.module.js.map +1 -1
  1117. package/dist/icons/IconProvider.cjs.map +1 -1
  1118. package/dist/icons/IconProvider.js.map +1 -1
  1119. package/dist/icons/alias.cjs.map +1 -1
  1120. package/dist/icons/alias.js.map +1 -1
  1121. package/dist/icons/generated/aliases.cjs.map +1 -1
  1122. package/dist/icons/generated/aliases.js.map +1 -1
  1123. package/dist/icons/generated/icon-names.cjs.map +1 -1
  1124. package/dist/icons/generated/icon-names.js.map +1 -1
  1125. package/dist/icons/generated/loaders.cjs.map +1 -1
  1126. package/dist/icons/generated/loaders.js.map +1 -1
  1127. package/dist/icons/generated/shard-00.cjs.map +1 -1
  1128. package/dist/icons/generated/shard-00.js.map +1 -1
  1129. package/dist/icons/generated/shard-01.cjs.map +1 -1
  1130. package/dist/icons/generated/shard-01.js.map +1 -1
  1131. package/dist/icons/generated/shard-02.cjs.map +1 -1
  1132. package/dist/icons/generated/shard-02.js.map +1 -1
  1133. package/dist/icons/generated/shard-03.cjs.map +1 -1
  1134. package/dist/icons/generated/shard-03.js.map +1 -1
  1135. package/dist/icons/generated/shard-04.cjs.map +1 -1
  1136. package/dist/icons/generated/shard-04.js.map +1 -1
  1137. package/dist/icons/generated/shard-05.cjs.map +1 -1
  1138. package/dist/icons/generated/shard-05.js.map +1 -1
  1139. package/dist/icons/generated/shard-06.cjs.map +1 -1
  1140. package/dist/icons/generated/shard-06.js.map +1 -1
  1141. package/dist/icons/generated/shard-07.cjs.map +1 -1
  1142. package/dist/icons/generated/shard-07.js.map +1 -1
  1143. package/dist/icons/generated/shard-08.cjs.map +1 -1
  1144. package/dist/icons/generated/shard-08.js.map +1 -1
  1145. package/dist/icons/generated/shard-09.cjs.map +1 -1
  1146. package/dist/icons/generated/shard-09.js.map +1 -1
  1147. package/dist/icons/generated/shard-10.cjs.map +1 -1
  1148. package/dist/icons/generated/shard-10.js.map +1 -1
  1149. package/dist/icons/generated/shard-11.cjs.map +1 -1
  1150. package/dist/icons/generated/shard-11.js.map +1 -1
  1151. package/dist/icons/generated/shard-12.cjs.map +1 -1
  1152. package/dist/icons/generated/shard-12.js.map +1 -1
  1153. package/dist/icons/generated/shard-13.cjs.map +1 -1
  1154. package/dist/icons/generated/shard-13.js.map +1 -1
  1155. package/dist/icons/generated/shard-14.cjs.map +1 -1
  1156. package/dist/icons/generated/shard-14.js.map +1 -1
  1157. package/dist/icons/generated/shard-15.cjs.map +1 -1
  1158. package/dist/icons/generated/shard-15.js.map +1 -1
  1159. package/dist/icons/generated/shard-16.cjs.map +1 -1
  1160. package/dist/icons/generated/shard-16.js.map +1 -1
  1161. package/dist/icons/generated/shard-17.cjs.map +1 -1
  1162. package/dist/icons/generated/shard-17.js.map +1 -1
  1163. package/dist/icons/generated/shard-18.cjs.map +1 -1
  1164. package/dist/icons/generated/shard-18.js.map +1 -1
  1165. package/dist/icons/generated/shard-19.cjs.map +1 -1
  1166. package/dist/icons/generated/shard-19.js.map +1 -1
  1167. package/dist/icons/generated/shard-20.cjs.map +1 -1
  1168. package/dist/icons/generated/shard-20.js.map +1 -1
  1169. package/dist/icons/generated/shard-21.cjs.map +1 -1
  1170. package/dist/icons/generated/shard-21.js.map +1 -1
  1171. package/dist/icons/generated/shard-22.cjs.map +1 -1
  1172. package/dist/icons/generated/shard-22.js.map +1 -1
  1173. package/dist/icons/generated/shard-23.cjs.map +1 -1
  1174. package/dist/icons/generated/shard-23.js.map +1 -1
  1175. package/dist/icons/generated/shard-24.cjs.map +1 -1
  1176. package/dist/icons/generated/shard-24.js.map +1 -1
  1177. package/dist/icons/generated/shard-25.cjs.map +1 -1
  1178. package/dist/icons/generated/shard-25.js.map +1 -1
  1179. package/dist/icons/generated/shard-26.cjs.map +1 -1
  1180. package/dist/icons/generated/shard-26.js.map +1 -1
  1181. package/dist/icons/generated/shard-27.cjs.map +1 -1
  1182. package/dist/icons/generated/shard-27.js.map +1 -1
  1183. package/dist/icons/generated/shard-28.cjs.map +1 -1
  1184. package/dist/icons/generated/shard-28.js.map +1 -1
  1185. package/dist/icons/generated/shard-29.cjs.map +1 -1
  1186. package/dist/icons/generated/shard-29.js.map +1 -1
  1187. package/dist/icons/generated/shard-30.cjs.map +1 -1
  1188. package/dist/icons/generated/shard-30.js.map +1 -1
  1189. package/dist/icons/generated/shard-31.cjs.map +1 -1
  1190. package/dist/icons/generated/shard-31.js.map +1 -1
  1191. package/dist/icons/generated/shard-32.cjs.map +1 -1
  1192. package/dist/icons/generated/shard-32.js.map +1 -1
  1193. package/dist/icons/generated/shard-33.cjs.map +1 -1
  1194. package/dist/icons/generated/shard-33.js.map +1 -1
  1195. package/dist/icons/generated/shard-34.cjs.map +1 -1
  1196. package/dist/icons/generated/shard-34.js.map +1 -1
  1197. package/dist/icons/generated/shard-35.cjs.map +1 -1
  1198. package/dist/icons/generated/shard-35.js.map +1 -1
  1199. package/dist/icons/generated/shard-36.cjs.map +1 -1
  1200. package/dist/icons/generated/shard-36.js.map +1 -1
  1201. package/dist/icons/generated/shard-37.cjs.map +1 -1
  1202. package/dist/icons/generated/shard-37.js.map +1 -1
  1203. package/dist/icons/generated/shard-38.cjs.map +1 -1
  1204. package/dist/icons/generated/shard-38.js.map +1 -1
  1205. package/dist/icons/generated/shard-39.cjs.map +1 -1
  1206. package/dist/icons/generated/shard-39.js.map +1 -1
  1207. package/dist/icons/generated/shard-40.cjs.map +1 -1
  1208. package/dist/icons/generated/shard-40.js.map +1 -1
  1209. package/dist/icons/generated/shard-41.cjs.map +1 -1
  1210. package/dist/icons/generated/shard-41.js.map +1 -1
  1211. package/dist/icons/generated/shard-42.cjs.map +1 -1
  1212. package/dist/icons/generated/shard-42.js.map +1 -1
  1213. package/dist/icons/generated/shard-43.cjs.map +1 -1
  1214. package/dist/icons/generated/shard-43.js.map +1 -1
  1215. package/dist/icons/generated/shard-44.cjs.map +1 -1
  1216. package/dist/icons/generated/shard-44.js.map +1 -1
  1217. package/dist/icons/generated/shard-45.cjs.map +1 -1
  1218. package/dist/icons/generated/shard-45.js.map +1 -1
  1219. package/dist/icons/icon-context.cjs.map +1 -1
  1220. package/dist/icons/icon-context.js.map +1 -1
  1221. package/dist/icons/is-icon-name.cjs.map +1 -1
  1222. package/dist/icons/is-icon-name.js.map +1 -1
  1223. package/dist/icons/material-symbols.cjs.map +1 -1
  1224. package/dist/icons/material-symbols.js.map +1 -1
  1225. package/dist/icons/normalize-icon-name.cjs.map +1 -1
  1226. package/dist/icons/normalize-icon-name.js.map +1 -1
  1227. package/dist/icons/shard-cache.cjs +1 -1
  1228. package/dist/icons/shard-cache.cjs.map +1 -1
  1229. package/dist/icons/shard-cache.js +2 -5
  1230. package/dist/icons/shard-cache.js.map +1 -1
  1231. package/dist/icons/use-icon.cjs.map +1 -1
  1232. package/dist/icons/use-icon.js.map +1 -1
  1233. package/dist/icons/validate-icon-name.cjs.map +1 -1
  1234. package/dist/icons/validate-icon-name.js.map +1 -1
  1235. package/dist/icons-virtual.cjs.map +1 -1
  1236. package/dist/icons-virtual.js.map +1 -1
  1237. package/dist/imaging/canvas.cjs.map +1 -1
  1238. package/dist/imaging/canvas.js.map +1 -1
  1239. package/dist/imaging/compress.cjs.map +1 -1
  1240. package/dist/imaging/compress.js.map +1 -1
  1241. package/dist/imaging/decode.cjs.map +1 -1
  1242. package/dist/imaging/decode.js.map +1 -1
  1243. package/dist/imaging/encode.cjs.map +1 -1
  1244. package/dist/imaging/encode.js.map +1 -1
  1245. package/dist/imaging/exceptions.cjs.map +1 -1
  1246. package/dist/imaging/exceptions.js.map +1 -1
  1247. package/dist/imaging/frame.cjs.map +1 -1
  1248. package/dist/imaging/frame.js.map +1 -1
  1249. package/dist/imaging/thumbnails.cjs.map +1 -1
  1250. package/dist/imaging/thumbnails.js.map +1 -1
  1251. package/dist/imaging/transform.cjs.map +1 -1
  1252. package/dist/imaging/transform.js.map +1 -1
  1253. package/dist/imaging/use-image-processing.cjs.map +1 -1
  1254. package/dist/imaging/use-image-processing.js.map +1 -1
  1255. package/dist/logger/logger.cjs.map +1 -1
  1256. package/dist/logger/logger.js.map +1 -1
  1257. package/dist/neural.cjs.map +1 -1
  1258. package/dist/neural.js.map +1 -1
  1259. package/dist/oauth/GoogleSignIn.cjs +1 -1
  1260. package/dist/oauth/GoogleSignIn.cjs.map +1 -1
  1261. package/dist/oauth/GoogleSignIn.js +6 -9
  1262. package/dist/oauth/GoogleSignIn.js.map +1 -1
  1263. package/dist/oauth/callback.cjs.map +1 -1
  1264. package/dist/oauth/callback.js.map +1 -1
  1265. package/dist/oauth/use-oauth-callback.cjs.map +1 -1
  1266. package/dist/oauth/use-oauth-callback.js.map +1 -1
  1267. package/dist/offline/conflict.cjs.map +1 -1
  1268. package/dist/offline/conflict.js.map +1 -1
  1269. package/dist/offline/create-offline-database.cjs.map +1 -1
  1270. package/dist/offline/create-offline-database.js.map +1 -1
  1271. package/dist/offline/create-offline-store.cjs +1 -1
  1272. package/dist/offline/create-offline-store.cjs.map +1 -1
  1273. package/dist/offline/create-offline-store.js +1 -5
  1274. package/dist/offline/create-offline-store.js.map +1 -1
  1275. package/dist/offline/create-offline-sync.cjs +1 -1
  1276. package/dist/offline/create-offline-sync.cjs.map +1 -1
  1277. package/dist/offline/create-offline-sync.js +9 -14
  1278. package/dist/offline/create-offline-sync.js.map +1 -1
  1279. package/dist/offline/use-offline-sync.cjs.map +1 -1
  1280. package/dist/offline/use-offline-sync.js.map +1 -1
  1281. package/dist/perf/cache-size.cjs.map +1 -1
  1282. package/dist/perf/cache-size.js.map +1 -1
  1283. package/dist/perf/device.cjs.map +1 -1
  1284. package/dist/perf/device.js.map +1 -1
  1285. package/dist/perf/format.cjs.map +1 -1
  1286. package/dist/perf/format.js.map +1 -1
  1287. package/dist/perf/profiler.cjs.map +1 -1
  1288. package/dist/perf/profiler.js.map +1 -1
  1289. package/dist/push/use-push-subscription.cjs.map +1 -1
  1290. package/dist/push/use-push-subscription.js.map +1 -1
  1291. package/dist/push/utils.cjs.map +1 -1
  1292. package/dist/push/utils.js.map +1 -1
  1293. package/dist/push/web-push-client.cjs.map +1 -1
  1294. package/dist/push/web-push-client.js.map +1 -1
  1295. package/dist/query/QueryProvider.cjs.map +1 -1
  1296. package/dist/query/QueryProvider.js.map +1 -1
  1297. package/dist/query/constants.cjs.map +1 -1
  1298. package/dist/query/constants.js.map +1 -1
  1299. package/dist/query/create-query-keys.cjs.map +1 -1
  1300. package/dist/query/create-query-keys.js.map +1 -1
  1301. package/dist/query/foreign-client-warning.cjs.map +1 -1
  1302. package/dist/query/foreign-client-warning.js.map +1 -1
  1303. package/dist/query/offline-persistence.cjs +1 -1
  1304. package/dist/query/offline-persistence.cjs.map +1 -1
  1305. package/dist/query/offline-persistence.js +2 -10
  1306. package/dist/query/offline-persistence.js.map +1 -1
  1307. package/dist/query/optimistic.cjs.map +1 -1
  1308. package/dist/query/optimistic.js.map +1 -1
  1309. package/dist/query/pagination.cjs.map +1 -1
  1310. package/dist/query/pagination.js.map +1 -1
  1311. package/dist/query/retry-policy.cjs.map +1 -1
  1312. package/dist/query/retry-policy.js.map +1 -1
  1313. package/dist/query/use-cursor-query.cjs.map +1 -1
  1314. package/dist/query/use-cursor-query.js.map +1 -1
  1315. package/dist/query/use-offline-mutation.cjs.map +1 -1
  1316. package/dist/query/use-offline-mutation.js.map +1 -1
  1317. package/dist/query/use-paginated-query.cjs.map +1 -1
  1318. package/dist/query/use-paginated-query.js.map +1 -1
  1319. package/dist/router/AppRouter.cjs.map +1 -1
  1320. package/dist/router/AppRouter.js.map +1 -1
  1321. package/dist/router/RouteGuard.cjs.map +1 -1
  1322. package/dist/router/RouteGuard.js.map +1 -1
  1323. package/dist/router/index.js +2 -2
  1324. package/dist/share/share-or-download.cjs.map +1 -1
  1325. package/dist/share/share-or-download.js.map +1 -1
  1326. package/dist/share/share.cjs.map +1 -1
  1327. package/dist/share/share.js.map +1 -1
  1328. package/dist/sse/create-event-stream.cjs.map +1 -1
  1329. package/dist/sse/create-event-stream.js.map +1 -1
  1330. package/dist/sse/use-event-stream.cjs.map +1 -1
  1331. package/dist/sse/use-event-stream.js.map +1 -1
  1332. package/dist/store/create-selectors.cjs.map +1 -1
  1333. package/dist/store/create-selectors.js.map +1 -1
  1334. package/dist/store/create-store.cjs.map +1 -1
  1335. package/dist/store/create-store.js.map +1 -1
  1336. package/dist/sw/background-sync.cjs.map +1 -1
  1337. package/dist/sw/background-sync.js.map +1 -1
  1338. package/dist/sw/cache-inspect.cjs.map +1 -1
  1339. package/dist/sw/cache-inspect.js.map +1 -1
  1340. package/dist/sw/cache.cjs +1 -1
  1341. package/dist/sw/cache.cjs.map +1 -1
  1342. package/dist/sw/cache.js +2 -6
  1343. package/dist/sw/cache.js.map +1 -1
  1344. package/dist/sw/create-push-handler.cjs.map +1 -1
  1345. package/dist/sw/create-push-handler.js.map +1 -1
  1346. package/dist/sw/credential-headers.cjs.map +1 -1
  1347. package/dist/sw/credential-headers.js.map +1 -1
  1348. package/dist/sw/periodic-sync.cjs.map +1 -1
  1349. package/dist/sw/periodic-sync.js.map +1 -1
  1350. package/dist/sw/register-service-worker.cjs.map +1 -1
  1351. package/dist/sw/register-service-worker.js.map +1 -1
  1352. package/dist/sw/session-data.cjs.map +1 -1
  1353. package/dist/sw/session-data.js.map +1 -1
  1354. package/dist/tabular/assets.cjs.map +1 -1
  1355. package/dist/tabular/assets.js.map +1 -1
  1356. package/dist/tabular/cache.cjs.map +1 -1
  1357. package/dist/tabular/cache.js.map +1 -1
  1358. package/dist/tabular/compact.cjs.map +1 -1
  1359. package/dist/tabular/compact.js.map +1 -1
  1360. package/dist/tabular/exceptions.cjs.map +1 -1
  1361. package/dist/tabular/exceptions.js.map +1 -1
  1362. package/dist/tabular/manifest.cjs.map +1 -1
  1363. package/dist/tabular/manifest.js.map +1 -1
  1364. package/dist/tabular/predictor.cjs.map +1 -1
  1365. package/dist/tabular/predictor.js.map +1 -1
  1366. package/dist/tabular/use-tabular-predictor.cjs.map +1 -1
  1367. package/dist/tabular/use-tabular-predictor.js.map +1 -1
  1368. package/dist/telemetry/TelemetryProvider.cjs.map +1 -1
  1369. package/dist/telemetry/TelemetryProvider.js.map +1 -1
  1370. package/dist/telemetry/app-error-adapter.cjs.map +1 -1
  1371. package/dist/telemetry/app-error-adapter.js.map +1 -1
  1372. package/dist/telemetry/app-error-queue.cjs.map +1 -1
  1373. package/dist/telemetry/app-error-queue.js.map +1 -1
  1374. package/dist/telemetry/app-error-reporter.cjs.map +1 -1
  1375. package/dist/telemetry/app-error-reporter.js.map +1 -1
  1376. package/dist/telemetry/app-error-schema.cjs.map +1 -1
  1377. package/dist/telemetry/app-error-schema.js.map +1 -1
  1378. package/dist/telemetry/app-error-transport.cjs.map +1 -1
  1379. package/dist/telemetry/app-error-transport.js.map +1 -1
  1380. package/dist/telemetry/console-adapter.cjs.map +1 -1
  1381. package/dist/telemetry/console-adapter.js.map +1 -1
  1382. package/dist/telemetry/describe-app-error.cjs.map +1 -1
  1383. package/dist/telemetry/describe-app-error.js.map +1 -1
  1384. package/dist/telemetry/posthog-adapter.cjs +1 -1
  1385. package/dist/telemetry/posthog-adapter.cjs.map +1 -1
  1386. package/dist/telemetry/posthog-adapter.js +1 -5
  1387. package/dist/telemetry/posthog-adapter.js.map +1 -1
  1388. package/dist/telemetry/sentry-adapter.cjs.map +1 -1
  1389. package/dist/telemetry/sentry-adapter.js.map +1 -1
  1390. package/dist/tempest-react-sdk.cjs +1 -1
  1391. package/dist/tempest-react-sdk.d.ts +234 -3
  1392. package/dist/tempest-react-sdk.js +85 -85
  1393. package/dist/testing/create-mock-handlers.cjs.map +1 -1
  1394. package/dist/testing/create-mock-handlers.js.map +1 -1
  1395. package/dist/testing.js +1 -2
  1396. package/dist/theme/ThemeProvider.cjs.map +1 -1
  1397. package/dist/theme/ThemeProvider.js.map +1 -1
  1398. package/dist/theme/apply-theme.cjs.map +1 -1
  1399. package/dist/theme/apply-theme.js.map +1 -1
  1400. package/dist/theme/color.cjs.map +1 -1
  1401. package/dist/theme/color.js.map +1 -1
  1402. package/dist/theme/create-theme.cjs.map +1 -1
  1403. package/dist/theme/create-theme.js.map +1 -1
  1404. package/dist/theme/data-viz-ramps.cjs.map +1 -1
  1405. package/dist/theme/data-viz-ramps.js.map +1 -1
  1406. package/dist/theme/initial-theme.cjs.map +1 -1
  1407. package/dist/theme/initial-theme.js.map +1 -1
  1408. package/dist/theme/inverse-render.cjs.map +1 -1
  1409. package/dist/theme/inverse-render.js.map +1 -1
  1410. package/dist/theme/inverse-restore.cjs.map +1 -1
  1411. package/dist/theme/inverse-restore.js.map +1 -1
  1412. package/dist/theme/inverse-surface.cjs.map +1 -1
  1413. package/dist/theme/inverse-surface.js.map +1 -1
  1414. package/dist/theme/status-tokens.cjs.map +1 -1
  1415. package/dist/theme/status-tokens.js.map +1 -1
  1416. package/dist/theme/theme-presets.cjs.map +1 -1
  1417. package/dist/theme/theme-presets.js.map +1 -1
  1418. package/dist/utils/absent.cjs.map +1 -1
  1419. package/dist/utils/absent.js.map +1 -1
  1420. package/dist/utils/arrays.cjs.map +1 -1
  1421. package/dist/utils/arrays.js.map +1 -1
  1422. package/dist/utils/base64.cjs.map +1 -1
  1423. package/dist/utils/base64.js.map +1 -1
  1424. package/dist/utils/cn.cjs.map +1 -1
  1425. package/dist/utils/cn.js.map +1 -1
  1426. package/dist/utils/compare-values.cjs.map +1 -1
  1427. package/dist/utils/compare-values.js.map +1 -1
  1428. package/dist/utils/compressed-storage.cjs.map +1 -1
  1429. package/dist/utils/compressed-storage.js.map +1 -1
  1430. package/dist/utils/csv.cjs.map +1 -1
  1431. package/dist/utils/csv.js.map +1 -1
  1432. package/dist/utils/dev-mode.cjs.map +1 -1
  1433. package/dist/utils/dev-mode.js.map +1 -1
  1434. package/dist/utils/duplicate-instance.cjs.map +1 -1
  1435. package/dist/utils/duplicate-instance.js.map +1 -1
  1436. package/dist/utils/format.cjs.map +1 -1
  1437. package/dist/utils/format.js.map +1 -1
  1438. package/dist/utils/functions.cjs +1 -1
  1439. package/dist/utils/functions.cjs.map +1 -1
  1440. package/dist/utils/functions.js +1 -1
  1441. package/dist/utils/functions.js.map +1 -1
  1442. package/dist/utils/guards.cjs.map +1 -1
  1443. package/dist/utils/guards.js.map +1 -1
  1444. package/dist/utils/ids.cjs.map +1 -1
  1445. package/dist/utils/ids.js.map +1 -1
  1446. package/dist/utils/intl-cache.cjs.map +1 -1
  1447. package/dist/utils/intl-cache.js.map +1 -1
  1448. package/dist/utils/json-frame.cjs.map +1 -1
  1449. package/dist/utils/json-frame.js.map +1 -1
  1450. package/dist/utils/numbers.cjs.map +1 -1
  1451. package/dist/utils/numbers.js.map +1 -1
  1452. package/dist/utils/objects.cjs.map +1 -1
  1453. package/dist/utils/objects.js.map +1 -1
  1454. package/dist/utils/owner-fingerprint.cjs.map +1 -1
  1455. package/dist/utils/owner-fingerprint.js.map +1 -1
  1456. package/dist/utils/promises.cjs.map +1 -1
  1457. package/dist/utils/promises.js.map +1 -1
  1458. package/dist/utils/relative-time.cjs.map +1 -1
  1459. package/dist/utils/relative-time.js.map +1 -1
  1460. package/dist/utils/safe-url.cjs.map +1 -1
  1461. package/dist/utils/safe-url.js.map +1 -1
  1462. package/dist/utils/schema-like.cjs.map +1 -1
  1463. package/dist/utils/schema-like.js.map +1 -1
  1464. package/dist/utils/storage.cjs +1 -1
  1465. package/dist/utils/storage.cjs.map +1 -1
  1466. package/dist/utils/storage.js +2 -2
  1467. package/dist/utils/storage.js.map +1 -1
  1468. package/dist/utils/strings.cjs.map +1 -1
  1469. package/dist/utils/strings.js.map +1 -1
  1470. package/dist/utils/xlsx.cjs.map +1 -1
  1471. package/dist/utils/xlsx.js.map +1 -1
  1472. package/dist/vision/core/canvas.cjs.map +1 -1
  1473. package/dist/vision/core/canvas.js.map +1 -1
  1474. package/dist/vision/core/dtypes.cjs.map +1 -1
  1475. package/dist/vision/core/dtypes.js.map +1 -1
  1476. package/dist/vision/core/exceptions.cjs.map +1 -1
  1477. package/dist/vision/core/exceptions.js.map +1 -1
  1478. package/dist/vision/core/graph.cjs.map +1 -1
  1479. package/dist/vision/core/graph.js.map +1 -1
  1480. package/dist/vision/core/metadata.cjs +1 -1
  1481. package/dist/vision/core/metadata.cjs.map +1 -1
  1482. package/dist/vision/core/metadata.js +9 -26
  1483. package/dist/vision/core/metadata.js.map +1 -1
  1484. package/dist/vision/core/providers.cjs.map +1 -1
  1485. package/dist/vision/core/providers.js.map +1 -1
  1486. package/dist/vision/core/session.cjs.map +1 -1
  1487. package/dist/vision/core/session.js.map +1 -1
  1488. package/dist/vision/core/timing.cjs.map +1 -1
  1489. package/dist/vision/core/timing.js.map +1 -1
  1490. package/dist/vision/fusion.cjs.map +1 -1
  1491. package/dist/vision/fusion.js.map +1 -1
  1492. package/dist/vision/index.cjs.map +1 -1
  1493. package/dist/vision/index.js.map +1 -1
  1494. package/dist/vision/io/image.cjs.map +1 -1
  1495. package/dist/vision/io/image.js.map +1 -1
  1496. package/dist/vision/labels.cjs.map +1 -1
  1497. package/dist/vision/labels.js.map +1 -1
  1498. package/dist/vision/luminance.cjs.map +1 -1
  1499. package/dist/vision/luminance.js.map +1 -1
  1500. package/dist/vision/normalization.cjs.map +1 -1
  1501. package/dist/vision/normalization.js.map +1 -1
  1502. package/dist/vision/postprocess/classification.cjs.map +1 -1
  1503. package/dist/vision/postprocess/classification.js.map +1 -1
  1504. package/dist/vision/postprocess/detection.cjs.map +1 -1
  1505. package/dist/vision/postprocess/detection.js.map +1 -1
  1506. package/dist/vision/postprocess/segmentation.cjs.map +1 -1
  1507. package/dist/vision/postprocess/segmentation.js.map +1 -1
  1508. package/dist/vision/preprocess/image.cjs.map +1 -1
  1509. package/dist/vision/preprocess/image.js.map +1 -1
  1510. package/dist/vision/preprocess/pipeline.cjs.map +1 -1
  1511. package/dist/vision/preprocess/pipeline.js.map +1 -1
  1512. package/dist/vision/results.cjs.map +1 -1
  1513. package/dist/vision/results.js.map +1 -1
  1514. package/dist/vision/tasks/base.cjs.map +1 -1
  1515. package/dist/vision/tasks/base.js.map +1 -1
  1516. package/dist/vision/tasks/classifier.cjs.map +1 -1
  1517. package/dist/vision/tasks/classifier.js.map +1 -1
  1518. package/dist/vision/tasks/detectClassify.cjs.map +1 -1
  1519. package/dist/vision/tasks/detectClassify.js.map +1 -1
  1520. package/dist/vision/tasks/detector.cjs.map +1 -1
  1521. package/dist/vision/tasks/detector.js.map +1 -1
  1522. package/dist/vision/tasks/segmenter.cjs.map +1 -1
  1523. package/dist/vision/tasks/segmenter.js.map +1 -1
  1524. package/dist/vision/types.cjs.map +1 -1
  1525. package/dist/vision/types.js.map +1 -1
  1526. package/dist/vision/use-camera-stream.cjs +1 -1
  1527. package/dist/vision/use-camera-stream.cjs.map +1 -1
  1528. package/dist/vision/use-camera-stream.js +3 -9
  1529. package/dist/vision/use-camera-stream.js.map +1 -1
  1530. package/dist/vision/use-live-luminance.cjs +1 -1
  1531. package/dist/vision/use-live-luminance.cjs.map +1 -1
  1532. package/dist/vision/use-live-luminance.js +1 -5
  1533. package/dist/vision/use-live-luminance.js.map +1 -1
  1534. package/dist/vite/base-url.cjs.map +1 -1
  1535. package/dist/vite/base-url.js.map +1 -1
  1536. package/dist/vite/create-vite-config.cjs.map +1 -1
  1537. package/dist/vite/create-vite-config.js.map +1 -1
  1538. package/dist/vite/narrow-tokens.cjs.map +1 -1
  1539. package/dist/vite/narrow-tokens.js.map +1 -1
  1540. package/dist/vite/tempest-csp.cjs +1 -1
  1541. package/dist/vite/tempest-csp.cjs.map +1 -1
  1542. package/dist/vite/tempest-csp.js +2 -10
  1543. package/dist/vite/tempest-csp.js.map +1 -1
  1544. package/dist/vite/tempest-icons.cjs.map +1 -1
  1545. package/dist/vite/tempest-icons.js.map +1 -1
  1546. package/dist/vite/tempest-pwa-dev-sw.cjs +1 -1
  1547. package/dist/vite/tempest-pwa-dev-sw.cjs.map +1 -1
  1548. package/dist/vite/tempest-pwa-dev-sw.js +9 -16
  1549. package/dist/vite/tempest-pwa-dev-sw.js.map +1 -1
  1550. package/dist/vite/tempest-pwa-icons.cjs.map +1 -1
  1551. package/dist/vite/tempest-pwa-icons.js.map +1 -1
  1552. package/dist/vite/tempest-pwa-manifest.cjs.map +1 -1
  1553. package/dist/vite/tempest-pwa-manifest.js.map +1 -1
  1554. package/dist/vite/tempest-styles.cjs.map +1 -1
  1555. package/dist/vite/tempest-styles.js.map +1 -1
  1556. package/dist/vite/tempest-vitest.cjs.map +1 -1
  1557. package/dist/vite/tempest-vitest.js.map +1 -1
  1558. package/dist/webrtc/link-stats.cjs.map +1 -1
  1559. package/dist/webrtc/link-stats.js.map +1 -1
  1560. package/dist/webrtc/mesh-quality.cjs.map +1 -1
  1561. package/dist/webrtc/mesh-quality.js.map +1 -1
  1562. package/dist/webrtc/opus-sdp.cjs.map +1 -1
  1563. package/dist/webrtc/opus-sdp.js.map +1 -1
  1564. package/dist/webrtc/peer-link.cjs +1 -1
  1565. package/dist/webrtc/peer-link.cjs.map +1 -1
  1566. package/dist/webrtc/peer-link.js +2 -5
  1567. package/dist/webrtc/peer-link.js.map +1 -1
  1568. package/dist/webrtc/peer-mesh.cjs +1 -1
  1569. package/dist/webrtc/peer-mesh.cjs.map +1 -1
  1570. package/dist/webrtc/peer-mesh.js +8 -24
  1571. package/dist/webrtc/peer-mesh.js.map +1 -1
  1572. package/dist/webrtc/sender-bitrate.cjs.map +1 -1
  1573. package/dist/webrtc/sender-bitrate.js.map +1 -1
  1574. package/dist/webrtc/use-link-stats.cjs.map +1 -1
  1575. package/dist/webrtc/use-link-stats.js.map +1 -1
  1576. package/dist/ws/create-web-socket.cjs +1 -1
  1577. package/dist/ws/create-web-socket.cjs.map +1 -1
  1578. package/dist/ws/create-web-socket.js +4 -22
  1579. package/dist/ws/create-web-socket.js.map +1 -1
  1580. package/dist/ws/resilience.cjs.map +1 -1
  1581. package/dist/ws/resilience.js.map +1 -1
  1582. package/dist/ws/use-web-socket.cjs.map +1 -1
  1583. package/dist/ws/use-web-socket.js.map +1 -1
  1584. package/package.json +9 -6
  1585. package/template/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"share.js","names":[],"sources":["../../src/share/share.ts"],"sourcesContent":["export interface SharePayload {\n title?: string;\n text?: string;\n url?: string;\n /** Files to share (supported only on a subset of browsers). */\n files?: File[];\n}\n\nexport interface ShareResult {\n /** True when `navigator.share` resolved successfully. */\n shared: boolean;\n /** True when the platform did not support the requested payload. */\n unsupported: boolean;\n /** True when the user cancelled the share dialog. */\n cancelled: boolean;\n error?: unknown;\n}\n\n/**\n * Wrap the Web Share API with a uniform result object. Falls through to\n * `unsupported: true` when the browser lacks `navigator.share`, leaving the\n * caller free to render a custom fallback (copy-link, social buttons).\n */\nexport async function share(payload: SharePayload): Promise<ShareResult> {\n if (typeof navigator === \"undefined\" || !(\"share\" in navigator)) {\n return { shared: false, unsupported: true, cancelled: false };\n }\n if (payload.files && !navigator.canShare?.({ files: payload.files })) {\n return { shared: false, unsupported: true, cancelled: false };\n }\n try {\n await navigator.share(payload);\n return { shared: true, unsupported: false, cancelled: false };\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n return { shared: false, unsupported: false, cancelled: true };\n }\n return { shared: false, unsupported: false, cancelled: false, error };\n }\n}\n\n/** True when the Web Share API is available in this environment. */\nexport function isShareSupported(): boolean {\n return typeof navigator !== \"undefined\" && \"share\" in navigator;\n}\n"],"mappings":";AAuBA,eAAsB,EAAM,GAA6C;CAIrE,IAHI,OAAO,YAAc,OAAe,EAAE,WAAW,cAGjD,EAAQ,SAAS,CAAC,UAAU,WAAW,EAAE,OAAO,EAAQ,MAAM,CAAC,GAC/D,OAAO;EAAE,QAAQ;EAAO,aAAa;EAAM,WAAW;CAAM;CAEhE,IAAI;EAEA,OADA,MAAM,UAAU,MAAM,CAAO,GACtB;GAAE,QAAQ;GAAM,aAAa;GAAO,WAAW;EAAM;CAChE,SAAS,GAAO;EAIZ,OAHI,aAAiB,gBAAgB,EAAM,SAAS,eACzC;GAAE,QAAQ;GAAO,aAAa;GAAO,WAAW;EAAK,IAEzD;GAAE,QAAQ;GAAO,aAAa;GAAO,WAAW;GAAO;EAAM;CACxE;AACJ;AAGA,SAAgB,IAA4B;CACxC,OAAO,OAAO,YAAc,OAAe,WAAW;AAC1D"}
1
+ {"version":3,"file":"share.js","names":["share","payload","error","isShareSupported"],"sources":["../../src/share/share.ts"],"sourcesContent":["export interface SharePayload {\n title?: string;\n text?: string;\n url?: string;\n /** Files to share (supported only on a subset of browsers). */\n files?: File[];\n}\n\nexport interface ShareResult {\n /** True when `navigator.share` resolved successfully. */\n shared: boolean;\n /** True when the platform did not support the requested payload. */\n unsupported: boolean;\n /** True when the user cancelled the share dialog. */\n cancelled: boolean;\n error?: unknown;\n}\n\n/**\n * Wrap the Web Share API with a uniform result object. Falls through to\n * `unsupported: true` when the browser lacks `navigator.share`, leaving the\n * caller free to render a custom fallback (copy-link, social buttons).\n */\nexport async function share(payload: SharePayload): Promise<ShareResult> {\n if (typeof navigator === \"undefined\" || !(\"share\" in navigator)) {\n return { shared: false, unsupported: true, cancelled: false };\n }\n if (payload.files && !navigator.canShare?.({ files: payload.files })) {\n return { shared: false, unsupported: true, cancelled: false };\n }\n try {\n await navigator.share(payload);\n return { shared: true, unsupported: false, cancelled: false };\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n return { shared: false, unsupported: false, cancelled: true };\n }\n return { shared: false, unsupported: false, cancelled: false, error };\n }\n}\n\n/** True when the Web Share API is available in this environment. */\nexport function isShareSupported(): boolean {\n return typeof navigator !== \"undefined\" && \"share\" in navigator;\n}\n"],"mappings":";AAuBA,eAAsBA,EAAM,GAA6C;CAIrE,IAHI,OAAO,YAAc,OAAe,EAAE,WAAW,cAGjDC,EAAQ,SAAS,CAAC,UAAU,WAAW,EAAE,OAAOA,EAAQ,MAAM,CAAC,GAC/D,OAAO;EAAE,QAAQ;EAAO,aAAa;EAAM,WAAW;CAAM;CAEhE,IAAI;EAEA,OADA,MAAM,UAAU,MAAMA,CAAO,GACtB;GAAE,QAAQ;GAAM,aAAa;GAAO,WAAW;EAAM;CAChE,SAASC,GAAO;EAIZ,OAHIA,aAAiB,gBAAgBA,EAAM,SAAS,eACzC;GAAE,QAAQ;GAAO,aAAa;GAAO,WAAW;EAAK,IAEzD;GAAE,QAAQ;GAAO,aAAa;GAAO,WAAW;GAAO;EAAM;CACxE;AACJ;AAGA,SAAgBC,IAA4B;CACxC,OAAO,OAAO,YAAc,OAAe,WAAW;AAC1D"}
@@ -1 +1 @@
1
- {"version":3,"file":"create-event-stream.cjs","names":[],"sources":["../../src/sse/create-event-stream.ts"],"sourcesContent":["/**\n * @tempest-limits function-lines — the body is the SSE line protocol — accumulate\n * `data:` lines until a blank line, track `id:` for Last-Event-ID, honour `retry:` —\n * plus the reconnect that uses the id it just tracked.\n */\nimport { decodeFrame } from \"../utils/json-frame\";\nimport type { SchemaIssue, SchemaLike } from \"../utils/schema-like\";\nexport type EventStreamStatus = \"idle\" | \"connecting\" | \"open\" | \"closed\" | \"error\";\n\nexport interface EventStreamMessage<T> {\n /** Server-named event (default `\"message\"`). */\n event: string;\n /** Parsed payload — validated when `schema` is set, JSON-decoded when possible, raw string otherwise. */\n data: T;\n /** Server-supplied id, if any. */\n id?: string;\n /** Raw `MessageEvent` for advanced cases. */\n raw: MessageEvent;\n}\n\nexport interface CreateEventStreamOptions<T> {\n /** Send cookies with the EventSource handshake. Default: false. */\n withCredentials?: boolean;\n /** Subscribe to named events in addition to `message`. */\n namedEvents?: readonly string[];\n /** Treat these named events as heartbeat-only (no callback). Default: `[\"ping\"]`. */\n heartbeatEvents?: readonly string[];\n /** Max reconnect attempts. Default: 10. Pass 0 to disable reconnect. */\n maxRetries?: number;\n /** Initial backoff in ms; doubles per attempt, capped at `maxBackoff`. Default: 1000. */\n initialBackoff?: number;\n /** Maximum backoff in ms. Default: 30000. */\n maxBackoff?: number;\n /** Parse `event.data`. Defaults to JSON with raw-string fallback. */\n parser?: (raw: string) => T;\n /**\n * A frame arrived that is not valid JSON, and no `parser` was supplied.\n *\n * Registering this drops the frame instead of delivering it: the previous\n * behaviour handed `onMessage` the raw `string` announced as your message\n * type, so the failure surfaced later, at the first property access, with\n * nothing left pointing at the parse. Leave it out and that behaviour is\n * kept, with a one-time warning in development builds.\n */\n onParseError?: (error: unknown, raw: string) => void;\n /**\n * Schema every decoded frame must satisfy, from zod, valibot, arktype or\n * anything else exposing `~standard` or `.safeParse`.\n *\n * Without it nothing changes: the payload reaches `onMessage` announced as\n * `T` on the strength of the type argument alone, which is a promise about\n * the server that TypeScript cannot keep. With it, a frame that does not\n * match is **not** delivered — the same rule `onParseError` already follows —\n * and `onValidationError` hears why. The value delivered is the schema's\n * output, so coercions and defaults are honoured.\n *\n * When `parser` is also supplied, it decodes first and the schema validates\n * what it returned.\n *\n * The validation must be synchronous. A frame is decoded inside the\n * `message` handler and delivered from it, so an async schema would deliver\n * frames in whatever order their validations settled; that case is reported\n * through `onValidationError` instead of awaited.\n */\n schema?: SchemaLike<T>;\n /**\n * A frame was decoded but the `schema` refused it, so it was dropped.\n *\n * The one signal that does not depend on how the app's bundler resolves\n * `process`: the one-time development warning behind `onParseError` needs\n * `isDevBuild()` to be able to answer, and this callback is the app's own.\n */\n onValidationError?: (issues: SchemaIssue[], raw: string) => void;\n onOpen?: () => void;\n onMessage?: (message: EventStreamMessage<T>) => void;\n onError?: (error: Event) => void;\n onStatusChange?: (status: EventStreamStatus) => void;\n}\n\nexport interface EventStreamController {\n close: () => void;\n /** Force an immediate reconnect, resetting the retry counter. */\n reconnect: () => void;\n /** Current connection status. */\n readonly status: EventStreamStatus;\n}\n\n/**\n * Open a Server-Sent Events stream with automatic exponential-backoff reconnect.\n *\n * Heartbeat events (default `\"ping\"`) keep the socket alive without firing\n * `onMessage`. Pass `withCredentials: true` when the backend authenticates via\n * cookies. Call `close()` from the returned controller to tear down.\n *\n * @param url - Full SSE endpoint URL.\n * @param options - Stream configuration and callbacks.\n * @returns A controller exposing `close`, `reconnect` and the current `status`.\n */\nexport function createEventStream<T = unknown>(\n url: string,\n options: CreateEventStreamOptions<T> = {},\n): EventStreamController {\n const {\n withCredentials = false,\n namedEvents = [],\n heartbeatEvents = [\"ping\"],\n maxRetries = 10,\n initialBackoff = 1000,\n maxBackoff = 30000,\n parser,\n onOpen,\n onMessage,\n onError,\n onParseError,\n schema,\n onValidationError,\n onStatusChange,\n } = options;\n\n let source: EventSource | null = null;\n let retryTimer: ReturnType<typeof setTimeout> | null = null;\n let retries = 0;\n let status: EventStreamStatus = \"idle\";\n let closed = false;\n\n function setStatus(next: EventStreamStatus): void {\n if (status === next) return;\n status = next;\n onStatusChange?.(next);\n }\n\n function emit(eventName: string, event: MessageEvent): void {\n if (heartbeatEvents.includes(eventName)) return;\n const decoded = decodeFrame<T>(\n typeof event.data === \"string\" ? event.data : \"\",\n \"createEventStream\",\n { parser, onParseError, schema, onValidationError },\n );\n if (!decoded.delivered) return;\n onMessage?.({\n event: eventName,\n data: decoded.data,\n id: event.lastEventId || undefined,\n raw: event,\n });\n }\n\n function scheduleReconnect(): void {\n if (closed) return;\n if (retries >= maxRetries) {\n setStatus(\"error\");\n return;\n }\n const delay = Math.min(initialBackoff * 2 ** retries, maxBackoff);\n retries += 1;\n retryTimer = setTimeout(connect, delay);\n }\n\n function connect(): void {\n if (closed) return;\n if (source) source.close();\n setStatus(\"connecting\");\n\n const es = new EventSource(url, { withCredentials });\n source = es;\n\n es.onopen = () => {\n retries = 0;\n setStatus(\"open\");\n onOpen?.();\n };\n\n es.onmessage = (event) => emit(\"message\", event);\n for (const name of namedEvents) {\n es.addEventListener(name, (event) => emit(name, event as MessageEvent));\n }\n for (const name of heartbeatEvents) {\n es.addEventListener(name, () => {\n /* heartbeat — keep socket alive */\n });\n }\n\n es.onerror = (event) => {\n onError?.(event);\n es.close();\n source = null;\n setStatus(\"closed\");\n scheduleReconnect();\n };\n }\n\n function close(): void {\n closed = true;\n if (retryTimer) {\n clearTimeout(retryTimer);\n retryTimer = null;\n }\n retries = 0;\n if (source) {\n source.close();\n source = null;\n }\n setStatus(\"closed\");\n }\n\n function reconnect(): void {\n if (retryTimer) {\n clearTimeout(retryTimer);\n retryTimer = null;\n }\n retries = 0;\n closed = false;\n connect();\n }\n\n connect();\n\n return {\n close,\n reconnect,\n get status() {\n return status;\n },\n };\n}\n"],"mappings":"2CAkGA,SAAgB,EACZ,EACA,EAAuC,CAAC,EACnB,CACrB,GAAM,CACF,kBAAkB,GAClB,cAAc,CAAC,EACf,kBAAkB,CAAC,MAAM,EACzB,aAAa,GACb,iBAAiB,IACjB,aAAa,IACb,SACA,SACA,YACA,UACA,eACA,SACA,oBACA,kBACA,EAEA,EAA6B,KAC7B,EAAmD,KACnD,EAAU,EACV,EAA4B,OAC5B,EAAS,GAEb,SAAS,EAAU,EAA+B,CAC1C,IAAW,IACf,EAAS,EACT,IAAiB,CAAI,EACzB,CAEA,SAAS,EAAK,EAAmB,EAA2B,CACxD,GAAI,EAAgB,SAAS,CAAS,EAAG,OACzC,IAAM,EAAU,EAAA,YACZ,OAAO,EAAM,MAAS,SAAW,EAAM,KAAO,GAC9C,oBACA,CAAE,SAAQ,eAAc,SAAQ,mBAAkB,CACtD,EACK,EAAQ,WACb,IAAY,CACR,MAAO,EACP,KAAM,EAAQ,KACd,GAAI,EAAM,aAAe,IAAA,GACzB,IAAK,CACT,CAAC,CACL,CAEA,SAAS,GAA0B,CAC/B,GAAI,EAAQ,OACZ,GAAI,GAAW,EAAY,CACvB,EAAU,OAAO,EACjB,MACJ,CACA,IAAM,EAAQ,KAAK,IAAI,EAAiB,GAAK,EAAS,CAAU,EAChE,GAAW,EACX,EAAa,WAAW,EAAS,CAAK,CAC1C,CAEA,SAAS,GAAgB,CACrB,GAAI,EAAQ,OACR,GAAQ,EAAO,MAAM,EACzB,EAAU,YAAY,EAEtB,IAAM,EAAK,IAAI,YAAY,EAAK,CAAE,iBAAgB,CAAC,EACnD,EAAS,EAET,EAAG,WAAe,CACd,EAAU,EACV,EAAU,MAAM,EAChB,IAAS,CACb,EAEA,EAAG,UAAa,GAAU,EAAK,UAAW,CAAK,EAC/C,IAAK,IAAM,KAAQ,EACf,EAAG,iBAAiB,EAAO,GAAU,EAAK,EAAM,CAAqB,CAAC,EAE1E,IAAK,IAAM,KAAQ,EACf,EAAG,iBAAiB,MAAY,CAEhC,CAAC,EAGL,EAAG,QAAW,GAAU,CACpB,IAAU,CAAK,EACf,EAAG,MAAM,EACT,EAAS,KACT,EAAU,QAAQ,EAClB,EAAkB,CACtB,CACJ,CAEA,SAAS,GAAc,CACnB,EAAS,GACT,AAEI,KADA,aAAa,CAAU,EACV,MAEjB,EAAU,EACV,AAEI,KADA,EAAO,MAAM,EACJ,MAEb,EAAU,QAAQ,CACtB,CAEA,SAAS,GAAkB,CACvB,AAEI,KADA,aAAa,CAAU,EACV,MAEjB,EAAU,EACV,EAAS,GACT,EAAQ,CACZ,CAIA,OAFA,EAAQ,EAED,CACH,QACA,YACA,IAAI,QAAS,CACT,OAAO,CACX,CACJ,CACJ"}
1
+ {"version":3,"file":"create-event-stream.cjs","names":["decodeFrame","require_json_frame","createEventStream","options","source","retryTimer","retries","status","closed","setStatus","next","onStatusChange","emit","heartbeatEvents","eventName","decoded","event","onMessage","scheduleReconnect","maxRetries","delay","initialBackoff","maxBackoff","connect","es","url","onOpen","name","namedEvents","onError","close","reconnect"],"sources":["../../src/sse/create-event-stream.ts"],"sourcesContent":["/**\n * @tempest-limits function-lines — the body is the SSE line protocol — accumulate\n * `data:` lines until a blank line, track `id:` for Last-Event-ID, honour `retry:` —\n * plus the reconnect that uses the id it just tracked.\n */\nimport { decodeFrame } from \"../utils/json-frame\";\nimport type { SchemaIssue, SchemaLike } from \"../utils/schema-like\";\nexport type EventStreamStatus = \"idle\" | \"connecting\" | \"open\" | \"closed\" | \"error\";\n\nexport interface EventStreamMessage<T> {\n /** Server-named event (default `\"message\"`). */\n event: string;\n /** Parsed payload — validated when `schema` is set, JSON-decoded when possible, raw string otherwise. */\n data: T;\n /** Server-supplied id, if any. */\n id?: string;\n /** Raw `MessageEvent` for advanced cases. */\n raw: MessageEvent;\n}\n\nexport interface CreateEventStreamOptions<T> {\n /** Send cookies with the EventSource handshake. Default: false. */\n withCredentials?: boolean;\n /** Subscribe to named events in addition to `message`. */\n namedEvents?: readonly string[];\n /** Treat these named events as heartbeat-only (no callback). Default: `[\"ping\"]`. */\n heartbeatEvents?: readonly string[];\n /** Max reconnect attempts. Default: 10. Pass 0 to disable reconnect. */\n maxRetries?: number;\n /** Initial backoff in ms; doubles per attempt, capped at `maxBackoff`. Default: 1000. */\n initialBackoff?: number;\n /** Maximum backoff in ms. Default: 30000. */\n maxBackoff?: number;\n /** Parse `event.data`. Defaults to JSON with raw-string fallback. */\n parser?: (raw: string) => T;\n /**\n * A frame arrived that is not valid JSON, and no `parser` was supplied.\n *\n * Registering this drops the frame instead of delivering it: the previous\n * behaviour handed `onMessage` the raw `string` announced as your message\n * type, so the failure surfaced later, at the first property access, with\n * nothing left pointing at the parse. Leave it out and that behaviour is\n * kept, with a one-time warning in development builds.\n */\n onParseError?: (error: unknown, raw: string) => void;\n /**\n * Schema every decoded frame must satisfy, from zod, valibot, arktype or\n * anything else exposing `~standard` or `.safeParse`.\n *\n * Without it nothing changes: the payload reaches `onMessage` announced as\n * `T` on the strength of the type argument alone, which is a promise about\n * the server that TypeScript cannot keep. With it, a frame that does not\n * match is **not** delivered — the same rule `onParseError` already follows —\n * and `onValidationError` hears why. The value delivered is the schema's\n * output, so coercions and defaults are honoured.\n *\n * When `parser` is also supplied, it decodes first and the schema validates\n * what it returned.\n *\n * The validation must be synchronous. A frame is decoded inside the\n * `message` handler and delivered from it, so an async schema would deliver\n * frames in whatever order their validations settled; that case is reported\n * through `onValidationError` instead of awaited.\n */\n schema?: SchemaLike<T>;\n /**\n * A frame was decoded but the `schema` refused it, so it was dropped.\n *\n * The one signal that does not depend on how the app's bundler resolves\n * `process`: the one-time development warning behind `onParseError` needs\n * `isDevBuild()` to be able to answer, and this callback is the app's own.\n */\n onValidationError?: (issues: SchemaIssue[], raw: string) => void;\n onOpen?: () => void;\n onMessage?: (message: EventStreamMessage<T>) => void;\n onError?: (error: Event) => void;\n onStatusChange?: (status: EventStreamStatus) => void;\n}\n\nexport interface EventStreamController {\n close: () => void;\n /** Force an immediate reconnect, resetting the retry counter. */\n reconnect: () => void;\n /** Current connection status. */\n readonly status: EventStreamStatus;\n}\n\n/**\n * Open a Server-Sent Events stream with automatic exponential-backoff reconnect.\n *\n * Heartbeat events (default `\"ping\"`) keep the socket alive without firing\n * `onMessage`. Pass `withCredentials: true` when the backend authenticates via\n * cookies. Call `close()` from the returned controller to tear down.\n *\n * @param url - Full SSE endpoint URL.\n * @param options - Stream configuration and callbacks.\n * @returns A controller exposing `close`, `reconnect` and the current `status`.\n */\nexport function createEventStream<T = unknown>(\n url: string,\n options: CreateEventStreamOptions<T> = {},\n): EventStreamController {\n const {\n withCredentials = false,\n namedEvents = [],\n heartbeatEvents = [\"ping\"],\n maxRetries = 10,\n initialBackoff = 1000,\n maxBackoff = 30000,\n parser,\n onOpen,\n onMessage,\n onError,\n onParseError,\n schema,\n onValidationError,\n onStatusChange,\n } = options;\n\n let source: EventSource | null = null;\n let retryTimer: ReturnType<typeof setTimeout> | null = null;\n let retries = 0;\n let status: EventStreamStatus = \"idle\";\n let closed = false;\n\n function setStatus(next: EventStreamStatus): void {\n if (status === next) return;\n status = next;\n onStatusChange?.(next);\n }\n\n function emit(eventName: string, event: MessageEvent): void {\n if (heartbeatEvents.includes(eventName)) return;\n const decoded = decodeFrame<T>(\n typeof event.data === \"string\" ? event.data : \"\",\n \"createEventStream\",\n { parser, onParseError, schema, onValidationError },\n );\n if (!decoded.delivered) return;\n onMessage?.({\n event: eventName,\n data: decoded.data,\n id: event.lastEventId || undefined,\n raw: event,\n });\n }\n\n function scheduleReconnect(): void {\n if (closed) return;\n if (retries >= maxRetries) {\n setStatus(\"error\");\n return;\n }\n const delay = Math.min(initialBackoff * 2 ** retries, maxBackoff);\n retries += 1;\n retryTimer = setTimeout(connect, delay);\n }\n\n function connect(): void {\n if (closed) return;\n if (source) source.close();\n setStatus(\"connecting\");\n\n const es = new EventSource(url, { withCredentials });\n source = es;\n\n es.onopen = () => {\n retries = 0;\n setStatus(\"open\");\n onOpen?.();\n };\n\n es.onmessage = (event) => emit(\"message\", event);\n for (const name of namedEvents) {\n es.addEventListener(name, (event) => emit(name, event as MessageEvent));\n }\n for (const name of heartbeatEvents) {\n es.addEventListener(name, () => {\n /* heartbeat — keep socket alive */\n });\n }\n\n es.onerror = (event) => {\n onError?.(event);\n es.close();\n source = null;\n setStatus(\"closed\");\n scheduleReconnect();\n };\n }\n\n function close(): void {\n closed = true;\n if (retryTimer) {\n clearTimeout(retryTimer);\n retryTimer = null;\n }\n retries = 0;\n if (source) {\n source.close();\n source = null;\n }\n setStatus(\"closed\");\n }\n\n function reconnect(): void {\n if (retryTimer) {\n clearTimeout(retryTimer);\n retryTimer = null;\n }\n retries = 0;\n closed = false;\n connect();\n }\n\n connect();\n\n return {\n close,\n reconnect,\n get status() {\n return status;\n },\n };\n}\n"],"mappings":"A,2CAkGA,SAAgBE,EACZ,EACA,EAAuC,CAAC,EACnB,CACrB,GAAM,CACF,kBAAkB,GAClB,cAAc,CAAC,EACf,kBAAkB,CAAC,MAAM,EACzB,aAAa,GACb,iBAAiB,IACjB,aAAa,IACb,SACA,SACA,YACA,UACA,eACA,SACA,oBACA,kBACAC,EAEAC,EAA6B,KAC7BC,EAAmD,KACnDC,EAAU,EACVC,EAA4B,OAC5BC,EAAS,GAEb,SAASC,EAAU,EAA+B,CAC1CF,IAAWG,IACf,EAASA,EACTC,IAAiBD,CAAI,EACzB,CAEA,SAASE,EAAK,EAAmB,EAA2B,CACxD,GAAIC,EAAgB,SAASC,CAAS,EAAG,OACzC,IAAMC,EAAUf,EAAAA,YACZ,OAAOgB,EAAM,MAAS,SAAWA,EAAM,KAAO,GAC9C,oBACA,CAAE,SAAQ,eAAc,SAAQ,mBAAkB,CACtD,EACKD,EAAQ,WACbE,IAAY,CACR,MAAOH,EACP,KAAMC,EAAQ,KACd,GAAIC,EAAM,aAAe,IAAA,GACzB,IAAKA,CACT,CAAC,CACL,CAEA,SAASE,GAA0B,CAC/B,GAAIV,EAAQ,OACZ,GAAIF,GAAWa,EAAY,CACvBV,EAAU,OAAO,EACjB,MACJ,CACA,IAAMW,EAAQ,KAAK,IAAIC,EAAiB,GAAKf,EAASgB,CAAU,EAChE,GAAW,EACX,EAAa,WAAWC,EAASH,CAAK,CAC1C,CAEA,SAASG,GAAgB,CACrB,GAAIf,EAAQ,OACRJ,GAAQA,EAAO,MAAM,EACzBK,EAAU,YAAY,EAEtB,IAAMe,EAAK,IAAI,YAAYC,EAAK,CAAE,iBAAgB,CAAC,EACnD,EAASD,EAET,EAAG,WAAe,CACd,EAAU,EACVf,EAAU,MAAM,EAChBiB,IAAS,CACb,EAEA,EAAG,UAAa,GAAUd,EAAK,UAAWI,CAAK,EAC/C,IAAK,IAAMW,KAAQC,EACfJ,EAAG,iBAAiBG,EAAO,GAAUf,EAAKe,EAAMX,CAAqB,CAAC,EAE1E,IAAK,IAAMW,KAAQd,EACfW,EAAG,iBAAiBG,MAAY,CAEhC,CAAC,EAGL,EAAG,QAAW,GAAU,CACpBE,IAAUb,CAAK,EACfQ,EAAG,MAAM,EACT,EAAS,KACTf,EAAU,QAAQ,EAClBS,EAAkB,CACtB,CACJ,CAEA,SAASY,GAAc,CACnB,EAAS,GACT,AAEIzB,KADA,aAAaA,CAAU,EACV,MAEjB,EAAU,EACV,AAEID,KADAA,EAAO,MAAM,EACJ,MAEbK,EAAU,QAAQ,CACtB,CAEA,SAASsB,GAAkB,CACvB,AAEI1B,KADA,aAAaA,CAAU,EACV,MAEjB,EAAU,EACV,EAAS,GACTkB,EAAQ,CACZ,CAIA,OAFAA,EAAQ,EAED,CACH,QACA,YACA,IAAI,QAAS,CACT,OAAOhB,CACX,CACJ,CACJ,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"create-event-stream.js","names":[],"sources":["../../src/sse/create-event-stream.ts"],"sourcesContent":["/**\n * @tempest-limits function-lines — the body is the SSE line protocol — accumulate\n * `data:` lines until a blank line, track `id:` for Last-Event-ID, honour `retry:` —\n * plus the reconnect that uses the id it just tracked.\n */\nimport { decodeFrame } from \"../utils/json-frame\";\nimport type { SchemaIssue, SchemaLike } from \"../utils/schema-like\";\nexport type EventStreamStatus = \"idle\" | \"connecting\" | \"open\" | \"closed\" | \"error\";\n\nexport interface EventStreamMessage<T> {\n /** Server-named event (default `\"message\"`). */\n event: string;\n /** Parsed payload — validated when `schema` is set, JSON-decoded when possible, raw string otherwise. */\n data: T;\n /** Server-supplied id, if any. */\n id?: string;\n /** Raw `MessageEvent` for advanced cases. */\n raw: MessageEvent;\n}\n\nexport interface CreateEventStreamOptions<T> {\n /** Send cookies with the EventSource handshake. Default: false. */\n withCredentials?: boolean;\n /** Subscribe to named events in addition to `message`. */\n namedEvents?: readonly string[];\n /** Treat these named events as heartbeat-only (no callback). Default: `[\"ping\"]`. */\n heartbeatEvents?: readonly string[];\n /** Max reconnect attempts. Default: 10. Pass 0 to disable reconnect. */\n maxRetries?: number;\n /** Initial backoff in ms; doubles per attempt, capped at `maxBackoff`. Default: 1000. */\n initialBackoff?: number;\n /** Maximum backoff in ms. Default: 30000. */\n maxBackoff?: number;\n /** Parse `event.data`. Defaults to JSON with raw-string fallback. */\n parser?: (raw: string) => T;\n /**\n * A frame arrived that is not valid JSON, and no `parser` was supplied.\n *\n * Registering this drops the frame instead of delivering it: the previous\n * behaviour handed `onMessage` the raw `string` announced as your message\n * type, so the failure surfaced later, at the first property access, with\n * nothing left pointing at the parse. Leave it out and that behaviour is\n * kept, with a one-time warning in development builds.\n */\n onParseError?: (error: unknown, raw: string) => void;\n /**\n * Schema every decoded frame must satisfy, from zod, valibot, arktype or\n * anything else exposing `~standard` or `.safeParse`.\n *\n * Without it nothing changes: the payload reaches `onMessage` announced as\n * `T` on the strength of the type argument alone, which is a promise about\n * the server that TypeScript cannot keep. With it, a frame that does not\n * match is **not** delivered — the same rule `onParseError` already follows —\n * and `onValidationError` hears why. The value delivered is the schema's\n * output, so coercions and defaults are honoured.\n *\n * When `parser` is also supplied, it decodes first and the schema validates\n * what it returned.\n *\n * The validation must be synchronous. A frame is decoded inside the\n * `message` handler and delivered from it, so an async schema would deliver\n * frames in whatever order their validations settled; that case is reported\n * through `onValidationError` instead of awaited.\n */\n schema?: SchemaLike<T>;\n /**\n * A frame was decoded but the `schema` refused it, so it was dropped.\n *\n * The one signal that does not depend on how the app's bundler resolves\n * `process`: the one-time development warning behind `onParseError` needs\n * `isDevBuild()` to be able to answer, and this callback is the app's own.\n */\n onValidationError?: (issues: SchemaIssue[], raw: string) => void;\n onOpen?: () => void;\n onMessage?: (message: EventStreamMessage<T>) => void;\n onError?: (error: Event) => void;\n onStatusChange?: (status: EventStreamStatus) => void;\n}\n\nexport interface EventStreamController {\n close: () => void;\n /** Force an immediate reconnect, resetting the retry counter. */\n reconnect: () => void;\n /** Current connection status. */\n readonly status: EventStreamStatus;\n}\n\n/**\n * Open a Server-Sent Events stream with automatic exponential-backoff reconnect.\n *\n * Heartbeat events (default `\"ping\"`) keep the socket alive without firing\n * `onMessage`. Pass `withCredentials: true` when the backend authenticates via\n * cookies. Call `close()` from the returned controller to tear down.\n *\n * @param url - Full SSE endpoint URL.\n * @param options - Stream configuration and callbacks.\n * @returns A controller exposing `close`, `reconnect` and the current `status`.\n */\nexport function createEventStream<T = unknown>(\n url: string,\n options: CreateEventStreamOptions<T> = {},\n): EventStreamController {\n const {\n withCredentials = false,\n namedEvents = [],\n heartbeatEvents = [\"ping\"],\n maxRetries = 10,\n initialBackoff = 1000,\n maxBackoff = 30000,\n parser,\n onOpen,\n onMessage,\n onError,\n onParseError,\n schema,\n onValidationError,\n onStatusChange,\n } = options;\n\n let source: EventSource | null = null;\n let retryTimer: ReturnType<typeof setTimeout> | null = null;\n let retries = 0;\n let status: EventStreamStatus = \"idle\";\n let closed = false;\n\n function setStatus(next: EventStreamStatus): void {\n if (status === next) return;\n status = next;\n onStatusChange?.(next);\n }\n\n function emit(eventName: string, event: MessageEvent): void {\n if (heartbeatEvents.includes(eventName)) return;\n const decoded = decodeFrame<T>(\n typeof event.data === \"string\" ? event.data : \"\",\n \"createEventStream\",\n { parser, onParseError, schema, onValidationError },\n );\n if (!decoded.delivered) return;\n onMessage?.({\n event: eventName,\n data: decoded.data,\n id: event.lastEventId || undefined,\n raw: event,\n });\n }\n\n function scheduleReconnect(): void {\n if (closed) return;\n if (retries >= maxRetries) {\n setStatus(\"error\");\n return;\n }\n const delay = Math.min(initialBackoff * 2 ** retries, maxBackoff);\n retries += 1;\n retryTimer = setTimeout(connect, delay);\n }\n\n function connect(): void {\n if (closed) return;\n if (source) source.close();\n setStatus(\"connecting\");\n\n const es = new EventSource(url, { withCredentials });\n source = es;\n\n es.onopen = () => {\n retries = 0;\n setStatus(\"open\");\n onOpen?.();\n };\n\n es.onmessage = (event) => emit(\"message\", event);\n for (const name of namedEvents) {\n es.addEventListener(name, (event) => emit(name, event as MessageEvent));\n }\n for (const name of heartbeatEvents) {\n es.addEventListener(name, () => {\n /* heartbeat — keep socket alive */\n });\n }\n\n es.onerror = (event) => {\n onError?.(event);\n es.close();\n source = null;\n setStatus(\"closed\");\n scheduleReconnect();\n };\n }\n\n function close(): void {\n closed = true;\n if (retryTimer) {\n clearTimeout(retryTimer);\n retryTimer = null;\n }\n retries = 0;\n if (source) {\n source.close();\n source = null;\n }\n setStatus(\"closed\");\n }\n\n function reconnect(): void {\n if (retryTimer) {\n clearTimeout(retryTimer);\n retryTimer = null;\n }\n retries = 0;\n closed = false;\n connect();\n }\n\n connect();\n\n return {\n close,\n reconnect,\n get status() {\n return status;\n },\n };\n}\n"],"mappings":";;AAkGA,SAAgB,EACZ,GACA,IAAuC,CAAC,GACnB;CACrB,IAAM,EACF,qBAAkB,IAClB,iBAAc,CAAC,GACf,qBAAkB,CAAC,MAAM,GACzB,gBAAa,IACb,oBAAiB,KACjB,gBAAa,KACb,WACA,WACA,cACA,YACA,iBACA,WACA,sBACA,sBACA,GAEA,IAA6B,MAC7B,IAAmD,MACnD,IAAU,GACV,IAA4B,QAC5B,IAAS;CAEb,SAAS,EAAU,GAA+B;EAC1C,MAAW,MACf,IAAS,GACT,IAAiB,CAAI;CACzB;CAEA,SAAS,EAAK,GAAmB,GAA2B;EACxD,IAAI,EAAgB,SAAS,CAAS,GAAG;EACzC,IAAM,IAAU,EACZ,OAAO,EAAM,QAAS,WAAW,EAAM,OAAO,IAC9C,qBACA;GAAE;GAAQ;GAAc;GAAQ;EAAkB,CACtD;EACK,EAAQ,aACb,IAAY;GACR,OAAO;GACP,MAAM,EAAQ;GACd,IAAI,EAAM,eAAe,KAAA;GACzB,KAAK;EACT,CAAC;CACL;CAEA,SAAS,IAA0B;EAC/B,IAAI,GAAQ;EACZ,IAAI,KAAW,GAAY;GACvB,EAAU,OAAO;GACjB;EACJ;EACA,IAAM,IAAQ,KAAK,IAAI,IAAiB,KAAK,GAAS,CAAU;EAEhE,AADA,KAAW,GACX,IAAa,WAAW,GAAS,CAAK;CAC1C;CAEA,SAAS,IAAgB;EACrB,IAAI,GAAQ;EAEZ,AADI,KAAQ,EAAO,MAAM,GACzB,EAAU,YAAY;EAEtB,IAAM,IAAK,IAAI,YAAY,GAAK,EAAE,mBAAgB,CAAC;EASnD,AARA,IAAS,GAET,EAAG,eAAe;GAGd,AAFA,IAAU,GACV,EAAU,MAAM,GAChB,IAAS;EACb,GAEA,EAAG,aAAa,MAAU,EAAK,WAAW,CAAK;EAC/C,KAAK,IAAM,KAAQ,GACf,EAAG,iBAAiB,IAAO,MAAU,EAAK,GAAM,CAAqB,CAAC;EAE1E,KAAK,IAAM,KAAQ,GACf,EAAG,iBAAiB,SAAY,CAEhC,CAAC;EAGL,EAAG,WAAW,MAAU;GAKpB,AAJA,IAAU,CAAK,GACf,EAAG,MAAM,GACT,IAAS,MACT,EAAU,QAAQ,GAClB,EAAkB;EACtB;CACJ;CAEA,SAAS,IAAc;EAWnB,AAVA,IAAS,IACT,AAEI,OADA,aAAa,CAAU,GACV,OAEjB,IAAU,GACV,AAEI,OADA,EAAO,MAAM,GACJ,OAEb,EAAU,QAAQ;CACtB;CAEA,SAAS,IAAkB;EAOvB,AANA,AAEI,OADA,aAAa,CAAU,GACV,OAEjB,IAAU,GACV,IAAS,IACT,EAAQ;CACZ;CAIA,OAFA,EAAQ,GAED;EACH;EACA;EACA,IAAI,SAAS;GACT,OAAO;EACX;CACJ;AACJ"}
1
+ {"version":3,"file":"create-event-stream.js","names":["createEventStream","options","source","retryTimer","retries","status","closed","setStatus","next","onStatusChange","emit","heartbeatEvents","eventName","decoded","decodeFrame","event","onMessage","scheduleReconnect","maxRetries","delay","initialBackoff","maxBackoff","connect","es","url","onOpen","name","namedEvents","onError","close","reconnect"],"sources":["../../src/sse/create-event-stream.ts"],"sourcesContent":["/**\n * @tempest-limits function-lines — the body is the SSE line protocol — accumulate\n * `data:` lines until a blank line, track `id:` for Last-Event-ID, honour `retry:` —\n * plus the reconnect that uses the id it just tracked.\n */\nimport { decodeFrame } from \"../utils/json-frame\";\nimport type { SchemaIssue, SchemaLike } from \"../utils/schema-like\";\nexport type EventStreamStatus = \"idle\" | \"connecting\" | \"open\" | \"closed\" | \"error\";\n\nexport interface EventStreamMessage<T> {\n /** Server-named event (default `\"message\"`). */\n event: string;\n /** Parsed payload — validated when `schema` is set, JSON-decoded when possible, raw string otherwise. */\n data: T;\n /** Server-supplied id, if any. */\n id?: string;\n /** Raw `MessageEvent` for advanced cases. */\n raw: MessageEvent;\n}\n\nexport interface CreateEventStreamOptions<T> {\n /** Send cookies with the EventSource handshake. Default: false. */\n withCredentials?: boolean;\n /** Subscribe to named events in addition to `message`. */\n namedEvents?: readonly string[];\n /** Treat these named events as heartbeat-only (no callback). Default: `[\"ping\"]`. */\n heartbeatEvents?: readonly string[];\n /** Max reconnect attempts. Default: 10. Pass 0 to disable reconnect. */\n maxRetries?: number;\n /** Initial backoff in ms; doubles per attempt, capped at `maxBackoff`. Default: 1000. */\n initialBackoff?: number;\n /** Maximum backoff in ms. Default: 30000. */\n maxBackoff?: number;\n /** Parse `event.data`. Defaults to JSON with raw-string fallback. */\n parser?: (raw: string) => T;\n /**\n * A frame arrived that is not valid JSON, and no `parser` was supplied.\n *\n * Registering this drops the frame instead of delivering it: the previous\n * behaviour handed `onMessage` the raw `string` announced as your message\n * type, so the failure surfaced later, at the first property access, with\n * nothing left pointing at the parse. Leave it out and that behaviour is\n * kept, with a one-time warning in development builds.\n */\n onParseError?: (error: unknown, raw: string) => void;\n /**\n * Schema every decoded frame must satisfy, from zod, valibot, arktype or\n * anything else exposing `~standard` or `.safeParse`.\n *\n * Without it nothing changes: the payload reaches `onMessage` announced as\n * `T` on the strength of the type argument alone, which is a promise about\n * the server that TypeScript cannot keep. With it, a frame that does not\n * match is **not** delivered — the same rule `onParseError` already follows —\n * and `onValidationError` hears why. The value delivered is the schema's\n * output, so coercions and defaults are honoured.\n *\n * When `parser` is also supplied, it decodes first and the schema validates\n * what it returned.\n *\n * The validation must be synchronous. A frame is decoded inside the\n * `message` handler and delivered from it, so an async schema would deliver\n * frames in whatever order their validations settled; that case is reported\n * through `onValidationError` instead of awaited.\n */\n schema?: SchemaLike<T>;\n /**\n * A frame was decoded but the `schema` refused it, so it was dropped.\n *\n * The one signal that does not depend on how the app's bundler resolves\n * `process`: the one-time development warning behind `onParseError` needs\n * `isDevBuild()` to be able to answer, and this callback is the app's own.\n */\n onValidationError?: (issues: SchemaIssue[], raw: string) => void;\n onOpen?: () => void;\n onMessage?: (message: EventStreamMessage<T>) => void;\n onError?: (error: Event) => void;\n onStatusChange?: (status: EventStreamStatus) => void;\n}\n\nexport interface EventStreamController {\n close: () => void;\n /** Force an immediate reconnect, resetting the retry counter. */\n reconnect: () => void;\n /** Current connection status. */\n readonly status: EventStreamStatus;\n}\n\n/**\n * Open a Server-Sent Events stream with automatic exponential-backoff reconnect.\n *\n * Heartbeat events (default `\"ping\"`) keep the socket alive without firing\n * `onMessage`. Pass `withCredentials: true` when the backend authenticates via\n * cookies. Call `close()` from the returned controller to tear down.\n *\n * @param url - Full SSE endpoint URL.\n * @param options - Stream configuration and callbacks.\n * @returns A controller exposing `close`, `reconnect` and the current `status`.\n */\nexport function createEventStream<T = unknown>(\n url: string,\n options: CreateEventStreamOptions<T> = {},\n): EventStreamController {\n const {\n withCredentials = false,\n namedEvents = [],\n heartbeatEvents = [\"ping\"],\n maxRetries = 10,\n initialBackoff = 1000,\n maxBackoff = 30000,\n parser,\n onOpen,\n onMessage,\n onError,\n onParseError,\n schema,\n onValidationError,\n onStatusChange,\n } = options;\n\n let source: EventSource | null = null;\n let retryTimer: ReturnType<typeof setTimeout> | null = null;\n let retries = 0;\n let status: EventStreamStatus = \"idle\";\n let closed = false;\n\n function setStatus(next: EventStreamStatus): void {\n if (status === next) return;\n status = next;\n onStatusChange?.(next);\n }\n\n function emit(eventName: string, event: MessageEvent): void {\n if (heartbeatEvents.includes(eventName)) return;\n const decoded = decodeFrame<T>(\n typeof event.data === \"string\" ? event.data : \"\",\n \"createEventStream\",\n { parser, onParseError, schema, onValidationError },\n );\n if (!decoded.delivered) return;\n onMessage?.({\n event: eventName,\n data: decoded.data,\n id: event.lastEventId || undefined,\n raw: event,\n });\n }\n\n function scheduleReconnect(): void {\n if (closed) return;\n if (retries >= maxRetries) {\n setStatus(\"error\");\n return;\n }\n const delay = Math.min(initialBackoff * 2 ** retries, maxBackoff);\n retries += 1;\n retryTimer = setTimeout(connect, delay);\n }\n\n function connect(): void {\n if (closed) return;\n if (source) source.close();\n setStatus(\"connecting\");\n\n const es = new EventSource(url, { withCredentials });\n source = es;\n\n es.onopen = () => {\n retries = 0;\n setStatus(\"open\");\n onOpen?.();\n };\n\n es.onmessage = (event) => emit(\"message\", event);\n for (const name of namedEvents) {\n es.addEventListener(name, (event) => emit(name, event as MessageEvent));\n }\n for (const name of heartbeatEvents) {\n es.addEventListener(name, () => {\n /* heartbeat — keep socket alive */\n });\n }\n\n es.onerror = (event) => {\n onError?.(event);\n es.close();\n source = null;\n setStatus(\"closed\");\n scheduleReconnect();\n };\n }\n\n function close(): void {\n closed = true;\n if (retryTimer) {\n clearTimeout(retryTimer);\n retryTimer = null;\n }\n retries = 0;\n if (source) {\n source.close();\n source = null;\n }\n setStatus(\"closed\");\n }\n\n function reconnect(): void {\n if (retryTimer) {\n clearTimeout(retryTimer);\n retryTimer = null;\n }\n retries = 0;\n closed = false;\n connect();\n }\n\n connect();\n\n return {\n close,\n reconnect,\n get status() {\n return status;\n },\n };\n}\n"],"mappings":";;AAkGA,SAAgBA,EACZ,GACA,IAAuC,CAAC,GACnB;CACrB,IAAM,EACF,qBAAkB,IAClB,iBAAc,CAAC,GACf,qBAAkB,CAAC,MAAM,GACzB,gBAAa,IACb,oBAAiB,KACjB,gBAAa,KACb,WACA,WACA,cACA,YACA,iBACA,WACA,sBACA,sBACAC,GAEAC,IAA6B,MAC7BC,IAAmD,MACnDC,IAAU,GACVC,IAA4B,QAC5BC,IAAS;CAEb,SAASC,EAAU,GAA+B;EAC9C,AAAIF,MAAWG,MACf,IAASA,GACTC,IAAiBD,CAAI;CACzB;CAEA,SAASE,EAAK,GAAmB,GAA2B;EACxD,IAAIC,EAAgB,SAASC,CAAS,GAAG;EACzC,IAAMC,IAAUC,EACZ,OAAOC,EAAM,QAAS,WAAWA,EAAM,OAAO,IAC9C,qBACA;GAAE;GAAQ;GAAc;GAAQ;EAAkB,CACtD;EACA,AAAKF,EAAQ,aACbG,IAAY;GACR,OAAOJ;GACP,MAAMC,EAAQ;GACd,IAAIE,EAAM,eAAe,KAAA;GACzB,KAAKA;EACT,CAAC;CACL;CAEA,SAASE,IAA0B;EAC/B,IAAIX,GAAQ;EACZ,IAAIF,KAAWc,GAAY;GACvB,EAAU,OAAO;GACjB;EACJ;EACA,IAAMC,IAAQ,KAAK,IAAIC,IAAiB,KAAKhB,GAASiB,CAAU;EAEhE,AADA,KAAW,GACX,IAAa,WAAWC,GAASH,CAAK;CAC1C;CAEA,SAASG,IAAgB;EACrB,IAAIhB,GAAQ;EAEZ,AADIJ,KAAQA,EAAO,MAAM,GACzBK,EAAU,YAAY;EAEtB,IAAMgB,IAAK,IAAI,YAAYC,GAAK,EAAE,mBAAgB,CAAC;EASnD,AARA,IAASD,GAET,EAAG,eAAe;GAGd,AAFA,IAAU,GACVhB,EAAU,MAAM,GAChBkB,IAAS;EACb,GAEA,EAAG,aAAa,MAAUf,EAAK,WAAWK,CAAK;EAC/C,KAAK,IAAMW,KAAQC,GACf,EAAG,iBAAiBD,IAAO,MAAUhB,EAAKgB,GAAMX,CAAqB,CAAC;EAE1E,KAAK,IAAMW,KAAQf,GACf,EAAG,iBAAiBe,SAAY,CAEhC,CAAC;EAGL,EAAG,WAAW,MAAU;GAKpB,AAJAE,IAAUb,CAAK,GACfQ,EAAG,MAAM,GACT,IAAS,MACThB,EAAU,QAAQ,GAClBU,EAAkB;EACtB;CACJ;CAEA,SAASY,IAAc;EAWnB,AAVA,IAAS,IACT,AAEI1B,OADA,aAAaA,CAAU,GACV,OAEjB,IAAU,GACV,AAEID,OADAA,EAAO,MAAM,GACJ,OAEbK,EAAU,QAAQ;CACtB;CAEA,SAASuB,IAAkB;EAOvB,AANA,AAEI3B,OADA,aAAaA,CAAU,GACV,OAEjB,IAAU,GACV,IAAS,IACTmB,EAAQ;CACZ;CAIA,OAFAA,EAAQ,GAED;EACH;EACA;EACA,IAAI,SAAS;GACT,OAAOjB;EACX;CACJ;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-event-stream.cjs","names":[],"sources":["../../src/sse/use-event-stream.ts"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport { useLatestRef } from \"@/hooks/use-latest-ref\";\nimport {\n createEventStream,\n type CreateEventStreamOptions,\n type EventStreamMessage,\n type EventStreamStatus,\n} from \"./create-event-stream\";\n\nexport interface UseEventStreamOptions<T> extends Omit<\n CreateEventStreamOptions<T>,\n \"onStatusChange\"\n> {\n /** When false, the stream is not opened. Useful for \"wait for auth\". Default: true. */\n enabled?: boolean;\n}\n\nexport interface UseEventStreamResult<T> {\n status: EventStreamStatus;\n /** Last message received (excluding heartbeats). */\n lastMessage: EventStreamMessage<T> | null;\n /** Force a reconnect. */\n reconnect: () => void;\n}\n\n/**\n * React hook wrapper around {@link createEventStream}. Connection lifecycle is\n * tied to the component (and the `url`/`enabled` dependencies); the stream\n * closes on unmount.\n *\n * Pass `schema` to have every frame validated before it reaches `onMessage`,\n * instead of trusting the type argument: without it `data` is announced as `T`\n * on the strength of the generic alone, which is a promise about the server\n * that TypeScript cannot keep. It is read when the stream opens, so declare it\n * outside the component rather than building one inline per render.\n *\n * @example\n * useEventStream<Notification>(`${API}/notifications/stream`, {\n * enabled: !!user,\n * withCredentials: true,\n * onMessage: ({ data }) => addNotification(data),\n * });\n *\n * @example\n * // Validated: a frame that does not match never reaches `onMessage`\n * const notificationSchema = z.object({ id: z.string(), message: z.string() });\n *\n * useEventStream<Notification>(`${API}/notifications/stream`, {\n * schema: notificationSchema,\n * onValidationError: (issues) => logger.warn(\"stream drift\", { issues }),\n * onMessage: ({ data }) => addNotification(data),\n * });\n */\nexport function useEventStream<T = unknown>(\n url: string,\n options: UseEventStreamOptions<T> = {},\n): UseEventStreamResult<T> {\n const { enabled = true, onMessage, ...rest } = options;\n const [status, setStatus] = useState<EventStreamStatus>(\"idle\");\n const [lastMessage, setLastMessage] = useState<EventStreamMessage<T> | null>(null);\n const reconnectRef = useRef<(() => void) | null>(null);\n\n const onMessageRef = useLatestRef(onMessage);\n\n useEffect(() => {\n if (!enabled || !url) {\n setStatus(\"idle\");\n return;\n }\n\n const controller = createEventStream<T>(url, {\n ...rest,\n onStatusChange: setStatus,\n onMessage: (message) => {\n setLastMessage(message);\n onMessageRef.current?.(message);\n },\n });\n reconnectRef.current = controller.reconnect;\n\n return () => {\n controller.close();\n reconnectRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [url, enabled]);\n\n return {\n status,\n lastMessage,\n reconnect: () => reconnectRef.current?.(),\n };\n}\n"],"mappings":"6GAqDA,SAAgB,EACZ,EACA,EAAoC,CAAC,EACd,CACvB,GAAM,CAAE,UAAU,GAAM,YAAW,GAAG,GAAS,EACzC,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAA4B,MAAM,EACxD,CAAC,EAAa,IAAA,EAAkB,EAAA,SAAA,CAAuC,IAAI,EAC3E,GAAA,EAAe,EAAA,OAAA,CAA4B,IAAI,EAE/C,EAAe,EAAA,aAAa,CAAS,EAyB3C,OAvBA,EAAA,EAAA,UAAA,KAAgB,CACZ,GAAI,CAAC,GAAW,CAAC,EAAK,CAClB,EAAU,MAAM,EAChB,MACJ,CAEA,IAAM,EAAa,EAAA,kBAAqB,EAAK,CACzC,GAAG,EACH,eAAgB,EAChB,UAAY,GAAY,CACpB,EAAe,CAAO,EACtB,EAAa,UAAU,CAAO,CAClC,CACJ,CAAC,EAGD,MAFA,GAAa,QAAU,EAAW,cAErB,CACT,EAAW,MAAM,EACjB,EAAa,QAAU,IAC3B,CAEJ,EAAG,CAAC,EAAK,CAAO,CAAC,EAEV,CACH,SACA,cACA,cAAiB,EAAa,UAAU,CAC5C,CACJ"}
1
+ {"version":3,"file":"use-event-stream.cjs","names":["useState","useRef","useLatestRef","createEventStream","require_use_latest_ref","require_create_event_stream","react","useEventStream","rest","options","status","setStatus","lastMessage","setLastMessage","reconnectRef","onMessageRef","onMessage","enabled","url","controller","message"],"sources":["../../src/sse/use-event-stream.ts"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport { useLatestRef } from \"@/hooks/use-latest-ref\";\nimport {\n createEventStream,\n type CreateEventStreamOptions,\n type EventStreamMessage,\n type EventStreamStatus,\n} from \"./create-event-stream\";\n\nexport interface UseEventStreamOptions<T> extends Omit<\n CreateEventStreamOptions<T>,\n \"onStatusChange\"\n> {\n /** When false, the stream is not opened. Useful for \"wait for auth\". Default: true. */\n enabled?: boolean;\n}\n\nexport interface UseEventStreamResult<T> {\n status: EventStreamStatus;\n /** Last message received (excluding heartbeats). */\n lastMessage: EventStreamMessage<T> | null;\n /** Force a reconnect. */\n reconnect: () => void;\n}\n\n/**\n * React hook wrapper around {@link createEventStream}. Connection lifecycle is\n * tied to the component (and the `url`/`enabled` dependencies); the stream\n * closes on unmount.\n *\n * Pass `schema` to have every frame validated before it reaches `onMessage`,\n * instead of trusting the type argument: without it `data` is announced as `T`\n * on the strength of the generic alone, which is a promise about the server\n * that TypeScript cannot keep. It is read when the stream opens, so declare it\n * outside the component rather than building one inline per render.\n *\n * @example\n * useEventStream<Notification>(`${API}/notifications/stream`, {\n * enabled: !!user,\n * withCredentials: true,\n * onMessage: ({ data }) => addNotification(data),\n * });\n *\n * @example\n * // Validated: a frame that does not match never reaches `onMessage`\n * const notificationSchema = z.object({ id: z.string(), message: z.string() });\n *\n * useEventStream<Notification>(`${API}/notifications/stream`, {\n * schema: notificationSchema,\n * onValidationError: (issues) => logger.warn(\"stream drift\", { issues }),\n * onMessage: ({ data }) => addNotification(data),\n * });\n */\nexport function useEventStream<T = unknown>(\n url: string,\n options: UseEventStreamOptions<T> = {},\n): UseEventStreamResult<T> {\n const { enabled = true, onMessage, ...rest } = options;\n const [status, setStatus] = useState<EventStreamStatus>(\"idle\");\n const [lastMessage, setLastMessage] = useState<EventStreamMessage<T> | null>(null);\n const reconnectRef = useRef<(() => void) | null>(null);\n\n const onMessageRef = useLatestRef(onMessage);\n\n useEffect(() => {\n if (!enabled || !url) {\n setStatus(\"idle\");\n return;\n }\n\n const controller = createEventStream<T>(url, {\n ...rest,\n onStatusChange: setStatus,\n onMessage: (message) => {\n setLastMessage(message);\n onMessageRef.current?.(message);\n },\n });\n reconnectRef.current = controller.reconnect;\n\n return () => {\n controller.close();\n reconnectRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [url, enabled]);\n\n return {\n status,\n lastMessage,\n reconnect: () => reconnectRef.current?.(),\n };\n}\n"],"mappings":"A,6GAqDA,SAAgBO,EACZ,EACA,EAAoC,CAAC,EACd,CACvB,GAAM,CAAE,UAAU,GAAM,YAAW,GAAGC,GAASC,EACzC,CAACC,EAAQC,IAAA,EAAaX,EAAAA,SAAAA,CAA4B,MAAM,EACxD,CAACY,EAAaC,IAAA,EAAkBb,EAAAA,SAAAA,CAAuC,IAAI,EAC3Ec,GAAA,EAAeb,EAAAA,OAAAA,CAA4B,IAAI,EAE/Cc,EAAeb,EAAAA,aAAac,CAAS,EAyB3C,OAvBA,EAAAV,EAAA,UAAA,KAAgB,CACZ,GAAI,CAACW,GAAW,CAACC,EAAK,CAClBP,EAAU,MAAM,EAChB,MACJ,CAEA,IAAMQ,EAAahB,EAAAA,kBAAqBe,EAAK,CACzC,GAAGV,EACH,eAAgBG,EAChB,UAAY,GAAY,CACpBE,EAAeO,CAAO,EACtBL,EAAa,UAAUK,CAAO,CAClC,CACJ,CAAC,EAGD,MAFA,GAAa,QAAUD,EAAW,cAErB,CACTA,EAAW,MAAM,EACjB,EAAa,QAAU,IAC3B,CAEJ,EAAG,CAACD,EAAKD,CAAO,CAAC,EAEV,CACH,SACA,cACA,cAAiBH,EAAa,UAAU,CAC5C,CACJ,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-event-stream.js","names":[],"sources":["../../src/sse/use-event-stream.ts"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport { useLatestRef } from \"@/hooks/use-latest-ref\";\nimport {\n createEventStream,\n type CreateEventStreamOptions,\n type EventStreamMessage,\n type EventStreamStatus,\n} from \"./create-event-stream\";\n\nexport interface UseEventStreamOptions<T> extends Omit<\n CreateEventStreamOptions<T>,\n \"onStatusChange\"\n> {\n /** When false, the stream is not opened. Useful for \"wait for auth\". Default: true. */\n enabled?: boolean;\n}\n\nexport interface UseEventStreamResult<T> {\n status: EventStreamStatus;\n /** Last message received (excluding heartbeats). */\n lastMessage: EventStreamMessage<T> | null;\n /** Force a reconnect. */\n reconnect: () => void;\n}\n\n/**\n * React hook wrapper around {@link createEventStream}. Connection lifecycle is\n * tied to the component (and the `url`/`enabled` dependencies); the stream\n * closes on unmount.\n *\n * Pass `schema` to have every frame validated before it reaches `onMessage`,\n * instead of trusting the type argument: without it `data` is announced as `T`\n * on the strength of the generic alone, which is a promise about the server\n * that TypeScript cannot keep. It is read when the stream opens, so declare it\n * outside the component rather than building one inline per render.\n *\n * @example\n * useEventStream<Notification>(`${API}/notifications/stream`, {\n * enabled: !!user,\n * withCredentials: true,\n * onMessage: ({ data }) => addNotification(data),\n * });\n *\n * @example\n * // Validated: a frame that does not match never reaches `onMessage`\n * const notificationSchema = z.object({ id: z.string(), message: z.string() });\n *\n * useEventStream<Notification>(`${API}/notifications/stream`, {\n * schema: notificationSchema,\n * onValidationError: (issues) => logger.warn(\"stream drift\", { issues }),\n * onMessage: ({ data }) => addNotification(data),\n * });\n */\nexport function useEventStream<T = unknown>(\n url: string,\n options: UseEventStreamOptions<T> = {},\n): UseEventStreamResult<T> {\n const { enabled = true, onMessage, ...rest } = options;\n const [status, setStatus] = useState<EventStreamStatus>(\"idle\");\n const [lastMessage, setLastMessage] = useState<EventStreamMessage<T> | null>(null);\n const reconnectRef = useRef<(() => void) | null>(null);\n\n const onMessageRef = useLatestRef(onMessage);\n\n useEffect(() => {\n if (!enabled || !url) {\n setStatus(\"idle\");\n return;\n }\n\n const controller = createEventStream<T>(url, {\n ...rest,\n onStatusChange: setStatus,\n onMessage: (message) => {\n setLastMessage(message);\n onMessageRef.current?.(message);\n },\n });\n reconnectRef.current = controller.reconnect;\n\n return () => {\n controller.close();\n reconnectRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [url, enabled]);\n\n return {\n status,\n lastMessage,\n reconnect: () => reconnectRef.current?.(),\n };\n}\n"],"mappings":";;;;AAqDA,SAAgB,EACZ,GACA,IAAoC,CAAC,GACd;CACvB,IAAM,EAAE,aAAU,IAAM,cAAW,GAAG,MAAS,GACzC,CAAC,GAAQ,KAAa,EAA4B,MAAM,GACxD,CAAC,GAAa,KAAkB,EAAuC,IAAI,GAC3E,IAAe,EAA4B,IAAI,GAE/C,IAAe,EAAa,CAAS;CAyB3C,OAvBA,QAAgB;EACZ,IAAI,CAAC,KAAW,CAAC,GAAK;GAClB,EAAU,MAAM;GAChB;EACJ;EAEA,IAAM,IAAa,EAAqB,GAAK;GACzC,GAAG;GACH,gBAAgB;GAChB,YAAY,MAAY;IAEpB,AADA,EAAe,CAAO,GACtB,EAAa,UAAU,CAAO;GAClC;EACJ,CAAC;EAGD,OAFA,EAAa,UAAU,EAAW,iBAErB;GAET,AADA,EAAW,MAAM,GACjB,EAAa,UAAU;EAC3B;CAEJ,GAAG,CAAC,GAAK,CAAO,CAAC,GAEV;EACH;EACA;EACA,iBAAiB,EAAa,UAAU;CAC5C;AACJ"}
1
+ {"version":3,"file":"use-event-stream.js","names":["useEventStream","rest","options","status","setStatus","useState","lastMessage","setLastMessage","reconnectRef","useRef","onMessageRef","useLatestRef","onMessage","useEffect","enabled","url","controller","createEventStream","message"],"sources":["../../src/sse/use-event-stream.ts"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport { useLatestRef } from \"@/hooks/use-latest-ref\";\nimport {\n createEventStream,\n type CreateEventStreamOptions,\n type EventStreamMessage,\n type EventStreamStatus,\n} from \"./create-event-stream\";\n\nexport interface UseEventStreamOptions<T> extends Omit<\n CreateEventStreamOptions<T>,\n \"onStatusChange\"\n> {\n /** When false, the stream is not opened. Useful for \"wait for auth\". Default: true. */\n enabled?: boolean;\n}\n\nexport interface UseEventStreamResult<T> {\n status: EventStreamStatus;\n /** Last message received (excluding heartbeats). */\n lastMessage: EventStreamMessage<T> | null;\n /** Force a reconnect. */\n reconnect: () => void;\n}\n\n/**\n * React hook wrapper around {@link createEventStream}. Connection lifecycle is\n * tied to the component (and the `url`/`enabled` dependencies); the stream\n * closes on unmount.\n *\n * Pass `schema` to have every frame validated before it reaches `onMessage`,\n * instead of trusting the type argument: without it `data` is announced as `T`\n * on the strength of the generic alone, which is a promise about the server\n * that TypeScript cannot keep. It is read when the stream opens, so declare it\n * outside the component rather than building one inline per render.\n *\n * @example\n * useEventStream<Notification>(`${API}/notifications/stream`, {\n * enabled: !!user,\n * withCredentials: true,\n * onMessage: ({ data }) => addNotification(data),\n * });\n *\n * @example\n * // Validated: a frame that does not match never reaches `onMessage`\n * const notificationSchema = z.object({ id: z.string(), message: z.string() });\n *\n * useEventStream<Notification>(`${API}/notifications/stream`, {\n * schema: notificationSchema,\n * onValidationError: (issues) => logger.warn(\"stream drift\", { issues }),\n * onMessage: ({ data }) => addNotification(data),\n * });\n */\nexport function useEventStream<T = unknown>(\n url: string,\n options: UseEventStreamOptions<T> = {},\n): UseEventStreamResult<T> {\n const { enabled = true, onMessage, ...rest } = options;\n const [status, setStatus] = useState<EventStreamStatus>(\"idle\");\n const [lastMessage, setLastMessage] = useState<EventStreamMessage<T> | null>(null);\n const reconnectRef = useRef<(() => void) | null>(null);\n\n const onMessageRef = useLatestRef(onMessage);\n\n useEffect(() => {\n if (!enabled || !url) {\n setStatus(\"idle\");\n return;\n }\n\n const controller = createEventStream<T>(url, {\n ...rest,\n onStatusChange: setStatus,\n onMessage: (message) => {\n setLastMessage(message);\n onMessageRef.current?.(message);\n },\n });\n reconnectRef.current = controller.reconnect;\n\n return () => {\n controller.close();\n reconnectRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [url, enabled]);\n\n return {\n status,\n lastMessage,\n reconnect: () => reconnectRef.current?.(),\n };\n}\n"],"mappings":";;;;AAqDA,SAAgBA,EACZ,GACA,IAAoC,CAAC,GACd;CACvB,IAAM,EAAE,aAAU,IAAM,cAAW,GAAGC,MAASC,GACzC,CAACC,GAAQC,KAAaC,EAA4B,MAAM,GACxD,CAACC,GAAaC,KAAkBF,EAAuC,IAAI,GAC3EG,IAAeC,EAA4B,IAAI,GAE/CC,IAAeC,EAAaC,CAAS;CAyB3C,OAvBAC,QAAgB;EACZ,IAAI,CAACC,KAAW,CAACC,GAAK;GAClB,EAAU,MAAM;GAChB;EACJ;EAEA,IAAMC,IAAaC,EAAqBF,GAAK;GACzC,GAAGd;GACH,gBAAgBG;GAChB,YAAY,MAAY;IAEpB,AADAG,EAAeW,CAAO,GACtBR,EAAa,UAAUQ,CAAO;GAClC;EACJ,CAAC;EAGD,OAFA,EAAa,UAAUF,EAAW,iBAErB;GAET,AADAA,EAAW,MAAM,GACjB,EAAa,UAAU;EAC3B;CAEJ,GAAG,CAACD,GAAKD,CAAO,CAAC,GAEV;EACH;EACA;EACA,iBAAiBN,EAAa,UAAU;CAC5C;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"create-selectors.cjs","names":[],"sources":["../../src/store/create-selectors.ts"],"sourcesContent":["import type { StoreApi, UseBoundStore } from \"zustand\";\n\n/**\n * A bound Zustand hook augmented with auto-generated per-field selector hooks\n * under `.use`. Reading a single field via `store.use.field()` subscribes the\n * component only to that field, avoiding re-renders when unrelated slices change.\n */\nexport type WithSelectors<S> = S extends { getState: () => infer T }\n ? S & { use: { [K in keyof T]: () => T[K] } }\n : never;\n\n/**\n * Attach auto-generated selector hooks to a Zustand store. Instead of writing\n * `useStore((s) => s.user)` at every call site, you get `useStore.use.user()`\n * — one memoized selector per top-level state key.\n *\n * @typeParam S - The bound store hook type returned by `create`/{@link createStore}.\n * @param store - The bound Zustand hook.\n * @returns The same hook with a `.use` namespace of field selectors.\n *\n * @example\n * const useCart = createSelectors(\n * createStore<CartState>((set) => ({ items: [], add: (id) => ... })),\n * );\n * const items = useCart.use.items(); // subscribes only to `items`\n */\nexport function createSelectors<S extends UseBoundStore<StoreApi<object>>>(\n store: S,\n): WithSelectors<S> {\n const bound = store as WithSelectors<S>;\n bound.use = {} as WithSelectors<S>[\"use\"];\n for (const key of Object.keys(store.getState())) {\n (bound.use as Record<string, () => unknown>)[key] = () =>\n store((state) => (state as Record<string, unknown>)[key]);\n }\n return bound;\n}\n"],"mappings":"AA0BA,SAAgB,EACZ,EACgB,CAChB,IAAM,EAAQ,EACd,EAAM,IAAM,CAAC,EACb,IAAK,IAAM,KAAO,OAAO,KAAK,EAAM,SAAS,CAAC,EAC1C,EAAO,IAAsC,OACzC,EAAO,GAAW,EAAkC,EAAI,EAEhE,OAAO,CACX"}
1
+ {"version":3,"file":"create-selectors.cjs","names":["createSelectors","bound","store","key","state"],"sources":["../../src/store/create-selectors.ts"],"sourcesContent":["import type { StoreApi, UseBoundStore } from \"zustand\";\n\n/**\n * A bound Zustand hook augmented with auto-generated per-field selector hooks\n * under `.use`. Reading a single field via `store.use.field()` subscribes the\n * component only to that field, avoiding re-renders when unrelated slices change.\n */\nexport type WithSelectors<S> = S extends { getState: () => infer T }\n ? S & { use: { [K in keyof T]: () => T[K] } }\n : never;\n\n/**\n * Attach auto-generated selector hooks to a Zustand store. Instead of writing\n * `useStore((s) => s.user)` at every call site, you get `useStore.use.user()`\n * — one memoized selector per top-level state key.\n *\n * @typeParam S - The bound store hook type returned by `create`/{@link createStore}.\n * @param store - The bound Zustand hook.\n * @returns The same hook with a `.use` namespace of field selectors.\n *\n * @example\n * const useCart = createSelectors(\n * createStore<CartState>((set) => ({ items: [], add: (id) => ... })),\n * );\n * const items = useCart.use.items(); // subscribes only to `items`\n */\nexport function createSelectors<S extends UseBoundStore<StoreApi<object>>>(\n store: S,\n): WithSelectors<S> {\n const bound = store as WithSelectors<S>;\n bound.use = {} as WithSelectors<S>[\"use\"];\n for (const key of Object.keys(store.getState())) {\n (bound.use as Record<string, () => unknown>)[key] = () =>\n store((state) => (state as Record<string, unknown>)[key]);\n }\n return bound;\n}\n"],"mappings":"AA0BA,SAAgBA,EACZ,EACgB,CAChB,IAAMC,EAAQC,EACd,EAAM,IAAM,CAAC,EACb,IAAK,IAAMC,KAAO,OAAO,KAAKD,EAAM,SAAS,CAAC,EAC1C,EAAO,IAAsCC,OACzCD,EAAO,GAAWE,EAAkCD,EAAI,EAEhE,OAAOF,CACX,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"create-selectors.js","names":[],"sources":["../../src/store/create-selectors.ts"],"sourcesContent":["import type { StoreApi, UseBoundStore } from \"zustand\";\n\n/**\n * A bound Zustand hook augmented with auto-generated per-field selector hooks\n * under `.use`. Reading a single field via `store.use.field()` subscribes the\n * component only to that field, avoiding re-renders when unrelated slices change.\n */\nexport type WithSelectors<S> = S extends { getState: () => infer T }\n ? S & { use: { [K in keyof T]: () => T[K] } }\n : never;\n\n/**\n * Attach auto-generated selector hooks to a Zustand store. Instead of writing\n * `useStore((s) => s.user)` at every call site, you get `useStore.use.user()`\n * — one memoized selector per top-level state key.\n *\n * @typeParam S - The bound store hook type returned by `create`/{@link createStore}.\n * @param store - The bound Zustand hook.\n * @returns The same hook with a `.use` namespace of field selectors.\n *\n * @example\n * const useCart = createSelectors(\n * createStore<CartState>((set) => ({ items: [], add: (id) => ... })),\n * );\n * const items = useCart.use.items(); // subscribes only to `items`\n */\nexport function createSelectors<S extends UseBoundStore<StoreApi<object>>>(\n store: S,\n): WithSelectors<S> {\n const bound = store as WithSelectors<S>;\n bound.use = {} as WithSelectors<S>[\"use\"];\n for (const key of Object.keys(store.getState())) {\n (bound.use as Record<string, () => unknown>)[key] = () =>\n store((state) => (state as Record<string, unknown>)[key]);\n }\n return bound;\n}\n"],"mappings":";AA0BA,SAAgB,EACZ,GACgB;CAChB,IAAM,IAAQ;CACd,EAAM,MAAM,CAAC;CACb,KAAK,IAAM,KAAO,OAAO,KAAK,EAAM,SAAS,CAAC,GAC1C,EAAO,IAAsC,WACzC,GAAO,MAAW,EAAkC,EAAI;CAEhE,OAAO;AACX"}
1
+ {"version":3,"file":"create-selectors.js","names":["createSelectors","bound","store","key","state"],"sources":["../../src/store/create-selectors.ts"],"sourcesContent":["import type { StoreApi, UseBoundStore } from \"zustand\";\n\n/**\n * A bound Zustand hook augmented with auto-generated per-field selector hooks\n * under `.use`. Reading a single field via `store.use.field()` subscribes the\n * component only to that field, avoiding re-renders when unrelated slices change.\n */\nexport type WithSelectors<S> = S extends { getState: () => infer T }\n ? S & { use: { [K in keyof T]: () => T[K] } }\n : never;\n\n/**\n * Attach auto-generated selector hooks to a Zustand store. Instead of writing\n * `useStore((s) => s.user)` at every call site, you get `useStore.use.user()`\n * — one memoized selector per top-level state key.\n *\n * @typeParam S - The bound store hook type returned by `create`/{@link createStore}.\n * @param store - The bound Zustand hook.\n * @returns The same hook with a `.use` namespace of field selectors.\n *\n * @example\n * const useCart = createSelectors(\n * createStore<CartState>((set) => ({ items: [], add: (id) => ... })),\n * );\n * const items = useCart.use.items(); // subscribes only to `items`\n */\nexport function createSelectors<S extends UseBoundStore<StoreApi<object>>>(\n store: S,\n): WithSelectors<S> {\n const bound = store as WithSelectors<S>;\n bound.use = {} as WithSelectors<S>[\"use\"];\n for (const key of Object.keys(store.getState())) {\n (bound.use as Record<string, () => unknown>)[key] = () =>\n store((state) => (state as Record<string, unknown>)[key]);\n }\n return bound;\n}\n"],"mappings":";AA0BA,SAAgBA,EACZ,GACgB;CAChB,IAAMC,IAAQC;CACd,EAAM,MAAM,CAAC;CACb,KAAK,IAAMC,KAAO,OAAO,KAAKD,EAAM,SAAS,CAAC,GAC1C,EAAO,IAAsCC,WACzCD,GAAO,MAAWE,EAAkCD,EAAI;CAEhE,OAAOF;AACX"}
@@ -1 +1 @@
1
- {"version":3,"file":"create-store.cjs","names":[],"sources":["../../src/store/create-store.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport type { StateCreator, StoreApi, UseBoundStore } from \"zustand\";\nimport { persist, createJSONStorage } from \"zustand/middleware\";\nimport type { PersistOptions } from \"zustand/middleware\";\n\n/**\n * Persistence options for {@link createStore}. Mirrors the subset of Zustand's\n * `persist` middleware that apps usually need, with sensible Tempest defaults.\n */\nexport interface CreateStorePersistOptions<T> {\n /** Storage key (required to enable persistence). */\n name: string;\n /** Which Web Storage to use (default: `\"local\"`). */\n storage?: \"local\" | \"session\";\n /**\n * Pick the slice of state to persist. Defaults to persisting the whole\n * state. Use this to avoid writing transient/derived fields.\n */\n partialize?: PersistOptions<T, Partial<T>>[\"partialize\"];\n /** Persisted schema version, forwarded to Zustand for migrations. */\n version?: number;\n /** Migration function forwarded to Zustand's `persist` middleware. */\n migrate?: PersistOptions<T, Partial<T>>[\"migrate\"];\n}\n\n/**\n * Options accepted by {@link createStore}.\n */\nexport interface CreateStoreOptions<T> {\n /** Enable `localStorage`/`sessionStorage` persistence for the store. */\n persist?: CreateStorePersistOptions<T>;\n}\n\n/**\n * Create a typed Zustand store with optional `persist` middleware, wired with\n * Tempest defaults. This is the generic counterpart to `createAuthStore`: use\n * it for any domain slice (cart, preferences, wizard state, …) without\n * re-writing the persistence boilerplate in every app.\n *\n * @typeParam T - The store state shape (state + actions).\n * @param initializer - Standard Zustand `StateCreator` (`(set, get) => state`).\n * @param options - Optional persistence configuration.\n * @returns A bound Zustand hook (`useStore`) with the usual `getState`/`setState`/`subscribe` API.\n *\n * @example\n * interface CartState {\n * items: string[];\n * add: (id: string) => void;\n * clear: () => void;\n * }\n *\n * const useCart = createStore<CartState>(\n * (set) => ({\n * items: [],\n * add: (id) => set((s) => ({ items: [...s.items, id] })),\n * clear: () => set({ items: [] }),\n * }),\n * { persist: { name: \"cart\", partialize: (s) => ({ items: s.items }) } },\n * );\n */\nexport function createStore<T>(\n initializer: StateCreator<T, [], []>,\n options: CreateStoreOptions<T> = {},\n): UseBoundStore<StoreApi<T>> {\n if (!options.persist) {\n return create<T>()(initializer);\n }\n\n const { name, storage = \"local\", partialize, version, migrate } = options.persist;\n const storageImpl = storage === \"session\" ? () => sessionStorage : () => localStorage;\n\n return create<T>()(\n persist(initializer, {\n name,\n storage: createJSONStorage(storageImpl),\n ...(partialize ? { partialize } : {}),\n ...(version !== undefined ? { version } : {}),\n ...(migrate ? { migrate } : {}),\n }),\n );\n}\n"],"mappings":"yDA4DA,SAAgB,EACZ,EACA,EAAiC,CAAC,EACR,CAC1B,GAAI,CAAC,EAAQ,QACT,OAAA,EAAO,EAAA,OAAA,CAAU,CAAC,CAAC,CAAW,EAGlC,GAAM,CAAE,OAAM,UAAU,QAAS,aAAY,UAAS,WAAY,EAAQ,QACpE,EAAc,IAAY,cAAkB,mBAAuB,aAEzE,OAAA,EAAO,EAAA,OAAA,CAAU,CAAC,EAAA,EACd,EAAA,QAAA,CAAQ,EAAa,CACjB,OACA,SAAA,EAAS,EAAA,kBAAA,CAAkB,CAAW,EACtC,GAAI,EAAa,CAAE,YAAW,EAAI,CAAC,EACnC,GAAI,IAAY,IAAA,GAA0B,CAAC,EAAf,CAAE,SAAQ,EACtC,GAAI,EAAU,CAAE,SAAQ,EAAI,CAAC,CACjC,CAAC,CACL,CACJ"}
1
+ {"version":3,"file":"create-store.cjs","names":["create","persist","createJSONStorage","zustand","zustand_middleware","createStore","options","initializer","storageImpl","storage","partialize","version","migrate"],"sources":["../../src/store/create-store.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport type { StateCreator, StoreApi, UseBoundStore } from \"zustand\";\nimport { persist, createJSONStorage } from \"zustand/middleware\";\nimport type { PersistOptions } from \"zustand/middleware\";\n\n/**\n * Persistence options for {@link createStore}. Mirrors the subset of Zustand's\n * `persist` middleware that apps usually need, with sensible Tempest defaults.\n */\nexport interface CreateStorePersistOptions<T> {\n /** Storage key (required to enable persistence). */\n name: string;\n /** Which Web Storage to use (default: `\"local\"`). */\n storage?: \"local\" | \"session\";\n /**\n * Pick the slice of state to persist. Defaults to persisting the whole\n * state. Use this to avoid writing transient/derived fields.\n */\n partialize?: PersistOptions<T, Partial<T>>[\"partialize\"];\n /** Persisted schema version, forwarded to Zustand for migrations. */\n version?: number;\n /** Migration function forwarded to Zustand's `persist` middleware. */\n migrate?: PersistOptions<T, Partial<T>>[\"migrate\"];\n}\n\n/**\n * Options accepted by {@link createStore}.\n */\nexport interface CreateStoreOptions<T> {\n /** Enable `localStorage`/`sessionStorage` persistence for the store. */\n persist?: CreateStorePersistOptions<T>;\n}\n\n/**\n * Create a typed Zustand store with optional `persist` middleware, wired with\n * Tempest defaults. This is the generic counterpart to `createAuthStore`: use\n * it for any domain slice (cart, preferences, wizard state, …) without\n * re-writing the persistence boilerplate in every app.\n *\n * @typeParam T - The store state shape (state + actions).\n * @param initializer - Standard Zustand `StateCreator` (`(set, get) => state`).\n * @param options - Optional persistence configuration.\n * @returns A bound Zustand hook (`useStore`) with the usual `getState`/`setState`/`subscribe` API.\n *\n * @example\n * interface CartState {\n * items: string[];\n * add: (id: string) => void;\n * clear: () => void;\n * }\n *\n * const useCart = createStore<CartState>(\n * (set) => ({\n * items: [],\n * add: (id) => set((s) => ({ items: [...s.items, id] })),\n * clear: () => set({ items: [] }),\n * }),\n * { persist: { name: \"cart\", partialize: (s) => ({ items: s.items }) } },\n * );\n */\nexport function createStore<T>(\n initializer: StateCreator<T, [], []>,\n options: CreateStoreOptions<T> = {},\n): UseBoundStore<StoreApi<T>> {\n if (!options.persist) {\n return create<T>()(initializer);\n }\n\n const { name, storage = \"local\", partialize, version, migrate } = options.persist;\n const storageImpl = storage === \"session\" ? () => sessionStorage : () => localStorage;\n\n return create<T>()(\n persist(initializer, {\n name,\n storage: createJSONStorage(storageImpl),\n ...(partialize ? { partialize } : {}),\n ...(version !== undefined ? { version } : {}),\n ...(migrate ? { migrate } : {}),\n }),\n );\n}\n"],"mappings":"A,yDA4DA,SAAgBK,EACZ,EACA,EAAiC,CAAC,EACR,CAC1B,GAAI,CAACC,EAAQ,QACT,OAAA,EAAON,EAAAA,OAAAA,CAAU,CAAC,CAACO,CAAW,EAGlC,GAAM,CAAE,OAAM,UAAU,QAAS,aAAY,UAAS,WAAYD,EAAQ,QACpEE,EAAcC,IAAY,cAAkB,mBAAuB,aAEzE,OAAA,EAAOT,EAAAA,OAAAA,CAAU,CAAC,EAAA,EACdC,EAAAA,QAAAA,CAAQM,EAAa,CACjB,OACA,SAAA,EAASL,EAAAA,kBAAAA,CAAkBM,CAAW,EACtC,GAAIE,EAAa,CAAE,YAAW,EAAI,CAAC,EACnC,GAAIC,IAAY,IAAA,GAA0B,CAAC,EAAf,CAAE,SAAQ,EACtC,GAAIC,EAAU,CAAE,SAAQ,EAAI,CAAC,CACjC,CAAC,CACL,CACJ,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"create-store.js","names":[],"sources":["../../src/store/create-store.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport type { StateCreator, StoreApi, UseBoundStore } from \"zustand\";\nimport { persist, createJSONStorage } from \"zustand/middleware\";\nimport type { PersistOptions } from \"zustand/middleware\";\n\n/**\n * Persistence options for {@link createStore}. Mirrors the subset of Zustand's\n * `persist` middleware that apps usually need, with sensible Tempest defaults.\n */\nexport interface CreateStorePersistOptions<T> {\n /** Storage key (required to enable persistence). */\n name: string;\n /** Which Web Storage to use (default: `\"local\"`). */\n storage?: \"local\" | \"session\";\n /**\n * Pick the slice of state to persist. Defaults to persisting the whole\n * state. Use this to avoid writing transient/derived fields.\n */\n partialize?: PersistOptions<T, Partial<T>>[\"partialize\"];\n /** Persisted schema version, forwarded to Zustand for migrations. */\n version?: number;\n /** Migration function forwarded to Zustand's `persist` middleware. */\n migrate?: PersistOptions<T, Partial<T>>[\"migrate\"];\n}\n\n/**\n * Options accepted by {@link createStore}.\n */\nexport interface CreateStoreOptions<T> {\n /** Enable `localStorage`/`sessionStorage` persistence for the store. */\n persist?: CreateStorePersistOptions<T>;\n}\n\n/**\n * Create a typed Zustand store with optional `persist` middleware, wired with\n * Tempest defaults. This is the generic counterpart to `createAuthStore`: use\n * it for any domain slice (cart, preferences, wizard state, …) without\n * re-writing the persistence boilerplate in every app.\n *\n * @typeParam T - The store state shape (state + actions).\n * @param initializer - Standard Zustand `StateCreator` (`(set, get) => state`).\n * @param options - Optional persistence configuration.\n * @returns A bound Zustand hook (`useStore`) with the usual `getState`/`setState`/`subscribe` API.\n *\n * @example\n * interface CartState {\n * items: string[];\n * add: (id: string) => void;\n * clear: () => void;\n * }\n *\n * const useCart = createStore<CartState>(\n * (set) => ({\n * items: [],\n * add: (id) => set((s) => ({ items: [...s.items, id] })),\n * clear: () => set({ items: [] }),\n * }),\n * { persist: { name: \"cart\", partialize: (s) => ({ items: s.items }) } },\n * );\n */\nexport function createStore<T>(\n initializer: StateCreator<T, [], []>,\n options: CreateStoreOptions<T> = {},\n): UseBoundStore<StoreApi<T>> {\n if (!options.persist) {\n return create<T>()(initializer);\n }\n\n const { name, storage = \"local\", partialize, version, migrate } = options.persist;\n const storageImpl = storage === \"session\" ? () => sessionStorage : () => localStorage;\n\n return create<T>()(\n persist(initializer, {\n name,\n storage: createJSONStorage(storageImpl),\n ...(partialize ? { partialize } : {}),\n ...(version !== undefined ? { version } : {}),\n ...(migrate ? { migrate } : {}),\n }),\n );\n}\n"],"mappings":";;;AA4DA,SAAgB,EACZ,GACA,IAAiC,CAAC,GACR;CAC1B,IAAI,CAAC,EAAQ,SACT,OAAO,EAAU,CAAC,CAAC,CAAW;CAGlC,IAAM,EAAE,SAAM,aAAU,SAAS,eAAY,YAAS,eAAY,EAAQ,SACpE,IAAc,MAAY,kBAAkB,uBAAuB;CAEzE,OAAO,EAAU,CAAC,CACd,EAAQ,GAAa;EACjB;EACA,SAAS,EAAkB,CAAW;EACtC,GAAI,IAAa,EAAE,cAAW,IAAI,CAAC;EACnC,GAAI,MAAY,KAAA,IAA0B,CAAC,IAAf,EAAE,WAAQ;EACtC,GAAI,IAAU,EAAE,WAAQ,IAAI,CAAC;CACjC,CAAC,CACL;AACJ"}
1
+ {"version":3,"file":"create-store.js","names":["createStore","options","create","initializer","storageImpl","storage","persist","createJSONStorage","partialize","version","migrate"],"sources":["../../src/store/create-store.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport type { StateCreator, StoreApi, UseBoundStore } from \"zustand\";\nimport { persist, createJSONStorage } from \"zustand/middleware\";\nimport type { PersistOptions } from \"zustand/middleware\";\n\n/**\n * Persistence options for {@link createStore}. Mirrors the subset of Zustand's\n * `persist` middleware that apps usually need, with sensible Tempest defaults.\n */\nexport interface CreateStorePersistOptions<T> {\n /** Storage key (required to enable persistence). */\n name: string;\n /** Which Web Storage to use (default: `\"local\"`). */\n storage?: \"local\" | \"session\";\n /**\n * Pick the slice of state to persist. Defaults to persisting the whole\n * state. Use this to avoid writing transient/derived fields.\n */\n partialize?: PersistOptions<T, Partial<T>>[\"partialize\"];\n /** Persisted schema version, forwarded to Zustand for migrations. */\n version?: number;\n /** Migration function forwarded to Zustand's `persist` middleware. */\n migrate?: PersistOptions<T, Partial<T>>[\"migrate\"];\n}\n\n/**\n * Options accepted by {@link createStore}.\n */\nexport interface CreateStoreOptions<T> {\n /** Enable `localStorage`/`sessionStorage` persistence for the store. */\n persist?: CreateStorePersistOptions<T>;\n}\n\n/**\n * Create a typed Zustand store with optional `persist` middleware, wired with\n * Tempest defaults. This is the generic counterpart to `createAuthStore`: use\n * it for any domain slice (cart, preferences, wizard state, …) without\n * re-writing the persistence boilerplate in every app.\n *\n * @typeParam T - The store state shape (state + actions).\n * @param initializer - Standard Zustand `StateCreator` (`(set, get) => state`).\n * @param options - Optional persistence configuration.\n * @returns A bound Zustand hook (`useStore`) with the usual `getState`/`setState`/`subscribe` API.\n *\n * @example\n * interface CartState {\n * items: string[];\n * add: (id: string) => void;\n * clear: () => void;\n * }\n *\n * const useCart = createStore<CartState>(\n * (set) => ({\n * items: [],\n * add: (id) => set((s) => ({ items: [...s.items, id] })),\n * clear: () => set({ items: [] }),\n * }),\n * { persist: { name: \"cart\", partialize: (s) => ({ items: s.items }) } },\n * );\n */\nexport function createStore<T>(\n initializer: StateCreator<T, [], []>,\n options: CreateStoreOptions<T> = {},\n): UseBoundStore<StoreApi<T>> {\n if (!options.persist) {\n return create<T>()(initializer);\n }\n\n const { name, storage = \"local\", partialize, version, migrate } = options.persist;\n const storageImpl = storage === \"session\" ? () => sessionStorage : () => localStorage;\n\n return create<T>()(\n persist(initializer, {\n name,\n storage: createJSONStorage(storageImpl),\n ...(partialize ? { partialize } : {}),\n ...(version !== undefined ? { version } : {}),\n ...(migrate ? { migrate } : {}),\n }),\n );\n}\n"],"mappings":";;;AA4DA,SAAgBA,EACZ,GACA,IAAiC,CAAC,GACR;CAC1B,IAAI,CAACC,EAAQ,SACT,OAAOC,EAAU,CAAC,CAACC,CAAW;CAGlC,IAAM,EAAE,SAAM,aAAU,SAAS,eAAY,YAAS,eAAYF,EAAQ,SACpEG,IAAcC,MAAY,kBAAkB,uBAAuB;CAEzE,OAAOH,EAAU,CAAC,CACdI,EAAQH,GAAa;EACjB;EACA,SAASI,EAAkBH,CAAW;EACtC,GAAII,IAAa,EAAE,cAAW,IAAI,CAAC;EACnC,GAAIC,MAAY,KAAA,IAA0B,CAAC,IAAf,EAAE,WAAQ;EACtC,GAAIC,IAAU,EAAE,WAAQ,IAAI,CAAC;CACjC,CAAC,CACL;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"background-sync.cjs","names":[],"sources":["../../src/sw/background-sync.ts"],"sourcesContent":["/**\n * Background-sync helper: queue failed mutating requests (POST/PUT/PATCH/DELETE)\n * while offline and replay them when connectivity returns. A dependency-free\n * take on Workbox's `BackgroundSyncPlugin`, backed by a tiny IndexedDB queue.\n *\n * Import inside your `sw.ts`. Uses the Background Sync API (`registration.sync`)\n * when available, and also replays opportunistically on the next request as a\n * fallback for browsers without it (e.g. Safari).\n *\n * Credential headers (`Authorization` and the rest of\n * {@link DEFAULT_CREDENTIAL_HEADERS}) are never written to IndexedDB: the queue\n * outlives the session, and a stored bearer stayed readable after logout and was\n * replayed with the old identity (reproduced in Chromium 153, 11/10/2026). On\n * replay the worker asks the open pages for the *current* credentials — see\n * {@link provideBackgroundSyncCredentials} — or a custom `beforeReplay` hook.\n * Credentials carried in the URL or the body are out of reach and are stored\n * as sent.\n *\n * @example\n * import { installBackgroundSync } from \"tempest-react-sdk/sw\";\n *\n * installBackgroundSync({ match: (url) => url.pathname.startsWith(\"/api/\") });\n */\nimport { isDevBuild } from \"../utils/dev-mode\";\nimport { DEFAULT_CREDENTIAL_HEADERS, credentialHeaderSet } from \"./credential-headers\";\n\ninterface SyncEventLike {\n tag: string;\n waitUntil(promise: Promise<unknown>): void;\n}\n\ninterface BgFetchEventLike {\n request: Request;\n /** Id of the window client that issued the request, when there is one. */\n clientId?: string;\n respondWith(response: Response | Promise<Response>): void;\n waitUntil(promise: Promise<unknown>): void;\n}\n\ninterface PeriodicSyncEventLike {\n tag: string;\n waitUntil(promise: Promise<unknown>): void;\n}\n\n/** Minimal shape of a window client the worker can message. */\ninterface WindowClientLike {\n postMessage(message: unknown, transfer: Transferable[]): void;\n}\n\ninterface BgSwGlobal {\n registration: { sync?: { register(tag: string): Promise<void> } };\n clients?: {\n matchAll(options: { type: \"window\" }): Promise<readonly WindowClientLike[]>;\n get(id: string): Promise<WindowClientLike | undefined>;\n };\n addEventListener(type: \"sync\", listener: (event: SyncEventLike) => void): void;\n addEventListener(type: \"fetch\", listener: (event: BgFetchEventLike) => void): void;\n addEventListener(type: \"periodicsync\", listener: (event: PeriodicSyncEventLike) => void): void;\n}\n\nfunction getSwScope(): BgSwGlobal {\n return globalThis as unknown as BgSwGlobal;\n}\n\n/**\n * How an entry is tied to whoever queued it:\n * - `\"bound\"`: the issuing page reported a principal (or `null` for nobody);\n * the entry only goes out while the same one is signed in.\n * - `\"unbound\"`: the issuing page answered without `getPrincipal`.\n * - `\"unknown\"`: nobody could say — no issuing tab, no answer, an error, or an\n * entry written before owners existed. Fails closed, with or without stripped\n * credentials: a cookie session rides along on the replay, so an entry with no\n * credential header is checked like any other.\n *\n * While the worker is still asking, the stored state is `\"pending\"`, which a\n * replay never sees: it waits, then reads a stamp that never came as `\"unknown\"`.\n */\nexport type BackgroundSyncOwnerState = \"bound\" | \"unbound\" | \"unknown\";\n\n/**\n * How the default `beforeReplay` treats an `\"unknown\"` owner on an entry that\n * carried no credential header:\n * - `\"strict\"` (default): it asks the open pages like any other entry — replayed\n * only when every answer lacks a principal, dropped as soon as one answer has\n * one, pending while nobody answers.\n * - `\"lenient\"`: it is replayed as-is, without asking (the behavior up to 0.77.0).\n *\n * An entry with stripped credentials always asks, under either policy.\n */\nexport type BackgroundSyncOwnerPolicy = \"strict\" | \"lenient\";\n\n/** A serialized request stored in the queue. */\ninterface QueuedRequest {\n id?: number;\n url: string;\n method: string;\n headers: [string, string][];\n body: ArrayBuffer | null;\n timestamp: number;\n /** The original `credentials` mode, so cookie-based APIs replay with cookies. */\n credentials?: RequestCredentials;\n /** Lower-cased names of the credential headers removed before persisting. */\n strippedHeaders?: string[];\n /** Absent on entries written before 0.77 — read as `\"unknown\"`. */\n ownerState?: BackgroundSyncOwnerState | \"pending\";\n /** Fingerprint of the principal under `\"bound\"`; `null` for \"nobody signed in\". */\n owner?: string | null;\n}\n\n/** Default IndexedDB database name (and sync tag) of the background-sync queue. */\nconst DEFAULT_QUEUE_NAME = \"tempest-bg-sync\";\n\n/**\n * Schema version of the queue database. Version 2 adds the `meta` store (the\n * clear epoch) and migrates version-1 entries, scrubbing their plaintext\n * credential headers on first open.\n */\nconst DB_VERSION = 2;\nconst STORE = \"requests\";\nconst META = \"meta\";\nconst EPOCH_KEY = \"epoch\";\n\n/**\n * `type` of the message the worker posts to window clients to ask about a queued\n * request. Answered by {@link provideBackgroundSyncCredentials}.\n */\nexport const BACKGROUND_SYNC_CREDENTIALS_MESSAGE = \"tempest:bg-sync-credentials\";\n\n/** How long the worker waits for the window clients to answer, in milliseconds. */\nconst CREDENTIALS_TIMEOUT_MS = 3000;\n\n/**\n * How long a replay waits on an entry whose owner is still being stamped. Past\n * it (the worker died mid-question), the owner is read as `\"unknown\"`.\n */\nconst OWNER_STAMP_GRACE_MS = CREDENTIALS_TIMEOUT_MS * 2;\n\n/** What a queued request looked like when it was stored, passed to `beforeReplay`. */\nexport interface BackgroundSyncReplayContext {\n /** Epoch milliseconds of the original failed attempt. */\n queuedAt: number;\n /** Lower-cased credential header names stripped before the entry was stored. */\n strippedHeaders: readonly string[];\n /** How the entry is tied to its owner. */\n ownerState: BackgroundSyncOwnerState;\n /** Owner fingerprint under `\"bound\"` (`null` for nobody); `undefined` otherwise. */\n owner: string | null | undefined;\n}\n\n/** The request a window client is asked about, as sent by the worker. */\nexport interface BackgroundSyncCredentialsRequest {\n /** Absolute URL of the queued request. */\n url: string;\n /** HTTP method of the queued request. */\n method: string;\n /**\n * `\"enqueue\"` when the worker only wants the owner of a request that just\n * failed; `\"replay\"` when it is about to send it and needs the credentials.\n */\n phase: \"enqueue\" | \"replay\";\n}\n\n/**\n * Resolve the credentials for a queued request: a header record to apply, or\n * `null` when there is no session (the entry is then dropped).\n */\nexport type BackgroundSyncCredentialsProvider = (\n request: BackgroundSyncCredentialsRequest,\n) => Record<string, string> | null | Promise<Record<string, string> | null>;\n\n/** Options for {@link provideBackgroundSyncCredentials}. */\nexport interface ProvideBackgroundSyncCredentialsOptions {\n /**\n * Who is signed in right now — a stable, non-secret id such as the user id;\n * `null`/`undefined` when nobody is. Read when a request is queued and again\n * when it is replayed: an entry is only sent while the same principal is\n * signed in, and dropped otherwise, so a mutation queued by one account is\n * never sent with another account's credentials even when the app forgets\n * `clearSessionData()` on logout. Only a SHA-256 fingerprint reaches the\n * queue, never the value itself. A throw is answered as an explicit error,\n * which leaves the owner unknown (fail closed).\n */\n getPrincipal?: () => string | null | undefined | Promise<string | null | undefined>;\n}\n\n/** Options for {@link installBackgroundSync}. */\nexport interface InstallBackgroundSyncOptions {\n /**\n * Which requests to queue on failure. A `RegExp` against the URL or a\n * predicate. Only non-`GET` requests are ever considered. Default: all\n * non-`GET` requests.\n */\n match?: RegExp | ((url: URL, request: Request) => boolean);\n /** IndexedDB database name, also used as the sync tag. Default `tempest-bg-sync`. */\n queueName?: string;\n /** Drop queued requests older than this (minutes) on replay. Default `1440` (24h). */\n maxRetentionMinutes?: number;\n /**\n * Also drain the queue on the `periodicsync` event carrying this tag,\n * complementing the one-off `sync` replay so long-pending mutations retry\n * even without a fresh navigation. Register the periodic sync from the main\n * thread with {@link registerPeriodicSync}. Default `${queueName}-periodic`.\n */\n periodicSyncTag?: string;\n /**\n * Header names stripped before a request is persisted — and stripped again on\n * replay, so entries written by an older version never go out with the\n * credential they stored. Default {@link DEFAULT_CREDENTIAL_HEADERS}; extend it\n * for a custom credential header (`[...DEFAULT_CREDENTIAL_HEADERS,\n * \"x-tenant-key\"]`). Passing `[]` restores the pre-0.77 behavior of\n * persisting and replaying every header, credentials included.\n */\n credentialHeaders?: readonly string[];\n /**\n * Prepare each queued request right before it is replayed: return the\n * request to send (typically with the current credentials applied) or\n * `null` to drop the entry for good. A thrown error keeps the entry pending.\n * The context carries the entry's owner, so a custom hook can apply the\n * same rule as the default.\n *\n * Default: only an `\"unbound\"` entry with no stripped credentials (and, under\n * `ownerPolicy: \"lenient\"`, an `\"unknown\"` one) is replayed as-is, without\n * asking. Every other entry — credentialed or not —\n * asks every open window client in parallel (see\n * {@link provideBackgroundSyncCredentials}) and picks the answer that fits:\n * - `\"bound\"`: the answer whose owner matches; none among valid answers →\n * dropped, never sent anonymously or as somebody else;\n * - `\"unknown\"`: only when every answer lacks a principal (an app that does\n * not use `getPrincipal`); a single answer with one → dropped, since a\n * stale tab without `getPrincipal` says nothing about who is signed in\n * next to it. This holds for an entry\n * with no credential header too, since the browser attaches the cookies of\n * whoever is signed in at replay time;\n * - `\"unbound\"`: any answer, preferring one without a principal.\n * Then `null` headers drop a credentialed entry, an answer that lacks one of\n * the stripped headers keeps it pending, and only the stripped names are\n * re-applied. No valid answer at all keeps it pending until\n * `maxRetentionMinutes` (and warns once per replay in development builds) —\n * so a page that never calls {@link provideBackgroundSyncCredentials} leaves\n * every entry it queued `\"unknown\"`, and none of them is replayed.\n */\n /**\n * How an `\"unknown\"` owner is handled on an entry with no stripped\n * credentials (see {@link BackgroundSyncOwnerPolicy}). Default `\"strict\"`.\n *\n * `\"lenient\"` restores the replay-as-is of 0.77.0 and earlier for an app without sign-in,\n * where no page ever reports a principal. Do not use it with a cookie\n * session: the browser attaches on replay the cookie of whoever is signed in\n * at that moment, so a mutation queued by A whose owner was never stamped\n * (issuing tab closed, empty `clientId`, stamp lost, legacy entry) goes out\n * with B's session. Entries with stripped credentials ask the pages either\n * way. Ignored when a custom `beforeReplay` is given.\n */\n ownerPolicy?: BackgroundSyncOwnerPolicy;\n beforeReplay?: (\n request: Request,\n context: BackgroundSyncReplayContext,\n ) => Request | null | Promise<Request | null>;\n}\n\n/**\n * Move credential headers out of a header list.\n *\n * @returns The remaining headers and the lower-cased names removed.\n */\nfunction splitHeaders(\n headers: Iterable<[string, string]>,\n credentialHeaders: ReadonlySet<string>,\n): { kept: [string, string][]; stripped: string[] } {\n const kept: [string, string][] = [];\n const stripped: string[] = [];\n for (const [name, value] of headers) {\n if (credentialHeaders.has(name.toLowerCase())) stripped.push(name.toLowerCase());\n else kept.push([name, value]);\n }\n return { kept, stripped };\n}\n\n/**\n * Scrub version-1 entries during the upgrade: their credential headers were\n * stored in plaintext, so they are removed from disk on the first open, recorded\n * as stripped, and the owner is marked unknown.\n */\nfunction migrateLegacyEntries(store: IDBObjectStore, credentialHeaders: ReadonlySet<string>): void {\n const cursorRequest = store.openCursor();\n cursorRequest.onsuccess = () => {\n const cursor = cursorRequest.result;\n if (!cursor) return;\n const entry = cursor.value as QueuedRequest;\n const { kept, stripped } = splitHeaders(entry.headers, credentialHeaders);\n cursor.update({\n ...entry,\n headers: kept,\n strippedHeaders: [...new Set([...(entry.strippedHeaders ?? []), ...stripped])],\n ownerState: entry.ownerState ?? \"unknown\",\n });\n cursor.continue();\n };\n}\n\nfunction openQueueDb(\n name: string,\n credentialHeaders: ReadonlySet<string> = credentialHeaderSet(),\n): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(name, DB_VERSION);\n request.onupgradeneeded = (event) => {\n const db = request.result;\n if (!db.objectStoreNames.contains(STORE)) {\n db.createObjectStore(STORE, { keyPath: \"id\", autoIncrement: true });\n } else if (event.oldVersion < 2 && request.transaction) {\n migrateLegacyEntries(request.transaction.objectStore(STORE), credentialHeaders);\n }\n if (!db.objectStoreNames.contains(META)) db.createObjectStore(META);\n };\n request.onsuccess = () => {\n const db = request.result;\n db.onversionchange = () => db.close();\n resolve(db);\n };\n request.onerror = () => reject(request.error);\n });\n}\n\nfunction txDone(tx: IDBTransaction): Promise<void> {\n return new Promise((resolve, reject) => {\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n tx.onabort = () => reject(tx.error);\n });\n}\n\n/** The current clear epoch: bumped by every {@link clearBackgroundSyncQueue}. */\nasync function readEpoch(name: string, credentialHeaders: ReadonlySet<string>): Promise<number> {\n const db = await openQueueDb(name, credentialHeaders);\n const tx = db.transaction(META, \"readonly\");\n const get = tx.objectStore(META).get(EPOCH_KEY);\n await txDone(tx);\n db.close();\n return (get.result as number | undefined) ?? 0;\n}\n\n/**\n * Add an entry unless the queue was cleared since `epoch` was read — checked in\n * the same transaction as the write, so a logout that lands while the request\n * is still failing never lets it into the next session's queue.\n *\n * @returns The new entry's key, or `undefined` when the clear won.\n */\nasync function enqueue(\n name: string,\n entry: QueuedRequest,\n epoch: number,\n credentialHeaders: ReadonlySet<string>,\n): Promise<number | undefined> {\n const db = await openQueueDb(name, credentialHeaders);\n const tx = db.transaction([STORE, META], \"readwrite\");\n let id: number | undefined;\n const current = tx.objectStore(META).get(EPOCH_KEY);\n current.onsuccess = () => {\n if (((current.result as number | undefined) ?? 0) !== epoch) return;\n const add = tx.objectStore(STORE).add(entry);\n add.onsuccess = () => {\n id = add.result as number;\n };\n };\n await txDone(tx);\n db.close();\n return id;\n}\n\n/**\n * Record how an entry is owned. A no-op when the entry is already gone\n * (replayed, or the queue was cleared).\n */\nasync function stampOwner(\n name: string,\n id: number,\n ownerState: BackgroundSyncOwnerState,\n owner: string | null | undefined,\n): Promise<void> {\n const db = await openQueueDb(name);\n const tx = db.transaction(STORE, \"readwrite\");\n const store = tx.objectStore(STORE);\n const get = store.get(id);\n get.onsuccess = () => {\n const entry = get.result as QueuedRequest | undefined;\n if (!entry) return;\n entry.ownerState = ownerState;\n if (ownerState === \"bound\") entry.owner = owner ?? null;\n store.put(entry);\n };\n await txDone(tx);\n db.close();\n}\n\nasync function readAll(\n name: string,\n credentialHeaders: ReadonlySet<string>,\n): Promise<QueuedRequest[]> {\n const db = await openQueueDb(name, credentialHeaders);\n const tx = db.transaction(STORE, \"readonly\");\n const all = await new Promise<QueuedRequest[]>((resolve, reject) => {\n const req = tx.objectStore(STORE).getAll();\n req.onsuccess = () => resolve(req.result as QueuedRequest[]);\n req.onerror = () => reject(req.error);\n });\n db.close();\n return all;\n}\n\n/** Whether an entry is still in the queue — `false` once it was cleared. */\nasync function stillQueued(name: string, id: number): Promise<boolean> {\n const db = await openQueueDb(name);\n const tx = db.transaction(STORE, \"readonly\");\n const count = tx.objectStore(STORE).count(id);\n await txDone(tx);\n db.close();\n return count.result > 0;\n}\n\nasync function remove(name: string, id: number): Promise<void> {\n const db = await openQueueDb(name);\n const tx = db.transaction(STORE, \"readwrite\");\n tx.objectStore(STORE).delete(id);\n await txDone(tx);\n db.close();\n}\n\n/**\n * Serialize a request for the queue, leaving out every credential header and\n * recording which ones were present.\n */\nasync function serializeRequest(\n request: Request,\n timestamp: number,\n credentialHeaders: ReadonlySet<string>,\n ownerState: QueuedRequest[\"ownerState\"],\n): Promise<QueuedRequest> {\n const buffer = await request.clone().arrayBuffer();\n const { kept, stripped } = splitHeaders(request.headers.entries(), credentialHeaders);\n return {\n url: request.url,\n method: request.method,\n headers: kept,\n body: buffer.byteLength > 0 ? buffer : null,\n timestamp,\n credentials: request.credentials,\n strippedHeaders: stripped,\n ownerState,\n };\n}\n\n/**\n * Rebuild a stored request, stripping credential headers once more so an entry\n * that still holds one (a custom `credentialHeaders` the migration did not know)\n * never replays it.\n */\nfunction deserializeRequest(\n entry: QueuedRequest,\n credentialHeaders: ReadonlySet<string>,\n): { request: Request; strippedHeaders: string[] } {\n const { kept, stripped } = splitHeaders(entry.headers, credentialHeaders);\n return {\n request: new Request(entry.url, {\n method: entry.method,\n headers: kept,\n body: entry.body ?? undefined,\n credentials: entry.credentials,\n }),\n strippedHeaders: [...new Set([...(entry.strippedHeaders ?? []), ...stripped])],\n };\n}\n\n/** A window client's parsed answer. */\ninterface ClientAnswer {\n headers: Record<string, string> | null;\n /** Whether the page has `getPrincipal`. */\n hasPrincipal: boolean;\n owner: string | null;\n}\n\n/**\n * Ask one window client about a queued request over a `MessageChannel`.\n *\n * @returns The parsed answer, or `undefined` when the client stayed silent until\n * `deadline`, answered `{ error: true }`, or answered something unrecognizable.\n */\nasync function askClient(\n client: WindowClientLike,\n request: BackgroundSyncCredentialsRequest,\n deadline: Promise<void>,\n): Promise<ClientAnswer | undefined> {\n const channel = new MessageChannel();\n const answer = await Promise.race([\n new Promise<unknown>((resolve) => {\n channel.port1.onmessage = (event: MessageEvent) => resolve(event.data);\n client.postMessage({ type: BACKGROUND_SYNC_CREDENTIALS_MESSAGE, ...request }, [\n channel.port2,\n ]);\n }),\n deadline.then(() => undefined),\n ]);\n channel.port1.close();\n if (answer === null || typeof answer !== \"object\" || !(\"headers\" in answer)) return undefined;\n const { headers, owner } = answer as { headers: unknown; owner?: unknown };\n const hasPrincipal = \"owner\" in answer;\n if (hasPrincipal && typeof owner !== \"string\" && owner !== null) return undefined;\n return {\n headers:\n headers !== null && typeof headers === \"object\"\n ? (headers as Record<string, string>)\n : null,\n hasPrincipal,\n owner: hasPrincipal ? (owner as string | null) : null,\n };\n}\n\n/** A deadline shared by every client asked in one round. */\nfunction startDeadline(): { promise: Promise<void>; cancel: () => void } {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const promise = new Promise<void>((resolve) => {\n timer = setTimeout(resolve, CREDENTIALS_TIMEOUT_MS);\n });\n return { promise, cancel: () => clearTimeout(timer) };\n}\n\n/**\n * Ask every open window client in parallel, under one shared deadline.\n *\n * @returns Every valid answer; empty when nobody answered.\n */\nasync function askAllClients(\n sw: BgSwGlobal,\n request: BackgroundSyncCredentialsRequest,\n): Promise<ClientAnswer[]> {\n const clients = (await sw.clients?.matchAll({ type: \"window\" })) ?? [];\n if (clients.length === 0) return [];\n const deadline = startDeadline();\n const answers = await Promise.all(\n clients.map((client) => askClient(client, request, deadline.promise)),\n );\n deadline.cancel();\n return answers.filter((answer): answer is ClientAnswer => answer !== undefined);\n}\n\n/** State of one replay pass: answers cached per URL + method, and the warning flag. */\ninterface ReplayRun {\n ask(request: Request): Promise<ClientAnswer[]>;\n warnNoAnswer(): void;\n}\n\nfunction createReplayRun(sw: BgSwGlobal): ReplayRun {\n const answers = new Map<string, Promise<ClientAnswer[]>>();\n let warned = false;\n return {\n ask(request) {\n const key = `${request.method} ${request.url}`;\n let pending = answers.get(key);\n if (!pending) {\n pending = askAllClients(sw, {\n url: request.url,\n method: request.method,\n phase: \"replay\",\n });\n answers.set(key, pending);\n }\n return pending;\n },\n warnNoAnswer() {\n if (warned || !isDevBuild()) return;\n warned = true;\n console.warn(\n \"[tempest-react-sdk/sw] background-sync: a queued request needs an open page \" +\n \"to confirm who is signed in or to supply the current credentials, and no \" +\n \"open page answered. Call \" +\n \"provideBackgroundSyncCredentials() in the page; the entry stays pending.\",\n );\n },\n };\n}\n\n/**\n * Pick the answer an entry may be replayed with, per its owner state.\n *\n * An `\"unknown\"` owner replays only when every valid answer lacks a principal:\n * one tab reporting a principal (even `null`) is enough to drop it, because a\n * principal-less answer — say a tab still running a bundle from before the app\n * adopted `getPrincipal` — says nothing about whose cookie the replay carries.\n */\nfunction chooseAnswer(\n answers: readonly ClientAnswer[],\n context: BackgroundSyncReplayContext,\n): ClientAnswer | undefined {\n switch (context.ownerState) {\n case \"bound\":\n return answers.find((answer) => answer.hasPrincipal && answer.owner === context.owner);\n case \"unknown\":\n return answers.every((answer) => !answer.hasPrincipal) ? answers[0] : undefined;\n case \"unbound\":\n return answers.find((answer) => !answer.hasPrincipal) ?? answers[0];\n }\n}\n\n/**\n * The default `beforeReplay` (rules on {@link InstallBackgroundSyncOptions}).\n *\n * @throws {Error} When no page answered, or the chosen answer lacks a stripped\n * header — the entry stays pending.\n */\nasync function defaultBeforeReplay(\n run: ReplayRun,\n request: Request,\n context: BackgroundSyncReplayContext,\n ownerPolicy: BackgroundSyncOwnerPolicy,\n): Promise<Request | null> {\n const credentialed = context.strippedHeaders.length > 0;\n const unchecked =\n context.ownerState === \"unbound\" ||\n (ownerPolicy === \"lenient\" && context.ownerState === \"unknown\");\n if (!credentialed && unchecked) return request;\n const answers = await run.ask(request);\n if (answers.length === 0) {\n run.warnNoAnswer();\n throw new Error(\"background-sync: no client answered\");\n }\n const chosen = chooseAnswer(answers, context);\n if (!chosen) return null;\n if (!credentialed) return request;\n if (chosen.headers === null) return null;\n const provided = new Map(\n Object.entries(chosen.headers).map(([name, value]) => [name.toLowerCase(), value]),\n );\n if (context.strippedHeaders.some((name) => !provided.has(name))) {\n throw new Error(\"background-sync: the answer lacks a stripped credential header\");\n }\n const headers = new Headers(request.headers);\n for (const name of context.strippedHeaders) headers.set(name, provided.get(name) as string);\n return new Request(request, { headers });\n}\n\n/** Everything {@link replayQueue} needs besides the clock. */\ninterface ReplayConfig {\n sw: BgSwGlobal;\n name: string;\n maxRetentionMs: number;\n credentialHeaders: ReadonlySet<string>;\n beforeReplay?: InstallBackgroundSyncOptions[\"beforeReplay\"];\n ownerPolicy: BackgroundSyncOwnerPolicy;\n}\n\n/**\n * Replay every queued request once. Entries that succeed, are stale, get a 4xx\n * (a client error that will not fix itself) or that the preparation rejects with\n * `null` are removed; entries that fail again — network error, 5xx, or a\n * preparation that throws — are kept, and so is an entry whose owner is still\n * being stamped (for up to {@link OWNER_STAMP_GRACE_MS}). Each entry is checked\n * against the store right before it is sent, so a queue cleared mid-replay stops\n * the replay. Throws if any entry is still pending, so a `sync` handler keeps\n * the sync registered.\n */\nasync function replayQueue(config: ReplayConfig, now: number): Promise<void> {\n const { sw, name, maxRetentionMs, credentialHeaders, beforeReplay, ownerPolicy } = config;\n const run = createReplayRun(sw);\n const prepare =\n beforeReplay ??\n ((request: Request, context: BackgroundSyncReplayContext) =>\n defaultBeforeReplay(run, request, context, ownerPolicy));\n const entries = await readAll(name, credentialHeaders);\n let pending = 0;\n\n for (const entry of entries) {\n if (entry.id === undefined) continue;\n if (now - entry.timestamp > maxRetentionMs) {\n await remove(name, entry.id);\n continue;\n }\n const state = entry.ownerState ?? \"unknown\";\n if (state === \"pending\" && now - entry.timestamp < OWNER_STAMP_GRACE_MS) {\n pending += 1;\n continue;\n }\n const ownerState: BackgroundSyncOwnerState = state === \"pending\" ? \"unknown\" : state;\n try {\n const { request: stored, strippedHeaders } = deserializeRequest(\n entry,\n credentialHeaders,\n );\n const request = await prepare(stored, {\n queuedAt: entry.timestamp,\n strippedHeaders,\n ownerState,\n owner: ownerState === \"bound\" ? (entry.owner ?? null) : undefined,\n });\n if (!(await stillQueued(name, entry.id))) continue;\n if (request === null) {\n await remove(name, entry.id);\n continue;\n }\n const response = await fetch(request);\n if (response.ok || (response.status >= 400 && response.status < 500)) {\n await remove(name, entry.id);\n } else {\n pending += 1;\n }\n } catch {\n pending += 1;\n }\n }\n\n if (pending > 0) throw new Error(`background-sync: ${pending} request(s) still pending`);\n}\n\n/**\n * The replay in flight per queue. `sync`, `periodicsync` and the Safari fallback\n * can fire together; sharing one pass keeps a mutation from being sent twice.\n */\nconst replaysInFlight = new Map<string, Promise<void>>();\n\nfunction drainQueue(config: ReplayConfig): Promise<void> {\n const running = replaysInFlight.get(config.name);\n if (running) return running;\n const pass = replayQueue(config, Date.now()).finally(() => {\n replaysInFlight.delete(config.name);\n });\n replaysInFlight.set(config.name, pass);\n return pass;\n}\n\nfunction matches(\n match: InstallBackgroundSyncOptions[\"match\"],\n url: URL,\n request: Request,\n): boolean {\n if (!match) return true;\n return typeof match === \"function\" ? match(url, request) : match.test(url.href);\n}\n\n/**\n * Ask the issuing page who owns a just-queued entry and record it.\n *\n * @returns Resolves once the owner is stamped; never rejects.\n */\nasync function stampFromIssuer(\n name: string,\n id: number,\n issuer: WindowClientLike,\n request: Request,\n): Promise<void> {\n const deadline = startDeadline();\n const answer = await askClient(\n issuer,\n { url: request.url, method: request.method, phase: \"enqueue\" },\n deadline.promise,\n );\n deadline.cancel();\n const state: BackgroundSyncOwnerState = !answer\n ? \"unknown\"\n : answer.hasPrincipal\n ? \"bound\"\n : \"unbound\";\n await stampOwner(name, id, state, answer?.owner);\n}\n\n/**\n * Install the background-sync queue: on a failed mutating request, the request\n * is serialized to IndexedDB (without its credential headers) and a sync is\n * registered; the original fetch still rejects (so your app can show an offline\n * state), and the request is replayed later when the network returns.\n *\n * Right after queueing, the worker asks the page that issued the request who is\n * signed in (`getPrincipal` on {@link provideBackgroundSyncCredentials}) and\n * stamps the entry with that owner, without delaying the rejection. The work is\n * handed to `event.waitUntil` synchronously, so the worker stays alive for it\n * in every engine. Without the Background Sync API (every non-Chromium\n * browser), the queue is drained opportunistically whenever a `GET` goes\n * through the worker.\n *\n * @tempest-limits empty-catch — `registration.sync.register` is unavailable on\n * every non-Chromium browser and fails on a revoked background-sync permission.\n * The entry is already durable in IndexedDB at that point, and the queue is also\n * drained opportunistically on the next successful request, so losing the OS-level\n * wakeup degrades *when* the replay happens, not *whether* it happens.\n */\nexport function installBackgroundSync(options: InstallBackgroundSyncOptions = {}): void {\n const sw = getSwScope();\n const {\n match,\n queueName = DEFAULT_QUEUE_NAME,\n maxRetentionMinutes = 1440,\n periodicSyncTag = `${options.queueName ?? DEFAULT_QUEUE_NAME}-periodic`,\n credentialHeaders = DEFAULT_CREDENTIAL_HEADERS,\n beforeReplay,\n ownerPolicy = \"strict\",\n } = options;\n const stripped = credentialHeaderSet(credentialHeaders);\n const replay: ReplayConfig = {\n sw,\n name: queueName,\n maxRetentionMs: maxRetentionMinutes * 60 * 1000,\n credentialHeaders: stripped,\n beforeReplay,\n ownerPolicy,\n };\n\n sw.addEventListener(\"fetch\", (event) => {\n const request = event.request;\n if (request.method === \"GET\" || request.method === \"HEAD\") return;\n\n const url = new URL(request.url);\n if (!matches(match, url, request)) return;\n\n const epoch = readEpoch(queueName, stripped);\n epoch.catch(() => undefined);\n const attempt = fetch(request.clone());\n const queued = attempt.then(\n () => undefined,\n async () => {\n const issuer = event.clientId ? await sw.clients?.get(event.clientId) : undefined;\n const entry = await serializeRequest(\n request,\n Date.now(),\n stripped,\n issuer ? \"pending\" : \"unknown\",\n );\n const id = await enqueue(queueName, entry, await epoch, stripped);\n if (id === undefined) return undefined;\n try {\n await sw.registration.sync?.register(queueName);\n } catch {\n /* empty */\n }\n return issuer ? { id, issuer } : undefined;\n },\n );\n event.respondWith(\n attempt.catch(async (error: unknown) => {\n await queued;\n throw error;\n }),\n );\n event.waitUntil(\n queued\n .then((stamp) =>\n stamp ? stampFromIssuer(queueName, stamp.id, stamp.issuer, request) : undefined,\n )\n .catch(() => undefined),\n );\n });\n\n sw.addEventListener(\"sync\", (event) => {\n if (event.tag !== queueName) return;\n event.waitUntil(drainQueue(replay));\n });\n\n sw.addEventListener(\"periodicsync\", (event) => {\n if (event.tag !== periodicSyncTag) return;\n event.waitUntil(drainQueue(replay).catch(() => undefined));\n });\n\n sw.addEventListener(\"fetch\", (event) => {\n if (sw.registration.sync) return;\n if (event.request.method !== \"GET\") return;\n event.waitUntil(drainQueue(replay).catch(() => undefined));\n });\n}\n\n/**\n * Empty the background-sync queue — every request still waiting to be replayed —\n * and bump its clear epoch. Call it on logout (or use `clearSessionData()`, which\n * also clears the runtime caches) so mutations made under one session are never\n * replayed under the next.\n *\n * Works from the page and from the worker, and reaches work already in flight\n * in the worker: a replay checks each entry right before sending it, and a\n * request still failing when the queue is cleared is not written afterwards.\n *\n * @param queueName - The `queueName` given to {@link installBackgroundSync}.\n * Default `tempest-bg-sync`.\n * @returns `true` once the queue is empty; `false` when IndexedDB is\n * unavailable (SSR, old browsers).\n *\n * @example\n * import { clearBackgroundSyncQueue } from \"tempest-react-sdk/sw\";\n *\n * await clearBackgroundSyncQueue();\n */\nexport async function clearBackgroundSyncQueue(\n queueName: string = DEFAULT_QUEUE_NAME,\n): Promise<boolean> {\n if (typeof indexedDB === \"undefined\") return false;\n const db = await openQueueDb(queueName);\n const tx = db.transaction([STORE, META], \"readwrite\");\n tx.objectStore(STORE).clear();\n const meta = tx.objectStore(META);\n const current = meta.get(EPOCH_KEY);\n current.onsuccess = () => {\n meta.put(((current.result as number | undefined) ?? 0) + 1, EPOCH_KEY);\n };\n await txDone(tx);\n db.close();\n return true;\n}\n\n/**\n * One-way fingerprint of a principal: hex SHA-256, so the queue can compare\n * owners without ever holding the id itself.\n *\n * @returns The fingerprint, or `null` when nobody is signed in.\n */\nasync function ownerFingerprint(principal: string | null | undefined): Promise<string | null> {\n if (principal === null || principal === undefined || principal === \"\") return null;\n const digest = await crypto.subtle.digest(\n \"SHA-256\",\n new TextEncoder().encode(`tempest-bg-sync:${principal}`),\n );\n return [...new Uint8Array(digest)].map((byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\n/**\n * Answer the worker's questions about queued requests (see `beforeReplay` on\n * {@link installBackgroundSync}). Install it once in every page, next to your\n * auth setup; it reads the token at replay time, so the queue never has to store\n * it. Without it, a queued request that carried a credential header is never\n * replayed.\n *\n * `getHeaders` must return **every** credential header the app sends (the worker\n * keeps an entry pending when one it stripped is missing), or `null` when there\n * is no session — the worker then drops the entry instead of replaying it\n * anonymously. A throw from `getHeaders` or `getPrincipal` is answered as an\n * explicit `{ error: true }`. The worker only applies headers whose names the\n * original request carried, so returning `Authorization` for every URL never\n * leaks it to a URL that did not receive it in the first place.\n *\n * Pass `getPrincipal` to bind each entry to whoever queued it: the worker asks\n * the issuing tab right after queueing, asks every tab again before replaying,\n * and drops the entry when no signed-in tab is its owner.\n *\n * @param getHeaders - Resolves the headers for one queued request at replay.\n * @param options - `getPrincipal` binds entries to their owner.\n * @returns A function that removes the listener. A no-op outside the browser.\n *\n * @example\n * import { provideBackgroundSyncCredentials } from \"tempest-react-sdk/sw\";\n *\n * const stop = provideBackgroundSyncCredentials(\n * () => {\n * const token = localStorage.getItem(\"token\");\n * return token ? { Authorization: `Bearer ${token}` } : null;\n * },\n * { getPrincipal: () => localStorage.getItem(\"userId\") },\n * );\n */\nexport function provideBackgroundSyncCredentials(\n getHeaders: BackgroundSyncCredentialsProvider,\n options: ProvideBackgroundSyncCredentialsOptions = {},\n): () => void {\n if (typeof navigator === \"undefined\" || !navigator.serviceWorker) return () => undefined;\n const container = navigator.serviceWorker;\n const { getPrincipal } = options;\n const onMessage = (event: MessageEvent): void => {\n const data = event.data as Partial<BackgroundSyncCredentialsRequest> & { type?: unknown };\n const port = event.ports[0];\n if (data?.type !== BACKGROUND_SYNC_CREDENTIALS_MESSAGE || !port) return;\n const request: BackgroundSyncCredentialsRequest = {\n url: String(data.url),\n method: String(data.method),\n phase: data.phase === \"enqueue\" ? \"enqueue\" : \"replay\",\n };\n void (async () => {\n try {\n const headers = request.phase === \"enqueue\" ? null : await getHeaders(request);\n const answer: { headers: Record<string, string> | null; owner?: string | null } = {\n headers,\n };\n if (getPrincipal) answer.owner = await ownerFingerprint(await getPrincipal());\n port.postMessage(answer);\n } catch {\n port.postMessage({ error: true });\n }\n })();\n };\n container.addEventListener(\"message\", onMessage);\n return () => container.removeEventListener(\"message\", onMessage);\n}\n"],"mappings":"+EA4DA,SAAS,GAAyB,CAC9B,OAAO,UACX,CAgDA,IAAM,EAAqB,kBAOrB,EAAa,EACb,EAAQ,WACR,EAAO,OACP,EAAY,QAML,EAAsC,8BAG7C,EAAyB,IAMzB,EAAuB,EAAyB,EAkItD,SAAS,EACL,EACA,EACgD,CAChD,IAAM,EAA2B,CAAC,EAC5B,EAAqB,CAAC,EAC5B,IAAK,GAAM,CAAC,EAAM,KAAU,EACpB,EAAkB,IAAI,EAAK,YAAY,CAAC,EAAG,EAAS,KAAK,EAAK,YAAY,CAAC,EAC1E,EAAK,KAAK,CAAC,EAAM,CAAK,CAAC,EAEhC,MAAO,CAAE,OAAM,UAAS,CAC5B,CAOA,SAAS,EAAqB,EAAuB,EAA8C,CAC/F,IAAM,EAAgB,EAAM,WAAW,EACvC,EAAc,cAAkB,CAC5B,IAAM,EAAS,EAAc,OAC7B,GAAI,CAAC,EAAQ,OACb,IAAM,EAAQ,EAAO,MACf,CAAE,OAAM,YAAa,EAAa,EAAM,QAAS,CAAiB,EACxE,EAAO,OAAO,CACV,GAAG,EACH,QAAS,EACT,gBAAiB,CAAC,GAAG,IAAI,IAAI,CAAC,GAAI,EAAM,iBAAmB,CAAC,EAAI,GAAG,CAAQ,CAAC,CAAC,EAC7E,WAAY,EAAM,YAAc,SACpC,CAAC,EACD,EAAO,SAAS,CACpB,CACJ,CAEA,SAAS,EACL,EACA,EAAyC,EAAA,oBAAoB,EACzC,CACpB,OAAO,IAAI,SAAS,EAAS,IAAW,CACpC,IAAM,EAAU,UAAU,KAAK,EAAM,CAAU,EAC/C,EAAQ,gBAAmB,GAAU,CACjC,IAAM,EAAK,EAAQ,OACd,EAAG,iBAAiB,SAAS,CAAK,EAE5B,EAAM,WAAa,GAAK,EAAQ,aACvC,EAAqB,EAAQ,YAAY,YAAY,CAAK,EAAG,CAAiB,EAF9E,EAAG,kBAAkB,EAAO,CAAE,QAAS,KAAM,cAAe,EAAK,CAAC,EAIjE,EAAG,iBAAiB,SAAS,CAAI,GAAG,EAAG,kBAAkB,CAAI,CACtE,EACA,EAAQ,cAAkB,CACtB,IAAM,EAAK,EAAQ,OACnB,EAAG,oBAAwB,EAAG,MAAM,EACpC,EAAQ,CAAE,CACd,EACA,EAAQ,YAAgB,EAAO,EAAQ,KAAK,CAChD,CAAC,CACL,CAEA,SAAS,EAAO,EAAmC,CAC/C,OAAO,IAAI,SAAS,EAAS,IAAW,CACpC,EAAG,eAAmB,EAAQ,EAC9B,EAAG,YAAgB,EAAO,EAAG,KAAK,EAClC,EAAG,YAAgB,EAAO,EAAG,KAAK,CACtC,CAAC,CACL,CAGA,eAAe,EAAU,EAAc,EAAyD,CAC5F,IAAM,EAAK,MAAM,EAAY,EAAM,CAAiB,EAC9C,EAAK,EAAG,YAAY,EAAM,UAAU,EACpC,EAAM,EAAG,YAAY,CAAI,CAAC,CAAC,IAAI,CAAS,EAG9C,OAFA,MAAM,EAAO,CAAE,EACf,EAAG,MAAM,EACD,EAAI,QAAiC,CACjD,CASA,eAAe,EACX,EACA,EACA,EACA,EAC2B,CAC3B,IAAM,EAAK,MAAM,EAAY,EAAM,CAAiB,EAC9C,EAAK,EAAG,YAAY,CAAC,EAAO,CAAI,EAAG,WAAW,EAChD,EACE,EAAU,EAAG,YAAY,CAAI,CAAC,CAAC,IAAI,CAAS,EAUlD,MATA,GAAQ,cAAkB,CACtB,IAAM,EAAQ,QAAiC,KAAO,EAAO,OAC7D,IAAM,EAAM,EAAG,YAAY,CAAK,CAAC,CAAC,IAAI,CAAK,EAC3C,EAAI,cAAkB,CAClB,EAAK,EAAI,MACb,CACJ,EACA,MAAM,EAAO,CAAE,EACf,EAAG,MAAM,EACF,CACX,CAMA,eAAe,EACX,EACA,EACA,EACA,EACa,CACb,IAAM,EAAK,MAAM,EAAY,CAAI,EAC3B,EAAK,EAAG,YAAY,EAAO,WAAW,EACtC,EAAQ,EAAG,YAAY,CAAK,EAC5B,EAAM,EAAM,IAAI,CAAE,EACxB,EAAI,cAAkB,CAClB,IAAM,EAAQ,EAAI,OACb,IACL,EAAM,WAAa,EACf,IAAe,UAAS,EAAM,MAAQ,GAAS,MACnD,EAAM,IAAI,CAAK,EACnB,EACA,MAAM,EAAO,CAAE,EACf,EAAG,MAAM,CACb,CAEA,eAAe,EACX,EACA,EACwB,CACxB,IAAM,EAAK,MAAM,EAAY,EAAM,CAAiB,EAC9C,EAAK,EAAG,YAAY,EAAO,UAAU,EACrC,EAAM,MAAM,IAAI,SAA0B,EAAS,IAAW,CAChE,IAAM,EAAM,EAAG,YAAY,CAAK,CAAC,CAAC,OAAO,EACzC,EAAI,cAAkB,EAAQ,EAAI,MAAyB,EAC3D,EAAI,YAAgB,EAAO,EAAI,KAAK,CACxC,CAAC,EAED,OADA,EAAG,MAAM,EACF,CACX,CAGA,eAAe,EAAY,EAAc,EAA8B,CACnE,IAAM,EAAK,MAAM,EAAY,CAAI,EAC3B,EAAK,EAAG,YAAY,EAAO,UAAU,EACrC,EAAQ,EAAG,YAAY,CAAK,CAAC,CAAC,MAAM,CAAE,EAG5C,OAFA,MAAM,EAAO,CAAE,EACf,EAAG,MAAM,EACF,EAAM,OAAS,CAC1B,CAEA,eAAe,EAAO,EAAc,EAA2B,CAC3D,IAAM,EAAK,MAAM,EAAY,CAAI,EAC3B,EAAK,EAAG,YAAY,EAAO,WAAW,EAC5C,EAAG,YAAY,CAAK,CAAC,CAAC,OAAO,CAAE,EAC/B,MAAM,EAAO,CAAE,EACf,EAAG,MAAM,CACb,CAMA,eAAe,EACX,EACA,EACA,EACA,EACsB,CACtB,IAAM,EAAS,MAAM,EAAQ,MAAM,CAAC,CAAC,YAAY,EAC3C,CAAE,OAAM,YAAa,EAAa,EAAQ,QAAQ,QAAQ,EAAG,CAAiB,EACpF,MAAO,CACH,IAAK,EAAQ,IACb,OAAQ,EAAQ,OAChB,QAAS,EACT,KAAM,EAAO,WAAa,EAAI,EAAS,KACvC,YACA,YAAa,EAAQ,YACrB,gBAAiB,EACjB,YACJ,CACJ,CAOA,SAAS,EACL,EACA,EAC+C,CAC/C,GAAM,CAAE,OAAM,YAAa,EAAa,EAAM,QAAS,CAAiB,EACxE,MAAO,CACH,QAAS,IAAI,QAAQ,EAAM,IAAK,CAC5B,OAAQ,EAAM,OACd,QAAS,EACT,KAAM,EAAM,MAAQ,IAAA,GACpB,YAAa,EAAM,WACvB,CAAC,EACD,gBAAiB,CAAC,GAAG,IAAI,IAAI,CAAC,GAAI,EAAM,iBAAmB,CAAC,EAAI,GAAG,CAAQ,CAAC,CAAC,CACjF,CACJ,CAgBA,eAAe,EACX,EACA,EACA,EACiC,CACjC,IAAM,EAAU,IAAI,eACd,EAAS,MAAM,QAAQ,KAAK,CAC9B,IAAI,QAAkB,GAAY,CAC9B,EAAQ,MAAM,UAAa,GAAwB,EAAQ,EAAM,IAAI,EACrE,EAAO,YAAY,CAAE,KAAM,EAAqC,GAAG,CAAQ,EAAG,CAC1E,EAAQ,KACZ,CAAC,CACL,CAAC,EACD,EAAS,SAAW,IAAA,EAAS,CACjC,CAAC,EAED,GADA,EAAQ,MAAM,MAAM,EACG,OAAO,GAAW,WAArC,GAAiD,EAAE,YAAa,GAAS,OAC7E,GAAM,CAAE,UAAS,SAAU,EACrB,EAAe,UAAW,EAC5B,QAAgB,OAAO,GAAU,UAAY,IAAU,MAC3D,MAAO,CACH,QACwB,OAAO,GAAY,UAAvC,EACO,EACD,KACV,eACA,MAAO,EAAgB,EAA0B,IACrD,CACJ,CAGA,SAAS,GAAgE,CACrE,IAAI,EAIJ,MAAO,CAAE,QAAA,IAHW,QAAe,GAAY,CAC3C,EAAQ,WAAW,EAAS,CAAsB,CACtD,CACS,EAAS,WAAc,aAAa,CAAK,CAAE,CACxD,CAOA,eAAe,EACX,EACA,EACuB,CACvB,IAAM,EAAW,MAAM,EAAG,SAAS,SAAS,CAAE,KAAM,QAAS,CAAC,GAAM,CAAC,EACrE,GAAI,EAAQ,SAAW,EAAG,MAAO,CAAC,EAClC,IAAM,EAAW,EAAc,EACzB,EAAU,MAAM,QAAQ,IAC1B,EAAQ,IAAK,GAAW,EAAU,EAAQ,EAAS,EAAS,OAAO,CAAC,CACxE,EAEA,OADA,EAAS,OAAO,EACT,EAAQ,OAAQ,GAAmC,IAAW,IAAA,EAAS,CAClF,CAQA,SAAS,EAAgB,EAA2B,CAChD,IAAM,EAAU,IAAI,IAChB,EAAS,GACb,MAAO,CACH,IAAI,EAAS,CACT,IAAM,EAAM,GAAG,EAAQ,OAAO,GAAG,EAAQ,MACrC,EAAU,EAAQ,IAAI,CAAG,EAS7B,OARK,IACD,EAAU,EAAc,EAAI,CACxB,IAAK,EAAQ,IACb,OAAQ,EAAQ,OAChB,MAAO,QACX,CAAC,EACD,EAAQ,IAAI,EAAK,CAAO,GAErB,CACX,EACA,cAAe,CACP,IAAW,EAAA,WAAW,IAC1B,EAAS,GACT,QAAQ,KACJ,wPAIJ,EACJ,CACJ,CACJ,CAUA,SAAS,EACL,EACA,EACwB,CACxB,OAAQ,EAAQ,WAAhB,CACI,IAAK,QACD,OAAO,EAAQ,KAAM,GAAW,EAAO,cAAgB,EAAO,QAAU,EAAQ,KAAK,EACzF,IAAK,UACD,OAAO,EAAQ,MAAO,GAAW,CAAC,EAAO,YAAY,EAAI,EAAQ,GAAK,IAAA,GAC1E,IAAK,UACD,OAAO,EAAQ,KAAM,GAAW,CAAC,EAAO,YAAY,GAAK,EAAQ,EACzE,CACJ,CAQA,eAAe,EACX,EACA,EACA,EACA,EACuB,CACvB,IAAM,EAAe,EAAQ,gBAAgB,OAAS,EAChD,EACF,EAAQ,aAAe,WACtB,IAAgB,WAAa,EAAQ,aAAe,UACzD,GAAI,CAAC,GAAgB,EAAW,OAAO,EACvC,IAAM,EAAU,MAAM,EAAI,IAAI,CAAO,EACrC,GAAI,EAAQ,SAAW,EAEnB,MADA,EAAI,aAAa,EACP,MAAM,qCAAqC,EAEzD,IAAM,EAAS,EAAa,EAAS,CAAO,EAC5C,GAAI,CAAC,EAAQ,OAAO,KACpB,GAAI,CAAC,EAAc,OAAO,EAC1B,GAAI,EAAO,UAAY,KAAM,OAAO,KACpC,IAAM,EAAW,IAAI,IACjB,OAAO,QAAQ,EAAO,OAAO,CAAC,CAAC,KAAK,CAAC,EAAM,KAAW,CAAC,EAAK,YAAY,EAAG,CAAK,CAAC,CACrF,EACA,GAAI,EAAQ,gBAAgB,KAAM,GAAS,CAAC,EAAS,IAAI,CAAI,CAAC,EAC1D,MAAU,MAAM,gEAAgE,EAEpF,IAAM,EAAU,IAAI,QAAQ,EAAQ,OAAO,EAC3C,IAAK,IAAM,KAAQ,EAAQ,gBAAiB,EAAQ,IAAI,EAAM,EAAS,IAAI,CAAI,CAAW,EAC1F,OAAO,IAAI,QAAQ,EAAS,CAAE,SAAQ,CAAC,CAC3C,CAsBA,eAAe,EAAY,EAAsB,EAA4B,CACzE,GAAM,CAAE,KAAI,OAAM,iBAAgB,oBAAmB,eAAc,eAAgB,EAC7E,EAAM,EAAgB,CAAE,EACxB,EACF,KACE,EAAkB,IAChB,EAAoB,EAAK,EAAS,EAAS,CAAW,GACxD,EAAU,MAAM,EAAQ,EAAM,CAAiB,EACjD,EAAU,EAEd,IAAK,IAAM,KAAS,EAAS,CACzB,GAAI,EAAM,KAAO,IAAA,GAAW,SAC5B,GAAI,EAAM,EAAM,UAAY,EAAgB,CACxC,MAAM,EAAO,EAAM,EAAM,EAAE,EAC3B,QACJ,CACA,IAAM,EAAQ,EAAM,YAAc,UAClC,GAAI,IAAU,WAAa,EAAM,EAAM,UAAY,EAAsB,CACrE,GAAW,EACX,QACJ,CACA,IAAM,EAAuC,IAAU,UAAY,UAAY,EAC/E,GAAI,CACA,GAAM,CAAE,QAAS,EAAQ,mBAAoB,EACzC,EACA,CACJ,EACM,EAAU,MAAM,EAAQ,EAAQ,CAClC,SAAU,EAAM,UAChB,kBACA,aACA,MAAO,IAAe,QAAW,EAAM,OAAS,KAAQ,IAAA,EAC5D,CAAC,EACD,GAAI,CAAE,MAAM,EAAY,EAAM,EAAM,EAAE,EAAI,SAC1C,GAAI,IAAY,KAAM,CAClB,MAAM,EAAO,EAAM,EAAM,EAAE,EAC3B,QACJ,CACA,IAAM,EAAW,MAAM,MAAM,CAAO,EAChC,EAAS,IAAO,EAAS,QAAU,KAAO,EAAS,OAAS,IAC5D,MAAM,EAAO,EAAM,EAAM,EAAE,EAE3B,GAAW,CAEnB,MAAQ,CACJ,GAAW,CACf,CACJ,CAEA,GAAI,EAAU,EAAG,MAAU,MAAM,oBAAoB,EAAQ,0BAA0B,CAC3F,CAMA,IAAM,EAAkB,IAAI,IAE5B,SAAS,EAAW,EAAqC,CACrD,IAAM,EAAU,EAAgB,IAAI,EAAO,IAAI,EAC/C,GAAI,EAAS,OAAO,EACpB,IAAM,EAAO,EAAY,EAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,YAAc,CACvD,EAAgB,OAAO,EAAO,IAAI,CACtC,CAAC,EAED,OADA,EAAgB,IAAI,EAAO,KAAM,CAAI,EAC9B,CACX,CAEA,SAAS,EACL,EACA,EACA,EACO,CAEP,OADK,EACE,OAAO,GAAU,WAAa,EAAM,EAAK,CAAO,EAAI,EAAM,KAAK,EAAI,IAAI,EAD3D,EAEvB,CAOA,eAAe,EACX,EACA,EACA,EACA,EACa,CACb,IAAM,EAAW,EAAc,EACzB,EAAS,MAAM,EACjB,EACA,CAAE,IAAK,EAAQ,IAAK,OAAQ,EAAQ,OAAQ,MAAO,SAAU,EAC7D,EAAS,OACb,EACA,EAAS,OAAO,EAMhB,MAAM,EAAW,EAAM,EALkB,EAEnC,EAAO,aACL,QACA,UAHF,UAI4B,GAAQ,KAAK,CACnD,CAsBA,SAAgB,EAAsB,EAAwC,CAAC,EAAS,CACpF,IAAM,EAAK,EAAW,EAChB,CACF,QACA,YAAY,EACZ,sBAAsB,KACtB,kBAAkB,GAAG,EAAQ,WAAa,EAAmB,WAC7D,oBAAoB,EAAA,2BACpB,eACA,cAAc,UACd,EACE,EAAW,EAAA,oBAAoB,CAAiB,EAChD,EAAuB,CACzB,KACA,KAAM,EACN,eAAgB,EAAsB,GAAK,IAC3C,kBAAmB,EACnB,eACA,aACJ,EAEA,EAAG,iBAAiB,QAAU,GAAU,CACpC,IAAM,EAAU,EAAM,QACtB,GAAI,EAAQ,SAAW,OAAS,EAAQ,SAAW,OAAQ,OAE3D,IAAM,EAAM,IAAI,IAAI,EAAQ,GAAG,EAC/B,GAAI,CAAC,EAAQ,EAAO,EAAK,CAAO,EAAG,OAEnC,IAAM,EAAQ,EAAU,EAAW,CAAQ,EAC3C,EAAM,UAAY,IAAA,EAAS,EAC3B,IAAM,EAAU,MAAM,EAAQ,MAAM,CAAC,EAC/B,EAAS,EAAQ,SACb,IAAA,GACN,SAAY,CACR,IAAM,EAAS,EAAM,SAAW,MAAM,EAAG,SAAS,IAAI,EAAM,QAAQ,EAAI,IAAA,GAClE,EAAQ,MAAM,EAChB,EACA,KAAK,IAAI,EACT,EACA,EAAS,UAAY,SACzB,EACM,EAAK,MAAM,EAAQ,EAAW,EAAO,MAAM,EAAO,CAAQ,EAC5D,OAAO,IAAA,GACX,IAAI,CACA,MAAM,EAAG,aAAa,MAAM,SAAS,CAAS,CAClD,MAAQ,CAER,CACA,OAAO,EAAS,CAAE,KAAI,QAAO,EAAI,IAAA,EADjC,CAEJ,CACJ,EACA,EAAM,YACF,EAAQ,MAAM,KAAO,IAAmB,CAEpC,MADA,MAAM,EACA,CACV,CAAC,CACL,EACA,EAAM,UACF,EACK,KAAM,GACH,EAAQ,EAAgB,EAAW,EAAM,GAAI,EAAM,OAAQ,CAAO,EAAI,IAAA,EAC1E,CAAC,CACA,UAAY,IAAA,EAAS,CAC9B,CACJ,CAAC,EAED,EAAG,iBAAiB,OAAS,GAAU,CAC/B,EAAM,MAAQ,GAClB,EAAM,UAAU,EAAW,CAAM,CAAC,CACtC,CAAC,EAED,EAAG,iBAAiB,eAAiB,GAAU,CACvC,EAAM,MAAQ,GAClB,EAAM,UAAU,EAAW,CAAM,CAAC,CAAC,UAAY,IAAA,EAAS,CAAC,CAC7D,CAAC,EAED,EAAG,iBAAiB,QAAU,GAAU,CAChC,EAAG,aAAa,MAChB,EAAM,QAAQ,SAAW,OAC7B,EAAM,UAAU,EAAW,CAAM,CAAC,CAAC,UAAY,IAAA,EAAS,CAAC,CAC7D,CAAC,CACL,CAsBA,eAAsB,EAClB,EAAoB,EACJ,CAChB,GAAI,OAAO,UAAc,IAAa,MAAO,GAC7C,IAAM,EAAK,MAAM,EAAY,CAAS,EAChC,EAAK,EAAG,YAAY,CAAC,EAAO,CAAI,EAAG,WAAW,EACpD,EAAG,YAAY,CAAK,CAAC,CAAC,MAAM,EAC5B,IAAM,EAAO,EAAG,YAAY,CAAI,EAC1B,EAAU,EAAK,IAAI,CAAS,EAMlC,MALA,GAAQ,cAAkB,CACtB,EAAK,KAAM,EAAQ,QAAiC,GAAK,EAAG,CAAS,CACzE,EACA,MAAM,EAAO,CAAE,EACf,EAAG,MAAM,EACF,EACX,CAQA,eAAe,EAAiB,EAA8D,CAC1F,GAAI,GAAc,MAAmC,IAAc,GAAI,OAAO,KAC9E,IAAM,EAAS,MAAM,OAAO,OAAO,OAC/B,UACA,IAAI,YAAY,CAAC,CAAC,OAAO,mBAAmB,GAAW,CAC3D,EACA,MAAO,CAAC,GAAG,IAAI,WAAW,CAAM,CAAC,CAAC,CAAC,IAAK,GAAS,EAAK,SAAS,EAAE,CAAC,CAAC,SAAS,EAAG,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAChG,CAoCA,SAAgB,EACZ,EACA,EAAmD,CAAC,EAC1C,CACV,GAAI,OAAO,UAAc,KAAe,CAAC,UAAU,cAAe,UAAa,IAAA,GAC/E,IAAM,EAAY,UAAU,cACtB,CAAE,gBAAiB,EACnB,EAAa,GAA8B,CAC7C,IAAM,EAAO,EAAM,KACb,EAAO,EAAM,MAAM,GACzB,GAAI,GAAM,OAAA,+BAAgD,CAAC,EAAM,OACjE,IAAM,EAA4C,CAC9C,IAAK,OAAO,EAAK,GAAG,EACpB,OAAQ,OAAO,EAAK,MAAM,EAC1B,MAAO,EAAK,QAAU,UAAY,UAAY,QAClD,GACM,SAAY,CACd,GAAI,CAEA,IAAM,EAA4E,CAC9E,QAFY,EAAQ,QAAU,UAAY,KAAO,MAAM,EAAW,CAAO,CAG7E,EACI,IAAc,EAAO,MAAQ,MAAM,EAAiB,MAAM,EAAa,CAAC,GAC5E,EAAK,YAAY,CAAM,CAC3B,MAAQ,CACJ,EAAK,YAAY,CAAE,MAAO,EAAK,CAAC,CACpC,CACJ,EAAA,CAAG,CACP,EAEA,OADA,EAAU,iBAAiB,UAAW,CAAS,MAClC,EAAU,oBAAoB,UAAW,CAAS,CACnE"}
1
+ {"version":3,"file":"background-sync.cjs","names":["credentialHeaderSet","isDevBuild","DEFAULT_CREDENTIAL_HEADERS","require_dev_mode","require_credential_headers","getSwScope","DEFAULT_QUEUE_NAME","DB_VERSION","STORE","META","EPOCH_KEY","BACKGROUND_SYNC_CREDENTIALS_MESSAGE","CREDENTIALS_TIMEOUT_MS","OWNER_STAMP_GRACE_MS","splitHeaders","kept","stripped","name","value","headers","credentialHeaders","migrateLegacyEntries","cursorRequest","store","cursor","entry","openQueueDb","request","db","event","resolve","reject","txDone","tx","readEpoch","get","enqueue","id","current","epoch","add","stampOwner","ownerState","owner","readAll","all","req","stillQueued","count","remove","serializeRequest","buffer","deserializeRequest","askClient","channel","answer","client","deadline","hasPrincipal","startDeadline","timer","askAllClients","clients","sw","answers","createReplayRun","warned","key","pending","chooseAnswer","context","defaultBeforeReplay","credentialed","unchecked","ownerPolicy","run","chosen","provided","replayQueue","config","prepare","beforeReplay","entries","now","maxRetentionMs","state","stored","response","replaysInFlight","drainQueue","running","pass","matches","match","url","stampFromIssuer","issuer","installBackgroundSync","options","replay","queueName","maxRetentionMinutes","attempt","queued","error","stamp","periodicSyncTag","clearBackgroundSyncQueue","meta","ownerFingerprint","principal","digest","byte","provideBackgroundSyncCredentials","container","onMessage","data","port","getHeaders","getPrincipal"],"sources":["../../src/sw/background-sync.ts"],"sourcesContent":["/**\n * Background-sync helper: queue failed mutating requests (POST/PUT/PATCH/DELETE)\n * while offline and replay them when connectivity returns. A dependency-free\n * take on Workbox's `BackgroundSyncPlugin`, backed by a tiny IndexedDB queue.\n *\n * Import inside your `sw.ts`. Uses the Background Sync API (`registration.sync`)\n * when available, and also replays opportunistically on the next request as a\n * fallback for browsers without it (e.g. Safari).\n *\n * Credential headers (`Authorization` and the rest of\n * {@link DEFAULT_CREDENTIAL_HEADERS}) are never written to IndexedDB: the queue\n * outlives the session, and a stored bearer stayed readable after logout and was\n * replayed with the old identity (reproduced in Chromium 153, 11/10/2026). On\n * replay the worker asks the open pages for the *current* credentials — see\n * {@link provideBackgroundSyncCredentials} — or a custom `beforeReplay` hook.\n * Credentials carried in the URL or the body are out of reach and are stored\n * as sent.\n *\n * @example\n * import { installBackgroundSync } from \"tempest-react-sdk/sw\";\n *\n * installBackgroundSync({ match: (url) => url.pathname.startsWith(\"/api/\") });\n */\nimport { isDevBuild } from \"../utils/dev-mode\";\nimport { DEFAULT_CREDENTIAL_HEADERS, credentialHeaderSet } from \"./credential-headers\";\n\ninterface SyncEventLike {\n tag: string;\n waitUntil(promise: Promise<unknown>): void;\n}\n\ninterface BgFetchEventLike {\n request: Request;\n /** Id of the window client that issued the request, when there is one. */\n clientId?: string;\n respondWith(response: Response | Promise<Response>): void;\n waitUntil(promise: Promise<unknown>): void;\n}\n\ninterface PeriodicSyncEventLike {\n tag: string;\n waitUntil(promise: Promise<unknown>): void;\n}\n\n/** Minimal shape of a window client the worker can message. */\ninterface WindowClientLike {\n postMessage(message: unknown, transfer: Transferable[]): void;\n}\n\ninterface BgSwGlobal {\n registration: { sync?: { register(tag: string): Promise<void> } };\n clients?: {\n matchAll(options: { type: \"window\" }): Promise<readonly WindowClientLike[]>;\n get(id: string): Promise<WindowClientLike | undefined>;\n };\n addEventListener(type: \"sync\", listener: (event: SyncEventLike) => void): void;\n addEventListener(type: \"fetch\", listener: (event: BgFetchEventLike) => void): void;\n addEventListener(type: \"periodicsync\", listener: (event: PeriodicSyncEventLike) => void): void;\n}\n\nfunction getSwScope(): BgSwGlobal {\n return globalThis as unknown as BgSwGlobal;\n}\n\n/**\n * How an entry is tied to whoever queued it:\n * - `\"bound\"`: the issuing page reported a principal (or `null` for nobody);\n * the entry only goes out while the same one is signed in.\n * - `\"unbound\"`: the issuing page answered without `getPrincipal`.\n * - `\"unknown\"`: nobody could say — no issuing tab, no answer, an error, or an\n * entry written before owners existed. Fails closed, with or without stripped\n * credentials: a cookie session rides along on the replay, so an entry with no\n * credential header is checked like any other.\n *\n * While the worker is still asking, the stored state is `\"pending\"`, which a\n * replay never sees: it waits, then reads a stamp that never came as `\"unknown\"`.\n */\nexport type BackgroundSyncOwnerState = \"bound\" | \"unbound\" | \"unknown\";\n\n/**\n * How the default `beforeReplay` treats an `\"unknown\"` owner on an entry that\n * carried no credential header:\n * - `\"strict\"` (default): it asks the open pages like any other entry — replayed\n * only when every answer lacks a principal, dropped as soon as one answer has\n * one, pending while nobody answers.\n * - `\"lenient\"`: it is replayed as-is, without asking (the behavior up to 0.77.0).\n *\n * An entry with stripped credentials always asks, under either policy.\n */\nexport type BackgroundSyncOwnerPolicy = \"strict\" | \"lenient\";\n\n/** A serialized request stored in the queue. */\ninterface QueuedRequest {\n id?: number;\n url: string;\n method: string;\n headers: [string, string][];\n body: ArrayBuffer | null;\n timestamp: number;\n /** The original `credentials` mode, so cookie-based APIs replay with cookies. */\n credentials?: RequestCredentials;\n /** Lower-cased names of the credential headers removed before persisting. */\n strippedHeaders?: string[];\n /** Absent on entries written before 0.77 — read as `\"unknown\"`. */\n ownerState?: BackgroundSyncOwnerState | \"pending\";\n /** Fingerprint of the principal under `\"bound\"`; `null` for \"nobody signed in\". */\n owner?: string | null;\n}\n\n/** Default IndexedDB database name (and sync tag) of the background-sync queue. */\nconst DEFAULT_QUEUE_NAME = \"tempest-bg-sync\";\n\n/**\n * Schema version of the queue database. Version 2 adds the `meta` store (the\n * clear epoch) and migrates version-1 entries, scrubbing their plaintext\n * credential headers on first open.\n */\nconst DB_VERSION = 2;\nconst STORE = \"requests\";\nconst META = \"meta\";\nconst EPOCH_KEY = \"epoch\";\n\n/**\n * `type` of the message the worker posts to window clients to ask about a queued\n * request. Answered by {@link provideBackgroundSyncCredentials}.\n */\nexport const BACKGROUND_SYNC_CREDENTIALS_MESSAGE = \"tempest:bg-sync-credentials\";\n\n/** How long the worker waits for the window clients to answer, in milliseconds. */\nconst CREDENTIALS_TIMEOUT_MS = 3000;\n\n/**\n * How long a replay waits on an entry whose owner is still being stamped. Past\n * it (the worker died mid-question), the owner is read as `\"unknown\"`.\n */\nconst OWNER_STAMP_GRACE_MS = CREDENTIALS_TIMEOUT_MS * 2;\n\n/** What a queued request looked like when it was stored, passed to `beforeReplay`. */\nexport interface BackgroundSyncReplayContext {\n /** Epoch milliseconds of the original failed attempt. */\n queuedAt: number;\n /** Lower-cased credential header names stripped before the entry was stored. */\n strippedHeaders: readonly string[];\n /** How the entry is tied to its owner. */\n ownerState: BackgroundSyncOwnerState;\n /** Owner fingerprint under `\"bound\"` (`null` for nobody); `undefined` otherwise. */\n owner: string | null | undefined;\n}\n\n/** The request a window client is asked about, as sent by the worker. */\nexport interface BackgroundSyncCredentialsRequest {\n /** Absolute URL of the queued request. */\n url: string;\n /** HTTP method of the queued request. */\n method: string;\n /**\n * `\"enqueue\"` when the worker only wants the owner of a request that just\n * failed; `\"replay\"` when it is about to send it and needs the credentials.\n */\n phase: \"enqueue\" | \"replay\";\n}\n\n/**\n * Resolve the credentials for a queued request: a header record to apply, or\n * `null` when there is no session (the entry is then dropped).\n */\nexport type BackgroundSyncCredentialsProvider = (\n request: BackgroundSyncCredentialsRequest,\n) => Record<string, string> | null | Promise<Record<string, string> | null>;\n\n/** Options for {@link provideBackgroundSyncCredentials}. */\nexport interface ProvideBackgroundSyncCredentialsOptions {\n /**\n * Who is signed in right now — a stable, non-secret id such as the user id;\n * `null`/`undefined` when nobody is. Read when a request is queued and again\n * when it is replayed: an entry is only sent while the same principal is\n * signed in, and dropped otherwise, so a mutation queued by one account is\n * never sent with another account's credentials even when the app forgets\n * `clearSessionData()` on logout. Only a SHA-256 fingerprint reaches the\n * queue, never the value itself. A throw is answered as an explicit error,\n * which leaves the owner unknown (fail closed).\n */\n getPrincipal?: () => string | null | undefined | Promise<string | null | undefined>;\n}\n\n/** Options for {@link installBackgroundSync}. */\nexport interface InstallBackgroundSyncOptions {\n /**\n * Which requests to queue on failure. A `RegExp` against the URL or a\n * predicate. Only non-`GET` requests are ever considered. Default: all\n * non-`GET` requests.\n */\n match?: RegExp | ((url: URL, request: Request) => boolean);\n /** IndexedDB database name, also used as the sync tag. Default `tempest-bg-sync`. */\n queueName?: string;\n /** Drop queued requests older than this (minutes) on replay. Default `1440` (24h). */\n maxRetentionMinutes?: number;\n /**\n * Also drain the queue on the `periodicsync` event carrying this tag,\n * complementing the one-off `sync` replay so long-pending mutations retry\n * even without a fresh navigation. Register the periodic sync from the main\n * thread with {@link registerPeriodicSync}. Default `${queueName}-periodic`.\n */\n periodicSyncTag?: string;\n /**\n * Header names stripped before a request is persisted — and stripped again on\n * replay, so entries written by an older version never go out with the\n * credential they stored. Default {@link DEFAULT_CREDENTIAL_HEADERS}; extend it\n * for a custom credential header (`[...DEFAULT_CREDENTIAL_HEADERS,\n * \"x-tenant-key\"]`). Passing `[]` restores the pre-0.77 behavior of\n * persisting and replaying every header, credentials included.\n */\n credentialHeaders?: readonly string[];\n /**\n * Prepare each queued request right before it is replayed: return the\n * request to send (typically with the current credentials applied) or\n * `null` to drop the entry for good. A thrown error keeps the entry pending.\n * The context carries the entry's owner, so a custom hook can apply the\n * same rule as the default.\n *\n * Default: only an `\"unbound\"` entry with no stripped credentials (and, under\n * `ownerPolicy: \"lenient\"`, an `\"unknown\"` one) is replayed as-is, without\n * asking. Every other entry — credentialed or not —\n * asks every open window client in parallel (see\n * {@link provideBackgroundSyncCredentials}) and picks the answer that fits:\n * - `\"bound\"`: the answer whose owner matches; none among valid answers →\n * dropped, never sent anonymously or as somebody else;\n * - `\"unknown\"`: only when every answer lacks a principal (an app that does\n * not use `getPrincipal`); a single answer with one → dropped, since a\n * stale tab without `getPrincipal` says nothing about who is signed in\n * next to it. This holds for an entry\n * with no credential header too, since the browser attaches the cookies of\n * whoever is signed in at replay time;\n * - `\"unbound\"`: any answer, preferring one without a principal.\n * Then `null` headers drop a credentialed entry, an answer that lacks one of\n * the stripped headers keeps it pending, and only the stripped names are\n * re-applied. No valid answer at all keeps it pending until\n * `maxRetentionMinutes` (and warns once per replay in development builds) —\n * so a page that never calls {@link provideBackgroundSyncCredentials} leaves\n * every entry it queued `\"unknown\"`, and none of them is replayed.\n */\n /**\n * How an `\"unknown\"` owner is handled on an entry with no stripped\n * credentials (see {@link BackgroundSyncOwnerPolicy}). Default `\"strict\"`.\n *\n * `\"lenient\"` restores the replay-as-is of 0.77.0 and earlier for an app without sign-in,\n * where no page ever reports a principal. Do not use it with a cookie\n * session: the browser attaches on replay the cookie of whoever is signed in\n * at that moment, so a mutation queued by A whose owner was never stamped\n * (issuing tab closed, empty `clientId`, stamp lost, legacy entry) goes out\n * with B's session. Entries with stripped credentials ask the pages either\n * way. Ignored when a custom `beforeReplay` is given.\n */\n ownerPolicy?: BackgroundSyncOwnerPolicy;\n beforeReplay?: (\n request: Request,\n context: BackgroundSyncReplayContext,\n ) => Request | null | Promise<Request | null>;\n}\n\n/**\n * Move credential headers out of a header list.\n *\n * @returns The remaining headers and the lower-cased names removed.\n */\nfunction splitHeaders(\n headers: Iterable<[string, string]>,\n credentialHeaders: ReadonlySet<string>,\n): { kept: [string, string][]; stripped: string[] } {\n const kept: [string, string][] = [];\n const stripped: string[] = [];\n for (const [name, value] of headers) {\n if (credentialHeaders.has(name.toLowerCase())) stripped.push(name.toLowerCase());\n else kept.push([name, value]);\n }\n return { kept, stripped };\n}\n\n/**\n * Scrub version-1 entries during the upgrade: their credential headers were\n * stored in plaintext, so they are removed from disk on the first open, recorded\n * as stripped, and the owner is marked unknown.\n */\nfunction migrateLegacyEntries(store: IDBObjectStore, credentialHeaders: ReadonlySet<string>): void {\n const cursorRequest = store.openCursor();\n cursorRequest.onsuccess = () => {\n const cursor = cursorRequest.result;\n if (!cursor) return;\n const entry = cursor.value as QueuedRequest;\n const { kept, stripped } = splitHeaders(entry.headers, credentialHeaders);\n cursor.update({\n ...entry,\n headers: kept,\n strippedHeaders: [...new Set([...(entry.strippedHeaders ?? []), ...stripped])],\n ownerState: entry.ownerState ?? \"unknown\",\n });\n cursor.continue();\n };\n}\n\nfunction openQueueDb(\n name: string,\n credentialHeaders: ReadonlySet<string> = credentialHeaderSet(),\n): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(name, DB_VERSION);\n request.onupgradeneeded = (event) => {\n const db = request.result;\n if (!db.objectStoreNames.contains(STORE)) {\n db.createObjectStore(STORE, { keyPath: \"id\", autoIncrement: true });\n } else if (event.oldVersion < 2 && request.transaction) {\n migrateLegacyEntries(request.transaction.objectStore(STORE), credentialHeaders);\n }\n if (!db.objectStoreNames.contains(META)) db.createObjectStore(META);\n };\n request.onsuccess = () => {\n const db = request.result;\n db.onversionchange = () => db.close();\n resolve(db);\n };\n request.onerror = () => reject(request.error);\n });\n}\n\nfunction txDone(tx: IDBTransaction): Promise<void> {\n return new Promise((resolve, reject) => {\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n tx.onabort = () => reject(tx.error);\n });\n}\n\n/** The current clear epoch: bumped by every {@link clearBackgroundSyncQueue}. */\nasync function readEpoch(name: string, credentialHeaders: ReadonlySet<string>): Promise<number> {\n const db = await openQueueDb(name, credentialHeaders);\n const tx = db.transaction(META, \"readonly\");\n const get = tx.objectStore(META).get(EPOCH_KEY);\n await txDone(tx);\n db.close();\n return (get.result as number | undefined) ?? 0;\n}\n\n/**\n * Add an entry unless the queue was cleared since `epoch` was read — checked in\n * the same transaction as the write, so a logout that lands while the request\n * is still failing never lets it into the next session's queue.\n *\n * @returns The new entry's key, or `undefined` when the clear won.\n */\nasync function enqueue(\n name: string,\n entry: QueuedRequest,\n epoch: number,\n credentialHeaders: ReadonlySet<string>,\n): Promise<number | undefined> {\n const db = await openQueueDb(name, credentialHeaders);\n const tx = db.transaction([STORE, META], \"readwrite\");\n let id: number | undefined;\n const current = tx.objectStore(META).get(EPOCH_KEY);\n current.onsuccess = () => {\n if (((current.result as number | undefined) ?? 0) !== epoch) return;\n const add = tx.objectStore(STORE).add(entry);\n add.onsuccess = () => {\n id = add.result as number;\n };\n };\n await txDone(tx);\n db.close();\n return id;\n}\n\n/**\n * Record how an entry is owned. A no-op when the entry is already gone\n * (replayed, or the queue was cleared).\n */\nasync function stampOwner(\n name: string,\n id: number,\n ownerState: BackgroundSyncOwnerState,\n owner: string | null | undefined,\n): Promise<void> {\n const db = await openQueueDb(name);\n const tx = db.transaction(STORE, \"readwrite\");\n const store = tx.objectStore(STORE);\n const get = store.get(id);\n get.onsuccess = () => {\n const entry = get.result as QueuedRequest | undefined;\n if (!entry) return;\n entry.ownerState = ownerState;\n if (ownerState === \"bound\") entry.owner = owner ?? null;\n store.put(entry);\n };\n await txDone(tx);\n db.close();\n}\n\nasync function readAll(\n name: string,\n credentialHeaders: ReadonlySet<string>,\n): Promise<QueuedRequest[]> {\n const db = await openQueueDb(name, credentialHeaders);\n const tx = db.transaction(STORE, \"readonly\");\n const all = await new Promise<QueuedRequest[]>((resolve, reject) => {\n const req = tx.objectStore(STORE).getAll();\n req.onsuccess = () => resolve(req.result as QueuedRequest[]);\n req.onerror = () => reject(req.error);\n });\n db.close();\n return all;\n}\n\n/** Whether an entry is still in the queue — `false` once it was cleared. */\nasync function stillQueued(name: string, id: number): Promise<boolean> {\n const db = await openQueueDb(name);\n const tx = db.transaction(STORE, \"readonly\");\n const count = tx.objectStore(STORE).count(id);\n await txDone(tx);\n db.close();\n return count.result > 0;\n}\n\nasync function remove(name: string, id: number): Promise<void> {\n const db = await openQueueDb(name);\n const tx = db.transaction(STORE, \"readwrite\");\n tx.objectStore(STORE).delete(id);\n await txDone(tx);\n db.close();\n}\n\n/**\n * Serialize a request for the queue, leaving out every credential header and\n * recording which ones were present.\n */\nasync function serializeRequest(\n request: Request,\n timestamp: number,\n credentialHeaders: ReadonlySet<string>,\n ownerState: QueuedRequest[\"ownerState\"],\n): Promise<QueuedRequest> {\n const buffer = await request.clone().arrayBuffer();\n const { kept, stripped } = splitHeaders(request.headers.entries(), credentialHeaders);\n return {\n url: request.url,\n method: request.method,\n headers: kept,\n body: buffer.byteLength > 0 ? buffer : null,\n timestamp,\n credentials: request.credentials,\n strippedHeaders: stripped,\n ownerState,\n };\n}\n\n/**\n * Rebuild a stored request, stripping credential headers once more so an entry\n * that still holds one (a custom `credentialHeaders` the migration did not know)\n * never replays it.\n */\nfunction deserializeRequest(\n entry: QueuedRequest,\n credentialHeaders: ReadonlySet<string>,\n): { request: Request; strippedHeaders: string[] } {\n const { kept, stripped } = splitHeaders(entry.headers, credentialHeaders);\n return {\n request: new Request(entry.url, {\n method: entry.method,\n headers: kept,\n body: entry.body ?? undefined,\n credentials: entry.credentials,\n }),\n strippedHeaders: [...new Set([...(entry.strippedHeaders ?? []), ...stripped])],\n };\n}\n\n/** A window client's parsed answer. */\ninterface ClientAnswer {\n headers: Record<string, string> | null;\n /** Whether the page has `getPrincipal`. */\n hasPrincipal: boolean;\n owner: string | null;\n}\n\n/**\n * Ask one window client about a queued request over a `MessageChannel`.\n *\n * @returns The parsed answer, or `undefined` when the client stayed silent until\n * `deadline`, answered `{ error: true }`, or answered something unrecognizable.\n */\nasync function askClient(\n client: WindowClientLike,\n request: BackgroundSyncCredentialsRequest,\n deadline: Promise<void>,\n): Promise<ClientAnswer | undefined> {\n const channel = new MessageChannel();\n const answer = await Promise.race([\n new Promise<unknown>((resolve) => {\n channel.port1.onmessage = (event: MessageEvent) => resolve(event.data);\n client.postMessage({ type: BACKGROUND_SYNC_CREDENTIALS_MESSAGE, ...request }, [\n channel.port2,\n ]);\n }),\n deadline.then(() => undefined),\n ]);\n channel.port1.close();\n if (answer === null || typeof answer !== \"object\" || !(\"headers\" in answer)) return undefined;\n const { headers, owner } = answer as { headers: unknown; owner?: unknown };\n const hasPrincipal = \"owner\" in answer;\n if (hasPrincipal && typeof owner !== \"string\" && owner !== null) return undefined;\n return {\n headers:\n headers !== null && typeof headers === \"object\"\n ? (headers as Record<string, string>)\n : null,\n hasPrincipal,\n owner: hasPrincipal ? (owner as string | null) : null,\n };\n}\n\n/** A deadline shared by every client asked in one round. */\nfunction startDeadline(): { promise: Promise<void>; cancel: () => void } {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const promise = new Promise<void>((resolve) => {\n timer = setTimeout(resolve, CREDENTIALS_TIMEOUT_MS);\n });\n return { promise, cancel: () => clearTimeout(timer) };\n}\n\n/**\n * Ask every open window client in parallel, under one shared deadline.\n *\n * @returns Every valid answer; empty when nobody answered.\n */\nasync function askAllClients(\n sw: BgSwGlobal,\n request: BackgroundSyncCredentialsRequest,\n): Promise<ClientAnswer[]> {\n const clients = (await sw.clients?.matchAll({ type: \"window\" })) ?? [];\n if (clients.length === 0) return [];\n const deadline = startDeadline();\n const answers = await Promise.all(\n clients.map((client) => askClient(client, request, deadline.promise)),\n );\n deadline.cancel();\n return answers.filter((answer): answer is ClientAnswer => answer !== undefined);\n}\n\n/** State of one replay pass: answers cached per URL + method, and the warning flag. */\ninterface ReplayRun {\n ask(request: Request): Promise<ClientAnswer[]>;\n warnNoAnswer(): void;\n}\n\nfunction createReplayRun(sw: BgSwGlobal): ReplayRun {\n const answers = new Map<string, Promise<ClientAnswer[]>>();\n let warned = false;\n return {\n ask(request) {\n const key = `${request.method} ${request.url}`;\n let pending = answers.get(key);\n if (!pending) {\n pending = askAllClients(sw, {\n url: request.url,\n method: request.method,\n phase: \"replay\",\n });\n answers.set(key, pending);\n }\n return pending;\n },\n warnNoAnswer() {\n if (warned || !isDevBuild()) return;\n warned = true;\n console.warn(\n \"[tempest-react-sdk/sw] background-sync: a queued request needs an open page \" +\n \"to confirm who is signed in or to supply the current credentials, and no \" +\n \"open page answered. Call \" +\n \"provideBackgroundSyncCredentials() in the page; the entry stays pending.\",\n );\n },\n };\n}\n\n/**\n * Pick the answer an entry may be replayed with, per its owner state.\n *\n * An `\"unknown\"` owner replays only when every valid answer lacks a principal:\n * one tab reporting a principal (even `null`) is enough to drop it, because a\n * principal-less answer — say a tab still running a bundle from before the app\n * adopted `getPrincipal` — says nothing about whose cookie the replay carries.\n */\nfunction chooseAnswer(\n answers: readonly ClientAnswer[],\n context: BackgroundSyncReplayContext,\n): ClientAnswer | undefined {\n switch (context.ownerState) {\n case \"bound\":\n return answers.find((answer) => answer.hasPrincipal && answer.owner === context.owner);\n case \"unknown\":\n return answers.every((answer) => !answer.hasPrincipal) ? answers[0] : undefined;\n case \"unbound\":\n return answers.find((answer) => !answer.hasPrincipal) ?? answers[0];\n }\n}\n\n/**\n * The default `beforeReplay` (rules on {@link InstallBackgroundSyncOptions}).\n *\n * @throws {Error} When no page answered, or the chosen answer lacks a stripped\n * header — the entry stays pending.\n */\nasync function defaultBeforeReplay(\n run: ReplayRun,\n request: Request,\n context: BackgroundSyncReplayContext,\n ownerPolicy: BackgroundSyncOwnerPolicy,\n): Promise<Request | null> {\n const credentialed = context.strippedHeaders.length > 0;\n const unchecked =\n context.ownerState === \"unbound\" ||\n (ownerPolicy === \"lenient\" && context.ownerState === \"unknown\");\n if (!credentialed && unchecked) return request;\n const answers = await run.ask(request);\n if (answers.length === 0) {\n run.warnNoAnswer();\n throw new Error(\"background-sync: no client answered\");\n }\n const chosen = chooseAnswer(answers, context);\n if (!chosen) return null;\n if (!credentialed) return request;\n if (chosen.headers === null) return null;\n const provided = new Map(\n Object.entries(chosen.headers).map(([name, value]) => [name.toLowerCase(), value]),\n );\n if (context.strippedHeaders.some((name) => !provided.has(name))) {\n throw new Error(\"background-sync: the answer lacks a stripped credential header\");\n }\n const headers = new Headers(request.headers);\n for (const name of context.strippedHeaders) headers.set(name, provided.get(name) as string);\n return new Request(request, { headers });\n}\n\n/** Everything {@link replayQueue} needs besides the clock. */\ninterface ReplayConfig {\n sw: BgSwGlobal;\n name: string;\n maxRetentionMs: number;\n credentialHeaders: ReadonlySet<string>;\n beforeReplay?: InstallBackgroundSyncOptions[\"beforeReplay\"];\n ownerPolicy: BackgroundSyncOwnerPolicy;\n}\n\n/**\n * Replay every queued request once. Entries that succeed, are stale, get a 4xx\n * (a client error that will not fix itself) or that the preparation rejects with\n * `null` are removed; entries that fail again — network error, 5xx, or a\n * preparation that throws — are kept, and so is an entry whose owner is still\n * being stamped (for up to {@link OWNER_STAMP_GRACE_MS}). Each entry is checked\n * against the store right before it is sent, so a queue cleared mid-replay stops\n * the replay. Throws if any entry is still pending, so a `sync` handler keeps\n * the sync registered.\n */\nasync function replayQueue(config: ReplayConfig, now: number): Promise<void> {\n const { sw, name, maxRetentionMs, credentialHeaders, beforeReplay, ownerPolicy } = config;\n const run = createReplayRun(sw);\n const prepare =\n beforeReplay ??\n ((request: Request, context: BackgroundSyncReplayContext) =>\n defaultBeforeReplay(run, request, context, ownerPolicy));\n const entries = await readAll(name, credentialHeaders);\n let pending = 0;\n\n for (const entry of entries) {\n if (entry.id === undefined) continue;\n if (now - entry.timestamp > maxRetentionMs) {\n await remove(name, entry.id);\n continue;\n }\n const state = entry.ownerState ?? \"unknown\";\n if (state === \"pending\" && now - entry.timestamp < OWNER_STAMP_GRACE_MS) {\n pending += 1;\n continue;\n }\n const ownerState: BackgroundSyncOwnerState = state === \"pending\" ? \"unknown\" : state;\n try {\n const { request: stored, strippedHeaders } = deserializeRequest(\n entry,\n credentialHeaders,\n );\n const request = await prepare(stored, {\n queuedAt: entry.timestamp,\n strippedHeaders,\n ownerState,\n owner: ownerState === \"bound\" ? (entry.owner ?? null) : undefined,\n });\n if (!(await stillQueued(name, entry.id))) continue;\n if (request === null) {\n await remove(name, entry.id);\n continue;\n }\n const response = await fetch(request);\n if (response.ok || (response.status >= 400 && response.status < 500)) {\n await remove(name, entry.id);\n } else {\n pending += 1;\n }\n } catch {\n pending += 1;\n }\n }\n\n if (pending > 0) throw new Error(`background-sync: ${pending} request(s) still pending`);\n}\n\n/**\n * The replay in flight per queue. `sync`, `periodicsync` and the Safari fallback\n * can fire together; sharing one pass keeps a mutation from being sent twice.\n */\nconst replaysInFlight = new Map<string, Promise<void>>();\n\nfunction drainQueue(config: ReplayConfig): Promise<void> {\n const running = replaysInFlight.get(config.name);\n if (running) return running;\n const pass = replayQueue(config, Date.now()).finally(() => {\n replaysInFlight.delete(config.name);\n });\n replaysInFlight.set(config.name, pass);\n return pass;\n}\n\nfunction matches(\n match: InstallBackgroundSyncOptions[\"match\"],\n url: URL,\n request: Request,\n): boolean {\n if (!match) return true;\n return typeof match === \"function\" ? match(url, request) : match.test(url.href);\n}\n\n/**\n * Ask the issuing page who owns a just-queued entry and record it.\n *\n * @returns Resolves once the owner is stamped; never rejects.\n */\nasync function stampFromIssuer(\n name: string,\n id: number,\n issuer: WindowClientLike,\n request: Request,\n): Promise<void> {\n const deadline = startDeadline();\n const answer = await askClient(\n issuer,\n { url: request.url, method: request.method, phase: \"enqueue\" },\n deadline.promise,\n );\n deadline.cancel();\n const state: BackgroundSyncOwnerState = !answer\n ? \"unknown\"\n : answer.hasPrincipal\n ? \"bound\"\n : \"unbound\";\n await stampOwner(name, id, state, answer?.owner);\n}\n\n/**\n * Install the background-sync queue: on a failed mutating request, the request\n * is serialized to IndexedDB (without its credential headers) and a sync is\n * registered; the original fetch still rejects (so your app can show an offline\n * state), and the request is replayed later when the network returns.\n *\n * Right after queueing, the worker asks the page that issued the request who is\n * signed in (`getPrincipal` on {@link provideBackgroundSyncCredentials}) and\n * stamps the entry with that owner, without delaying the rejection. The work is\n * handed to `event.waitUntil` synchronously, so the worker stays alive for it\n * in every engine. Without the Background Sync API (every non-Chromium\n * browser), the queue is drained opportunistically whenever a `GET` goes\n * through the worker.\n *\n * @tempest-limits empty-catch — `registration.sync.register` is unavailable on\n * every non-Chromium browser and fails on a revoked background-sync permission.\n * The entry is already durable in IndexedDB at that point, and the queue is also\n * drained opportunistically on the next successful request, so losing the OS-level\n * wakeup degrades *when* the replay happens, not *whether* it happens.\n */\nexport function installBackgroundSync(options: InstallBackgroundSyncOptions = {}): void {\n const sw = getSwScope();\n const {\n match,\n queueName = DEFAULT_QUEUE_NAME,\n maxRetentionMinutes = 1440,\n periodicSyncTag = `${options.queueName ?? DEFAULT_QUEUE_NAME}-periodic`,\n credentialHeaders = DEFAULT_CREDENTIAL_HEADERS,\n beforeReplay,\n ownerPolicy = \"strict\",\n } = options;\n const stripped = credentialHeaderSet(credentialHeaders);\n const replay: ReplayConfig = {\n sw,\n name: queueName,\n maxRetentionMs: maxRetentionMinutes * 60 * 1000,\n credentialHeaders: stripped,\n beforeReplay,\n ownerPolicy,\n };\n\n sw.addEventListener(\"fetch\", (event) => {\n const request = event.request;\n if (request.method === \"GET\" || request.method === \"HEAD\") return;\n\n const url = new URL(request.url);\n if (!matches(match, url, request)) return;\n\n const epoch = readEpoch(queueName, stripped);\n epoch.catch(() => undefined);\n const attempt = fetch(request.clone());\n const queued = attempt.then(\n () => undefined,\n async () => {\n const issuer = event.clientId ? await sw.clients?.get(event.clientId) : undefined;\n const entry = await serializeRequest(\n request,\n Date.now(),\n stripped,\n issuer ? \"pending\" : \"unknown\",\n );\n const id = await enqueue(queueName, entry, await epoch, stripped);\n if (id === undefined) return undefined;\n try {\n await sw.registration.sync?.register(queueName);\n } catch {\n /* empty */\n }\n return issuer ? { id, issuer } : undefined;\n },\n );\n event.respondWith(\n attempt.catch(async (error: unknown) => {\n await queued;\n throw error;\n }),\n );\n event.waitUntil(\n queued\n .then((stamp) =>\n stamp ? stampFromIssuer(queueName, stamp.id, stamp.issuer, request) : undefined,\n )\n .catch(() => undefined),\n );\n });\n\n sw.addEventListener(\"sync\", (event) => {\n if (event.tag !== queueName) return;\n event.waitUntil(drainQueue(replay));\n });\n\n sw.addEventListener(\"periodicsync\", (event) => {\n if (event.tag !== periodicSyncTag) return;\n event.waitUntil(drainQueue(replay).catch(() => undefined));\n });\n\n sw.addEventListener(\"fetch\", (event) => {\n if (sw.registration.sync) return;\n if (event.request.method !== \"GET\") return;\n event.waitUntil(drainQueue(replay).catch(() => undefined));\n });\n}\n\n/**\n * Empty the background-sync queue — every request still waiting to be replayed —\n * and bump its clear epoch. Call it on logout (or use `clearSessionData()`, which\n * also clears the runtime caches) so mutations made under one session are never\n * replayed under the next.\n *\n * Works from the page and from the worker, and reaches work already in flight\n * in the worker: a replay checks each entry right before sending it, and a\n * request still failing when the queue is cleared is not written afterwards.\n *\n * @param queueName - The `queueName` given to {@link installBackgroundSync}.\n * Default `tempest-bg-sync`.\n * @returns `true` once the queue is empty; `false` when IndexedDB is\n * unavailable (SSR, old browsers).\n *\n * @example\n * import { clearBackgroundSyncQueue } from \"tempest-react-sdk/sw\";\n *\n * await clearBackgroundSyncQueue();\n */\nexport async function clearBackgroundSyncQueue(\n queueName: string = DEFAULT_QUEUE_NAME,\n): Promise<boolean> {\n if (typeof indexedDB === \"undefined\") return false;\n const db = await openQueueDb(queueName);\n const tx = db.transaction([STORE, META], \"readwrite\");\n tx.objectStore(STORE).clear();\n const meta = tx.objectStore(META);\n const current = meta.get(EPOCH_KEY);\n current.onsuccess = () => {\n meta.put(((current.result as number | undefined) ?? 0) + 1, EPOCH_KEY);\n };\n await txDone(tx);\n db.close();\n return true;\n}\n\n/**\n * One-way fingerprint of a principal: hex SHA-256, so the queue can compare\n * owners without ever holding the id itself.\n *\n * @returns The fingerprint, or `null` when nobody is signed in.\n */\nasync function ownerFingerprint(principal: string | null | undefined): Promise<string | null> {\n if (principal === null || principal === undefined || principal === \"\") return null;\n const digest = await crypto.subtle.digest(\n \"SHA-256\",\n new TextEncoder().encode(`tempest-bg-sync:${principal}`),\n );\n return [...new Uint8Array(digest)].map((byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\n/**\n * Answer the worker's questions about queued requests (see `beforeReplay` on\n * {@link installBackgroundSync}). Install it once in every page, next to your\n * auth setup; it reads the token at replay time, so the queue never has to store\n * it. Without it, a queued request that carried a credential header is never\n * replayed.\n *\n * `getHeaders` must return **every** credential header the app sends (the worker\n * keeps an entry pending when one it stripped is missing), or `null` when there\n * is no session — the worker then drops the entry instead of replaying it\n * anonymously. A throw from `getHeaders` or `getPrincipal` is answered as an\n * explicit `{ error: true }`. The worker only applies headers whose names the\n * original request carried, so returning `Authorization` for every URL never\n * leaks it to a URL that did not receive it in the first place.\n *\n * Pass `getPrincipal` to bind each entry to whoever queued it: the worker asks\n * the issuing tab right after queueing, asks every tab again before replaying,\n * and drops the entry when no signed-in tab is its owner.\n *\n * @param getHeaders - Resolves the headers for one queued request at replay.\n * @param options - `getPrincipal` binds entries to their owner.\n * @returns A function that removes the listener. A no-op outside the browser.\n *\n * @example\n * import { provideBackgroundSyncCredentials } from \"tempest-react-sdk/sw\";\n *\n * const stop = provideBackgroundSyncCredentials(\n * () => {\n * const token = localStorage.getItem(\"token\");\n * return token ? { Authorization: `Bearer ${token}` } : null;\n * },\n * { getPrincipal: () => localStorage.getItem(\"userId\") },\n * );\n */\nexport function provideBackgroundSyncCredentials(\n getHeaders: BackgroundSyncCredentialsProvider,\n options: ProvideBackgroundSyncCredentialsOptions = {},\n): () => void {\n if (typeof navigator === \"undefined\" || !navigator.serviceWorker) return () => undefined;\n const container = navigator.serviceWorker;\n const { getPrincipal } = options;\n const onMessage = (event: MessageEvent): void => {\n const data = event.data as Partial<BackgroundSyncCredentialsRequest> & { type?: unknown };\n const port = event.ports[0];\n if (data?.type !== BACKGROUND_SYNC_CREDENTIALS_MESSAGE || !port) return;\n const request: BackgroundSyncCredentialsRequest = {\n url: String(data.url),\n method: String(data.method),\n phase: data.phase === \"enqueue\" ? \"enqueue\" : \"replay\",\n };\n void (async () => {\n try {\n const headers = request.phase === \"enqueue\" ? null : await getHeaders(request);\n const answer: { headers: Record<string, string> | null; owner?: string | null } = {\n headers,\n };\n if (getPrincipal) answer.owner = await ownerFingerprint(await getPrincipal());\n port.postMessage(answer);\n } catch {\n port.postMessage({ error: true });\n }\n })();\n };\n container.addEventListener(\"message\", onMessage);\n return () => container.removeEventListener(\"message\", onMessage);\n}\n"],"mappings":"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"}