tiny-essentials 1.28.18 → 1.29.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 (567) 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/dist/v1/ColorSafeStringify.min.js +1 -1
  5. package/dist/v1/TinyAdvancedRaffle.min.js +1 -1
  6. package/dist/v1/TinyAfterScrollWatcher.min.js +1 -1
  7. package/dist/v1/TinyAnalogClock.min.js +1 -1
  8. package/dist/v1/TinyArrayComparator.min.js +1 -1
  9. package/dist/v1/TinyArrayPaginator.min.js +1 -1
  10. package/dist/v1/TinyBasicsEs.min.js +1 -1
  11. package/dist/v1/TinyBrowserMonitor.min.js +1 -0
  12. package/dist/v1/TinyClassManager.min.js +1 -1
  13. package/dist/v1/TinyClipboard.min.js +1 -1
  14. package/dist/v1/TinyCloner.min.js +1 -0
  15. package/dist/v1/TinyColorConverter.min.js +1 -1
  16. package/dist/v1/TinyColorValidator.min.js +1 -1
  17. package/dist/v1/TinyCookieConsent.min.js +1 -1
  18. package/dist/v1/TinyDayNightCycle.min.js +1 -1
  19. package/dist/v1/TinyDebugger.min.js +1 -1
  20. package/dist/v1/TinyDomReadyManager.min.js +1 -1
  21. package/dist/v1/TinyDragDropDetector.min.js +1 -1
  22. package/dist/v1/TinyDragger.min.js +1 -1
  23. package/dist/v1/TinyElementObserver.min.js +1 -1
  24. package/dist/v1/TinyEssentials.min.js +1 -1
  25. package/dist/v1/TinyGamepad.min.js +1 -1
  26. package/dist/v1/TinyHtml.min.js +1 -1
  27. package/dist/v1/TinyHtmlTagRegexBuilder.min.js +1 -0
  28. package/dist/v1/TinyHttpResponseRegistry.min.js +1 -0
  29. package/dist/v1/TinyI18.min.js +1 -1
  30. package/dist/v1/TinyIframeEvents.min.js +1 -1
  31. package/dist/v1/TinyInventory.min.js +1 -1
  32. package/dist/v1/TinyInventoryTrader.min.js +1 -1
  33. package/dist/v1/TinyLevelUp.min.js +1 -1
  34. package/dist/v1/TinyLoadingScreen.min.js +1 -1
  35. package/dist/v1/TinyLocalStorage.min.js +1 -1
  36. package/dist/v1/TinyMaInSys.min.js +1 -1
  37. package/dist/v1/TinyMapCache.min.js +1 -0
  38. package/dist/v1/TinyMediaPlayer.min.js +1 -1
  39. package/dist/v1/TinyNeedBar.min.js +1 -1
  40. package/dist/v1/TinyNewWinEvents.min.js +1 -1
  41. package/dist/v1/TinyNotificationAdapter.min.js +1 -0
  42. package/dist/v1/TinyNotifications.min.js +1 -1
  43. package/dist/v1/TinyNotifyCenter.min.js +1 -1
  44. package/dist/v1/TinyOPFSFileSystem.min.js +1 -0
  45. package/dist/v1/TinyPasswordValidator.min.js +1 -0
  46. package/dist/v1/TinyPluginPackage.min.js +1 -0
  47. package/dist/v1/TinyPromiseQueue.min.js +1 -1
  48. package/dist/v1/TinyPushManager.min.js +1 -0
  49. package/dist/v1/TinyPushPayload.min.js +1 -0
  50. package/dist/v1/TinyPushRouter.min.js +1 -0
  51. package/dist/v1/TinyRadioFm.min.js +1 -1
  52. package/dist/v1/TinyRateLimiter.min.js +1 -1
  53. package/dist/v1/TinyRegexEs.min.js +1 -0
  54. package/dist/v1/TinyRouter.min.js +1 -0
  55. package/dist/v1/TinyServiceWorker.min.js +1 -0
  56. package/dist/v1/TinyServiceWorkerEngine.min.js +1 -0
  57. package/dist/v1/TinySetMapPackage.min.js +1 -0
  58. package/dist/v1/TinySimpleDice.min.js +1 -1
  59. package/dist/v1/TinySmartScroller.min.js +1 -1
  60. package/dist/v1/TinyStorageBucketFileSystem.min.js +1 -0
  61. package/dist/v1/TinyTextDiffer.min.js +1 -1
  62. package/dist/v1/TinyTextRangeEditor.min.js +1 -1
  63. package/dist/v1/TinyTextarea.min.js +1 -1
  64. package/dist/v1/TinyThrottledApi.min.js +1 -0
  65. package/dist/v1/TinyTimeout.min.js +1 -1
  66. package/dist/v1/TinyToastNotify.min.js +1 -1
  67. package/dist/v1/TinyUploadClicker.min.js +1 -1
  68. package/dist/v1/TinyUriParser.min.js +1 -0
  69. package/dist/v1/TinyVersion.min.js +1 -0
  70. package/dist/v1/TinyWebWorker.min.js +1 -0
  71. package/dist/v1/TinyWebWorkerEngine.min.js +1 -0
  72. package/dist/v1/UltraRandomMsgGen.min.js +1 -1
  73. package/dist/v1/basics/array.cjs +2 -2
  74. package/dist/v1/basics/array.d.mts +2 -0
  75. package/dist/v1/basics/array.d.mts.map +1 -1
  76. package/dist/v1/basics/array.mjs +2 -1
  77. package/dist/v1/basics/browserDetector.cjs +37 -12
  78. package/dist/v1/basics/browserDetector.d.mts +8 -0
  79. package/dist/v1/basics/browserDetector.d.mts.map +1 -1
  80. package/dist/v1/basics/browserDetector.mjs +32 -13
  81. package/dist/v1/basics/crypto.cjs +23 -0
  82. package/dist/v1/basics/crypto.d.mts +10 -0
  83. package/dist/v1/basics/crypto.d.mts.map +1 -0
  84. package/dist/v1/basics/crypto.mjs +18 -0
  85. package/dist/v1/basics/html.cjs +0 -3
  86. package/dist/v1/basics/html.d.mts.map +1 -1
  87. package/dist/v1/basics/html.mjs +0 -2
  88. package/dist/v1/basics/index.cjs +8 -1
  89. package/dist/v1/basics/index.d.mts +6 -5
  90. package/dist/v1/basics/index.d.mts.map +1 -1
  91. package/dist/v1/basics/index.mjs +6 -5
  92. package/dist/v1/basics/objChecker.cjs +88 -0
  93. package/dist/v1/basics/objChecker.d.mts +26 -0
  94. package/dist/v1/basics/objChecker.d.mts.map +1 -1
  95. package/dist/v1/basics/objChecker.mjs +74 -0
  96. package/dist/v1/basics/objFilter.cjs +234 -93
  97. package/dist/v1/basics/objFilter.d.mts +96 -22
  98. package/dist/v1/basics/objFilter.d.mts.map +1 -1
  99. package/dist/v1/basics/objFilter.mjs +216 -92
  100. package/dist/v1/basics/promiseUtils.cjs +48 -12
  101. package/dist/v1/basics/promiseUtils.d.mts +45 -12
  102. package/dist/v1/basics/promiseUtils.d.mts.map +1 -1
  103. package/dist/v1/basics/promiseUtils.mjs +47 -12
  104. package/dist/v1/basics/text.cjs +0 -12
  105. package/dist/v1/basics/text.d.mts +0 -10
  106. package/dist/v1/basics/text.d.mts.map +1 -1
  107. package/dist/v1/basics/text.mjs +0 -10
  108. package/dist/v1/css/TinyCookieConsent.min.css +1 -0
  109. package/dist/v1/css/TinyCookieConsent.min.css.map +1 -0
  110. package/dist/v1/css/TinyDraggerExample.min.css +1 -0
  111. package/dist/v1/css/TinyDraggerExample.min.css.map +1 -0
  112. package/dist/v1/css/TinyLoadingScreen.min.css +1 -0
  113. package/dist/v1/css/TinyLoadingScreen.min.css.map +1 -0
  114. package/dist/v1/css/TinyNotify.min.css +1 -0
  115. package/dist/v1/css/TinyNotify.min.css.map +1 -0
  116. package/dist/v1/css/aiMarker.min.css +1 -0
  117. package/dist/v1/css/aiMarker.min.css.map +1 -0
  118. package/dist/v1/index.cjs +88 -3
  119. package/dist/v1/index.d.mts +31 -6
  120. package/dist/v1/index.d.mts.map +1 -1
  121. package/dist/v1/index.mjs +32 -7
  122. package/dist/v1/jsdoc/EventEmitter.cjs +4 -0
  123. package/dist/v1/jsdoc/EventEmitter.d.mts +33 -0
  124. package/dist/v1/jsdoc/EventEmitter.d.mts.map +1 -0
  125. package/dist/v1/jsdoc/EventEmitter.mjs +18 -0
  126. package/dist/v1/libs/array/TinyArrayComparator.cjs +240 -25
  127. package/dist/v1/libs/array/TinyArrayComparator.d.mts +130 -22
  128. package/dist/v1/libs/array/TinyArrayComparator.d.mts.map +1 -1
  129. package/dist/v1/libs/array/TinyArrayComparator.mjs +210 -24
  130. package/dist/v1/libs/fs/constants.cjs +74 -0
  131. package/dist/v1/libs/fs/constants.d.mts +22 -0
  132. package/dist/v1/libs/fs/constants.d.mts.map +1 -0
  133. package/dist/v1/libs/fs/constants.mjs +53 -0
  134. package/dist/v1/libs/fs/encoding.cjs +118 -0
  135. package/dist/v1/libs/fs/encoding.d.mts +50 -0
  136. package/dist/v1/libs/fs/encoding.d.mts.map +1 -0
  137. package/dist/v1/libs/fs/encoding.mjs +102 -0
  138. package/dist/v1/libs/fs/error.cjs +188 -0
  139. package/dist/v1/libs/fs/error.d.mts +105 -0
  140. package/dist/v1/libs/fs/error.d.mts.map +1 -0
  141. package/dist/v1/libs/fs/error.mjs +158 -0
  142. package/dist/v1/libs/fs/handle.cjs +121 -0
  143. package/dist/v1/libs/fs/handle.d.mts +56 -0
  144. package/dist/v1/libs/fs/handle.d.mts.map +1 -0
  145. package/dist/v1/libs/fs/handle.mjs +100 -0
  146. package/dist/v1/libs/fs/index.cjs +700 -0
  147. package/dist/v1/libs/fs/index.d.mts +377 -0
  148. package/dist/v1/libs/fs/index.d.mts.map +1 -0
  149. package/dist/v1/libs/fs/index.mjs +630 -0
  150. package/dist/v1/libs/fs/path.cjs +234 -0
  151. package/dist/v1/libs/fs/path.d.mts +176 -0
  152. package/dist/v1/libs/fs/path.d.mts.map +1 -0
  153. package/dist/v1/libs/fs/path.mjs +197 -0
  154. package/dist/v1/libs/fs/plugins/OPFS/StorageBucket.cjs +202 -0
  155. package/dist/v1/libs/fs/plugins/OPFS/StorageBucket.d.mts +121 -0
  156. package/dist/v1/libs/fs/plugins/OPFS/StorageBucket.d.mts.map +1 -0
  157. package/dist/v1/libs/fs/plugins/OPFS/StorageBucket.mjs +172 -0
  158. package/dist/v1/libs/fs/plugins/OPFS/index.cjs +334 -0
  159. package/dist/v1/libs/fs/plugins/OPFS/index.d.mts +98 -0
  160. package/dist/v1/libs/fs/plugins/OPFS/index.d.mts.map +1 -0
  161. package/dist/v1/libs/fs/plugins/OPFS/index.mjs +300 -0
  162. package/dist/v1/libs/fs/stats.cjs +245 -0
  163. package/dist/v1/libs/fs/stats.d.mts +226 -0
  164. package/dist/v1/libs/fs/stats.d.mts.map +1 -0
  165. package/dist/v1/libs/fs/stats.mjs +197 -0
  166. package/dist/v1/libs/html/events/TinyIframeEvents.cjs +10 -1
  167. package/dist/v1/libs/html/events/TinyIframeEvents.d.mts +9 -2
  168. package/dist/v1/libs/html/events/TinyIframeEvents.d.mts.map +1 -1
  169. package/dist/v1/libs/html/events/TinyIframeEvents.mjs +8 -1
  170. package/dist/v1/libs/html/events/TinyNewWinEvents.cjs +14 -3
  171. package/dist/v1/libs/html/events/TinyNewWinEvents.d.mts +21 -5
  172. package/dist/v1/libs/html/events/TinyNewWinEvents.d.mts.map +1 -1
  173. package/dist/v1/libs/html/events/TinyNewWinEvents.mjs +12 -3
  174. package/dist/v1/libs/html/scroll/TinySmartScroller.cjs +13 -1
  175. package/dist/v1/libs/html/scroll/TinySmartScroller.d.mts +29 -2
  176. package/dist/v1/libs/html/scroll/TinySmartScroller.d.mts.map +1 -1
  177. package/dist/v1/libs/html/scroll/TinySmartScroller.mjs +11 -1
  178. package/dist/v1/libs/math/TinyAdvancedRaffle.cjs +13 -1
  179. package/dist/v1/libs/math/TinyAdvancedRaffle.d.mts +32 -2
  180. package/dist/v1/libs/math/TinyAdvancedRaffle.d.mts.map +1 -1
  181. package/dist/v1/libs/math/TinyAdvancedRaffle.mjs +11 -1
  182. package/dist/v1/libs/math/TinyTimeout.cjs +0 -14
  183. package/dist/v1/libs/math/TinyTimeout.d.mts +0 -11
  184. package/dist/v1/libs/math/TinyTimeout.d.mts.map +1 -1
  185. package/dist/v1/libs/math/TinyTimeout.mjs +0 -13
  186. package/dist/v1/libs/media/TinyMediaPlayer/index.cjs +25 -1
  187. package/dist/v1/libs/media/TinyMediaPlayer/index.d.mts +35 -2
  188. package/dist/v1/libs/media/TinyMediaPlayer/index.d.mts.map +1 -1
  189. package/dist/v1/libs/media/TinyMediaPlayer/index.mjs +23 -1
  190. package/dist/v1/libs/media/TinyMediaPlayer.cjs +2 -2
  191. package/dist/v1/libs/media/TinyMediaPlayer.d.mts +2 -2
  192. package/dist/v1/libs/media/TinyMediaPlayer.d.mts.map +1 -1
  193. package/dist/v1/libs/media/TinyMediaPlayer.mjs +2 -2
  194. package/dist/v1/libs/media/TinyRadioFm.cjs +19 -1
  195. package/dist/v1/libs/media/TinyRadioFm.d.mts +78 -2
  196. package/dist/v1/libs/media/TinyRadioFm.d.mts.map +1 -1
  197. package/dist/v1/libs/media/TinyRadioFm.mjs +17 -1
  198. package/dist/v1/libs/plugin/TinyPlugin.cjs +1630 -0
  199. package/dist/v1/libs/plugin/TinyPlugin.d.mts +753 -0
  200. package/dist/v1/libs/plugin/TinyPlugin.d.mts.map +1 -0
  201. package/dist/v1/libs/plugin/TinyPlugin.mjs +1376 -0
  202. package/dist/v1/libs/plugin/TinyVersion.cjs +204 -0
  203. package/dist/v1/libs/plugin/TinyVersion.d.mts +70 -0
  204. package/dist/v1/libs/plugin/TinyVersion.d.mts.map +1 -0
  205. package/dist/v1/libs/plugin/TinyVersion.mjs +179 -0
  206. package/dist/v1/libs/router/TinyRouter.cjs +661 -0
  207. package/dist/v1/libs/router/TinyRouter.d.mts +320 -0
  208. package/dist/v1/libs/router/TinyRouter.d.mts.map +1 -0
  209. package/dist/v1/libs/router/TinyRouter.mjs +572 -0
  210. package/dist/v1/libs/storage/TinyLocalStorage.cjs +20 -1
  211. package/dist/v1/libs/storage/TinyLocalStorage.d.mts +64 -2
  212. package/dist/v1/libs/storage/TinyLocalStorage.d.mts.map +1 -1
  213. package/dist/v1/libs/storage/TinyLocalStorage.mjs +18 -1
  214. package/dist/v1/libs/storage/TinyMapCache.cjs +373 -0
  215. package/dist/v1/libs/storage/TinyMapCache.d.mts +274 -0
  216. package/dist/v1/libs/storage/TinyMapCache.d.mts.map +1 -0
  217. package/dist/v1/libs/storage/TinyMapCache.mjs +333 -0
  218. package/dist/v1/libs/storage/TinySetMapDatabase.cjs +1167 -0
  219. package/dist/v1/libs/storage/TinySetMapDatabase.d.mts +603 -0
  220. package/dist/v1/libs/storage/TinySetMapDatabase.d.mts.map +1 -0
  221. package/dist/v1/libs/storage/TinySetMapDatabase.mjs +1059 -0
  222. package/dist/v1/libs/sw/browser/TinyNotificationAdapter.cjs +126 -0
  223. package/dist/v1/libs/sw/browser/TinyNotificationAdapter.d.mts +132 -0
  224. package/dist/v1/libs/sw/browser/TinyNotificationAdapter.d.mts.map +1 -0
  225. package/dist/v1/libs/sw/browser/TinyNotificationAdapter.mjs +109 -0
  226. package/dist/v1/libs/sw/browser/TinyPushManager.cjs +310 -0
  227. package/dist/v1/libs/sw/browser/TinyPushManager.d.mts +168 -0
  228. package/dist/v1/libs/sw/browser/TinyPushManager.d.mts.map +1 -0
  229. package/dist/v1/libs/sw/browser/TinyPushManager.mjs +264 -0
  230. package/dist/v1/libs/sw/browser/TinyServiceWorker.cjs +1060 -0
  231. package/dist/v1/libs/sw/browser/TinyServiceWorker.d.mts +348 -0
  232. package/dist/v1/libs/sw/browser/TinyServiceWorker.d.mts.map +1 -0
  233. package/dist/v1/libs/sw/browser/TinyServiceWorker.mjs +933 -0
  234. package/dist/v1/libs/sw/browser/plugins/TabManager.cjs +315 -0
  235. package/dist/v1/libs/sw/browser/plugins/TabManager.d.mts +178 -0
  236. package/dist/v1/libs/sw/browser/plugins/TabManager.d.mts.map +1 -0
  237. package/dist/v1/libs/sw/browser/plugins/TabManager.mjs +274 -0
  238. package/dist/v1/libs/sw/browser/utils.cjs +28 -0
  239. package/dist/v1/libs/sw/browser/utils.d.mts +8 -0
  240. package/dist/v1/libs/sw/browser/utils.d.mts.map +1 -0
  241. package/dist/v1/libs/sw/browser/utils.mjs +21 -0
  242. package/dist/v1/libs/sw/service/TinyPushRouter.cjs +222 -0
  243. package/dist/v1/libs/sw/service/TinyPushRouter.d.mts +138 -0
  244. package/dist/v1/libs/sw/service/TinyPushRouter.d.mts.map +1 -0
  245. package/dist/v1/libs/sw/service/TinyPushRouter.mjs +201 -0
  246. package/dist/v1/libs/sw/service/TinyServiceWorkerEngine.cjs +3016 -0
  247. package/dist/v1/libs/sw/service/TinyServiceWorkerEngine.d.mts +993 -0
  248. package/dist/v1/libs/sw/service/TinyServiceWorkerEngine.d.mts.map +1 -0
  249. package/dist/v1/libs/sw/service/TinyServiceWorkerEngine.mjs +2558 -0
  250. package/dist/v1/libs/sw/service/plugins/GlobBypassPlugin.cjs +88 -0
  251. package/dist/v1/libs/sw/service/plugins/GlobBypassPlugin.d.mts +32 -0
  252. package/dist/v1/libs/sw/service/plugins/GlobBypassPlugin.d.mts.map +1 -0
  253. package/dist/v1/libs/sw/service/plugins/GlobBypassPlugin.mjs +69 -0
  254. package/dist/v1/libs/sw/service/plugins/GlobCachePlugin.cjs +112 -0
  255. package/dist/v1/libs/sw/service/plugins/GlobCachePlugin.d.mts +31 -0
  256. package/dist/v1/libs/sw/service/plugins/GlobCachePlugin.d.mts.map +1 -0
  257. package/dist/v1/libs/sw/service/plugins/GlobCachePlugin.mjs +91 -0
  258. package/dist/v1/libs/sw/service/plugins/Ping.cjs +32 -0
  259. package/dist/v1/libs/sw/service/plugins/Ping.d.mts +9 -0
  260. package/dist/v1/libs/sw/service/plugins/Ping.d.mts.map +1 -0
  261. package/dist/v1/libs/sw/service/plugins/Ping.mjs +25 -0
  262. package/dist/v1/libs/sw/service/plugins/TabManager.cjs +457 -0
  263. package/dist/v1/libs/sw/service/plugins/TabManager.d.mts +91 -0
  264. package/dist/v1/libs/sw/service/plugins/TabManager.d.mts.map +1 -0
  265. package/dist/v1/libs/sw/service/plugins/TabManager.mjs +372 -0
  266. package/dist/v1/libs/sw/service/plugins/ViteFileDetector.cjs +180 -0
  267. package/dist/v1/libs/sw/service/plugins/ViteFileDetector.d.mts +28 -0
  268. package/dist/v1/libs/sw/service/plugins/ViteFileDetector.d.mts.map +1 -0
  269. package/dist/v1/libs/sw/service/plugins/ViteFileDetector.mjs +148 -0
  270. package/dist/v1/libs/sw/service/shared/TinyPushPayload.cjs +199 -0
  271. package/dist/v1/libs/sw/service/shared/TinyPushPayload.d.mts +80 -0
  272. package/dist/v1/libs/sw/service/shared/TinyPushPayload.d.mts.map +1 -0
  273. package/dist/v1/libs/sw/service/shared/TinyPushPayload.mjs +174 -0
  274. package/dist/v1/libs/sw/utils.cjs +57 -0
  275. package/dist/v1/libs/sw/utils.d.mts +173 -0
  276. package/dist/v1/libs/sw/utils.d.mts.map +1 -0
  277. package/dist/v1/libs/sw/utils.mjs +50 -0
  278. package/dist/v1/libs/text/TinyI18/Browser-NON-DOM.cjs +57 -0
  279. package/dist/v1/libs/text/TinyI18/Browser-NON-DOM.d.mts +39 -0
  280. package/dist/v1/libs/text/TinyI18/Browser-NON-DOM.d.mts.map +1 -0
  281. package/dist/v1/libs/text/TinyI18/Browser-NON-DOM.mjs +48 -0
  282. package/dist/v1/libs/text/TinyI18/Browser.cjs +64 -0
  283. package/dist/v1/libs/text/TinyI18/Browser.d.mts +47 -0
  284. package/dist/v1/libs/text/TinyI18/Browser.d.mts.map +1 -0
  285. package/dist/v1/libs/text/TinyI18/Browser.mjs +57 -0
  286. package/dist/v1/libs/text/TinyI18/Node.cjs +49 -0
  287. package/dist/v1/libs/text/TinyI18/Node.d.mts +38 -0
  288. package/dist/v1/libs/text/TinyI18/Node.d.mts.map +1 -0
  289. package/dist/v1/libs/text/TinyI18/Node.mjs +43 -0
  290. package/dist/v1/libs/text/TinyI18/browser-utils.cjs +17 -0
  291. package/dist/v1/libs/text/TinyI18/browser-utils.d.mts +8 -0
  292. package/dist/v1/libs/text/TinyI18/browser-utils.d.mts.map +1 -0
  293. package/dist/v1/libs/text/TinyI18/browser-utils.mjs +13 -0
  294. package/dist/v1/libs/text/{TinyI18.cjs → TinyI18/index.cjs} +205 -104
  295. package/dist/v1/libs/text/{TinyI18.d.mts → TinyI18/index.d.mts} +141 -92
  296. package/dist/v1/libs/text/TinyI18/index.d.mts.map +1 -0
  297. package/dist/v1/libs/text/{TinyI18.mjs → TinyI18/index.mjs} +195 -101
  298. package/dist/v1/libs/tools/TinyBrowserMonitor.cjs +1088 -0
  299. package/dist/v1/libs/tools/TinyBrowserMonitor.d.mts +621 -0
  300. package/dist/v1/libs/tools/TinyBrowserMonitor.d.mts.map +1 -0
  301. package/dist/v1/libs/tools/TinyBrowserMonitor.mjs +940 -0
  302. package/dist/v1/libs/tools/TinyDebugger.cjs +180 -19
  303. package/dist/v1/libs/tools/TinyDebugger.d.mts +220 -24
  304. package/dist/v1/libs/tools/TinyDebugger.d.mts.map +1 -1
  305. package/dist/v1/libs/tools/TinyDebugger.mjs +161 -19
  306. package/dist/v1/libs/tools/TinyHtmlTagRegexBuilder.cjs +256 -0
  307. package/dist/v1/libs/tools/TinyHtmlTagRegexBuilder.d.mts +125 -0
  308. package/dist/v1/libs/tools/TinyHtmlTagRegexBuilder.d.mts.map +1 -0
  309. package/dist/v1/libs/tools/TinyHtmlTagRegexBuilder.mjs +223 -0
  310. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser-NON-DOM.cjs +23 -0
  311. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser-NON-DOM.d.mts +17 -0
  312. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser-NON-DOM.d.mts.map +1 -0
  313. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser-NON-DOM.mjs +19 -0
  314. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser.cjs +23 -0
  315. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser.d.mts +17 -0
  316. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser.d.mts.map +1 -0
  317. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser.mjs +19 -0
  318. package/dist/v1/libs/tools/TinyHttpResponseRegistry/EmptyRequestCodes.cjs +390 -0
  319. package/dist/v1/libs/tools/TinyHttpResponseRegistry/EmptyRequestCodes.d.mts +9 -0
  320. package/dist/v1/libs/tools/TinyHttpResponseRegistry/EmptyRequestCodes.d.mts.map +1 -0
  321. package/dist/v1/libs/tools/TinyHttpResponseRegistry/EmptyRequestCodes.mjs +387 -0
  322. package/dist/v1/libs/tools/TinyHttpResponseRegistry/JsDoc.cjs +2 -0
  323. package/dist/v1/libs/tools/TinyHttpResponseRegistry/JsDoc.d.mts +27 -0
  324. package/dist/v1/libs/tools/TinyHttpResponseRegistry/JsDoc.d.mts.map +1 -0
  325. package/dist/v1/libs/tools/TinyHttpResponseRegistry/JsDoc.mjs +12 -0
  326. package/dist/v1/libs/tools/TinyHttpResponseRegistry/MozillaRequestCodes/LICENSE +53 -0
  327. package/dist/v1/libs/tools/TinyHttpResponseRegistry/MozillaRequestCodes/index.cjs +405 -0
  328. package/dist/v1/libs/tools/TinyHttpResponseRegistry/MozillaRequestCodes/index.d.mts +34 -0
  329. package/dist/v1/libs/tools/TinyHttpResponseRegistry/MozillaRequestCodes/index.d.mts.map +1 -0
  330. package/dist/v1/libs/tools/TinyHttpResponseRegistry/MozillaRequestCodes/index.mjs +342 -0
  331. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Node.cjs +23 -0
  332. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Node.d.mts +17 -0
  333. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Node.d.mts.map +1 -0
  334. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Node.mjs +19 -0
  335. package/dist/v1/libs/tools/TinyHttpResponseRegistry/RequestCodes.cjs +327 -0
  336. package/dist/v1/libs/tools/TinyHttpResponseRegistry/RequestCodes.d.mts +9 -0
  337. package/dist/v1/libs/tools/TinyHttpResponseRegistry/RequestCodes.d.mts.map +1 -0
  338. package/dist/v1/libs/tools/TinyHttpResponseRegistry/RequestCodes.mjs +324 -0
  339. package/dist/v1/libs/tools/TinyHttpResponseRegistry/index.cjs +268 -0
  340. package/dist/v1/libs/tools/TinyHttpResponseRegistry/index.d.mts +107 -0
  341. package/dist/v1/libs/tools/TinyHttpResponseRegistry/index.d.mts.map +1 -0
  342. package/dist/v1/libs/tools/TinyHttpResponseRegistry/index.mjs +238 -0
  343. package/dist/v1/libs/tools/TinyPasswordValidator.cjs +491 -0
  344. package/dist/v1/libs/tools/TinyPasswordValidator.d.mts +246 -0
  345. package/dist/v1/libs/tools/TinyPasswordValidator.d.mts.map +1 -0
  346. package/dist/v1/libs/tools/TinyPasswordValidator.mjs +434 -0
  347. package/dist/v1/libs/tools/TinyPkgExportValidator.cjs +48 -0
  348. package/dist/v1/libs/tools/TinyPkgExportValidator.d.mts +14 -0
  349. package/dist/v1/libs/tools/TinyPkgExportValidator.d.mts.map +1 -1
  350. package/dist/v1/libs/tools/TinyPkgExportValidator.mjs +44 -0
  351. package/dist/v1/libs/tools/TinySiteMap.cjs +1029 -0
  352. package/dist/v1/libs/tools/TinySiteMap.d.mts +429 -0
  353. package/dist/v1/libs/tools/TinySiteMap.d.mts.map +1 -0
  354. package/dist/v1/libs/tools/TinySiteMap.mjs +910 -0
  355. package/dist/v1/libs/tools/TinySiteMapStream.cjs +121 -0
  356. package/dist/v1/libs/tools/TinySiteMapStream.d.mts +51 -0
  357. package/dist/v1/libs/tools/TinySiteMapStream.d.mts.map +1 -0
  358. package/dist/v1/libs/tools/TinySiteMapStream.mjs +85 -0
  359. package/dist/v1/libs/tools/TinyURLSecurityVerifier.cjs +444 -0
  360. package/dist/v1/libs/tools/TinyURLSecurityVerifier.d.mts +217 -0
  361. package/dist/v1/libs/tools/TinyURLSecurityVerifier.d.mts.map +1 -0
  362. package/dist/v1/libs/tools/TinyURLSecurityVerifier.mjs +394 -0
  363. package/dist/v1/libs/tools/TinyUriParser/BlueSky.cjs +613 -0
  364. package/dist/v1/libs/tools/TinyUriParser/BlueSky.d.mts +152 -0
  365. package/dist/v1/libs/tools/TinyUriParser/BlueSky.d.mts.map +1 -0
  366. package/dist/v1/libs/tools/TinyUriParser/BlueSky.mjs +527 -0
  367. package/dist/v1/libs/tools/TinyUriParser/Discord.cjs +1119 -0
  368. package/dist/v1/libs/tools/TinyUriParser/Discord.d.mts +306 -0
  369. package/dist/v1/libs/tools/TinyUriParser/Discord.d.mts.map +1 -0
  370. package/dist/v1/libs/tools/TinyUriParser/Discord.mjs +968 -0
  371. package/dist/v1/libs/tools/TinyUriParser/MatrixProtocol.cjs +469 -0
  372. package/dist/v1/libs/tools/TinyUriParser/MatrixProtocol.d.mts +80 -0
  373. package/dist/v1/libs/tools/TinyUriParser/MatrixProtocol.d.mts.map +1 -0
  374. package/dist/v1/libs/tools/TinyUriParser/MatrixProtocol.mjs +379 -0
  375. package/dist/v1/libs/tools/TinyUriParser.cjs +217 -0
  376. package/dist/v1/libs/tools/TinyUriParser.d.mts +109 -0
  377. package/dist/v1/libs/tools/TinyUriParser.d.mts.map +1 -0
  378. package/dist/v1/libs/tools/TinyUriParser.mjs +183 -0
  379. package/dist/v1/libs/utils/TinyCloner.cjs +466 -0
  380. package/dist/v1/libs/utils/TinyCloner.d.mts +221 -0
  381. package/dist/v1/libs/utils/TinyCloner.d.mts.map +1 -0
  382. package/dist/v1/libs/utils/TinyCloner.mjs +416 -0
  383. package/dist/v1/libs/utils/TinyPromiseQueue.cjs +1 -1
  384. package/dist/v1/libs/utils/TinyPromiseQueue.d.mts +2 -2
  385. package/dist/v1/libs/utils/TinyPromiseQueue.d.mts.map +1 -1
  386. package/dist/v1/libs/utils/TinyPromiseQueue.mjs +1 -1
  387. package/dist/v1/libs/utils/TinyThrottledApi.cjs +333 -0
  388. package/dist/v1/libs/utils/TinyThrottledApi.d.mts +163 -0
  389. package/dist/v1/libs/utils/TinyThrottledApi.d.mts.map +1 -0
  390. package/dist/v1/libs/utils/TinyThrottledApi.mjs +294 -0
  391. package/dist/v1/libs/worker/browser/TinyWebWorker.cjs +342 -0
  392. package/dist/v1/libs/worker/browser/TinyWebWorker.d.mts +97 -0
  393. package/dist/v1/libs/worker/browser/TinyWebWorker.d.mts.map +1 -0
  394. package/dist/v1/libs/worker/browser/TinyWebWorker.mjs +305 -0
  395. package/dist/v1/libs/worker/engine/TinyWebWorkerEngine.cjs +346 -0
  396. package/dist/v1/libs/worker/engine/TinyWebWorkerEngine.d.mts +127 -0
  397. package/dist/v1/libs/worker/engine/TinyWebWorkerEngine.d.mts.map +1 -0
  398. package/dist/v1/libs/worker/engine/TinyWebWorkerEngine.mjs +304 -0
  399. package/dist/v1/regexp/Email.cjs +185 -0
  400. package/dist/v1/regexp/Email.d.mts +73 -0
  401. package/dist/v1/regexp/Email.d.mts.map +1 -0
  402. package/dist/v1/regexp/Email.mjs +153 -0
  403. package/dist/v1/regexp/Glob.cjs +293 -0
  404. package/dist/v1/regexp/Glob.d.mts +45 -0
  405. package/dist/v1/regexp/Glob.d.mts.map +1 -0
  406. package/dist/v1/regexp/Glob.mjs +260 -0
  407. package/dist/v1/regexp/Ipv4.cjs +57 -0
  408. package/dist/v1/regexp/Ipv4.d.mts +29 -0
  409. package/dist/v1/regexp/Ipv4.d.mts.map +1 -0
  410. package/dist/v1/regexp/Ipv4.mjs +45 -0
  411. package/dist/v1/regexp/Ipv6.cjs +67 -0
  412. package/dist/v1/regexp/Ipv6.d.mts +29 -0
  413. package/dist/v1/regexp/Ipv6.d.mts.map +1 -0
  414. package/dist/v1/regexp/Ipv6.mjs +54 -0
  415. package/dist/v1/regexp/SegmentExtractor.cjs +145 -0
  416. package/dist/v1/regexp/SegmentExtractor.d.mts +91 -0
  417. package/dist/v1/regexp/SegmentExtractor.d.mts.map +1 -0
  418. package/dist/v1/regexp/SegmentExtractor.mjs +116 -0
  419. package/dist/v1/regexp/UrlDetector.cjs +125 -0
  420. package/dist/v1/regexp/UrlDetector.d.mts +67 -0
  421. package/dist/v1/regexp/UrlDetector.d.mts.map +1 -0
  422. package/dist/v1/regexp/UrlDetector.mjs +102 -0
  423. package/dist/v1/regexp/Username/index.cjs +233 -0
  424. package/dist/v1/regexp/Username/index.d.mts +77 -0
  425. package/dist/v1/regexp/Username/index.d.mts.map +1 -0
  426. package/dist/v1/regexp/Username/index.mjs +199 -0
  427. package/dist/v1/regexp/Username/jsDoc.cjs +2 -0
  428. package/dist/v1/regexp/Username/jsDoc.d.mts +57 -0
  429. package/dist/v1/regexp/Username/jsDoc.d.mts.map +1 -0
  430. package/dist/v1/regexp/Username/jsDoc.mjs +18 -0
  431. package/dist/v1/regexp/Username/templates/BlueSky.cjs +56 -0
  432. package/dist/v1/regexp/Username/templates/BlueSky.d.mts +35 -0
  433. package/dist/v1/regexp/Username/templates/BlueSky.d.mts.map +1 -0
  434. package/dist/v1/regexp/Username/templates/BlueSky.mjs +52 -0
  435. package/dist/v1/regexp/Username/templates/Discord.cjs +505 -0
  436. package/dist/v1/regexp/Username/templates/Discord.d.mts +209 -0
  437. package/dist/v1/regexp/Username/templates/Discord.d.mts.map +1 -0
  438. package/dist/v1/regexp/Username/templates/Discord.mjs +458 -0
  439. package/dist/v1/regexp/Username/templates/MatrixProtocol.cjs +143 -0
  440. package/dist/v1/regexp/Username/templates/MatrixProtocol.d.mts +70 -0
  441. package/dist/v1/regexp/Username/templates/MatrixProtocol.d.mts.map +1 -0
  442. package/dist/v1/regexp/Username/templates/MatrixProtocol.mjs +128 -0
  443. package/dist/v1/regexp/Username/templates/deprecated/Discord.cjs +24 -0
  444. package/dist/v1/regexp/Username/templates/deprecated/Discord.d.mts +17 -0
  445. package/dist/v1/regexp/Username/templates/deprecated/Discord.d.mts.map +1 -0
  446. package/dist/v1/regexp/Username/templates/deprecated/Discord.mjs +20 -0
  447. package/dist/v1/regexp/Username/templates/index.cjs +11 -0
  448. package/dist/v1/regexp/Username/templates/index.d.mts +5 -0
  449. package/dist/v1/regexp/Username/templates/index.d.mts.map +1 -0
  450. package/dist/v1/regexp/Username/templates/index.mjs +4 -0
  451. package/dist/v1/regexp/index.cjs +41 -0
  452. package/dist/v1/regexp/index.d.mts +9 -0
  453. package/dist/v1/regexp/index.d.mts.map +1 -0
  454. package/dist/v1/regexp/index.mjs +8 -0
  455. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Browser.cjs +64 -0
  456. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Browser.d.mts +11 -0
  457. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Browser.d.mts.map +1 -0
  458. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Browser.mjs +51 -0
  459. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/FileInput.cjs +66 -0
  460. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/FileInput.d.mts +11 -0
  461. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/FileInput.d.mts.map +1 -0
  462. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/FileInput.mjs +51 -0
  463. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Node.cjs +39 -0
  464. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Node.d.mts +11 -0
  465. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Node.d.mts.map +1 -0
  466. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Node.mjs +28 -0
  467. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Template.cjs +494 -0
  468. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Template.d.mts +142 -0
  469. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Template.d.mts.map +1 -0
  470. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Template.mjs +445 -0
  471. package/dist/v1/webTemplates/bootstrap/5.3/html/BootstrapDialogs.cjs +725 -0
  472. package/dist/v1/webTemplates/bootstrap/5.3/html/BootstrapDialogs.d.mts +293 -0
  473. package/dist/v1/webTemplates/bootstrap/5.3/html/BootstrapDialogs.d.mts.map +1 -0
  474. package/dist/v1/webTemplates/bootstrap/5.3/html/BootstrapDialogs.mjs +614 -0
  475. package/dist/v1/webTemplates/bootstrap/5.3/scss/input/Placeholder-Colors-Fix.scss +64 -0
  476. package/dist/v1/webTemplates/bootstrap/5.3/scss/spacing/Spacing-Plus.scss +31 -0
  477. package/dist/v1/webTemplates/media/MediaValidator/v1/Browser/index.cjs +135 -0
  478. package/dist/v1/webTemplates/media/MediaValidator/v1/Browser/index.d.mts +83 -0
  479. package/dist/v1/webTemplates/media/MediaValidator/v1/Browser/index.d.mts.map +1 -0
  480. package/dist/v1/webTemplates/media/MediaValidator/v1/Browser/index.mjs +120 -0
  481. package/dist/v1/webTemplates/media/MediaValidator/v1/Node/index.cjs +127 -0
  482. package/dist/v1/webTemplates/media/MediaValidator/v1/Node/index.d.mts +95 -0
  483. package/dist/v1/webTemplates/media/MediaValidator/v1/Node/index.d.mts.map +1 -0
  484. package/dist/v1/webTemplates/media/MediaValidator/v1/Node/index.mjs +109 -0
  485. package/dist/v1/webTemplates/multiformats/14.0/IPFSHasher/index.cjs +83 -0
  486. package/dist/v1/webTemplates/multiformats/14.0/IPFSHasher/index.d.mts +46 -0
  487. package/dist/v1/webTemplates/multiformats/14.0/IPFSHasher/index.d.mts.map +1 -0
  488. package/dist/v1/webTemplates/multiformats/14.0/IPFSHasher/index.mjs +71 -0
  489. package/dist/v1/webTemplates/vite/7.3/plugins/TinyVitePwaPlugin.cjs +493 -0
  490. package/dist/v1/webTemplates/vite/7.3/plugins/TinyVitePwaPlugin.d.mts +67 -0
  491. package/dist/v1/webTemplates/vite/7.3/plugins/TinyVitePwaPlugin.d.mts.map +1 -0
  492. package/dist/v1/webTemplates/vite/7.3/plugins/TinyVitePwaPlugin.mjs +399 -0
  493. package/dist/v1/webTemplates/vite/7.3/plugins/githubUtils.cjs +35 -0
  494. package/dist/v1/webTemplates/vite/7.3/plugins/githubUtils.d.mts +6 -0
  495. package/dist/v1/webTemplates/vite/7.3/plugins/githubUtils.d.mts.map +1 -0
  496. package/dist/v1/webTemplates/vite/7.3/plugins/githubUtils.mjs +29 -0
  497. package/docs/info/RegExp.md +74 -0
  498. package/docs/v1/Exports.md +111 -0
  499. package/docs/v1/README.md +117 -13
  500. package/docs/v1/basics/asyncReplace.md +2 -0
  501. package/docs/v1/basics/browserDetector.md +28 -11
  502. package/docs/v1/basics/crypto.md +85 -0
  503. package/docs/v1/basics/deprecated/html.md +2 -0
  504. package/docs/v1/basics/deprecated/objFilter.md +2 -0
  505. package/docs/v1/basics/html.md +2 -0
  506. package/docs/v1/basics/objChecker.md +55 -0
  507. package/docs/v1/basics/objFilter.md +57 -86
  508. package/docs/v1/basics/promiseUtils.md +12 -3
  509. package/docs/v1/basics/text.md +0 -1
  510. package/docs/v1/libs/array/TinyArrayComparator.md +50 -39
  511. package/docs/v1/libs/fs/TinyFS.md +752 -0
  512. package/docs/v1/libs/fs/TinyOPFSFileSystem.md +495 -0
  513. package/docs/v1/libs/fs/TinyStorageBucketFileSystem.md +407 -0
  514. package/docs/v1/libs/plugin/TinyPlugin.md +441 -0
  515. package/docs/v1/libs/plugin/TinyVersion.md +145 -0
  516. package/docs/v1/libs/router/TinyRouter.md +216 -0
  517. package/docs/v1/libs/storage/TinyMapCache.md +219 -0
  518. package/docs/v1/libs/storage/TinySetMapDatabase.md +478 -0
  519. package/docs/v1/libs/sw/browser/TinyNotificationAdapter.md +280 -0
  520. package/docs/v1/libs/sw/browser/TinyPushManager.md +782 -0
  521. package/docs/v1/libs/sw/browser/TinyServiceWorker.md +365 -0
  522. package/docs/v1/libs/sw/browser/plugins/TabManager.md +133 -0
  523. package/docs/v1/libs/sw/service/TinyPushRouter.md +314 -0
  524. package/docs/v1/libs/sw/service/TinyServiceWorkerEngine.md +748 -0
  525. package/docs/v1/libs/sw/service/plugins/GlobBypassPlugin.md +229 -0
  526. package/docs/v1/libs/sw/service/plugins/GlobCachePlugin.md +91 -0
  527. package/docs/v1/libs/sw/service/plugins/Ping.md +36 -0
  528. package/docs/v1/libs/sw/service/plugins/TabManager.md +64 -0
  529. package/docs/v1/libs/sw/service/plugins/ViteFileDetector.md +92 -0
  530. package/docs/v1/libs/sw/service/shared/TinyPushPayload.md +316 -0
  531. package/docs/v1/libs/text/TinyI18.md +80 -56
  532. package/docs/v1/libs/tools/TinyBrowserMonitor.md +170 -0
  533. package/docs/v1/libs/tools/TinyDebugger.md +117 -1
  534. package/docs/v1/libs/tools/TinyHtmlTagRegexBuilder.md +141 -0
  535. package/docs/v1/libs/tools/TinyHttpResponseRegistry.md +129 -0
  536. package/docs/v1/libs/tools/TinyPasswordValidator.md +153 -0
  537. package/docs/v1/libs/tools/TinyPkgExportValidator.md +45 -1
  538. package/docs/v1/libs/tools/TinySiteMap.md +134 -0
  539. package/docs/v1/libs/tools/TinySiteMapStream.md +97 -0
  540. package/docs/v1/libs/tools/TinyURLSecurityVerifier.md +146 -0
  541. package/docs/v1/libs/tools/TinyUriParser/Discord.md +374 -0
  542. package/docs/v1/libs/tools/TinyUriParser/MatrixProtocol.md +54 -0
  543. package/docs/v1/libs/tools/TinyUriParser.md +128 -0
  544. package/docs/v1/libs/utils/TinyCloner.md +126 -0
  545. package/docs/v1/libs/utils/TinyPromiseQueue.md +1 -1
  546. package/docs/v1/libs/utils/TinyThrottledApi.md +219 -0
  547. package/docs/v1/libs/worker/browser/TinyWebWorker.md +331 -0
  548. package/docs/v1/libs/worker/engine/TinyWebWorkerEngine.md +137 -0
  549. package/docs/v1/regexp/Email.md +127 -0
  550. package/docs/v1/regexp/Glob.md +155 -0
  551. package/docs/v1/regexp/IPv4.md +103 -0
  552. package/docs/v1/regexp/IPv6.md +122 -0
  553. package/docs/v1/regexp/SegmentExtractor.md +120 -0
  554. package/docs/v1/regexp/UrlDetector.md +117 -0
  555. package/docs/v1/regexp/Username/Base.md +131 -0
  556. package/docs/v1/regexp/Username/Discord.md +267 -0
  557. package/docs/v1/regexp/Username/MatrixProtocol.md +131 -0
  558. package/docs/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters.md +569 -0
  559. package/docs/v1/webTemplates/bootstrap/5.3/html/BootstrapDialogs.md +174 -0
  560. package/docs/v1/webTemplates/media/MediaValidator/v1/Browser.md +123 -0
  561. package/docs/v1/webTemplates/media/MediaValidator/v1/Node.md +136 -0
  562. package/docs/v1/webTemplates/multiformats/14.0/IPFSHasher.md +310 -0
  563. package/docs/v1/webTemplates/vite/7.3/plugins/TinyVitePwaPlugin.md +131 -0
  564. package/docs/v1/webTemplates/vite/7.3/plugins/githubUtils.md +50 -0
  565. package/package.json +313 -18
  566. package/types/EventEmitter.d.ts +48 -0
  567. package/dist/v1/libs/text/TinyI18.d.mts.map +0 -1
@@ -0,0 +1,630 @@
1
+ /**
2
+ * @file Abstract, `node:fs/promises`-compatible file system.
3
+ *
4
+ * The class is a working implementation on its own: permissions, ownership and
5
+ * timestamps are stored in an in-memory side table. Backends extend it and
6
+ * override the `_`-prefixed protected hooks to delegate storage to a real
7
+ * medium.
8
+ *
9
+ * @divergence Every protected hook receives and returns raw values. Encoding,
10
+ * validation and metadata merging happen in the public methods.
11
+ */
12
+ import { DEFAULT_DIRECTORY_MODE, DEFAULT_FILE_MODE, DEFAULT_UMASK, ROOT_PATH, constants, } from './constants.mjs';
13
+ import { assertEncoding, assertInteger, assertMode, assertOptionsObject, assertPath, createFileSystemError, } from './error.mjs';
14
+ import { decodeBytes, toUint8Array } from './encoding.mjs';
15
+ import { Dirent, Stats } from './stats.mjs';
16
+ import { FileHandle } from './handle.mjs';
17
+ import { toSegments } from './path.mjs';
18
+ /**
19
+ * @typedef {import('./stats.mjs').FSDirectoryEntry} FSDirectoryEntry
20
+ * @typedef {import('./stats.mjs').Stats} StatsModule
21
+ * @typedef {import('./stats.mjs').FSMetadata} FSMetadata
22
+ * @typedef {import('./stats.mjs').FSStatDescriptor} FSStatDescriptor
23
+ */
24
+ /**
25
+ * @typedef {Object} FSIdentity
26
+ * @property {number} uid Effective user id.
27
+ * @property {number} gid Effective group id.
28
+ * @property {number[]} groups Supplementary group ids.
29
+ */
30
+ /**
31
+ * @typedef {Object} FSOptions
32
+ * @property {string} [cwd] Working directory used to resolve relative paths.
33
+ * @property {number} [umask] Permission mask applied on creation.
34
+ * @property {FSIdentity} [identity] Effective identity used by `access`.
35
+ */
36
+ /**
37
+ * @typedef {Object} FSCapabilities
38
+ * @property {boolean} permissions
39
+ * @property {boolean} ownership
40
+ * @property {boolean} symlinks
41
+ * @property {boolean} timestamps
42
+ * @property {boolean} atomicRename
43
+ * @property {boolean} seekableHandles
44
+ */
45
+ /**
46
+ * @typedef {Object} TReadFileOptions
47
+ * @property {string | null} [encoding] When omitted or `null`, a `Uint8Array` is returned.
48
+ */
49
+ /**
50
+ * @typedef {Object} TWriteFileOptions
51
+ * @property {string | null} [encoding] Encoding used to serialise string input.
52
+ * @property {boolean} [append] When `true`, the payload is appended.
53
+ * @property {number} [mode] Permission bits applied when the file is created.
54
+ */
55
+ /**
56
+ * @typedef {Object} TReaddirOptions
57
+ * @property {boolean} [withFileTypes] When `true`, resolves to `Dirent[]`.
58
+ * @property {boolean} [recursive] When `true`, walks sub-directories depth-first.
59
+ */
60
+ /**
61
+ * @typedef {Object} TMkdirOptions
62
+ * @property {boolean} [recursive] When `true`, missing parents are created.
63
+ * @property {number} [mode] Permission bits applied to the new directory.
64
+ */
65
+ /**
66
+ * @typedef {Object} TRmOptions
67
+ * @property {boolean} [recursive] When `true`, removes directories and their contents.
68
+ * @property {boolean} [force] When `true`, a missing path is not an error.
69
+ */
70
+ /**
71
+ * @typedef {Object} TStatOptions
72
+ * @property {boolean} [throwIfNoEntry] When `false`, resolves to `undefined` instead of throwing.
73
+ */
74
+ /**
75
+ * @typedef {Object} TCopyFileOptions
76
+ * @property {number} [mode] Bitmask of `constants.COPYFILE_*` flags.
77
+ */
78
+ /** @type {() => FSMetadata} */
79
+ const createDefaultMetadata = () => ({
80
+ mode: null,
81
+ uid: null,
82
+ gid: null,
83
+ atimeMs: null,
84
+ mtimeMs: null,
85
+ birthtimeMs: null,
86
+ });
87
+ /**
88
+ * Abstract, `node:fs/promises`-compatible file system.
89
+ * @beta
90
+ */
91
+ class TinyFSCore {
92
+ /** @type {Map<string, FSMetadata>} */
93
+ #metadata = new Map();
94
+ /** @type {string} */
95
+ #cwd;
96
+ /** @type {number} */
97
+ #umask;
98
+ /** @type {FSIdentity} */
99
+ #identity;
100
+ /**
101
+ * @param {FSOptions} [options] Construction options.
102
+ */
103
+ constructor(options = {}) {
104
+ const { cwd = ROOT_PATH, umask = DEFAULT_UMASK, identity, } = /** @type {FSOptions} */ (assertOptionsObject(options, 'constructor'));
105
+ this.#cwd = typeof cwd === 'string' ? cwd : ROOT_PATH;
106
+ this.#umask = typeof umask === 'number' ? umask : DEFAULT_UMASK;
107
+ this.#identity = {
108
+ uid: identity?.uid ?? 0,
109
+ gid: identity?.gid ?? 0,
110
+ groups: identity?.groups ?? [],
111
+ };
112
+ }
113
+ /**
114
+ * @returns {FSCapabilities} The capabilities advertised by the backend.
115
+ */
116
+ static get capabilities() {
117
+ return Object.freeze({
118
+ permissions: false,
119
+ ownership: false,
120
+ symlinks: false,
121
+ timestamps: false,
122
+ atomicRename: false,
123
+ seekableHandles: false,
124
+ });
125
+ }
126
+ /** @returns {string} Working directory used to resolve relative paths. */
127
+ get cwd() {
128
+ return this.#cwd;
129
+ }
130
+ /** @returns {number} Permission mask applied on creation. */
131
+ get umask() {
132
+ return this.#umask;
133
+ }
134
+ /** @returns {FSIdentity} Effective identity used by `access`. */
135
+ get identity() {
136
+ return this.#identity;
137
+ }
138
+ /* ------------------------------------------------------------------ */
139
+ /* Protected hooks — override in backends */
140
+ /* ------------------------------------------------------------------ */
141
+ /**
142
+ * @protected
143
+ * @param {string} targetPath Absolute path of the file.
144
+ * @returns {Promise<Uint8Array>} The raw file contents.
145
+ */
146
+ async _readFile(targetPath) {
147
+ throw this.#unsupported('readFile', targetPath);
148
+ }
149
+ /**
150
+ * @protected
151
+ * @param {string} targetPath Absolute path of the file.
152
+ * @param {Uint8Array} bytes Payload to persist.
153
+ * @param {TWriteFileOptions} options Write options.
154
+ * @returns {Promise<void>} Resolves once the payload is committed.
155
+ */
156
+ async _writeFile(targetPath, bytes, options) {
157
+ throw this.#unsupported('writeFile', targetPath);
158
+ }
159
+ /**
160
+ * @protected
161
+ * @param {string} targetPath Absolute path of the directory.
162
+ * @returns {Promise<FSDirectoryEntry[]>} The directory entries.
163
+ */
164
+ async _readdir(targetPath) {
165
+ throw this.#unsupported('readdir', targetPath);
166
+ }
167
+ /**
168
+ * @protected
169
+ * @param {string} targetPath Absolute path of the directory.
170
+ * @param {TMkdirOptions} options Creation options.
171
+ * @returns {Promise<void>} Resolves once the directory exists.
172
+ */
173
+ async _mkdir(targetPath, options) {
174
+ throw this.#unsupported('mkdir', targetPath);
175
+ }
176
+ /**
177
+ * @protected
178
+ * @param {string} targetPath Absolute path of the entry.
179
+ * @param {TRmOptions} options Removal options.
180
+ * @returns {Promise<void>} Resolves once the entry is gone.
181
+ */
182
+ async _rm(targetPath, options) {
183
+ throw this.#unsupported('rm', targetPath);
184
+ }
185
+ /**
186
+ * @protected
187
+ * @param {string} targetPath Absolute path of the entry.
188
+ * @returns {Promise<FSStatDescriptor | undefined>} The raw descriptor, or `undefined`.
189
+ */
190
+ async _stat(targetPath) {
191
+ throw this.#unsupported('stat', targetPath);
192
+ }
193
+ /**
194
+ * @protected
195
+ * @param {string} oldPath Current absolute path.
196
+ * @param {string} newPath Target absolute path.
197
+ * @returns {Promise<void>} Resolves once the move is complete.
198
+ */
199
+ async _rename(oldPath, newPath) {
200
+ throw this.#unsupported('rename', oldPath);
201
+ }
202
+ /**
203
+ * @protected
204
+ * @param {string} sourcePath Absolute path of the source file.
205
+ * @param {string} destinationPath Absolute path of the destination file.
206
+ * @param {number} mode Bitmask of `constants.COPYFILE_*` flags.
207
+ * @returns {Promise<void>} Resolves once the copy is complete.
208
+ */
209
+ async _copyFile(sourcePath, destinationPath, mode) {
210
+ throw this.#unsupported('copyFile', sourcePath);
211
+ }
212
+ /**
213
+ * @protected
214
+ * @param {string} targetPath Absolute path of the entry.
215
+ * @returns {Promise<FSMetadata>} The stored metadata.
216
+ */
217
+ async _readMetadata(targetPath) {
218
+ return this.#metadata.get(targetPath) ?? createDefaultMetadata();
219
+ }
220
+ /**
221
+ * @protected
222
+ * @param {string} targetPath Absolute path of the entry.
223
+ * @param {FSMetadata} metadata Metadata to persist.
224
+ * @returns {Promise<void>} Resolves once the metadata is committed.
225
+ */
226
+ async _writeMetadata(targetPath, metadata) {
227
+ this.#metadata.set(targetPath, metadata);
228
+ }
229
+ /* ------------------------------------------------------------------ */
230
+ /* Public API */
231
+ /* ------------------------------------------------------------------ */
232
+ /**
233
+ * Reads the entire contents of a file.
234
+ *
235
+ * @param {string} path Absolute path of the file.
236
+ * @param {TReadFileOptions} [options] Read options.
237
+ * @returns {Promise<string | Uint8Array>} The file contents.
238
+ */
239
+ async readFile(path, options = {}) {
240
+ const targetPath = assertPath(path, 'path');
241
+ const { encoding } = assertOptionsObject(options, 'readFile');
242
+ const resolvedEncoding = assertEncoding(encoding, 'readFile');
243
+ const bytes = await this._readFile(targetPath);
244
+ return decodeBytes(bytes, resolvedEncoding);
245
+ }
246
+ /**
247
+ * Writes data to a file, replacing it when it already exists.
248
+ *
249
+ * @param {string} path Absolute path of the file.
250
+ * @param {string | Uint8Array | ArrayBuffer} data Payload to persist.
251
+ * @param {TWriteFileOptions} [options] Write options.
252
+ * @returns {Promise<void>} Resolves once the payload is committed.
253
+ */
254
+ async writeFile(path, data, options = {}) {
255
+ const targetPath = assertPath(path, 'path');
256
+ const { encoding, append, mode } = assertOptionsObject(options, 'writeFile');
257
+ const resolvedEncoding = assertEncoding(encoding, 'writeFile');
258
+ const payload = toUint8Array(data, resolvedEncoding);
259
+ const exists = await this.exists(targetPath);
260
+ await this._writeFile(targetPath, payload, {
261
+ append: append === true,
262
+ mode: typeof mode === 'number' ? mode : undefined,
263
+ });
264
+ if (!exists) {
265
+ const resolvedMode = typeof mode === 'number' ? mode : DEFAULT_FILE_MODE;
266
+ await this._writeMetadata(targetPath, {
267
+ ...createDefaultMetadata(),
268
+ mode: resolvedMode & ~this.#umask,
269
+ uid: this.#identity.uid,
270
+ gid: this.#identity.gid,
271
+ birthtimeMs: Date.now(),
272
+ mtimeMs: Date.now(),
273
+ atimeMs: Date.now(),
274
+ });
275
+ }
276
+ }
277
+ /**
278
+ * Appends data to a file, creating it when missing.
279
+ *
280
+ * @param {string} path Absolute path of the file.
281
+ * @param {string | Uint8Array | ArrayBuffer} data Payload to append.
282
+ * @param {TWriteFileOptions} [options] Write options.
283
+ * @returns {Promise<void>} Resolves once the payload is committed.
284
+ */
285
+ async appendFile(path, data, options = {}) {
286
+ const targetPath = assertPath(path, 'path');
287
+ const validated = assertOptionsObject(options, 'appendFile');
288
+ return this.writeFile(targetPath, data, { ...validated, append: true });
289
+ }
290
+ /**
291
+ * Reads the contents of a directory.
292
+ *
293
+ * @param {string} path Absolute path of the directory.
294
+ * @param {TReaddirOptions} [options] Read options.
295
+ * @returns {Promise<Array<string | Dirent>>} The entry names, or `Dirent` objects.
296
+ */
297
+ async readdir(path, options = {}) {
298
+ const targetPath = assertPath(path, 'path');
299
+ const { withFileTypes, recursive } = assertOptionsObject(options, 'readdir');
300
+ const entries = await this._readdir(targetPath);
301
+ /** @type {Array<string | Dirent>} */
302
+ const output = [];
303
+ for (const entry of entries) {
304
+ output.push(withFileTypes === true ? new Dirent(entry.name, entry.kind) : entry.name);
305
+ if (recursive === true && entry.kind === 'directory') {
306
+ const nestedPath = `${targetPath.replace(/\/$/, '')}/${entry.name}`;
307
+ const nested = await this.readdir(nestedPath, options);
308
+ for (const nestedEntry of nested) {
309
+ const nestedName = typeof nestedEntry === 'string' ? nestedEntry : nestedEntry.name;
310
+ output.push(withFileTypes === true
311
+ ? new Dirent(`${entry.name}/${nestedName}`, 'file')
312
+ : `${entry.name}/${nestedName}`);
313
+ }
314
+ }
315
+ }
316
+ return output;
317
+ }
318
+ /**
319
+ * Creates a directory.
320
+ *
321
+ * @param {string} path Absolute path of the directory.
322
+ * @param {TMkdirOptions} [options] Creation options.
323
+ * @returns {Promise<string | undefined>} The created path when `recursive` is `true`.
324
+ */
325
+ async mkdir(path, options = {}) {
326
+ const targetPath = assertPath(path, 'path');
327
+ const { recursive, mode } = assertOptionsObject(options, 'mkdir');
328
+ await this._mkdir(targetPath, { recursive: recursive === true });
329
+ const resolvedMode = typeof mode === 'number' ? mode : DEFAULT_DIRECTORY_MODE;
330
+ await this._writeMetadata(targetPath, {
331
+ ...createDefaultMetadata(),
332
+ mode: resolvedMode & ~this.#umask,
333
+ uid: this.#identity.uid,
334
+ gid: this.#identity.gid,
335
+ birthtimeMs: Date.now(),
336
+ mtimeMs: Date.now(),
337
+ atimeMs: Date.now(),
338
+ });
339
+ return recursive === true ? targetPath : undefined;
340
+ }
341
+ /**
342
+ * Removes a file or, when `recursive` is `true`, a directory tree.
343
+ *
344
+ * @param {string} path Absolute path of the entry.
345
+ * @param {TRmOptions} [options] Removal options.
346
+ * @returns {Promise<void>} Resolves once the entry is gone.
347
+ */
348
+ async rm(path, options = {}) {
349
+ const targetPath = assertPath(path, 'path');
350
+ const { recursive, force } = assertOptionsObject(options, 'rm');
351
+ await this._rm(targetPath, { recursive: recursive === true, force: force === true });
352
+ this.#metadata.delete(targetPath);
353
+ }
354
+ /**
355
+ * Removes a file.
356
+ *
357
+ * @param {string} path Absolute path of the file.
358
+ * @returns {Promise<void>} Resolves once the file is gone.
359
+ */
360
+ async unlink(path) {
361
+ const targetPath = assertPath(path, 'path');
362
+ const stats = await this.__stat(targetPath);
363
+ if (stats?.isDirectory()) {
364
+ throw createFileSystemError('EISDIR', 'unlink', targetPath);
365
+ }
366
+ await this.rm(targetPath, { force: false });
367
+ }
368
+ /**
369
+ * Removes a directory.
370
+ *
371
+ * @param {string} path Absolute path of the directory.
372
+ * @param {TRmOptions} [options] Removal options.
373
+ * @returns {Promise<void>} Resolves once the directory is gone.
374
+ */
375
+ async rmdir(path, options = {}) {
376
+ const targetPath = assertPath(path, 'path');
377
+ const { recursive } = assertOptionsObject(options, 'rmdir');
378
+ await this.rm(targetPath, { recursive: recursive === true });
379
+ }
380
+ /**
381
+ * Renames or moves a file or directory.
382
+ *
383
+ * @param {string} oldPath Current absolute path.
384
+ * @param {string} newPath Target absolute path.
385
+ * @returns {Promise<void>} Resolves once the move is complete.
386
+ */
387
+ async rename(oldPath, newPath) {
388
+ const sourcePath = assertPath(oldPath, 'oldPath');
389
+ const destinationPath = assertPath(newPath, 'newPath');
390
+ await this._rename(sourcePath, destinationPath);
391
+ const metadata = await this._readMetadata(sourcePath);
392
+ await this._writeMetadata(destinationPath, metadata);
393
+ this.#metadata.delete(sourcePath);
394
+ }
395
+ /**
396
+ * Copies a file.
397
+ *
398
+ * @param {string} sourcePath Absolute path of the source file.
399
+ * @param {string} destinationPath Absolute path of the destination file.
400
+ * @param {number | TCopyFileOptions} [mode] Bitmask of `constants.COPYFILE_*` flags.
401
+ * @returns {Promise<void>} Resolves once the copy is complete.
402
+ */
403
+ async copyFile(sourcePath, destinationPath, mode = 0) {
404
+ const source = assertPath(sourcePath, 'sourcePath');
405
+ const destination = assertPath(destinationPath, 'destinationPath');
406
+ const flags = typeof mode === 'number' ? mode : 0;
407
+ await this._copyFile(source, destination, flags);
408
+ const metadata = await this._readMetadata(source);
409
+ await this._writeMetadata(destination, metadata);
410
+ }
411
+ /**
412
+ * Retrieves metadata about a file or directory.
413
+ *
414
+ * @param {string} path Absolute path of the entry.
415
+ * @param {TStatOptions} [options] Stat options.
416
+ * @returns {Promise<Stats | undefined>} The metadata snapshot.
417
+ */
418
+ async __stat(path, options = {}) {
419
+ const targetPath = assertPath(path, 'path');
420
+ const { throwIfNoEntry } = assertOptionsObject(options, 'stat');
421
+ const descriptor = await this._stat(targetPath);
422
+ if (descriptor === undefined) {
423
+ if (throwIfNoEntry === false) {
424
+ return undefined;
425
+ }
426
+ throw createFileSystemError('ENOENT', 'stat', targetPath);
427
+ }
428
+ const metadata = await this._readMetadata(targetPath);
429
+ const defaultMode = descriptor.kind === 'directory' ? DEFAULT_DIRECTORY_MODE : DEFAULT_FILE_MODE;
430
+ return new Stats({
431
+ path: targetPath,
432
+ name: descriptor.name,
433
+ kind: descriptor.kind,
434
+ size: descriptor.size,
435
+ mode: metadata.mode ?? defaultMode,
436
+ uid: metadata.uid ?? 0,
437
+ gid: metadata.gid ?? 0,
438
+ atimeMs: metadata.atimeMs ?? descriptor.mtimeMs,
439
+ mtimeMs: metadata.mtimeMs ?? descriptor.mtimeMs,
440
+ birthtimeMs: metadata.birthtimeMs ?? descriptor.mtimeMs,
441
+ ino: 0,
442
+ });
443
+ }
444
+ /**
445
+ * Retrieves metadata about a file or directory.
446
+ *
447
+ * @param {string} path Absolute path of the entry.
448
+ * @param {TStatOptions} [options] Stat options.
449
+ * @returns {Promise<Stats>} The metadata snapshot.
450
+ */
451
+ async stat(path, options = {}) {
452
+ const targetPath = assertPath(path, 'path');
453
+ const stats = await this.__stat(targetPath, options);
454
+ if (typeof stats === 'undefined') {
455
+ throw createFileSystemError('ENOENT', 'stat', targetPath);
456
+ }
457
+ return stats;
458
+ }
459
+ /**
460
+ * Alias of `stat`. The base class has no symbolic links.
461
+ *
462
+ * @param {string} path Absolute path of the entry.
463
+ * @param {TStatOptions} [options] Stat options.
464
+ * @returns {Promise<Stats | undefined>} The metadata snapshot.
465
+ */
466
+ async lstat(path, options = {}) {
467
+ return this.stat(path, options);
468
+ }
469
+ /**
470
+ * Checks whether a path is reachable.
471
+ *
472
+ * @param {string} path Absolute path of the entry.
473
+ * @param {number} [mode] Bitmask of `constants.F_OK`, `R_OK`, `W_OK` and `X_OK`.
474
+ * @returns {Promise<void>} Resolves when the path is reachable.
475
+ * @throws {Error} With `code: 'EACCES'` when the permission is missing.
476
+ */
477
+ async access(path, mode = constants.F_OK) {
478
+ const targetPath = assertPath(path, 'path');
479
+ if (typeof mode !== 'number' || !Number.isInteger(mode)) {
480
+ throw new TypeError('The "mode" argument must be an integer');
481
+ }
482
+ const stats = await this.__stat(targetPath);
483
+ if (mode === constants.F_OK) {
484
+ return;
485
+ }
486
+ if (!stats)
487
+ throw createFileSystemError('ENOENT', 'access', targetPath);
488
+ const shift = this.#resolvePermissionShift(stats.uid, stats.gid);
489
+ const granted = (stats.mode >> shift) & 0o7;
490
+ if (mode & constants.R_OK && !(granted & 0o4)) {
491
+ throw createFileSystemError('EACCES', 'access', targetPath);
492
+ }
493
+ if (mode & constants.W_OK && !(granted & 0o2)) {
494
+ throw createFileSystemError('EACCES', 'access', targetPath);
495
+ }
496
+ if (mode & constants.X_OK && !(granted & 0o1)) {
497
+ throw createFileSystemError('EACCES', 'access', targetPath);
498
+ }
499
+ }
500
+ /**
501
+ * Changes the permission bits of an entry.
502
+ *
503
+ * @param {string} path Absolute path of the entry.
504
+ * @param {number} mode New permission bits.
505
+ * @returns {Promise<void>} Resolves once the mode is committed.
506
+ */
507
+ async chmod(path, mode) {
508
+ const targetPath = assertPath(path, 'path');
509
+ const resolvedMode = assertMode(mode, 'mode');
510
+ const metadata = await this._readMetadata(targetPath);
511
+ await this._writeMetadata(targetPath, { ...metadata, mode: resolvedMode });
512
+ }
513
+ /**
514
+ * Changes the owner of an entry.
515
+ *
516
+ * @param {string} path Absolute path of the entry.
517
+ * @param {number} uid New owner user id.
518
+ * @param {number} [gid] New owner group id. Defaults to `uid`.
519
+ * @returns {Promise<void>} Resolves once the ownership is committed.
520
+ */
521
+ async chown(path, uid, gid) {
522
+ const targetPath = assertPath(path, 'path');
523
+ const resolvedUid = assertInteger(uid, 'uid');
524
+ const resolvedGid = gid === undefined ? resolvedUid : assertInteger(gid, 'gid');
525
+ const metadata = await this._readMetadata(targetPath);
526
+ await this._writeMetadata(targetPath, { ...metadata, uid: resolvedUid, gid: resolvedGid });
527
+ }
528
+ /**
529
+ * Updates the access and modification times of an entry.
530
+ *
531
+ * @param {string} path Absolute path of the entry.
532
+ * @param {number} atimeMs New access time in milliseconds since the epoch.
533
+ * @param {number} [mtimeMs] New modification time. Defaults to `atimeMs`.
534
+ * @returns {Promise<void>} Resolves once the timestamps are committed.
535
+ */
536
+ async utimes(path, atimeMs, mtimeMs) {
537
+ const targetPath = assertPath(path, 'path');
538
+ const resolvedAtime = assertInteger(atimeMs, 'atimeMs');
539
+ const resolvedMtime = mtimeMs === undefined ? resolvedAtime : assertInteger(mtimeMs, 'mtimeMs');
540
+ const metadata = await this._readMetadata(targetPath);
541
+ await this._writeMetadata(targetPath, {
542
+ ...metadata,
543
+ atimeMs: resolvedAtime,
544
+ mtimeMs: resolvedMtime,
545
+ });
546
+ }
547
+ /**
548
+ * Truncates a file to the given length.
549
+ *
550
+ * @param {string} path Absolute path of the file.
551
+ * @param {number} [length] Target length in bytes.
552
+ * @returns {Promise<void>} Resolves once the file is truncated.
553
+ */
554
+ async truncate(path, length = 0) {
555
+ const targetPath = assertPath(path, 'path');
556
+ const resolvedLength = assertInteger(length, 'length');
557
+ const current = await this.readFile(targetPath);
558
+ const bytes = /** @type {Uint8Array} */ (current);
559
+ const merged = new Uint8Array(resolvedLength);
560
+ merged.set(bytes.subarray(0, resolvedLength));
561
+ await this.writeFile(targetPath, merged);
562
+ }
563
+ /**
564
+ * Resolves the canonical absolute path.
565
+ *
566
+ * @param {string} path Absolute path of the entry.
567
+ * @returns {Promise<string>} The normalised absolute path.
568
+ */
569
+ async realpath(path) {
570
+ const targetPath = assertPath(path, 'path');
571
+ await this.__stat(targetPath);
572
+ return `/${toSegments(targetPath).join('/')}`;
573
+ }
574
+ /**
575
+ * Opens a file and returns a handle.
576
+ *
577
+ * @param {string} path Absolute path of the file.
578
+ * @param {string} [flags] Access mode, e.g. `'r'`, `'w'`, `'a'`.
579
+ * @returns {Promise<FileHandle>} The opened handle.
580
+ */
581
+ async open(path, flags = 'r') {
582
+ const targetPath = assertPath(path, 'path');
583
+ if (typeof flags !== 'string') {
584
+ throw new TypeError('The "flags" argument must be of type string');
585
+ }
586
+ if (flags.includes('w')) {
587
+ await this.writeFile(targetPath, new Uint8Array(0));
588
+ }
589
+ else if (flags.includes('a')) {
590
+ await this.writeFile(targetPath, new Uint8Array(0), { append: true });
591
+ }
592
+ else {
593
+ await this.__stat(targetPath);
594
+ }
595
+ return new FileHandle(this, targetPath, flags);
596
+ }
597
+ /**
598
+ * Reports whether a path exists.
599
+ *
600
+ * @param {string} path Absolute path of the entry.
601
+ * @returns {Promise<boolean>} `true` when the entry exists.
602
+ */
603
+ async exists(path) {
604
+ const stats = await this.__stat(path, { throwIfNoEntry: false });
605
+ return stats !== undefined;
606
+ }
607
+ /**
608
+ * @param {string} syscall Name of the unsupported operation.
609
+ * @param {string} targetPath Path the operation was applied to.
610
+ * @returns {Error} The error to throw.
611
+ */
612
+ #unsupported(syscall, targetPath) {
613
+ return createFileSystemError('ENOSYS', syscall, targetPath, `${syscall}() is not implemented by ${this.constructor.name}`);
614
+ }
615
+ /**
616
+ * @param {number} uid Owner user id of the entry.
617
+ * @param {number} gid Owner group id of the entry.
618
+ * @returns {number} Bit shift applied to the permission triad.
619
+ */
620
+ #resolvePermissionShift(uid, gid) {
621
+ if (uid === this.#identity.uid) {
622
+ return 6;
623
+ }
624
+ if (gid === this.#identity.gid || this.#identity.groups.includes(gid)) {
625
+ return 3;
626
+ }
627
+ return 0;
628
+ }
629
+ }
630
+ export default TinyFSCore;