tiny-essentials 1.28.19 → 1.29.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (556) hide show
  1. package/README.md +1 -1
  2. package/changelog/1/28/19.md +24 -0
  3. package/changelog/1/29/0.md +58 -0
  4. package/changelog/1/29/1.md +11 -0
  5. package/dist/v1/ColorSafeStringify.min.js +1 -1
  6. package/dist/v1/TinyAdvancedRaffle.min.js +1 -1
  7. package/dist/v1/TinyAfterScrollWatcher.min.js +1 -1
  8. package/dist/v1/TinyAnalogClock.min.js +1 -1
  9. package/dist/v1/TinyArrayComparator.min.js +1 -1
  10. package/dist/v1/TinyArrayPaginator.min.js +1 -1
  11. package/dist/v1/TinyBasicsEs.min.js +1 -1
  12. package/dist/v1/TinyBrowserMonitor.min.js +1 -0
  13. package/dist/v1/TinyClassManager.min.js +1 -1
  14. package/dist/v1/TinyClipboard.min.js +1 -1
  15. package/dist/v1/TinyCloner.min.js +1 -0
  16. package/dist/v1/TinyColorConverter.min.js +1 -1
  17. package/dist/v1/TinyColorValidator.min.js +1 -1
  18. package/dist/v1/TinyCookieConsent.min.js +1 -1
  19. package/dist/v1/TinyDayNightCycle.min.js +1 -1
  20. package/dist/v1/TinyDebugger.min.js +1 -1
  21. package/dist/v1/TinyDomReadyManager.min.js +1 -1
  22. package/dist/v1/TinyDragDropDetector.min.js +1 -1
  23. package/dist/v1/TinyDragger.min.js +1 -1
  24. package/dist/v1/TinyElementObserver.min.js +1 -1
  25. package/dist/v1/TinyEssentials.min.js +1 -1
  26. package/dist/v1/TinyGamepad.min.js +1 -1
  27. package/dist/v1/TinyHtml.min.js +1 -1
  28. package/dist/v1/TinyHtmlTagRegexBuilder.min.js +1 -0
  29. package/dist/v1/TinyHttpResponseRegistry.min.js +1 -0
  30. package/dist/v1/TinyI18.min.js +1 -1
  31. package/dist/v1/TinyIframeEvents.min.js +1 -1
  32. package/dist/v1/TinyInventory.min.js +1 -1
  33. package/dist/v1/TinyInventoryTrader.min.js +1 -1
  34. package/dist/v1/TinyLevelUp.min.js +1 -1
  35. package/dist/v1/TinyLoadingScreen.min.js +1 -1
  36. package/dist/v1/TinyLocalStorage.min.js +1 -1
  37. package/dist/v1/TinyMaInSys.min.js +1 -1
  38. package/dist/v1/TinyMapCache.min.js +1 -0
  39. package/dist/v1/TinyMediaPlayer.min.js +1 -1
  40. package/dist/v1/TinyNeedBar.min.js +1 -1
  41. package/dist/v1/TinyNewWinEvents.min.js +1 -1
  42. package/dist/v1/TinyNotificationAdapter.min.js +1 -0
  43. package/dist/v1/TinyNotifications.min.js +1 -1
  44. package/dist/v1/TinyNotifyCenter.min.js +1 -1
  45. package/dist/v1/TinyOPFSFileSystem.min.js +1 -0
  46. package/dist/v1/TinyPasswordValidator.min.js +1 -0
  47. package/dist/v1/TinyPluginPackage.min.js +1 -0
  48. package/dist/v1/TinyPromiseQueue.min.js +1 -1
  49. package/dist/v1/TinyPushManager.min.js +1 -0
  50. package/dist/v1/TinyPushPayload.min.js +1 -0
  51. package/dist/v1/TinyPushRouter.min.js +1 -0
  52. package/dist/v1/TinyRadioFm.min.js +1 -1
  53. package/dist/v1/TinyRateLimiter.min.js +1 -1
  54. package/dist/v1/TinyRegexEs.min.js +1 -0
  55. package/dist/v1/TinyRouter.min.js +1 -0
  56. package/dist/v1/TinyServiceWorker.min.js +1 -0
  57. package/dist/v1/TinyServiceWorkerEngine.min.js +1 -0
  58. package/dist/v1/TinySetMapPackage.min.js +1 -0
  59. package/dist/v1/TinySimpleDice.min.js +1 -1
  60. package/dist/v1/TinySmartScroller.min.js +1 -1
  61. package/dist/v1/TinyStorageBucketFileSystem.min.js +1 -0
  62. package/dist/v1/TinyTextDiffer.min.js +1 -1
  63. package/dist/v1/TinyTextRangeEditor.min.js +1 -1
  64. package/dist/v1/TinyTextarea.min.js +1 -1
  65. package/dist/v1/TinyThrottledApi.min.js +1 -0
  66. package/dist/v1/TinyTimeout.min.js +1 -1
  67. package/dist/v1/TinyToastNotify.min.js +1 -1
  68. package/dist/v1/TinyUploadClicker.min.js +1 -1
  69. package/dist/v1/TinyUriParser.min.js +1 -0
  70. package/dist/v1/TinyVersion.min.js +1 -0
  71. package/dist/v1/TinyWebWorker.min.js +1 -0
  72. package/dist/v1/TinyWebWorkerEngine.min.js +1 -0
  73. package/dist/v1/UltraRandomMsgGen.min.js +1 -1
  74. package/dist/v1/basics/array.cjs +2 -2
  75. package/dist/v1/basics/array.d.mts +2 -0
  76. package/dist/v1/basics/array.d.mts.map +1 -1
  77. package/dist/v1/basics/array.mjs +2 -1
  78. package/dist/v1/basics/browserDetector.cjs +37 -12
  79. package/dist/v1/basics/browserDetector.d.mts +8 -0
  80. package/dist/v1/basics/browserDetector.d.mts.map +1 -1
  81. package/dist/v1/basics/browserDetector.mjs +32 -13
  82. package/dist/v1/basics/crypto.cjs +23 -0
  83. package/dist/v1/basics/crypto.d.mts +10 -0
  84. package/dist/v1/basics/crypto.d.mts.map +1 -0
  85. package/dist/v1/basics/crypto.mjs +18 -0
  86. package/dist/v1/basics/html.cjs +0 -3
  87. package/dist/v1/basics/html.d.mts.map +1 -1
  88. package/dist/v1/basics/html.mjs +0 -2
  89. package/dist/v1/basics/index.cjs +8 -1
  90. package/dist/v1/basics/index.d.mts +6 -5
  91. package/dist/v1/basics/index.d.mts.map +1 -1
  92. package/dist/v1/basics/index.mjs +6 -5
  93. package/dist/v1/basics/objChecker.cjs +88 -0
  94. package/dist/v1/basics/objChecker.d.mts +26 -0
  95. package/dist/v1/basics/objChecker.d.mts.map +1 -1
  96. package/dist/v1/basics/objChecker.mjs +74 -0
  97. package/dist/v1/basics/objFilter.cjs +234 -93
  98. package/dist/v1/basics/objFilter.d.mts +96 -22
  99. package/dist/v1/basics/objFilter.d.mts.map +1 -1
  100. package/dist/v1/basics/objFilter.mjs +216 -92
  101. package/dist/v1/basics/promiseUtils.cjs +48 -12
  102. package/dist/v1/basics/promiseUtils.d.mts +45 -12
  103. package/dist/v1/basics/promiseUtils.d.mts.map +1 -1
  104. package/dist/v1/basics/promiseUtils.mjs +47 -12
  105. package/dist/v1/basics/text.cjs +0 -12
  106. package/dist/v1/basics/text.d.mts +0 -10
  107. package/dist/v1/basics/text.d.mts.map +1 -1
  108. package/dist/v1/basics/text.mjs +0 -10
  109. package/dist/v1/index.cjs +88 -3
  110. package/dist/v1/index.d.mts +31 -6
  111. package/dist/v1/index.d.mts.map +1 -1
  112. package/dist/v1/index.mjs +32 -7
  113. package/dist/v1/jsdoc/EventEmitter.cjs +4 -0
  114. package/dist/v1/jsdoc/EventEmitter.d.mts +33 -0
  115. package/dist/v1/jsdoc/EventEmitter.d.mts.map +1 -0
  116. package/dist/v1/jsdoc/EventEmitter.mjs +18 -0
  117. package/dist/v1/libs/array/TinyArrayComparator.cjs +240 -25
  118. package/dist/v1/libs/array/TinyArrayComparator.d.mts +130 -22
  119. package/dist/v1/libs/array/TinyArrayComparator.d.mts.map +1 -1
  120. package/dist/v1/libs/array/TinyArrayComparator.mjs +210 -24
  121. package/dist/v1/libs/fs/constants.cjs +74 -0
  122. package/dist/v1/libs/fs/constants.d.mts +22 -0
  123. package/dist/v1/libs/fs/constants.d.mts.map +1 -0
  124. package/dist/v1/libs/fs/constants.mjs +53 -0
  125. package/dist/v1/libs/fs/encoding.cjs +118 -0
  126. package/dist/v1/libs/fs/encoding.d.mts +50 -0
  127. package/dist/v1/libs/fs/encoding.d.mts.map +1 -0
  128. package/dist/v1/libs/fs/encoding.mjs +102 -0
  129. package/dist/v1/libs/fs/error.cjs +188 -0
  130. package/dist/v1/libs/fs/error.d.mts +105 -0
  131. package/dist/v1/libs/fs/error.d.mts.map +1 -0
  132. package/dist/v1/libs/fs/error.mjs +158 -0
  133. package/dist/v1/libs/fs/handle.cjs +121 -0
  134. package/dist/v1/libs/fs/handle.d.mts +56 -0
  135. package/dist/v1/libs/fs/handle.d.mts.map +1 -0
  136. package/dist/v1/libs/fs/handle.mjs +100 -0
  137. package/dist/v1/libs/fs/index.cjs +700 -0
  138. package/dist/v1/libs/fs/index.d.mts +377 -0
  139. package/dist/v1/libs/fs/index.d.mts.map +1 -0
  140. package/dist/v1/libs/fs/index.mjs +630 -0
  141. package/dist/v1/libs/fs/path.cjs +234 -0
  142. package/dist/v1/libs/fs/path.d.mts +176 -0
  143. package/dist/v1/libs/fs/path.d.mts.map +1 -0
  144. package/dist/v1/libs/fs/path.mjs +197 -0
  145. package/dist/v1/libs/fs/plugins/OPFS/StorageBucket.cjs +202 -0
  146. package/dist/v1/libs/fs/plugins/OPFS/StorageBucket.d.mts +121 -0
  147. package/dist/v1/libs/fs/plugins/OPFS/StorageBucket.d.mts.map +1 -0
  148. package/dist/v1/libs/fs/plugins/OPFS/StorageBucket.mjs +172 -0
  149. package/dist/v1/libs/fs/plugins/OPFS/index.cjs +334 -0
  150. package/dist/v1/libs/fs/plugins/OPFS/index.d.mts +98 -0
  151. package/dist/v1/libs/fs/plugins/OPFS/index.d.mts.map +1 -0
  152. package/dist/v1/libs/fs/plugins/OPFS/index.mjs +300 -0
  153. package/dist/v1/libs/fs/stats.cjs +245 -0
  154. package/dist/v1/libs/fs/stats.d.mts +226 -0
  155. package/dist/v1/libs/fs/stats.d.mts.map +1 -0
  156. package/dist/v1/libs/fs/stats.mjs +197 -0
  157. package/dist/v1/libs/html/events/TinyIframeEvents.cjs +10 -1
  158. package/dist/v1/libs/html/events/TinyIframeEvents.d.mts +9 -2
  159. package/dist/v1/libs/html/events/TinyIframeEvents.d.mts.map +1 -1
  160. package/dist/v1/libs/html/events/TinyIframeEvents.mjs +8 -1
  161. package/dist/v1/libs/html/events/TinyNewWinEvents.cjs +14 -3
  162. package/dist/v1/libs/html/events/TinyNewWinEvents.d.mts +21 -5
  163. package/dist/v1/libs/html/events/TinyNewWinEvents.d.mts.map +1 -1
  164. package/dist/v1/libs/html/events/TinyNewWinEvents.mjs +12 -3
  165. package/dist/v1/libs/html/scroll/TinySmartScroller.cjs +13 -1
  166. package/dist/v1/libs/html/scroll/TinySmartScroller.d.mts +29 -2
  167. package/dist/v1/libs/html/scroll/TinySmartScroller.d.mts.map +1 -1
  168. package/dist/v1/libs/html/scroll/TinySmartScroller.mjs +11 -1
  169. package/dist/v1/libs/math/TinyAdvancedRaffle.cjs +13 -1
  170. package/dist/v1/libs/math/TinyAdvancedRaffle.d.mts +32 -2
  171. package/dist/v1/libs/math/TinyAdvancedRaffle.d.mts.map +1 -1
  172. package/dist/v1/libs/math/TinyAdvancedRaffle.mjs +11 -1
  173. package/dist/v1/libs/math/TinyTimeout.cjs +0 -14
  174. package/dist/v1/libs/math/TinyTimeout.d.mts +0 -11
  175. package/dist/v1/libs/math/TinyTimeout.d.mts.map +1 -1
  176. package/dist/v1/libs/math/TinyTimeout.mjs +0 -13
  177. package/dist/v1/libs/media/TinyMediaPlayer/index.cjs +25 -1
  178. package/dist/v1/libs/media/TinyMediaPlayer/index.d.mts +35 -2
  179. package/dist/v1/libs/media/TinyMediaPlayer/index.d.mts.map +1 -1
  180. package/dist/v1/libs/media/TinyMediaPlayer/index.mjs +23 -1
  181. package/dist/v1/libs/media/TinyMediaPlayer.cjs +2 -2
  182. package/dist/v1/libs/media/TinyMediaPlayer.d.mts +2 -2
  183. package/dist/v1/libs/media/TinyMediaPlayer.d.mts.map +1 -1
  184. package/dist/v1/libs/media/TinyMediaPlayer.mjs +2 -2
  185. package/dist/v1/libs/media/TinyRadioFm.cjs +19 -1
  186. package/dist/v1/libs/media/TinyRadioFm.d.mts +78 -2
  187. package/dist/v1/libs/media/TinyRadioFm.d.mts.map +1 -1
  188. package/dist/v1/libs/media/TinyRadioFm.mjs +17 -1
  189. package/dist/v1/libs/plugin/TinyPlugin.cjs +1630 -0
  190. package/dist/v1/libs/plugin/TinyPlugin.d.mts +753 -0
  191. package/dist/v1/libs/plugin/TinyPlugin.d.mts.map +1 -0
  192. package/dist/v1/libs/plugin/TinyPlugin.mjs +1376 -0
  193. package/dist/v1/libs/plugin/TinyVersion.cjs +204 -0
  194. package/dist/v1/libs/plugin/TinyVersion.d.mts +70 -0
  195. package/dist/v1/libs/plugin/TinyVersion.d.mts.map +1 -0
  196. package/dist/v1/libs/plugin/TinyVersion.mjs +179 -0
  197. package/dist/v1/libs/router/TinyRouter.cjs +661 -0
  198. package/dist/v1/libs/router/TinyRouter.d.mts +320 -0
  199. package/dist/v1/libs/router/TinyRouter.d.mts.map +1 -0
  200. package/dist/v1/libs/router/TinyRouter.mjs +572 -0
  201. package/dist/v1/libs/storage/TinyLocalStorage.cjs +20 -1
  202. package/dist/v1/libs/storage/TinyLocalStorage.d.mts +64 -2
  203. package/dist/v1/libs/storage/TinyLocalStorage.d.mts.map +1 -1
  204. package/dist/v1/libs/storage/TinyLocalStorage.mjs +18 -1
  205. package/dist/v1/libs/storage/TinyMapCache.cjs +373 -0
  206. package/dist/v1/libs/storage/TinyMapCache.d.mts +274 -0
  207. package/dist/v1/libs/storage/TinyMapCache.d.mts.map +1 -0
  208. package/dist/v1/libs/storage/TinyMapCache.mjs +333 -0
  209. package/dist/v1/libs/storage/TinySetMapDatabase.cjs +1167 -0
  210. package/dist/v1/libs/storage/TinySetMapDatabase.d.mts +603 -0
  211. package/dist/v1/libs/storage/TinySetMapDatabase.d.mts.map +1 -0
  212. package/dist/v1/libs/storage/TinySetMapDatabase.mjs +1059 -0
  213. package/dist/v1/libs/sw/browser/TinyNotificationAdapter.cjs +126 -0
  214. package/dist/v1/libs/sw/browser/TinyNotificationAdapter.d.mts +132 -0
  215. package/dist/v1/libs/sw/browser/TinyNotificationAdapter.d.mts.map +1 -0
  216. package/dist/v1/libs/sw/browser/TinyNotificationAdapter.mjs +109 -0
  217. package/dist/v1/libs/sw/browser/TinyPushManager.cjs +310 -0
  218. package/dist/v1/libs/sw/browser/TinyPushManager.d.mts +168 -0
  219. package/dist/v1/libs/sw/browser/TinyPushManager.d.mts.map +1 -0
  220. package/dist/v1/libs/sw/browser/TinyPushManager.mjs +264 -0
  221. package/dist/v1/libs/sw/browser/TinyServiceWorker.cjs +1060 -0
  222. package/dist/v1/libs/sw/browser/TinyServiceWorker.d.mts +348 -0
  223. package/dist/v1/libs/sw/browser/TinyServiceWorker.d.mts.map +1 -0
  224. package/dist/v1/libs/sw/browser/TinyServiceWorker.mjs +933 -0
  225. package/dist/v1/libs/sw/browser/plugins/TabManager.cjs +315 -0
  226. package/dist/v1/libs/sw/browser/plugins/TabManager.d.mts +178 -0
  227. package/dist/v1/libs/sw/browser/plugins/TabManager.d.mts.map +1 -0
  228. package/dist/v1/libs/sw/browser/plugins/TabManager.mjs +274 -0
  229. package/dist/v1/libs/sw/browser/utils.cjs +28 -0
  230. package/dist/v1/libs/sw/browser/utils.d.mts +8 -0
  231. package/dist/v1/libs/sw/browser/utils.d.mts.map +1 -0
  232. package/dist/v1/libs/sw/browser/utils.mjs +21 -0
  233. package/dist/v1/libs/sw/service/TinyPushRouter.cjs +222 -0
  234. package/dist/v1/libs/sw/service/TinyPushRouter.d.mts +138 -0
  235. package/dist/v1/libs/sw/service/TinyPushRouter.d.mts.map +1 -0
  236. package/dist/v1/libs/sw/service/TinyPushRouter.mjs +201 -0
  237. package/dist/v1/libs/sw/service/TinyServiceWorkerEngine.cjs +3016 -0
  238. package/dist/v1/libs/sw/service/TinyServiceWorkerEngine.d.mts +993 -0
  239. package/dist/v1/libs/sw/service/TinyServiceWorkerEngine.d.mts.map +1 -0
  240. package/dist/v1/libs/sw/service/TinyServiceWorkerEngine.mjs +2558 -0
  241. package/dist/v1/libs/sw/service/plugins/GlobBypassPlugin.cjs +88 -0
  242. package/dist/v1/libs/sw/service/plugins/GlobBypassPlugin.d.mts +32 -0
  243. package/dist/v1/libs/sw/service/plugins/GlobBypassPlugin.d.mts.map +1 -0
  244. package/dist/v1/libs/sw/service/plugins/GlobBypassPlugin.mjs +69 -0
  245. package/dist/v1/libs/sw/service/plugins/GlobCachePlugin.cjs +112 -0
  246. package/dist/v1/libs/sw/service/plugins/GlobCachePlugin.d.mts +31 -0
  247. package/dist/v1/libs/sw/service/plugins/GlobCachePlugin.d.mts.map +1 -0
  248. package/dist/v1/libs/sw/service/plugins/GlobCachePlugin.mjs +91 -0
  249. package/dist/v1/libs/sw/service/plugins/Ping.cjs +32 -0
  250. package/dist/v1/libs/sw/service/plugins/Ping.d.mts +9 -0
  251. package/dist/v1/libs/sw/service/plugins/Ping.d.mts.map +1 -0
  252. package/dist/v1/libs/sw/service/plugins/Ping.mjs +25 -0
  253. package/dist/v1/libs/sw/service/plugins/TabManager.cjs +457 -0
  254. package/dist/v1/libs/sw/service/plugins/TabManager.d.mts +91 -0
  255. package/dist/v1/libs/sw/service/plugins/TabManager.d.mts.map +1 -0
  256. package/dist/v1/libs/sw/service/plugins/TabManager.mjs +372 -0
  257. package/dist/v1/libs/sw/service/plugins/ViteFileDetector.cjs +180 -0
  258. package/dist/v1/libs/sw/service/plugins/ViteFileDetector.d.mts +28 -0
  259. package/dist/v1/libs/sw/service/plugins/ViteFileDetector.d.mts.map +1 -0
  260. package/dist/v1/libs/sw/service/plugins/ViteFileDetector.mjs +148 -0
  261. package/dist/v1/libs/sw/service/shared/TinyPushPayload.cjs +199 -0
  262. package/dist/v1/libs/sw/service/shared/TinyPushPayload.d.mts +80 -0
  263. package/dist/v1/libs/sw/service/shared/TinyPushPayload.d.mts.map +1 -0
  264. package/dist/v1/libs/sw/service/shared/TinyPushPayload.mjs +174 -0
  265. package/dist/v1/libs/sw/utils.cjs +57 -0
  266. package/dist/v1/libs/sw/utils.d.mts +173 -0
  267. package/dist/v1/libs/sw/utils.d.mts.map +1 -0
  268. package/dist/v1/libs/sw/utils.mjs +50 -0
  269. package/dist/v1/libs/text/TinyI18/Browser-NON-DOM.cjs +57 -0
  270. package/dist/v1/libs/text/TinyI18/Browser-NON-DOM.d.mts +39 -0
  271. package/dist/v1/libs/text/TinyI18/Browser-NON-DOM.d.mts.map +1 -0
  272. package/dist/v1/libs/text/TinyI18/Browser-NON-DOM.mjs +48 -0
  273. package/dist/v1/libs/text/TinyI18/Browser.cjs +64 -0
  274. package/dist/v1/libs/text/TinyI18/Browser.d.mts +47 -0
  275. package/dist/v1/libs/text/TinyI18/Browser.d.mts.map +1 -0
  276. package/dist/v1/libs/text/TinyI18/Browser.mjs +57 -0
  277. package/dist/v1/libs/text/TinyI18/Node.cjs +49 -0
  278. package/dist/v1/libs/text/TinyI18/Node.d.mts +38 -0
  279. package/dist/v1/libs/text/TinyI18/Node.d.mts.map +1 -0
  280. package/dist/v1/libs/text/TinyI18/Node.mjs +43 -0
  281. package/dist/v1/libs/text/TinyI18/browser-utils.cjs +17 -0
  282. package/dist/v1/libs/text/TinyI18/browser-utils.d.mts +8 -0
  283. package/dist/v1/libs/text/TinyI18/browser-utils.d.mts.map +1 -0
  284. package/dist/v1/libs/text/TinyI18/browser-utils.mjs +13 -0
  285. package/dist/v1/libs/text/{TinyI18.cjs → TinyI18/index.cjs} +205 -104
  286. package/dist/v1/libs/text/{TinyI18.d.mts → TinyI18/index.d.mts} +141 -92
  287. package/dist/v1/libs/text/TinyI18/index.d.mts.map +1 -0
  288. package/dist/v1/libs/text/{TinyI18.mjs → TinyI18/index.mjs} +195 -101
  289. package/dist/v1/libs/tools/TinyBrowserMonitor.cjs +1088 -0
  290. package/dist/v1/libs/tools/TinyBrowserMonitor.d.mts +621 -0
  291. package/dist/v1/libs/tools/TinyBrowserMonitor.d.mts.map +1 -0
  292. package/dist/v1/libs/tools/TinyBrowserMonitor.mjs +940 -0
  293. package/dist/v1/libs/tools/TinyDebugger.cjs +180 -19
  294. package/dist/v1/libs/tools/TinyDebugger.d.mts +220 -24
  295. package/dist/v1/libs/tools/TinyDebugger.d.mts.map +1 -1
  296. package/dist/v1/libs/tools/TinyDebugger.mjs +161 -19
  297. package/dist/v1/libs/tools/TinyHtmlTagRegexBuilder.cjs +256 -0
  298. package/dist/v1/libs/tools/TinyHtmlTagRegexBuilder.d.mts +125 -0
  299. package/dist/v1/libs/tools/TinyHtmlTagRegexBuilder.d.mts.map +1 -0
  300. package/dist/v1/libs/tools/TinyHtmlTagRegexBuilder.mjs +223 -0
  301. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser-NON-DOM.cjs +23 -0
  302. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser-NON-DOM.d.mts +17 -0
  303. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser-NON-DOM.d.mts.map +1 -0
  304. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser-NON-DOM.mjs +19 -0
  305. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser.cjs +23 -0
  306. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser.d.mts +17 -0
  307. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser.d.mts.map +1 -0
  308. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser.mjs +19 -0
  309. package/dist/v1/libs/tools/TinyHttpResponseRegistry/EmptyRequestCodes.cjs +390 -0
  310. package/dist/v1/libs/tools/TinyHttpResponseRegistry/EmptyRequestCodes.d.mts +9 -0
  311. package/dist/v1/libs/tools/TinyHttpResponseRegistry/EmptyRequestCodes.d.mts.map +1 -0
  312. package/dist/v1/libs/tools/TinyHttpResponseRegistry/EmptyRequestCodes.mjs +387 -0
  313. package/dist/v1/libs/tools/TinyHttpResponseRegistry/JsDoc.cjs +2 -0
  314. package/dist/v1/libs/tools/TinyHttpResponseRegistry/JsDoc.d.mts +27 -0
  315. package/dist/v1/libs/tools/TinyHttpResponseRegistry/JsDoc.d.mts.map +1 -0
  316. package/dist/v1/libs/tools/TinyHttpResponseRegistry/JsDoc.mjs +12 -0
  317. package/dist/v1/libs/tools/TinyHttpResponseRegistry/MozillaRequestCodes/LICENSE +53 -0
  318. package/dist/v1/libs/tools/TinyHttpResponseRegistry/MozillaRequestCodes/index.cjs +405 -0
  319. package/dist/v1/libs/tools/TinyHttpResponseRegistry/MozillaRequestCodes/index.d.mts +34 -0
  320. package/dist/v1/libs/tools/TinyHttpResponseRegistry/MozillaRequestCodes/index.d.mts.map +1 -0
  321. package/dist/v1/libs/tools/TinyHttpResponseRegistry/MozillaRequestCodes/index.mjs +342 -0
  322. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Node.cjs +23 -0
  323. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Node.d.mts +17 -0
  324. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Node.d.mts.map +1 -0
  325. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Node.mjs +19 -0
  326. package/dist/v1/libs/tools/TinyHttpResponseRegistry/RequestCodes.cjs +327 -0
  327. package/dist/v1/libs/tools/TinyHttpResponseRegistry/RequestCodes.d.mts +9 -0
  328. package/dist/v1/libs/tools/TinyHttpResponseRegistry/RequestCodes.d.mts.map +1 -0
  329. package/dist/v1/libs/tools/TinyHttpResponseRegistry/RequestCodes.mjs +324 -0
  330. package/dist/v1/libs/tools/TinyHttpResponseRegistry/index.cjs +268 -0
  331. package/dist/v1/libs/tools/TinyHttpResponseRegistry/index.d.mts +107 -0
  332. package/dist/v1/libs/tools/TinyHttpResponseRegistry/index.d.mts.map +1 -0
  333. package/dist/v1/libs/tools/TinyHttpResponseRegistry/index.mjs +238 -0
  334. package/dist/v1/libs/tools/TinyPasswordValidator.cjs +491 -0
  335. package/dist/v1/libs/tools/TinyPasswordValidator.d.mts +246 -0
  336. package/dist/v1/libs/tools/TinyPasswordValidator.d.mts.map +1 -0
  337. package/dist/v1/libs/tools/TinyPasswordValidator.mjs +434 -0
  338. package/dist/v1/libs/tools/TinyPkgExportValidator.cjs +48 -0
  339. package/dist/v1/libs/tools/TinyPkgExportValidator.d.mts +14 -0
  340. package/dist/v1/libs/tools/TinyPkgExportValidator.d.mts.map +1 -1
  341. package/dist/v1/libs/tools/TinyPkgExportValidator.mjs +44 -0
  342. package/dist/v1/libs/tools/TinySiteMap.cjs +1029 -0
  343. package/dist/v1/libs/tools/TinySiteMap.d.mts +429 -0
  344. package/dist/v1/libs/tools/TinySiteMap.d.mts.map +1 -0
  345. package/dist/v1/libs/tools/TinySiteMap.mjs +910 -0
  346. package/dist/v1/libs/tools/TinySiteMapStream.cjs +121 -0
  347. package/dist/v1/libs/tools/TinySiteMapStream.d.mts +51 -0
  348. package/dist/v1/libs/tools/TinySiteMapStream.d.mts.map +1 -0
  349. package/dist/v1/libs/tools/TinySiteMapStream.mjs +85 -0
  350. package/dist/v1/libs/tools/TinyURLSecurityVerifier.cjs +444 -0
  351. package/dist/v1/libs/tools/TinyURLSecurityVerifier.d.mts +217 -0
  352. package/dist/v1/libs/tools/TinyURLSecurityVerifier.d.mts.map +1 -0
  353. package/dist/v1/libs/tools/TinyURLSecurityVerifier.mjs +394 -0
  354. package/dist/v1/libs/tools/TinyUriParser/BlueSky.cjs +613 -0
  355. package/dist/v1/libs/tools/TinyUriParser/BlueSky.d.mts +152 -0
  356. package/dist/v1/libs/tools/TinyUriParser/BlueSky.d.mts.map +1 -0
  357. package/dist/v1/libs/tools/TinyUriParser/BlueSky.mjs +527 -0
  358. package/dist/v1/libs/tools/TinyUriParser/Discord.cjs +1119 -0
  359. package/dist/v1/libs/tools/TinyUriParser/Discord.d.mts +306 -0
  360. package/dist/v1/libs/tools/TinyUriParser/Discord.d.mts.map +1 -0
  361. package/dist/v1/libs/tools/TinyUriParser/Discord.mjs +968 -0
  362. package/dist/v1/libs/tools/TinyUriParser/MatrixProtocol.cjs +469 -0
  363. package/dist/v1/libs/tools/TinyUriParser/MatrixProtocol.d.mts +80 -0
  364. package/dist/v1/libs/tools/TinyUriParser/MatrixProtocol.d.mts.map +1 -0
  365. package/dist/v1/libs/tools/TinyUriParser/MatrixProtocol.mjs +379 -0
  366. package/dist/v1/libs/tools/TinyUriParser.cjs +217 -0
  367. package/dist/v1/libs/tools/TinyUriParser.d.mts +109 -0
  368. package/dist/v1/libs/tools/TinyUriParser.d.mts.map +1 -0
  369. package/dist/v1/libs/tools/TinyUriParser.mjs +183 -0
  370. package/dist/v1/libs/utils/TinyCloner.cjs +466 -0
  371. package/dist/v1/libs/utils/TinyCloner.d.mts +221 -0
  372. package/dist/v1/libs/utils/TinyCloner.d.mts.map +1 -0
  373. package/dist/v1/libs/utils/TinyCloner.mjs +416 -0
  374. package/dist/v1/libs/utils/TinyPromiseQueue.cjs +1 -1
  375. package/dist/v1/libs/utils/TinyPromiseQueue.d.mts +2 -2
  376. package/dist/v1/libs/utils/TinyPromiseQueue.d.mts.map +1 -1
  377. package/dist/v1/libs/utils/TinyPromiseQueue.mjs +1 -1
  378. package/dist/v1/libs/utils/TinyThrottledApi.cjs +333 -0
  379. package/dist/v1/libs/utils/TinyThrottledApi.d.mts +163 -0
  380. package/dist/v1/libs/utils/TinyThrottledApi.d.mts.map +1 -0
  381. package/dist/v1/libs/utils/TinyThrottledApi.mjs +294 -0
  382. package/dist/v1/libs/worker/browser/TinyWebWorker.cjs +342 -0
  383. package/dist/v1/libs/worker/browser/TinyWebWorker.d.mts +97 -0
  384. package/dist/v1/libs/worker/browser/TinyWebWorker.d.mts.map +1 -0
  385. package/dist/v1/libs/worker/browser/TinyWebWorker.mjs +305 -0
  386. package/dist/v1/libs/worker/engine/TinyWebWorkerEngine.cjs +346 -0
  387. package/dist/v1/libs/worker/engine/TinyWebWorkerEngine.d.mts +127 -0
  388. package/dist/v1/libs/worker/engine/TinyWebWorkerEngine.d.mts.map +1 -0
  389. package/dist/v1/libs/worker/engine/TinyWebWorkerEngine.mjs +304 -0
  390. package/dist/v1/regexp/Email.cjs +185 -0
  391. package/dist/v1/regexp/Email.d.mts +73 -0
  392. package/dist/v1/regexp/Email.d.mts.map +1 -0
  393. package/dist/v1/regexp/Email.mjs +153 -0
  394. package/dist/v1/regexp/Glob.cjs +293 -0
  395. package/dist/v1/regexp/Glob.d.mts +45 -0
  396. package/dist/v1/regexp/Glob.d.mts.map +1 -0
  397. package/dist/v1/regexp/Glob.mjs +260 -0
  398. package/dist/v1/regexp/Ipv4.cjs +57 -0
  399. package/dist/v1/regexp/Ipv4.d.mts +29 -0
  400. package/dist/v1/regexp/Ipv4.d.mts.map +1 -0
  401. package/dist/v1/regexp/Ipv4.mjs +45 -0
  402. package/dist/v1/regexp/Ipv6.cjs +67 -0
  403. package/dist/v1/regexp/Ipv6.d.mts +29 -0
  404. package/dist/v1/regexp/Ipv6.d.mts.map +1 -0
  405. package/dist/v1/regexp/Ipv6.mjs +54 -0
  406. package/dist/v1/regexp/SegmentExtractor.cjs +145 -0
  407. package/dist/v1/regexp/SegmentExtractor.d.mts +91 -0
  408. package/dist/v1/regexp/SegmentExtractor.d.mts.map +1 -0
  409. package/dist/v1/regexp/SegmentExtractor.mjs +116 -0
  410. package/dist/v1/regexp/UrlDetector.cjs +125 -0
  411. package/dist/v1/regexp/UrlDetector.d.mts +67 -0
  412. package/dist/v1/regexp/UrlDetector.d.mts.map +1 -0
  413. package/dist/v1/regexp/UrlDetector.mjs +102 -0
  414. package/dist/v1/regexp/Username/index.cjs +233 -0
  415. package/dist/v1/regexp/Username/index.d.mts +77 -0
  416. package/dist/v1/regexp/Username/index.d.mts.map +1 -0
  417. package/dist/v1/regexp/Username/index.mjs +199 -0
  418. package/dist/v1/regexp/Username/jsDoc.cjs +2 -0
  419. package/dist/v1/regexp/Username/jsDoc.d.mts +57 -0
  420. package/dist/v1/regexp/Username/jsDoc.d.mts.map +1 -0
  421. package/dist/v1/regexp/Username/jsDoc.mjs +18 -0
  422. package/dist/v1/regexp/Username/templates/BlueSky.cjs +56 -0
  423. package/dist/v1/regexp/Username/templates/BlueSky.d.mts +35 -0
  424. package/dist/v1/regexp/Username/templates/BlueSky.d.mts.map +1 -0
  425. package/dist/v1/regexp/Username/templates/BlueSky.mjs +52 -0
  426. package/dist/v1/regexp/Username/templates/Discord.cjs +505 -0
  427. package/dist/v1/regexp/Username/templates/Discord.d.mts +209 -0
  428. package/dist/v1/regexp/Username/templates/Discord.d.mts.map +1 -0
  429. package/dist/v1/regexp/Username/templates/Discord.mjs +458 -0
  430. package/dist/v1/regexp/Username/templates/MatrixProtocol.cjs +143 -0
  431. package/dist/v1/regexp/Username/templates/MatrixProtocol.d.mts +70 -0
  432. package/dist/v1/regexp/Username/templates/MatrixProtocol.d.mts.map +1 -0
  433. package/dist/v1/regexp/Username/templates/MatrixProtocol.mjs +128 -0
  434. package/dist/v1/regexp/Username/templates/deprecated/Discord.cjs +24 -0
  435. package/dist/v1/regexp/Username/templates/deprecated/Discord.d.mts +17 -0
  436. package/dist/v1/regexp/Username/templates/deprecated/Discord.d.mts.map +1 -0
  437. package/dist/v1/regexp/Username/templates/deprecated/Discord.mjs +20 -0
  438. package/dist/v1/regexp/Username/templates/index.cjs +11 -0
  439. package/dist/v1/regexp/Username/templates/index.d.mts +5 -0
  440. package/dist/v1/regexp/Username/templates/index.d.mts.map +1 -0
  441. package/dist/v1/regexp/Username/templates/index.mjs +4 -0
  442. package/dist/v1/regexp/index.cjs +41 -0
  443. package/dist/v1/regexp/index.d.mts +9 -0
  444. package/dist/v1/regexp/index.d.mts.map +1 -0
  445. package/dist/v1/regexp/index.mjs +8 -0
  446. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Browser.cjs +64 -0
  447. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Browser.d.mts +11 -0
  448. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Browser.d.mts.map +1 -0
  449. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Browser.mjs +51 -0
  450. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/FileInput.cjs +66 -0
  451. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/FileInput.d.mts +11 -0
  452. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/FileInput.d.mts.map +1 -0
  453. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/FileInput.mjs +51 -0
  454. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Node.cjs +39 -0
  455. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Node.d.mts +11 -0
  456. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Node.d.mts.map +1 -0
  457. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Node.mjs +28 -0
  458. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Template.cjs +494 -0
  459. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Template.d.mts +142 -0
  460. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Template.d.mts.map +1 -0
  461. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Template.mjs +445 -0
  462. package/dist/v1/webTemplates/bootstrap/5.3/html/BootstrapDialogs.cjs +30 -4
  463. package/dist/v1/webTemplates/bootstrap/5.3/html/BootstrapDialogs.d.mts +5 -2
  464. package/dist/v1/webTemplates/bootstrap/5.3/html/BootstrapDialogs.d.mts.map +1 -1
  465. package/dist/v1/webTemplates/bootstrap/5.3/html/BootstrapDialogs.mjs +29 -5
  466. package/dist/v1/webTemplates/media/MediaValidator/v1/Browser/index.cjs +135 -0
  467. package/dist/v1/webTemplates/media/MediaValidator/v1/Browser/index.d.mts +83 -0
  468. package/dist/v1/webTemplates/media/MediaValidator/v1/Browser/index.d.mts.map +1 -0
  469. package/dist/v1/webTemplates/media/MediaValidator/v1/Browser/index.mjs +120 -0
  470. package/dist/v1/webTemplates/media/MediaValidator/v1/Node/index.cjs +127 -0
  471. package/dist/v1/webTemplates/media/MediaValidator/v1/Node/index.d.mts +95 -0
  472. package/dist/v1/webTemplates/media/MediaValidator/v1/Node/index.d.mts.map +1 -0
  473. package/dist/v1/webTemplates/media/MediaValidator/v1/Node/index.mjs +109 -0
  474. package/dist/v1/webTemplates/multiformats/14.0/IPFSHasher/index.cjs +83 -0
  475. package/dist/v1/webTemplates/multiformats/14.0/IPFSHasher/index.d.mts +46 -0
  476. package/dist/v1/webTemplates/multiformats/14.0/IPFSHasher/index.d.mts.map +1 -0
  477. package/dist/v1/webTemplates/multiformats/14.0/IPFSHasher/index.mjs +71 -0
  478. package/dist/v1/webTemplates/vite/7.3/plugins/TinyVitePwaPlugin.cjs +493 -0
  479. package/dist/v1/webTemplates/vite/7.3/plugins/TinyVitePwaPlugin.d.mts +67 -0
  480. package/dist/v1/webTemplates/vite/7.3/plugins/TinyVitePwaPlugin.d.mts.map +1 -0
  481. package/dist/v1/webTemplates/vite/7.3/plugins/TinyVitePwaPlugin.mjs +399 -0
  482. package/dist/v1/webTemplates/vite/7.3/plugins/githubUtils.cjs +35 -0
  483. package/dist/v1/webTemplates/vite/7.3/plugins/githubUtils.d.mts +6 -0
  484. package/dist/v1/webTemplates/vite/7.3/plugins/githubUtils.d.mts.map +1 -0
  485. package/dist/v1/webTemplates/vite/7.3/plugins/githubUtils.mjs +29 -0
  486. package/docs/info/RegExp.md +74 -0
  487. package/docs/v1/Exports.md +101 -0
  488. package/docs/v1/README.md +113 -15
  489. package/docs/v1/basics/asyncReplace.md +2 -0
  490. package/docs/v1/basics/browserDetector.md +28 -11
  491. package/docs/v1/basics/crypto.md +85 -0
  492. package/docs/v1/basics/deprecated/html.md +2 -0
  493. package/docs/v1/basics/deprecated/objFilter.md +2 -0
  494. package/docs/v1/basics/html.md +2 -0
  495. package/docs/v1/basics/objChecker.md +55 -0
  496. package/docs/v1/basics/objFilter.md +57 -86
  497. package/docs/v1/basics/promiseUtils.md +12 -3
  498. package/docs/v1/basics/text.md +0 -1
  499. package/docs/v1/libs/array/TinyArrayComparator.md +50 -39
  500. package/docs/v1/libs/fs/TinyFS.md +752 -0
  501. package/docs/v1/libs/fs/TinyOPFSFileSystem.md +495 -0
  502. package/docs/v1/libs/fs/TinyStorageBucketFileSystem.md +407 -0
  503. package/docs/v1/libs/plugin/TinyPlugin.md +441 -0
  504. package/docs/v1/libs/plugin/TinyVersion.md +145 -0
  505. package/docs/v1/libs/router/TinyRouter.md +216 -0
  506. package/docs/v1/libs/storage/TinyMapCache.md +219 -0
  507. package/docs/v1/libs/storage/TinySetMapDatabase.md +478 -0
  508. package/docs/v1/libs/sw/browser/TinyNotificationAdapter.md +280 -0
  509. package/docs/v1/libs/sw/browser/TinyPushManager.md +782 -0
  510. package/docs/v1/libs/sw/browser/TinyServiceWorker.md +365 -0
  511. package/docs/v1/libs/sw/browser/plugins/TabManager.md +133 -0
  512. package/docs/v1/libs/sw/service/TinyPushRouter.md +314 -0
  513. package/docs/v1/libs/sw/service/TinyServiceWorkerEngine.md +748 -0
  514. package/docs/v1/libs/sw/service/plugins/GlobBypassPlugin.md +229 -0
  515. package/docs/v1/libs/sw/service/plugins/GlobCachePlugin.md +91 -0
  516. package/docs/v1/libs/sw/service/plugins/Ping.md +36 -0
  517. package/docs/v1/libs/sw/service/plugins/TabManager.md +64 -0
  518. package/docs/v1/libs/sw/service/plugins/ViteFileDetector.md +92 -0
  519. package/docs/v1/libs/sw/service/shared/TinyPushPayload.md +316 -0
  520. package/docs/v1/libs/text/TinyI18.md +80 -56
  521. package/docs/v1/libs/tools/TinyBrowserMonitor.md +170 -0
  522. package/docs/v1/libs/tools/TinyDebugger.md +117 -1
  523. package/docs/v1/libs/tools/TinyHtmlTagRegexBuilder.md +141 -0
  524. package/docs/v1/libs/tools/TinyHttpResponseRegistry.md +129 -0
  525. package/docs/v1/libs/tools/TinyPasswordValidator.md +153 -0
  526. package/docs/v1/libs/tools/TinyPkgExportValidator.md +45 -1
  527. package/docs/v1/libs/tools/TinySiteMap.md +134 -0
  528. package/docs/v1/libs/tools/TinySiteMapStream.md +97 -0
  529. package/docs/v1/libs/tools/TinyURLSecurityVerifier.md +146 -0
  530. package/docs/v1/libs/tools/TinyUriParser/Discord.md +374 -0
  531. package/docs/v1/libs/tools/TinyUriParser/MatrixProtocol.md +54 -0
  532. package/docs/v1/libs/tools/TinyUriParser.md +128 -0
  533. package/docs/v1/libs/utils/TinyCloner.md +126 -0
  534. package/docs/v1/libs/utils/TinyPromiseQueue.md +1 -1
  535. package/docs/v1/libs/utils/TinyThrottledApi.md +219 -0
  536. package/docs/v1/libs/worker/browser/TinyWebWorker.md +331 -0
  537. package/docs/v1/libs/worker/engine/TinyWebWorkerEngine.md +137 -0
  538. package/docs/v1/regexp/Email.md +127 -0
  539. package/docs/v1/regexp/Glob.md +155 -0
  540. package/docs/v1/regexp/IPv4.md +103 -0
  541. package/docs/v1/regexp/IPv6.md +122 -0
  542. package/docs/v1/regexp/SegmentExtractor.md +120 -0
  543. package/docs/v1/regexp/UrlDetector.md +117 -0
  544. package/docs/v1/regexp/Username/Base.md +131 -0
  545. package/docs/v1/regexp/Username/Discord.md +267 -0
  546. package/docs/v1/regexp/Username/MatrixProtocol.md +131 -0
  547. package/docs/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters.md +565 -0
  548. package/docs/v1/webTemplates/bootstrap/5.3/html/BootstrapDialogs.md +19 -7
  549. package/docs/v1/webTemplates/media/MediaValidator/v1/Browser.md +123 -0
  550. package/docs/v1/webTemplates/media/MediaValidator/v1/Node.md +136 -0
  551. package/docs/v1/webTemplates/multiformats/14.0/IPFSHasher.md +310 -0
  552. package/docs/v1/webTemplates/vite/7.3/plugins/TinyVitePwaPlugin.md +131 -0
  553. package/docs/v1/webTemplates/vite/7.3/plugins/githubUtils.md +50 -0
  554. package/package.json +340 -22
  555. package/types/EventEmitter.d.ts +48 -0
  556. package/dist/v1/libs/text/TinyI18.d.mts.map +0 -1
@@ -0,0 +1,126 @@
1
+ 'use strict';
2
+
3
+ var utils = require('../utils.cjs');
4
+
5
+ /** @typedef {import('../utils.mjs').TinyPushNotification} TinyPushNotification */
6
+
7
+ /**
8
+ * Options accepted by the page level `Notification` constructor.
9
+ *
10
+ * @typedef {Object} BrowserNotificationOptions
11
+ * @property {string} [body] - The main text of the notification, shown below the title.
12
+ * @property {string} [icon] - URL of the image used as the notification icon.
13
+ * @property {string} [image] - URL of an image shown inside the notification body.
14
+ * @property {string} [tag] - Identifier used to group and replace notifications sharing the same tag.
15
+ * @property {string} [lang] - BCP 47 language tag describing the notification text.
16
+ * @property {'auto'|'ltr'|'rtl'} [dir] - Text direction used to render the notification content.
17
+ * @property {boolean} [renotify] - Whether to notify the user again when a notification with the same `tag` is replaced.
18
+ * @property {boolean} [requireInteraction] - Whether the notification stays visible until the user interacts with it.
19
+ * @property {boolean} [silent] - Whether the notification is shown without sound or vibration feedback.
20
+ * @property {number} [timestamp] - Time the notification was created, in milliseconds since the Unix epoch.
21
+ * @property {number[]} [vibrate] - Vibration pattern, in milliseconds, applied on supported devices.
22
+ * @property {Record<string, unknown>} [data] - Arbitrary payload attached to the notification for later retrieval.
23
+ */
24
+
25
+ /**
26
+ * A notification already adapted to the page environment.
27
+ *
28
+ * @typedef {Object} BrowserNotification
29
+ * @property {string} title - The headline text displayed at the top of the notification.
30
+ * @property {BrowserNotificationOptions} options - The configuration applied to the notification.
31
+ */
32
+
33
+ /**
34
+ * Adapts notification descriptors between the Service Worker and the page.
35
+ *
36
+ * The class is a static-only utility and is never instantiated. It normalizes
37
+ * the payload in both directions: a descriptor produced by the Service Worker
38
+ * can be safely handed to the page level `Notification` constructor through
39
+ * {@link TinyNotificationAdapter.toBrowser}, and a page level notification can
40
+ * be converted back into a Service Worker payload through
41
+ * {@link TinyNotificationAdapter.toServiceWorker}.
42
+ *
43
+ * @beta
44
+ */
45
+ class TinyNotificationAdapter {
46
+ static PUSH_TYPE = utils.PUSH_TYPE;
47
+ /** @type {readonly string[]} */
48
+ static #SW_ONLY_KEYS = Object.freeze(['actions', 'badge']);
49
+
50
+ /**
51
+ * SW -> Browser. Use before `new Notification(...)`.
52
+ *
53
+ * @param {TinyPushNotification|null} notification - Descriptor sent by the Service Worker.
54
+ * @param {Partial<BrowserNotificationOptions>} [overrides] - Values that win over the descriptor.
55
+ * @returns {BrowserNotification} The notification adapted for the page environment.
56
+ * @throws {TypeError} If `notification` is neither `null` nor a non-null object.
57
+ */
58
+ static toBrowser(notification, overrides = {}) {
59
+ if (
60
+ notification !== null &&
61
+ (typeof notification !== 'object' || Array.isArray(notification))
62
+ ) {
63
+ throw new TypeError(
64
+ '[TinyNotificationAdapter] toBrowser: notification must be a non-null object.',
65
+ );
66
+ }
67
+ if (typeof overrides !== 'object' || overrides === null || Array.isArray(overrides)) {
68
+ throw new TypeError(
69
+ '[TinyNotificationAdapter] toBrowser: overrides must be a non-null object.',
70
+ );
71
+ }
72
+ const { title, ...rest } = notification ?? {};
73
+ /** @type {BrowserNotificationOptions} */
74
+ const options = {};
75
+ for (const [key, value] of Object.entries(rest)) {
76
+ if (TinyNotificationAdapter.#SW_ONLY_KEYS.includes(key)) continue;
77
+ if (typeof value === 'undefined') continue;
78
+ // @ts-ignore - the key comes from a validated descriptor.
79
+ options[key] = value;
80
+ }
81
+ // `dir` is the only field whose DOM type is a closed union, so an arbitrary
82
+ // string coming from the wire must be narrowed before it reaches the
83
+ // `Notification` constructor.
84
+ if (options.dir !== 'auto' && options.dir !== 'ltr' && options.dir !== 'rtl') {
85
+ delete options.dir;
86
+ }
87
+ // `renotify` without `tag` throws on Chromium.
88
+ if (options.renotify === true && typeof options.tag !== 'string') {
89
+ delete options.renotify;
90
+ }
91
+ return {
92
+ title: typeof title === 'string' && title !== '' ? title : 'Notification',
93
+ options: { ...options, ...overrides },
94
+ };
95
+ }
96
+
97
+ /**
98
+ * Browser -> SW. Use before sending a click/close back to the Service Worker.
99
+ *
100
+ * @param {BrowserNotification} notification - The value returned by {@link TinyNotificationAdapter.toBrowser}.
101
+ * @param {Partial<BrowserNotificationOptions>} [overrides] - Values that win over the descriptor.
102
+ * @returns {{ title: string, body: string, options: BrowserNotificationOptions }} The payload shaped for the Service Worker, with a guaranteed string `body`.
103
+ * @throws {TypeError} If `notification` is not a non-null object.
104
+ */
105
+ static toServiceWorker(notification, overrides = {}) {
106
+ if (typeof notification !== 'object' || notification === null || Array.isArray(notification)) {
107
+ throw new TypeError(
108
+ '[TinyNotificationAdapter] toServiceWorker: notification must be a non-null object.',
109
+ );
110
+ }
111
+ if (typeof overrides !== 'object' || overrides === null || Array.isArray(overrides)) {
112
+ throw new TypeError(
113
+ '[TinyNotificationAdapter] toServiceWorker: overrides must be a non-null object.',
114
+ );
115
+ }
116
+ const { title = 'Notification', options = {} } = notification;
117
+ const merged = { ...options, ...overrides };
118
+ return {
119
+ title,
120
+ body: typeof merged.body === 'string' ? merged.body : '',
121
+ options: merged,
122
+ };
123
+ }
124
+ }
125
+
126
+ module.exports = TinyNotificationAdapter;
@@ -0,0 +1,132 @@
1
+ export type TinyPushNotification = import('../utils.mjs').TinyPushNotification;
2
+ export type BrowserNotificationOptions = {
3
+ /**
4
+ * - The main text of the notification, shown below the title.
5
+ */
6
+ body?: string;
7
+ /**
8
+ * - URL of the image used as the notification icon.
9
+ */
10
+ icon?: string;
11
+ /**
12
+ * - URL of an image shown inside the notification body.
13
+ */
14
+ image?: string;
15
+ /**
16
+ * - Identifier used to group and replace notifications sharing the same tag.
17
+ */
18
+ tag?: string;
19
+ /**
20
+ * - BCP 47 language tag describing the notification text.
21
+ */
22
+ lang?: string;
23
+ /**
24
+ * - Text direction used to render the notification content.
25
+ */
26
+ dir?: 'auto' | 'ltr' | 'rtl';
27
+ /**
28
+ * - Whether to notify the user again when a notification with the same `tag` is replaced.
29
+ */
30
+ renotify?: boolean;
31
+ /**
32
+ * - Whether the notification stays visible until the user interacts with it.
33
+ */
34
+ requireInteraction?: boolean;
35
+ /**
36
+ * - Whether the notification is shown without sound or vibration feedback.
37
+ */
38
+ silent?: boolean;
39
+ /**
40
+ * - Time the notification was created, in milliseconds since the Unix epoch.
41
+ */
42
+ timestamp?: number;
43
+ /**
44
+ * - Vibration pattern, in milliseconds, applied on supported devices.
45
+ */
46
+ vibrate?: number[];
47
+ /**
48
+ * - Arbitrary payload attached to the notification for later retrieval.
49
+ */
50
+ data?: Record<string, unknown>;
51
+ };
52
+ export type BrowserNotification = {
53
+ /**
54
+ * - The headline text displayed at the top of the notification.
55
+ */
56
+ title: string;
57
+ /**
58
+ * - The configuration applied to the notification.
59
+ */
60
+ options: BrowserNotificationOptions;
61
+ };
62
+ /** @typedef {import('../utils.mjs').TinyPushNotification} TinyPushNotification */
63
+ /**
64
+ * Options accepted by the page level `Notification` constructor.
65
+ *
66
+ * @typedef {Object} BrowserNotificationOptions
67
+ * @property {string} [body] - The main text of the notification, shown below the title.
68
+ * @property {string} [icon] - URL of the image used as the notification icon.
69
+ * @property {string} [image] - URL of an image shown inside the notification body.
70
+ * @property {string} [tag] - Identifier used to group and replace notifications sharing the same tag.
71
+ * @property {string} [lang] - BCP 47 language tag describing the notification text.
72
+ * @property {'auto'|'ltr'|'rtl'} [dir] - Text direction used to render the notification content.
73
+ * @property {boolean} [renotify] - Whether to notify the user again when a notification with the same `tag` is replaced.
74
+ * @property {boolean} [requireInteraction] - Whether the notification stays visible until the user interacts with it.
75
+ * @property {boolean} [silent] - Whether the notification is shown without sound or vibration feedback.
76
+ * @property {number} [timestamp] - Time the notification was created, in milliseconds since the Unix epoch.
77
+ * @property {number[]} [vibrate] - Vibration pattern, in milliseconds, applied on supported devices.
78
+ * @property {Record<string, unknown>} [data] - Arbitrary payload attached to the notification for later retrieval.
79
+ */
80
+ /**
81
+ * A notification already adapted to the page environment.
82
+ *
83
+ * @typedef {Object} BrowserNotification
84
+ * @property {string} title - The headline text displayed at the top of the notification.
85
+ * @property {BrowserNotificationOptions} options - The configuration applied to the notification.
86
+ */
87
+ /**
88
+ * Adapts notification descriptors between the Service Worker and the page.
89
+ *
90
+ * The class is a static-only utility and is never instantiated. It normalizes
91
+ * the payload in both directions: a descriptor produced by the Service Worker
92
+ * can be safely handed to the page level `Notification` constructor through
93
+ * {@link TinyNotificationAdapter.toBrowser}, and a page level notification can
94
+ * be converted back into a Service Worker payload through
95
+ * {@link TinyNotificationAdapter.toServiceWorker}.
96
+ *
97
+ * @beta
98
+ */
99
+ declare class TinyNotificationAdapter {
100
+ #private;
101
+ static PUSH_TYPE: Readonly<{
102
+ NOTIFICATION: "notification";
103
+ DATA: "data";
104
+ SYNC: "sync";
105
+ COMMAND: "command";
106
+ UNKNOWN: "unknown";
107
+ }>;
108
+ /**
109
+ * SW -> Browser. Use before `new Notification(...)`.
110
+ *
111
+ * @param {TinyPushNotification|null} notification - Descriptor sent by the Service Worker.
112
+ * @param {Partial<BrowserNotificationOptions>} [overrides] - Values that win over the descriptor.
113
+ * @returns {BrowserNotification} The notification adapted for the page environment.
114
+ * @throws {TypeError} If `notification` is neither `null` nor a non-null object.
115
+ */
116
+ static toBrowser(notification: TinyPushNotification | null, overrides?: Partial<BrowserNotificationOptions>): BrowserNotification;
117
+ /**
118
+ * Browser -> SW. Use before sending a click/close back to the Service Worker.
119
+ *
120
+ * @param {BrowserNotification} notification - The value returned by {@link TinyNotificationAdapter.toBrowser}.
121
+ * @param {Partial<BrowserNotificationOptions>} [overrides] - Values that win over the descriptor.
122
+ * @returns {{ title: string, body: string, options: BrowserNotificationOptions }} The payload shaped for the Service Worker, with a guaranteed string `body`.
123
+ * @throws {TypeError} If `notification` is not a non-null object.
124
+ */
125
+ static toServiceWorker(notification: BrowserNotification, overrides?: Partial<BrowserNotificationOptions>): {
126
+ title: string;
127
+ body: string;
128
+ options: BrowserNotificationOptions;
129
+ };
130
+ }
131
+ export default TinyNotificationAdapter;
132
+ //# sourceMappingURL=TinyNotificationAdapter.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TinyNotificationAdapter.d.mts","sourceRoot":"","sources":["../../../../../src/v1/libs/sw/browser/TinyNotificationAdapter.mjs"],"names":[],"mappings":"AAEI,YAAuD,oBAAoB,GAAjE,OAAO,cAAc,EAAE,oBAAoB,CAAsB;AAK5E,YAAkB,0BAA0B,GAC5C;;;;IAAoB,IAAI,AAAxB,CACA,EADW,MAAM,CACjB;;;;IAAoB,IAAI,AAAxB,CACA,EADW,MAAM,CACjB;;;;IAAoB,KAAK,AAAzB,CACA,EADW,MAAM,CACjB;;;;IAAoB,GAAG,AAAvB,CACA,EADW,MAAM,CACjB;;;;IAAoB,IAAI,AAAxB,CACA,EADW,MAAM,CACjB;;;;IAAgC,GAAG,AAAnC,CACA,EADW,MAAM,GAAC,KAAK,GAAC,KAAK,CAC7B;;;;IAAqB,QAAQ,AAA7B,CACA,EADW,OAAO,CAClB;;;;IAAqB,kBAAkB,AAAvC,CACA,EADW,OAAO,CAClB;;;;IAAqB,MAAM,AAA3B,CACA,EADW,OAAO,CAClB;;;;IAAoB,SAAS,AAA7B,CACA,EADW,MAAM,CACjB;;;;IAAsB,OAAO,AAA7B,CACA,EADW,MAAM,EAAE,CACnB;;;;IAAqC,IAAI,AAAzC,CACF,EADa,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CACpC;CAAA,CAAA;AAKE,YAAkB,mBAAmB,GACrC;;;;IAAmB,KAAK,EAAb,MAAM,CACjB;;;;IAAuC,OAAO,EAAnC,0BAA0B,CACvC;CAAA,CAAA;AA1BD,kFAAkF;AAElF;;;;;;;;;;;;;;;;GAgBG;AAEH;;;;;;GAMG;AAEH;;;;;;;;;;;GAWG;AACH,cAAM,uBAAuB;;IAC3B,MAAM,CAAC,SAAS;;;;;;OAAa;IAI7B;;;;;;;OAOG;IACH,MAAM,CAAC,SAAS,CAAC,YAAY,EALlB,oBAAoB,GAAC,IAKH,EAAE,SAAS,AAJrC,CACA,EADQ,OAAO,CAAC,0BAA0B,CAIA,GAHhC,mBAAmB,CAwC/B;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,eAAe,CAAC,YAAY,EALxB,mBAKwB,EAAE,SAAS,AAJ3C,CACA,EADQ,OAAO,CAAC,0BAA0B,CAIM,GAHtC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,0BAA0B,CAAA;KAAE,CAqBhF;CACF;eAEc,uBAAuB"}
@@ -0,0 +1,109 @@
1
+ import { PUSH_TYPE } from '../utils.mjs';
2
+ /** @typedef {import('../utils.mjs').TinyPushNotification} TinyPushNotification */
3
+ /**
4
+ * Options accepted by the page level `Notification` constructor.
5
+ *
6
+ * @typedef {Object} BrowserNotificationOptions
7
+ * @property {string} [body] - The main text of the notification, shown below the title.
8
+ * @property {string} [icon] - URL of the image used as the notification icon.
9
+ * @property {string} [image] - URL of an image shown inside the notification body.
10
+ * @property {string} [tag] - Identifier used to group and replace notifications sharing the same tag.
11
+ * @property {string} [lang] - BCP 47 language tag describing the notification text.
12
+ * @property {'auto'|'ltr'|'rtl'} [dir] - Text direction used to render the notification content.
13
+ * @property {boolean} [renotify] - Whether to notify the user again when a notification with the same `tag` is replaced.
14
+ * @property {boolean} [requireInteraction] - Whether the notification stays visible until the user interacts with it.
15
+ * @property {boolean} [silent] - Whether the notification is shown without sound or vibration feedback.
16
+ * @property {number} [timestamp] - Time the notification was created, in milliseconds since the Unix epoch.
17
+ * @property {number[]} [vibrate] - Vibration pattern, in milliseconds, applied on supported devices.
18
+ * @property {Record<string, unknown>} [data] - Arbitrary payload attached to the notification for later retrieval.
19
+ */
20
+ /**
21
+ * A notification already adapted to the page environment.
22
+ *
23
+ * @typedef {Object} BrowserNotification
24
+ * @property {string} title - The headline text displayed at the top of the notification.
25
+ * @property {BrowserNotificationOptions} options - The configuration applied to the notification.
26
+ */
27
+ /**
28
+ * Adapts notification descriptors between the Service Worker and the page.
29
+ *
30
+ * The class is a static-only utility and is never instantiated. It normalizes
31
+ * the payload in both directions: a descriptor produced by the Service Worker
32
+ * can be safely handed to the page level `Notification` constructor through
33
+ * {@link TinyNotificationAdapter.toBrowser}, and a page level notification can
34
+ * be converted back into a Service Worker payload through
35
+ * {@link TinyNotificationAdapter.toServiceWorker}.
36
+ *
37
+ * @beta
38
+ */
39
+ class TinyNotificationAdapter {
40
+ static PUSH_TYPE = PUSH_TYPE;
41
+ /** @type {readonly string[]} */
42
+ static #SW_ONLY_KEYS = Object.freeze(['actions', 'badge']);
43
+ /**
44
+ * SW -> Browser. Use before `new Notification(...)`.
45
+ *
46
+ * @param {TinyPushNotification|null} notification - Descriptor sent by the Service Worker.
47
+ * @param {Partial<BrowserNotificationOptions>} [overrides] - Values that win over the descriptor.
48
+ * @returns {BrowserNotification} The notification adapted for the page environment.
49
+ * @throws {TypeError} If `notification` is neither `null` nor a non-null object.
50
+ */
51
+ static toBrowser(notification, overrides = {}) {
52
+ if (notification !== null &&
53
+ (typeof notification !== 'object' || Array.isArray(notification))) {
54
+ throw new TypeError('[TinyNotificationAdapter] toBrowser: notification must be a non-null object.');
55
+ }
56
+ if (typeof overrides !== 'object' || overrides === null || Array.isArray(overrides)) {
57
+ throw new TypeError('[TinyNotificationAdapter] toBrowser: overrides must be a non-null object.');
58
+ }
59
+ const { title, ...rest } = notification ?? {};
60
+ /** @type {BrowserNotificationOptions} */
61
+ const options = {};
62
+ for (const [key, value] of Object.entries(rest)) {
63
+ if (TinyNotificationAdapter.#SW_ONLY_KEYS.includes(key))
64
+ continue;
65
+ if (typeof value === 'undefined')
66
+ continue;
67
+ // @ts-ignore - the key comes from a validated descriptor.
68
+ options[key] = value;
69
+ }
70
+ // `dir` is the only field whose DOM type is a closed union, so an arbitrary
71
+ // string coming from the wire must be narrowed before it reaches the
72
+ // `Notification` constructor.
73
+ if (options.dir !== 'auto' && options.dir !== 'ltr' && options.dir !== 'rtl') {
74
+ delete options.dir;
75
+ }
76
+ // `renotify` without `tag` throws on Chromium.
77
+ if (options.renotify === true && typeof options.tag !== 'string') {
78
+ delete options.renotify;
79
+ }
80
+ return {
81
+ title: typeof title === 'string' && title !== '' ? title : 'Notification',
82
+ options: { ...options, ...overrides },
83
+ };
84
+ }
85
+ /**
86
+ * Browser -> SW. Use before sending a click/close back to the Service Worker.
87
+ *
88
+ * @param {BrowserNotification} notification - The value returned by {@link TinyNotificationAdapter.toBrowser}.
89
+ * @param {Partial<BrowserNotificationOptions>} [overrides] - Values that win over the descriptor.
90
+ * @returns {{ title: string, body: string, options: BrowserNotificationOptions }} The payload shaped for the Service Worker, with a guaranteed string `body`.
91
+ * @throws {TypeError} If `notification` is not a non-null object.
92
+ */
93
+ static toServiceWorker(notification, overrides = {}) {
94
+ if (typeof notification !== 'object' || notification === null || Array.isArray(notification)) {
95
+ throw new TypeError('[TinyNotificationAdapter] toServiceWorker: notification must be a non-null object.');
96
+ }
97
+ if (typeof overrides !== 'object' || overrides === null || Array.isArray(overrides)) {
98
+ throw new TypeError('[TinyNotificationAdapter] toServiceWorker: overrides must be a non-null object.');
99
+ }
100
+ const { title = 'Notification', options = {} } = notification;
101
+ const merged = { ...options, ...overrides };
102
+ return {
103
+ title,
104
+ body: typeof merged.body === 'string' ? merged.body : '',
105
+ options: merged,
106
+ };
107
+ }
108
+ }
109
+ export default TinyNotificationAdapter;
@@ -0,0 +1,310 @@
1
+ 'use strict';
2
+
3
+ var utils = require('../utils.cjs');
4
+ var utils$1 = require('./utils.cjs');
5
+
6
+ /**
7
+ * @file Owns the lifecycle of a `PushSubscription` in the page context.
8
+ *
9
+ * The manager never talks to the push service directly: it delegates to
10
+ * `PushManager` and to two HTTP endpoints that your backend exposes.
11
+ */
12
+
13
+ /**
14
+ * Describes the optional backend routes used to persist or remove a
15
+ * `PushSubscription`.
16
+ *
17
+ * @typedef {Object} TinyPushEndpoints
18
+ * @property {string} [subscribe] - `POST` route that persists a subscription.
19
+ * @property {string} [unsubscribe] - `DELETE` route that removes a subscription.
20
+ */
21
+
22
+ /**
23
+ * Describes every option accepted by the `TinyPushManager` constructor.
24
+ *
25
+ * @typedef {Object} TinyPushManagerOptions
26
+ * @property {ServiceWorkerRegistration} registration - The active registration.
27
+ * @property {string} vapidPublicKey - Base64 URL-safe VAPID public key.
28
+ * @property {TinyPushEndpoints} [endpoints] - Backend routes.
29
+ * @property {typeof fetch} [fetch] - Fetch implementation, injectable for tests.
30
+ * @property {(state: TinyPushState) => void} [onChange] - State observer.
31
+ */
32
+
33
+ /**
34
+ * Represents an immutable snapshot of the manager state exposed to observers.
35
+ *
36
+ * @typedef {Object} TinyPushState
37
+ * @property {'unsupported'|'unsubscribed'|'subscribed'|'denied'|'pending'} status - Current status.
38
+ * @property {PushSubscription|null} subscription - The active subscription, when any.
39
+ * @property {string|null} error - The last error message, when any.
40
+ */
41
+
42
+ /**
43
+ * Manages the full lifecycle of a browser `PushSubscription` in the page context.
44
+ *
45
+ * The manager is a thin, framework-agnostic wrapper around `PushManager`. It never
46
+ * talks to a push service directly: it delegates subscription creation to the
47
+ * `PushManager` API and persistence to two optional backend routes (`subscribe`
48
+ * and `unsubscribe`). Every state transition is broadcast to the optional
49
+ * `onChange` observer, which makes it easy to bind the manager to any UI layer.
50
+ *
51
+ * @example
52
+ * const manager = new TinyPushManager({
53
+ * registration: await navigator.serviceWorker.ready,
54
+ * vapidPublicKey: 'YOUR_PUBLIC_KEY',
55
+ * endpoints: { subscribe: '/api/push', unsubscribe: '/api/push' },
56
+ * onChange: (state) => console.log(state.status),
57
+ * });
58
+ *
59
+ * await manager.subscribe();
60
+ *
61
+ * @beta
62
+ */
63
+ class TinyPushManager {
64
+ static #PUSH_TYPE = utils.PUSH_TYPE;
65
+ static get PUSH_TYPE() {
66
+ return TinyPushManager.#PUSH_TYPE;
67
+ }
68
+
69
+ /** @type {BufferSource|null} */
70
+ static #cachedKey = null;
71
+
72
+ /** @type {string|null} */
73
+ static #cachedKeySource = null;
74
+
75
+ /**
76
+ * Reports whether the browser exposes the Push API.
77
+ * @returns {boolean} `true` when the Push API is available.
78
+ */
79
+ static isSupported() {
80
+ return (
81
+ typeof globalThis !== 'undefined' &&
82
+ 'serviceWorker' in navigator &&
83
+ 'PushManager' in globalThis &&
84
+ 'Notification' in globalThis
85
+ );
86
+ }
87
+
88
+ /** @returns {NotificationPermission} The current permission. */
89
+ static get permission() {
90
+ return TinyPushManager.isSupported() ? Notification.permission : 'denied';
91
+ }
92
+
93
+ /**
94
+ * Asks the user for the notification permission.
95
+ *
96
+ * @returns {Promise<NotificationPermission>} The resulting permission.
97
+ * @throws {Error} If the Push API is not supported.
98
+ */
99
+ static async requestPermission() {
100
+ if (!TinyPushManager.isSupported()) {
101
+ throw new Error('[TinyPushManager] Push API is not supported in this browser.');
102
+ }
103
+ return await utils$1.requestNotificationPermission();
104
+ }
105
+
106
+ /**
107
+ * Decodes a base64 URL-safe VAPID key. The result is memoized per key.
108
+ *
109
+ * @param {string} base64 - The VAPID public key.
110
+ * @returns {BufferSource} The decoded key.
111
+ * @throws {TypeError} If `base64` is not a non-empty string.
112
+ */
113
+ static decodeVapidKey(base64) {
114
+ if (typeof base64 !== 'string' || base64 === '') {
115
+ throw new TypeError('[TinyPushManager] decodeVapidKey: base64 must be a non-empty string.');
116
+ }
117
+ if (TinyPushManager.#cachedKeySource === base64 && TinyPushManager.#cachedKey) {
118
+ return TinyPushManager.#cachedKey;
119
+ }
120
+
121
+ const padding = '='.repeat((4 - (base64.length % 4)) % 4);
122
+ const normalized = (base64 + padding).replace(/-/g, '+').replace(/_/g, '/');
123
+ const raw = atob(normalized);
124
+ const bytes = Uint8Array.from(raw, (char) => char.charCodeAt(0));
125
+
126
+ TinyPushManager.#cachedKey = bytes;
127
+ TinyPushManager.#cachedKeySource = base64;
128
+
129
+ return bytes;
130
+ }
131
+
132
+ /** @type {ServiceWorkerRegistration} The service worker registration that owns the push subscription. */
133
+ #registration;
134
+
135
+ /** @type {string} The Base64 URL-safe VAPID public key used to create subscriptions. */
136
+ #vapidPublicKey;
137
+
138
+ /** @type {TinyPushEndpoints} The backend routes used to persist and remove subscriptions. */
139
+ #endpoints;
140
+
141
+ /** @type {typeof fetch} The fetch implementation used for backend calls. */
142
+ #fetch;
143
+
144
+ /** @type {((state: TinyPushState) => void)|null} The observer notified whenever the state changes. */
145
+ #onChange;
146
+
147
+ /** @type {TinyPushState} The current internal state of the manager. */
148
+ #state = { status: 'unsubscribed', subscription: null, error: null };
149
+
150
+ /**
151
+ * Creates a manager bound to a service worker registration.
152
+ *
153
+ * @param {TinyPushManagerOptions} options - The manager options.
154
+ * @throws {TypeError} If `options` is invalid.
155
+ */
156
+ constructor(options) {
157
+ if (typeof options !== 'object' || options === null || Array.isArray(options)) {
158
+ throw new TypeError('[TinyPushManager] constructor: options must be a non-null object.');
159
+ }
160
+
161
+ const { registration, vapidPublicKey, endpoints = {}, fetch: fetchImpl, onChange } = options;
162
+
163
+ if (typeof registration !== 'object' || registration === null) {
164
+ throw new TypeError('[TinyPushManager] constructor: options.registration is required.');
165
+ }
166
+ if (typeof vapidPublicKey !== 'string' || vapidPublicKey === '') {
167
+ throw new TypeError('[TinyPushManager] constructor: options.vapidPublicKey is required.');
168
+ }
169
+ if (endpoints.subscribe !== undefined && typeof endpoints.subscribe !== 'string') {
170
+ throw new TypeError('[TinyPushManager] constructor: endpoints.subscribe must be a string.');
171
+ }
172
+ if (endpoints.unsubscribe !== undefined && typeof endpoints.unsubscribe !== 'string') {
173
+ throw new TypeError('[TinyPushManager] constructor: endpoints.unsubscribe must be a string.');
174
+ }
175
+ if (onChange !== undefined && typeof onChange !== 'function') {
176
+ throw new TypeError('[TinyPushManager] constructor: onChange must be a function.');
177
+ }
178
+
179
+ this.#registration = registration;
180
+ this.#vapidPublicKey = vapidPublicKey;
181
+ this.#endpoints = endpoints;
182
+ this.#fetch = fetchImpl ?? globalThis.fetch.bind(globalThis);
183
+ this.#onChange = onChange ?? null;
184
+ }
185
+
186
+ /** @returns {TinyPushState} A frozen snapshot of the current state. */
187
+ get state() {
188
+ return Object.freeze({ ...this.#state });
189
+ }
190
+
191
+ /**
192
+ * Returns the current subscription, if any.
193
+ *
194
+ * @returns {Promise<PushSubscription|null>} The subscription or `null`.
195
+ */
196
+ async getSubscription() {
197
+ if (!TinyPushManager.isSupported()) return null;
198
+ return this.#registration.pushManager.getSubscription();
199
+ }
200
+
201
+ /**
202
+ * Subscribes the user and uploads the subscription to the backend.
203
+ *
204
+ * @param {PushSubscriptionOptionsInit} [options] - Extra options merged into `subscribe`.
205
+ * @returns {Promise<PushSubscription>} The active subscription.
206
+ * @throws {Error} If the permission is denied or the browser rejects the subscription.
207
+ */
208
+ async subscribe(options = {}) {
209
+ if (!TinyPushManager.isSupported()) {
210
+ throw new Error('[TinyPushManager] Push API is not supported in this browser.');
211
+ }
212
+
213
+ this.#setState({ status: 'pending', error: null });
214
+
215
+ const permission = await TinyPushManager.requestPermission();
216
+
217
+ if (permission !== 'granted') {
218
+ this.#setState({ status: 'denied', subscription: null });
219
+ throw new Error(`[TinyPushManager] Notification permission was not granted: ${permission}.`);
220
+ }
221
+
222
+ const existing = await this.getSubscription();
223
+ const subscription =
224
+ existing ??
225
+ (await this.#registration.pushManager.subscribe({
226
+ ...options,
227
+ userVisibleOnly: true,
228
+ applicationServerKey: TinyPushManager.decodeVapidKey(this.#vapidPublicKey),
229
+ }));
230
+
231
+ await this.#upload(subscription);
232
+ this.#setState({ status: 'subscribed', subscription, error: null });
233
+
234
+ return subscription;
235
+ }
236
+
237
+ /**
238
+ * Removes the subscription locally and on the backend.
239
+ *
240
+ * @returns {Promise<boolean>} `true` when a subscription was removed.
241
+ */
242
+ async unsubscribe() {
243
+ const subscription = await this.getSubscription();
244
+
245
+ if (!subscription) {
246
+ this.#setState({ status: 'unsubscribed', subscription: null });
247
+ return false;
248
+ }
249
+
250
+ if (this.#endpoints.unsubscribe) {
251
+ await this.#fetch(this.#endpoints.unsubscribe, {
252
+ method: 'DELETE',
253
+ headers: { 'Content-Type': 'application/json' },
254
+ body: JSON.stringify({ endpoint: subscription.endpoint }),
255
+ }).catch(() => undefined);
256
+ }
257
+
258
+ await subscription.unsubscribe();
259
+ this.#setState({ status: 'unsubscribed', subscription: null, error: null });
260
+
261
+ return true;
262
+ }
263
+
264
+ /**
265
+ * Re-uploads the current subscription. Call it after a `pushsubscriptionchange`.
266
+ *
267
+ * @returns {Promise<PushSubscription|null>} The refreshed subscription.
268
+ */
269
+ async syncWithServer() {
270
+ const subscription = await this.getSubscription();
271
+ if (!subscription) return null;
272
+ await this.#upload(subscription);
273
+ this.#setState({ status: 'subscribed', subscription, error: null });
274
+ return subscription;
275
+ }
276
+
277
+ /**
278
+ * Pushes the subscription to the backend.
279
+ *
280
+ * @param {PushSubscription} subscription - The subscription to upload.
281
+ * @returns {Promise<void>} A promise that resolves once the upload finishes.
282
+ * @throws {Error} If the backend responds with a non-2xx status.
283
+ */
284
+ async #upload(subscription) {
285
+ if (!this.#endpoints.subscribe) return;
286
+
287
+ const response = await this.#fetch(this.#endpoints.subscribe, {
288
+ method: 'POST',
289
+ headers: { 'Content-Type': 'application/json' },
290
+ body: JSON.stringify(subscription.toJSON()),
291
+ });
292
+
293
+ if (!response.ok) {
294
+ throw new Error(`[TinyPushManager] Failed to upload subscription: ${response.status}.`);
295
+ }
296
+ }
297
+
298
+ /**
299
+ * Updates the internal state and notifies the observer.
300
+ *
301
+ * @param {Partial<TinyPushState>} patch - The fields to merge.
302
+ * @returns {void} Nothing is returned; the state is updated in place.
303
+ */
304
+ #setState(patch) {
305
+ this.#state = { ...this.#state, ...patch };
306
+ this.#onChange?.(this.state);
307
+ }
308
+ }
309
+
310
+ module.exports = TinyPushManager;