tiny-essentials 1.28.19 โ†’ 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 (555) 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/index.cjs +88 -3
  109. package/dist/v1/index.d.mts +31 -6
  110. package/dist/v1/index.d.mts.map +1 -1
  111. package/dist/v1/index.mjs +32 -7
  112. package/dist/v1/jsdoc/EventEmitter.cjs +4 -0
  113. package/dist/v1/jsdoc/EventEmitter.d.mts +33 -0
  114. package/dist/v1/jsdoc/EventEmitter.d.mts.map +1 -0
  115. package/dist/v1/jsdoc/EventEmitter.mjs +18 -0
  116. package/dist/v1/libs/array/TinyArrayComparator.cjs +240 -25
  117. package/dist/v1/libs/array/TinyArrayComparator.d.mts +130 -22
  118. package/dist/v1/libs/array/TinyArrayComparator.d.mts.map +1 -1
  119. package/dist/v1/libs/array/TinyArrayComparator.mjs +210 -24
  120. package/dist/v1/libs/fs/constants.cjs +74 -0
  121. package/dist/v1/libs/fs/constants.d.mts +22 -0
  122. package/dist/v1/libs/fs/constants.d.mts.map +1 -0
  123. package/dist/v1/libs/fs/constants.mjs +53 -0
  124. package/dist/v1/libs/fs/encoding.cjs +118 -0
  125. package/dist/v1/libs/fs/encoding.d.mts +50 -0
  126. package/dist/v1/libs/fs/encoding.d.mts.map +1 -0
  127. package/dist/v1/libs/fs/encoding.mjs +102 -0
  128. package/dist/v1/libs/fs/error.cjs +188 -0
  129. package/dist/v1/libs/fs/error.d.mts +105 -0
  130. package/dist/v1/libs/fs/error.d.mts.map +1 -0
  131. package/dist/v1/libs/fs/error.mjs +158 -0
  132. package/dist/v1/libs/fs/handle.cjs +121 -0
  133. package/dist/v1/libs/fs/handle.d.mts +56 -0
  134. package/dist/v1/libs/fs/handle.d.mts.map +1 -0
  135. package/dist/v1/libs/fs/handle.mjs +100 -0
  136. package/dist/v1/libs/fs/index.cjs +700 -0
  137. package/dist/v1/libs/fs/index.d.mts +377 -0
  138. package/dist/v1/libs/fs/index.d.mts.map +1 -0
  139. package/dist/v1/libs/fs/index.mjs +630 -0
  140. package/dist/v1/libs/fs/path.cjs +234 -0
  141. package/dist/v1/libs/fs/path.d.mts +176 -0
  142. package/dist/v1/libs/fs/path.d.mts.map +1 -0
  143. package/dist/v1/libs/fs/path.mjs +197 -0
  144. package/dist/v1/libs/fs/plugins/OPFS/StorageBucket.cjs +202 -0
  145. package/dist/v1/libs/fs/plugins/OPFS/StorageBucket.d.mts +121 -0
  146. package/dist/v1/libs/fs/plugins/OPFS/StorageBucket.d.mts.map +1 -0
  147. package/dist/v1/libs/fs/plugins/OPFS/StorageBucket.mjs +172 -0
  148. package/dist/v1/libs/fs/plugins/OPFS/index.cjs +334 -0
  149. package/dist/v1/libs/fs/plugins/OPFS/index.d.mts +98 -0
  150. package/dist/v1/libs/fs/plugins/OPFS/index.d.mts.map +1 -0
  151. package/dist/v1/libs/fs/plugins/OPFS/index.mjs +300 -0
  152. package/dist/v1/libs/fs/stats.cjs +245 -0
  153. package/dist/v1/libs/fs/stats.d.mts +226 -0
  154. package/dist/v1/libs/fs/stats.d.mts.map +1 -0
  155. package/dist/v1/libs/fs/stats.mjs +197 -0
  156. package/dist/v1/libs/html/events/TinyIframeEvents.cjs +10 -1
  157. package/dist/v1/libs/html/events/TinyIframeEvents.d.mts +9 -2
  158. package/dist/v1/libs/html/events/TinyIframeEvents.d.mts.map +1 -1
  159. package/dist/v1/libs/html/events/TinyIframeEvents.mjs +8 -1
  160. package/dist/v1/libs/html/events/TinyNewWinEvents.cjs +14 -3
  161. package/dist/v1/libs/html/events/TinyNewWinEvents.d.mts +21 -5
  162. package/dist/v1/libs/html/events/TinyNewWinEvents.d.mts.map +1 -1
  163. package/dist/v1/libs/html/events/TinyNewWinEvents.mjs +12 -3
  164. package/dist/v1/libs/html/scroll/TinySmartScroller.cjs +13 -1
  165. package/dist/v1/libs/html/scroll/TinySmartScroller.d.mts +29 -2
  166. package/dist/v1/libs/html/scroll/TinySmartScroller.d.mts.map +1 -1
  167. package/dist/v1/libs/html/scroll/TinySmartScroller.mjs +11 -1
  168. package/dist/v1/libs/math/TinyAdvancedRaffle.cjs +13 -1
  169. package/dist/v1/libs/math/TinyAdvancedRaffle.d.mts +32 -2
  170. package/dist/v1/libs/math/TinyAdvancedRaffle.d.mts.map +1 -1
  171. package/dist/v1/libs/math/TinyAdvancedRaffle.mjs +11 -1
  172. package/dist/v1/libs/math/TinyTimeout.cjs +0 -14
  173. package/dist/v1/libs/math/TinyTimeout.d.mts +0 -11
  174. package/dist/v1/libs/math/TinyTimeout.d.mts.map +1 -1
  175. package/dist/v1/libs/math/TinyTimeout.mjs +0 -13
  176. package/dist/v1/libs/media/TinyMediaPlayer/index.cjs +25 -1
  177. package/dist/v1/libs/media/TinyMediaPlayer/index.d.mts +35 -2
  178. package/dist/v1/libs/media/TinyMediaPlayer/index.d.mts.map +1 -1
  179. package/dist/v1/libs/media/TinyMediaPlayer/index.mjs +23 -1
  180. package/dist/v1/libs/media/TinyMediaPlayer.cjs +2 -2
  181. package/dist/v1/libs/media/TinyMediaPlayer.d.mts +2 -2
  182. package/dist/v1/libs/media/TinyMediaPlayer.d.mts.map +1 -1
  183. package/dist/v1/libs/media/TinyMediaPlayer.mjs +2 -2
  184. package/dist/v1/libs/media/TinyRadioFm.cjs +19 -1
  185. package/dist/v1/libs/media/TinyRadioFm.d.mts +78 -2
  186. package/dist/v1/libs/media/TinyRadioFm.d.mts.map +1 -1
  187. package/dist/v1/libs/media/TinyRadioFm.mjs +17 -1
  188. package/dist/v1/libs/plugin/TinyPlugin.cjs +1630 -0
  189. package/dist/v1/libs/plugin/TinyPlugin.d.mts +753 -0
  190. package/dist/v1/libs/plugin/TinyPlugin.d.mts.map +1 -0
  191. package/dist/v1/libs/plugin/TinyPlugin.mjs +1376 -0
  192. package/dist/v1/libs/plugin/TinyVersion.cjs +204 -0
  193. package/dist/v1/libs/plugin/TinyVersion.d.mts +70 -0
  194. package/dist/v1/libs/plugin/TinyVersion.d.mts.map +1 -0
  195. package/dist/v1/libs/plugin/TinyVersion.mjs +179 -0
  196. package/dist/v1/libs/router/TinyRouter.cjs +661 -0
  197. package/dist/v1/libs/router/TinyRouter.d.mts +320 -0
  198. package/dist/v1/libs/router/TinyRouter.d.mts.map +1 -0
  199. package/dist/v1/libs/router/TinyRouter.mjs +572 -0
  200. package/dist/v1/libs/storage/TinyLocalStorage.cjs +20 -1
  201. package/dist/v1/libs/storage/TinyLocalStorage.d.mts +64 -2
  202. package/dist/v1/libs/storage/TinyLocalStorage.d.mts.map +1 -1
  203. package/dist/v1/libs/storage/TinyLocalStorage.mjs +18 -1
  204. package/dist/v1/libs/storage/TinyMapCache.cjs +373 -0
  205. package/dist/v1/libs/storage/TinyMapCache.d.mts +274 -0
  206. package/dist/v1/libs/storage/TinyMapCache.d.mts.map +1 -0
  207. package/dist/v1/libs/storage/TinyMapCache.mjs +333 -0
  208. package/dist/v1/libs/storage/TinySetMapDatabase.cjs +1167 -0
  209. package/dist/v1/libs/storage/TinySetMapDatabase.d.mts +603 -0
  210. package/dist/v1/libs/storage/TinySetMapDatabase.d.mts.map +1 -0
  211. package/dist/v1/libs/storage/TinySetMapDatabase.mjs +1059 -0
  212. package/dist/v1/libs/sw/browser/TinyNotificationAdapter.cjs +126 -0
  213. package/dist/v1/libs/sw/browser/TinyNotificationAdapter.d.mts +132 -0
  214. package/dist/v1/libs/sw/browser/TinyNotificationAdapter.d.mts.map +1 -0
  215. package/dist/v1/libs/sw/browser/TinyNotificationAdapter.mjs +109 -0
  216. package/dist/v1/libs/sw/browser/TinyPushManager.cjs +310 -0
  217. package/dist/v1/libs/sw/browser/TinyPushManager.d.mts +168 -0
  218. package/dist/v1/libs/sw/browser/TinyPushManager.d.mts.map +1 -0
  219. package/dist/v1/libs/sw/browser/TinyPushManager.mjs +264 -0
  220. package/dist/v1/libs/sw/browser/TinyServiceWorker.cjs +1060 -0
  221. package/dist/v1/libs/sw/browser/TinyServiceWorker.d.mts +348 -0
  222. package/dist/v1/libs/sw/browser/TinyServiceWorker.d.mts.map +1 -0
  223. package/dist/v1/libs/sw/browser/TinyServiceWorker.mjs +933 -0
  224. package/dist/v1/libs/sw/browser/plugins/TabManager.cjs +315 -0
  225. package/dist/v1/libs/sw/browser/plugins/TabManager.d.mts +178 -0
  226. package/dist/v1/libs/sw/browser/plugins/TabManager.d.mts.map +1 -0
  227. package/dist/v1/libs/sw/browser/plugins/TabManager.mjs +274 -0
  228. package/dist/v1/libs/sw/browser/utils.cjs +28 -0
  229. package/dist/v1/libs/sw/browser/utils.d.mts +8 -0
  230. package/dist/v1/libs/sw/browser/utils.d.mts.map +1 -0
  231. package/dist/v1/libs/sw/browser/utils.mjs +21 -0
  232. package/dist/v1/libs/sw/service/TinyPushRouter.cjs +222 -0
  233. package/dist/v1/libs/sw/service/TinyPushRouter.d.mts +138 -0
  234. package/dist/v1/libs/sw/service/TinyPushRouter.d.mts.map +1 -0
  235. package/dist/v1/libs/sw/service/TinyPushRouter.mjs +201 -0
  236. package/dist/v1/libs/sw/service/TinyServiceWorkerEngine.cjs +3016 -0
  237. package/dist/v1/libs/sw/service/TinyServiceWorkerEngine.d.mts +993 -0
  238. package/dist/v1/libs/sw/service/TinyServiceWorkerEngine.d.mts.map +1 -0
  239. package/dist/v1/libs/sw/service/TinyServiceWorkerEngine.mjs +2558 -0
  240. package/dist/v1/libs/sw/service/plugins/GlobBypassPlugin.cjs +88 -0
  241. package/dist/v1/libs/sw/service/plugins/GlobBypassPlugin.d.mts +32 -0
  242. package/dist/v1/libs/sw/service/plugins/GlobBypassPlugin.d.mts.map +1 -0
  243. package/dist/v1/libs/sw/service/plugins/GlobBypassPlugin.mjs +69 -0
  244. package/dist/v1/libs/sw/service/plugins/GlobCachePlugin.cjs +112 -0
  245. package/dist/v1/libs/sw/service/plugins/GlobCachePlugin.d.mts +31 -0
  246. package/dist/v1/libs/sw/service/plugins/GlobCachePlugin.d.mts.map +1 -0
  247. package/dist/v1/libs/sw/service/plugins/GlobCachePlugin.mjs +91 -0
  248. package/dist/v1/libs/sw/service/plugins/Ping.cjs +32 -0
  249. package/dist/v1/libs/sw/service/plugins/Ping.d.mts +9 -0
  250. package/dist/v1/libs/sw/service/plugins/Ping.d.mts.map +1 -0
  251. package/dist/v1/libs/sw/service/plugins/Ping.mjs +25 -0
  252. package/dist/v1/libs/sw/service/plugins/TabManager.cjs +457 -0
  253. package/dist/v1/libs/sw/service/plugins/TabManager.d.mts +91 -0
  254. package/dist/v1/libs/sw/service/plugins/TabManager.d.mts.map +1 -0
  255. package/dist/v1/libs/sw/service/plugins/TabManager.mjs +372 -0
  256. package/dist/v1/libs/sw/service/plugins/ViteFileDetector.cjs +180 -0
  257. package/dist/v1/libs/sw/service/plugins/ViteFileDetector.d.mts +28 -0
  258. package/dist/v1/libs/sw/service/plugins/ViteFileDetector.d.mts.map +1 -0
  259. package/dist/v1/libs/sw/service/plugins/ViteFileDetector.mjs +148 -0
  260. package/dist/v1/libs/sw/service/shared/TinyPushPayload.cjs +199 -0
  261. package/dist/v1/libs/sw/service/shared/TinyPushPayload.d.mts +80 -0
  262. package/dist/v1/libs/sw/service/shared/TinyPushPayload.d.mts.map +1 -0
  263. package/dist/v1/libs/sw/service/shared/TinyPushPayload.mjs +174 -0
  264. package/dist/v1/libs/sw/utils.cjs +57 -0
  265. package/dist/v1/libs/sw/utils.d.mts +173 -0
  266. package/dist/v1/libs/sw/utils.d.mts.map +1 -0
  267. package/dist/v1/libs/sw/utils.mjs +50 -0
  268. package/dist/v1/libs/text/TinyI18/Browser-NON-DOM.cjs +57 -0
  269. package/dist/v1/libs/text/TinyI18/Browser-NON-DOM.d.mts +39 -0
  270. package/dist/v1/libs/text/TinyI18/Browser-NON-DOM.d.mts.map +1 -0
  271. package/dist/v1/libs/text/TinyI18/Browser-NON-DOM.mjs +48 -0
  272. package/dist/v1/libs/text/TinyI18/Browser.cjs +64 -0
  273. package/dist/v1/libs/text/TinyI18/Browser.d.mts +47 -0
  274. package/dist/v1/libs/text/TinyI18/Browser.d.mts.map +1 -0
  275. package/dist/v1/libs/text/TinyI18/Browser.mjs +57 -0
  276. package/dist/v1/libs/text/TinyI18/Node.cjs +49 -0
  277. package/dist/v1/libs/text/TinyI18/Node.d.mts +38 -0
  278. package/dist/v1/libs/text/TinyI18/Node.d.mts.map +1 -0
  279. package/dist/v1/libs/text/TinyI18/Node.mjs +43 -0
  280. package/dist/v1/libs/text/TinyI18/browser-utils.cjs +17 -0
  281. package/dist/v1/libs/text/TinyI18/browser-utils.d.mts +8 -0
  282. package/dist/v1/libs/text/TinyI18/browser-utils.d.mts.map +1 -0
  283. package/dist/v1/libs/text/TinyI18/browser-utils.mjs +13 -0
  284. package/dist/v1/libs/text/{TinyI18.cjs โ†’ TinyI18/index.cjs} +205 -104
  285. package/dist/v1/libs/text/{TinyI18.d.mts โ†’ TinyI18/index.d.mts} +141 -92
  286. package/dist/v1/libs/text/TinyI18/index.d.mts.map +1 -0
  287. package/dist/v1/libs/text/{TinyI18.mjs โ†’ TinyI18/index.mjs} +195 -101
  288. package/dist/v1/libs/tools/TinyBrowserMonitor.cjs +1088 -0
  289. package/dist/v1/libs/tools/TinyBrowserMonitor.d.mts +621 -0
  290. package/dist/v1/libs/tools/TinyBrowserMonitor.d.mts.map +1 -0
  291. package/dist/v1/libs/tools/TinyBrowserMonitor.mjs +940 -0
  292. package/dist/v1/libs/tools/TinyDebugger.cjs +180 -19
  293. package/dist/v1/libs/tools/TinyDebugger.d.mts +220 -24
  294. package/dist/v1/libs/tools/TinyDebugger.d.mts.map +1 -1
  295. package/dist/v1/libs/tools/TinyDebugger.mjs +161 -19
  296. package/dist/v1/libs/tools/TinyHtmlTagRegexBuilder.cjs +256 -0
  297. package/dist/v1/libs/tools/TinyHtmlTagRegexBuilder.d.mts +125 -0
  298. package/dist/v1/libs/tools/TinyHtmlTagRegexBuilder.d.mts.map +1 -0
  299. package/dist/v1/libs/tools/TinyHtmlTagRegexBuilder.mjs +223 -0
  300. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser-NON-DOM.cjs +23 -0
  301. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser-NON-DOM.d.mts +17 -0
  302. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser-NON-DOM.d.mts.map +1 -0
  303. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser-NON-DOM.mjs +19 -0
  304. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser.cjs +23 -0
  305. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser.d.mts +17 -0
  306. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser.d.mts.map +1 -0
  307. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser.mjs +19 -0
  308. package/dist/v1/libs/tools/TinyHttpResponseRegistry/EmptyRequestCodes.cjs +390 -0
  309. package/dist/v1/libs/tools/TinyHttpResponseRegistry/EmptyRequestCodes.d.mts +9 -0
  310. package/dist/v1/libs/tools/TinyHttpResponseRegistry/EmptyRequestCodes.d.mts.map +1 -0
  311. package/dist/v1/libs/tools/TinyHttpResponseRegistry/EmptyRequestCodes.mjs +387 -0
  312. package/dist/v1/libs/tools/TinyHttpResponseRegistry/JsDoc.cjs +2 -0
  313. package/dist/v1/libs/tools/TinyHttpResponseRegistry/JsDoc.d.mts +27 -0
  314. package/dist/v1/libs/tools/TinyHttpResponseRegistry/JsDoc.d.mts.map +1 -0
  315. package/dist/v1/libs/tools/TinyHttpResponseRegistry/JsDoc.mjs +12 -0
  316. package/dist/v1/libs/tools/TinyHttpResponseRegistry/MozillaRequestCodes/LICENSE +53 -0
  317. package/dist/v1/libs/tools/TinyHttpResponseRegistry/MozillaRequestCodes/index.cjs +405 -0
  318. package/dist/v1/libs/tools/TinyHttpResponseRegistry/MozillaRequestCodes/index.d.mts +34 -0
  319. package/dist/v1/libs/tools/TinyHttpResponseRegistry/MozillaRequestCodes/index.d.mts.map +1 -0
  320. package/dist/v1/libs/tools/TinyHttpResponseRegistry/MozillaRequestCodes/index.mjs +342 -0
  321. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Node.cjs +23 -0
  322. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Node.d.mts +17 -0
  323. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Node.d.mts.map +1 -0
  324. package/dist/v1/libs/tools/TinyHttpResponseRegistry/Node.mjs +19 -0
  325. package/dist/v1/libs/tools/TinyHttpResponseRegistry/RequestCodes.cjs +327 -0
  326. package/dist/v1/libs/tools/TinyHttpResponseRegistry/RequestCodes.d.mts +9 -0
  327. package/dist/v1/libs/tools/TinyHttpResponseRegistry/RequestCodes.d.mts.map +1 -0
  328. package/dist/v1/libs/tools/TinyHttpResponseRegistry/RequestCodes.mjs +324 -0
  329. package/dist/v1/libs/tools/TinyHttpResponseRegistry/index.cjs +268 -0
  330. package/dist/v1/libs/tools/TinyHttpResponseRegistry/index.d.mts +107 -0
  331. package/dist/v1/libs/tools/TinyHttpResponseRegistry/index.d.mts.map +1 -0
  332. package/dist/v1/libs/tools/TinyHttpResponseRegistry/index.mjs +238 -0
  333. package/dist/v1/libs/tools/TinyPasswordValidator.cjs +491 -0
  334. package/dist/v1/libs/tools/TinyPasswordValidator.d.mts +246 -0
  335. package/dist/v1/libs/tools/TinyPasswordValidator.d.mts.map +1 -0
  336. package/dist/v1/libs/tools/TinyPasswordValidator.mjs +434 -0
  337. package/dist/v1/libs/tools/TinyPkgExportValidator.cjs +48 -0
  338. package/dist/v1/libs/tools/TinyPkgExportValidator.d.mts +14 -0
  339. package/dist/v1/libs/tools/TinyPkgExportValidator.d.mts.map +1 -1
  340. package/dist/v1/libs/tools/TinyPkgExportValidator.mjs +44 -0
  341. package/dist/v1/libs/tools/TinySiteMap.cjs +1029 -0
  342. package/dist/v1/libs/tools/TinySiteMap.d.mts +429 -0
  343. package/dist/v1/libs/tools/TinySiteMap.d.mts.map +1 -0
  344. package/dist/v1/libs/tools/TinySiteMap.mjs +910 -0
  345. package/dist/v1/libs/tools/TinySiteMapStream.cjs +121 -0
  346. package/dist/v1/libs/tools/TinySiteMapStream.d.mts +51 -0
  347. package/dist/v1/libs/tools/TinySiteMapStream.d.mts.map +1 -0
  348. package/dist/v1/libs/tools/TinySiteMapStream.mjs +85 -0
  349. package/dist/v1/libs/tools/TinyURLSecurityVerifier.cjs +444 -0
  350. package/dist/v1/libs/tools/TinyURLSecurityVerifier.d.mts +217 -0
  351. package/dist/v1/libs/tools/TinyURLSecurityVerifier.d.mts.map +1 -0
  352. package/dist/v1/libs/tools/TinyURLSecurityVerifier.mjs +394 -0
  353. package/dist/v1/libs/tools/TinyUriParser/BlueSky.cjs +613 -0
  354. package/dist/v1/libs/tools/TinyUriParser/BlueSky.d.mts +152 -0
  355. package/dist/v1/libs/tools/TinyUriParser/BlueSky.d.mts.map +1 -0
  356. package/dist/v1/libs/tools/TinyUriParser/BlueSky.mjs +527 -0
  357. package/dist/v1/libs/tools/TinyUriParser/Discord.cjs +1119 -0
  358. package/dist/v1/libs/tools/TinyUriParser/Discord.d.mts +306 -0
  359. package/dist/v1/libs/tools/TinyUriParser/Discord.d.mts.map +1 -0
  360. package/dist/v1/libs/tools/TinyUriParser/Discord.mjs +968 -0
  361. package/dist/v1/libs/tools/TinyUriParser/MatrixProtocol.cjs +469 -0
  362. package/dist/v1/libs/tools/TinyUriParser/MatrixProtocol.d.mts +80 -0
  363. package/dist/v1/libs/tools/TinyUriParser/MatrixProtocol.d.mts.map +1 -0
  364. package/dist/v1/libs/tools/TinyUriParser/MatrixProtocol.mjs +379 -0
  365. package/dist/v1/libs/tools/TinyUriParser.cjs +217 -0
  366. package/dist/v1/libs/tools/TinyUriParser.d.mts +109 -0
  367. package/dist/v1/libs/tools/TinyUriParser.d.mts.map +1 -0
  368. package/dist/v1/libs/tools/TinyUriParser.mjs +183 -0
  369. package/dist/v1/libs/utils/TinyCloner.cjs +466 -0
  370. package/dist/v1/libs/utils/TinyCloner.d.mts +221 -0
  371. package/dist/v1/libs/utils/TinyCloner.d.mts.map +1 -0
  372. package/dist/v1/libs/utils/TinyCloner.mjs +416 -0
  373. package/dist/v1/libs/utils/TinyPromiseQueue.cjs +1 -1
  374. package/dist/v1/libs/utils/TinyPromiseQueue.d.mts +2 -2
  375. package/dist/v1/libs/utils/TinyPromiseQueue.d.mts.map +1 -1
  376. package/dist/v1/libs/utils/TinyPromiseQueue.mjs +1 -1
  377. package/dist/v1/libs/utils/TinyThrottledApi.cjs +333 -0
  378. package/dist/v1/libs/utils/TinyThrottledApi.d.mts +163 -0
  379. package/dist/v1/libs/utils/TinyThrottledApi.d.mts.map +1 -0
  380. package/dist/v1/libs/utils/TinyThrottledApi.mjs +294 -0
  381. package/dist/v1/libs/worker/browser/TinyWebWorker.cjs +342 -0
  382. package/dist/v1/libs/worker/browser/TinyWebWorker.d.mts +97 -0
  383. package/dist/v1/libs/worker/browser/TinyWebWorker.d.mts.map +1 -0
  384. package/dist/v1/libs/worker/browser/TinyWebWorker.mjs +305 -0
  385. package/dist/v1/libs/worker/engine/TinyWebWorkerEngine.cjs +346 -0
  386. package/dist/v1/libs/worker/engine/TinyWebWorkerEngine.d.mts +127 -0
  387. package/dist/v1/libs/worker/engine/TinyWebWorkerEngine.d.mts.map +1 -0
  388. package/dist/v1/libs/worker/engine/TinyWebWorkerEngine.mjs +304 -0
  389. package/dist/v1/regexp/Email.cjs +185 -0
  390. package/dist/v1/regexp/Email.d.mts +73 -0
  391. package/dist/v1/regexp/Email.d.mts.map +1 -0
  392. package/dist/v1/regexp/Email.mjs +153 -0
  393. package/dist/v1/regexp/Glob.cjs +293 -0
  394. package/dist/v1/regexp/Glob.d.mts +45 -0
  395. package/dist/v1/regexp/Glob.d.mts.map +1 -0
  396. package/dist/v1/regexp/Glob.mjs +260 -0
  397. package/dist/v1/regexp/Ipv4.cjs +57 -0
  398. package/dist/v1/regexp/Ipv4.d.mts +29 -0
  399. package/dist/v1/regexp/Ipv4.d.mts.map +1 -0
  400. package/dist/v1/regexp/Ipv4.mjs +45 -0
  401. package/dist/v1/regexp/Ipv6.cjs +67 -0
  402. package/dist/v1/regexp/Ipv6.d.mts +29 -0
  403. package/dist/v1/regexp/Ipv6.d.mts.map +1 -0
  404. package/dist/v1/regexp/Ipv6.mjs +54 -0
  405. package/dist/v1/regexp/SegmentExtractor.cjs +145 -0
  406. package/dist/v1/regexp/SegmentExtractor.d.mts +91 -0
  407. package/dist/v1/regexp/SegmentExtractor.d.mts.map +1 -0
  408. package/dist/v1/regexp/SegmentExtractor.mjs +116 -0
  409. package/dist/v1/regexp/UrlDetector.cjs +125 -0
  410. package/dist/v1/regexp/UrlDetector.d.mts +67 -0
  411. package/dist/v1/regexp/UrlDetector.d.mts.map +1 -0
  412. package/dist/v1/regexp/UrlDetector.mjs +102 -0
  413. package/dist/v1/regexp/Username/index.cjs +233 -0
  414. package/dist/v1/regexp/Username/index.d.mts +77 -0
  415. package/dist/v1/regexp/Username/index.d.mts.map +1 -0
  416. package/dist/v1/regexp/Username/index.mjs +199 -0
  417. package/dist/v1/regexp/Username/jsDoc.cjs +2 -0
  418. package/dist/v1/regexp/Username/jsDoc.d.mts +57 -0
  419. package/dist/v1/regexp/Username/jsDoc.d.mts.map +1 -0
  420. package/dist/v1/regexp/Username/jsDoc.mjs +18 -0
  421. package/dist/v1/regexp/Username/templates/BlueSky.cjs +56 -0
  422. package/dist/v1/regexp/Username/templates/BlueSky.d.mts +35 -0
  423. package/dist/v1/regexp/Username/templates/BlueSky.d.mts.map +1 -0
  424. package/dist/v1/regexp/Username/templates/BlueSky.mjs +52 -0
  425. package/dist/v1/regexp/Username/templates/Discord.cjs +505 -0
  426. package/dist/v1/regexp/Username/templates/Discord.d.mts +209 -0
  427. package/dist/v1/regexp/Username/templates/Discord.d.mts.map +1 -0
  428. package/dist/v1/regexp/Username/templates/Discord.mjs +458 -0
  429. package/dist/v1/regexp/Username/templates/MatrixProtocol.cjs +143 -0
  430. package/dist/v1/regexp/Username/templates/MatrixProtocol.d.mts +70 -0
  431. package/dist/v1/regexp/Username/templates/MatrixProtocol.d.mts.map +1 -0
  432. package/dist/v1/regexp/Username/templates/MatrixProtocol.mjs +128 -0
  433. package/dist/v1/regexp/Username/templates/deprecated/Discord.cjs +24 -0
  434. package/dist/v1/regexp/Username/templates/deprecated/Discord.d.mts +17 -0
  435. package/dist/v1/regexp/Username/templates/deprecated/Discord.d.mts.map +1 -0
  436. package/dist/v1/regexp/Username/templates/deprecated/Discord.mjs +20 -0
  437. package/dist/v1/regexp/Username/templates/index.cjs +11 -0
  438. package/dist/v1/regexp/Username/templates/index.d.mts +5 -0
  439. package/dist/v1/regexp/Username/templates/index.d.mts.map +1 -0
  440. package/dist/v1/regexp/Username/templates/index.mjs +4 -0
  441. package/dist/v1/regexp/index.cjs +41 -0
  442. package/dist/v1/regexp/index.d.mts +9 -0
  443. package/dist/v1/regexp/index.d.mts.map +1 -0
  444. package/dist/v1/regexp/index.mjs +8 -0
  445. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Browser.cjs +64 -0
  446. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Browser.d.mts +11 -0
  447. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Browser.d.mts.map +1 -0
  448. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Browser.mjs +51 -0
  449. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/FileInput.cjs +66 -0
  450. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/FileInput.d.mts +11 -0
  451. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/FileInput.d.mts.map +1 -0
  452. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/FileInput.mjs +51 -0
  453. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Node.cjs +39 -0
  454. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Node.d.mts +11 -0
  455. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Node.d.mts.map +1 -0
  456. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Node.mjs +28 -0
  457. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Template.cjs +494 -0
  458. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Template.d.mts +142 -0
  459. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Template.d.mts.map +1 -0
  460. package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Template.mjs +445 -0
  461. package/dist/v1/webTemplates/bootstrap/5.3/html/BootstrapDialogs.cjs +30 -4
  462. package/dist/v1/webTemplates/bootstrap/5.3/html/BootstrapDialogs.d.mts +5 -2
  463. package/dist/v1/webTemplates/bootstrap/5.3/html/BootstrapDialogs.d.mts.map +1 -1
  464. package/dist/v1/webTemplates/bootstrap/5.3/html/BootstrapDialogs.mjs +29 -5
  465. package/dist/v1/webTemplates/media/MediaValidator/v1/Browser/index.cjs +135 -0
  466. package/dist/v1/webTemplates/media/MediaValidator/v1/Browser/index.d.mts +83 -0
  467. package/dist/v1/webTemplates/media/MediaValidator/v1/Browser/index.d.mts.map +1 -0
  468. package/dist/v1/webTemplates/media/MediaValidator/v1/Browser/index.mjs +120 -0
  469. package/dist/v1/webTemplates/media/MediaValidator/v1/Node/index.cjs +127 -0
  470. package/dist/v1/webTemplates/media/MediaValidator/v1/Node/index.d.mts +95 -0
  471. package/dist/v1/webTemplates/media/MediaValidator/v1/Node/index.d.mts.map +1 -0
  472. package/dist/v1/webTemplates/media/MediaValidator/v1/Node/index.mjs +109 -0
  473. package/dist/v1/webTemplates/multiformats/14.0/IPFSHasher/index.cjs +83 -0
  474. package/dist/v1/webTemplates/multiformats/14.0/IPFSHasher/index.d.mts +46 -0
  475. package/dist/v1/webTemplates/multiformats/14.0/IPFSHasher/index.d.mts.map +1 -0
  476. package/dist/v1/webTemplates/multiformats/14.0/IPFSHasher/index.mjs +71 -0
  477. package/dist/v1/webTemplates/vite/7.3/plugins/TinyVitePwaPlugin.cjs +493 -0
  478. package/dist/v1/webTemplates/vite/7.3/plugins/TinyVitePwaPlugin.d.mts +67 -0
  479. package/dist/v1/webTemplates/vite/7.3/plugins/TinyVitePwaPlugin.d.mts.map +1 -0
  480. package/dist/v1/webTemplates/vite/7.3/plugins/TinyVitePwaPlugin.mjs +399 -0
  481. package/dist/v1/webTemplates/vite/7.3/plugins/githubUtils.cjs +35 -0
  482. package/dist/v1/webTemplates/vite/7.3/plugins/githubUtils.d.mts +6 -0
  483. package/dist/v1/webTemplates/vite/7.3/plugins/githubUtils.d.mts.map +1 -0
  484. package/dist/v1/webTemplates/vite/7.3/plugins/githubUtils.mjs +29 -0
  485. package/docs/info/RegExp.md +74 -0
  486. package/docs/v1/Exports.md +101 -0
  487. package/docs/v1/README.md +113 -15
  488. package/docs/v1/basics/asyncReplace.md +2 -0
  489. package/docs/v1/basics/browserDetector.md +28 -11
  490. package/docs/v1/basics/crypto.md +85 -0
  491. package/docs/v1/basics/deprecated/html.md +2 -0
  492. package/docs/v1/basics/deprecated/objFilter.md +2 -0
  493. package/docs/v1/basics/html.md +2 -0
  494. package/docs/v1/basics/objChecker.md +55 -0
  495. package/docs/v1/basics/objFilter.md +57 -86
  496. package/docs/v1/basics/promiseUtils.md +12 -3
  497. package/docs/v1/basics/text.md +0 -1
  498. package/docs/v1/libs/array/TinyArrayComparator.md +50 -39
  499. package/docs/v1/libs/fs/TinyFS.md +752 -0
  500. package/docs/v1/libs/fs/TinyOPFSFileSystem.md +495 -0
  501. package/docs/v1/libs/fs/TinyStorageBucketFileSystem.md +407 -0
  502. package/docs/v1/libs/plugin/TinyPlugin.md +441 -0
  503. package/docs/v1/libs/plugin/TinyVersion.md +145 -0
  504. package/docs/v1/libs/router/TinyRouter.md +216 -0
  505. package/docs/v1/libs/storage/TinyMapCache.md +219 -0
  506. package/docs/v1/libs/storage/TinySetMapDatabase.md +478 -0
  507. package/docs/v1/libs/sw/browser/TinyNotificationAdapter.md +280 -0
  508. package/docs/v1/libs/sw/browser/TinyPushManager.md +782 -0
  509. package/docs/v1/libs/sw/browser/TinyServiceWorker.md +365 -0
  510. package/docs/v1/libs/sw/browser/plugins/TabManager.md +133 -0
  511. package/docs/v1/libs/sw/service/TinyPushRouter.md +314 -0
  512. package/docs/v1/libs/sw/service/TinyServiceWorkerEngine.md +748 -0
  513. package/docs/v1/libs/sw/service/plugins/GlobBypassPlugin.md +229 -0
  514. package/docs/v1/libs/sw/service/plugins/GlobCachePlugin.md +91 -0
  515. package/docs/v1/libs/sw/service/plugins/Ping.md +36 -0
  516. package/docs/v1/libs/sw/service/plugins/TabManager.md +64 -0
  517. package/docs/v1/libs/sw/service/plugins/ViteFileDetector.md +92 -0
  518. package/docs/v1/libs/sw/service/shared/TinyPushPayload.md +316 -0
  519. package/docs/v1/libs/text/TinyI18.md +80 -56
  520. package/docs/v1/libs/tools/TinyBrowserMonitor.md +170 -0
  521. package/docs/v1/libs/tools/TinyDebugger.md +117 -1
  522. package/docs/v1/libs/tools/TinyHtmlTagRegexBuilder.md +141 -0
  523. package/docs/v1/libs/tools/TinyHttpResponseRegistry.md +129 -0
  524. package/docs/v1/libs/tools/TinyPasswordValidator.md +153 -0
  525. package/docs/v1/libs/tools/TinyPkgExportValidator.md +45 -1
  526. package/docs/v1/libs/tools/TinySiteMap.md +134 -0
  527. package/docs/v1/libs/tools/TinySiteMapStream.md +97 -0
  528. package/docs/v1/libs/tools/TinyURLSecurityVerifier.md +146 -0
  529. package/docs/v1/libs/tools/TinyUriParser/Discord.md +374 -0
  530. package/docs/v1/libs/tools/TinyUriParser/MatrixProtocol.md +54 -0
  531. package/docs/v1/libs/tools/TinyUriParser.md +128 -0
  532. package/docs/v1/libs/utils/TinyCloner.md +126 -0
  533. package/docs/v1/libs/utils/TinyPromiseQueue.md +1 -1
  534. package/docs/v1/libs/utils/TinyThrottledApi.md +219 -0
  535. package/docs/v1/libs/worker/browser/TinyWebWorker.md +331 -0
  536. package/docs/v1/libs/worker/engine/TinyWebWorkerEngine.md +137 -0
  537. package/docs/v1/regexp/Email.md +127 -0
  538. package/docs/v1/regexp/Glob.md +155 -0
  539. package/docs/v1/regexp/IPv4.md +103 -0
  540. package/docs/v1/regexp/IPv6.md +122 -0
  541. package/docs/v1/regexp/SegmentExtractor.md +120 -0
  542. package/docs/v1/regexp/UrlDetector.md +117 -0
  543. package/docs/v1/regexp/Username/Base.md +131 -0
  544. package/docs/v1/regexp/Username/Discord.md +267 -0
  545. package/docs/v1/regexp/Username/MatrixProtocol.md +131 -0
  546. package/docs/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters.md +569 -0
  547. package/docs/v1/webTemplates/bootstrap/5.3/html/BootstrapDialogs.md +19 -7
  548. package/docs/v1/webTemplates/media/MediaValidator/v1/Browser.md +123 -0
  549. package/docs/v1/webTemplates/media/MediaValidator/v1/Node.md +136 -0
  550. package/docs/v1/webTemplates/multiformats/14.0/IPFSHasher.md +310 -0
  551. package/docs/v1/webTemplates/vite/7.3/plugins/TinyVitePwaPlugin.md +131 -0
  552. package/docs/v1/webTemplates/vite/7.3/plugins/githubUtils.md +50 -0
  553. package/package.json +303 -13
  554. package/types/EventEmitter.d.ts +48 -0
  555. package/dist/v1/libs/text/TinyI18.d.mts.map +0 -1
@@ -0,0 +1,117 @@
1
+ # ๐ŸŒ URL Regex Utility Module
2
+
3
+ A robust and highly customizable JavaScript utility for building, validating, and extracting URLs using precise Regular Expressions. This module is designed for developers who need strict control over what constitutes a "valid" URL in their specific application context. ๐Ÿš€
4
+
5
+ ## ๐Ÿ“‹ Table of Contents
6
+ 1. [Overview](#overview)
7
+ 2. [Configuration (`UrlRegexOptions`)](#configuration-urlregexoptions)
8
+ 3. [API Reference](#api-reference)
9
+ 4. [Practical Examples](#practical-examples)
10
+ 5. [Error Handling](#error-handling)
11
+
12
+ ---
13
+
14
+ ## ๐Ÿš€ Overview
15
+
16
+ The `URL Regex Utility` allows you to define exactly how a URL should look. Instead of using a "one-size-fits-all" regex, you can specify protocols, subdomains, and even the character length of the domain and TLD (Top-Level Domain). This is extremely useful for security-sensitive applications where you only want to allow specific types of links.
17
+
18
+ ---
19
+
20
+ ## โš™๏ธ Configuration (`UrlRegexOptions`)
21
+
22
+ When using any function in this module, you can pass an optional `options` object to customize the behavior.
23
+
24
+ | Property | Type | Default | Description |
25
+ | :--- | :--- | :--- | :--- |
26
+ | `protocol` | `string` | `'https?'` | The scheme to match (e.g., `'http'`, `'https'`, or a custom pattern like `'ftp'`). |
27
+ | `subDomain` | `string` | `''` | The specific subdomain string to look for (e.g., `'www'` or `'api'`). |
28
+ | `subDomainOptional` | `boolean` | `true` | If `true`, the URL doesn't *need* the subdomain. If `false`, it is mandatory. |
29
+ | `nameMaxLength` | `[number, number]` | `[1, 256]` | An array defining the `[min, max]` length of the domain name. |
30
+ | `topLevelDomainLength` | `[number, number]` | `[1, 6]` | An array defining the `[min, max]` length of the TLD (e.g., `.com`, `.org`). |
31
+
32
+ ---
33
+
34
+ ## ๐Ÿ“– API Reference
35
+
36
+ ### ๐Ÿ›  `urlStringRegexBuilder(options)`
37
+ **Description:** The engine of the module. It generates a raw regex pattern string based on your configuration.
38
+ * **Returns:** `{string}` A string representing the regex pattern.
39
+
40
+ ### ๐Ÿ”’ `urlRegex(options)`
41
+ **Description:** Creates a `RegExp` object that is **anchored**. This means the URL must match the pattern from the very start (`^`) to the very end (`$`) of the string.
42
+ * **Returns:** `{RegExp}` An anchored RegExp object.
43
+
44
+ ### โœ… `isValidUrl(s, options)`
45
+ **Description:** The most common function for validation. It checks if a single string is a valid URL according to your rules.
46
+ * **Parameters:**
47
+ * `s` `{string}`: The string to validate.
48
+ * `options` `{UrlRegexOptions}`: Your custom configuration.
49
+ * **Returns:** `{boolean}` `true` if valid, `false` otherwise.
50
+
51
+ ### ๐Ÿ” `findUrlRegex(options)`
52
+ **Description:** Generates a **global** `RegExp` object. This is used when you want to find multiple URLs within a larger block of text.
53
+ * **Returns:** `{RegExp}` A global (`g`) RegExp object.
54
+
55
+ ### ๐Ÿ“ฅ `extractUrls(text, options)`
56
+ **Description:** Scans a block of text and pulls out every URL that matches your configuration.
57
+ * **Parameters:**
58
+ * `text` `{string}`: The text content to search through.
59
+ * `options` `{UrlRegexOptions}`: Your custom configuration.
60
+ * **Returns:** `{string[]}` An array of matching URL strings. Returns an empty array `[]` if no matches are found.
61
+
62
+ ---
63
+
64
+ ## ๐Ÿ›  Practical Examples
65
+
66
+ ### 1. Simple Validation โœ…
67
+ Checking if a standard URL is valid.
68
+
69
+ ```javascript
70
+ import { isValidUrl } from 'tiny-essentials/regexp/UrlDetector';
71
+
72
+ const url = "https://google.com";
73
+ const isValid = isValidUrl(url);
74
+
75
+ console.log(isValid); // true
76
+ ```
77
+
78
+ ### 2. Strict Subdomain Requirement ๐Ÿ”’
79
+ Ensuring a URL *must* start with `api.`.
80
+
81
+ ```javascript
82
+ import { isValidUrl } from 'tiny-essentials/regexp/UrlDetector';
83
+
84
+ const options = {
85
+ subDomain: 'api',
86
+ subDomainOptional: false
87
+ };
88
+
89
+ console.log(isValidUrl("https://api.example.com", options)); // true
90
+ console.log(isValidUrl("https://example.com", options)); // false
91
+ ```
92
+
93
+ ### 3. Extracting Links from Text ๐Ÿ“ฅ
94
+ Finding all links inside a paragraph.
95
+
96
+ ```javascript
97
+ import { extractUrls } from 'tiny-essentials/regexp/UrlDetector';
98
+
99
+ const blogPost = "Check our site at https://mysite.com or follow us at http://social.com/user";
100
+ const links = extractUrls(blogPost);
101
+
102
+ console.log(links);
103
+ // Output: ["https://mysite.com", "http://social.com/user"]
104
+ ```
105
+
106
+ ---
107
+
108
+ ## โš ๏ธ Error Handling
109
+
110
+ To ensure your code doesn't fail silently, this module uses **strict runtime validation**. If you provide the wrong data type, the module will throw a `TypeError`.
111
+
112
+ **Common Errors:**
113
+ * `TypeError: Options must be an object.` โ€” Occurs if `options` is a string, number, or null.
114
+ * `TypeError: The "protocol" property must be a string.` โ€” Occurs if you pass a non-string to `protocol`.
115
+ * `TypeError: The input must be a string.` โ€” Occurs if you pass something other than a string to `isValidUrl` or `extractUrls`.
116
+
117
+ > **๐Ÿ’ก Pro-Tip:** Always wrap your calls in a `try...catch` block if you are handling user-provided input to prevent your application from crashing!
@@ -0,0 +1,131 @@
1
+ # ๐Ÿ› ๏ธ Username Regex Utility
2
+
3
+ A robust, highly configurable JavaScript utility designed to generate regular expressions for **validating**, **finding**, and **extracting** usernames from text. This tool supports complex rules like specific prefixes, domains, length constraints, and automated text transformations.
4
+
5
+ ## ๐Ÿš€ Key Features
6
+
7
+ * **๐ŸŽฏ Precision Matching:** Create highly specific patterns (e.g., `@user`, `#123`, or `user@domain.com`).
8
+ * **๐Ÿ›ก๏ธ Type Safety:** Built-in runtime validation to catch configuration errors immediately.
9
+ * **๐Ÿ”„ Automatic Transformation:** Automatically convert extracted usernames to `lowercase`, `uppercase`, or a custom function result.
10
+ * **๐Ÿ” Multi-Pattern Support:** Pass an array of configurations to match multiple different username formats in a single pass.
11
+ * **๐Ÿ“„ Smart Boundaries:** Intelligent handling of word boundaries to prevent "false positives" when usernames start or end with special characters (like `@`).
12
+
13
+ ---
14
+
15
+ ## โš™๏ธ Configuration Guide
16
+
17
+ The core of this utility is the `UsernameRegexOptions` object. This object defines exactly what a "valid username" looks like for your specific project.
18
+
19
+ ### `UsernameRegexOptions` Properties
20
+
21
+ | Property | Type | Default | Description |
22
+ | :--- | :--- | :--- | :--- |
23
+ | `validValues` | `string` | `'[a-zA-Z0-9_]'` | A regex character class defining allowed characters. |
24
+ | `length` | `[number, number]` | `[3, 20]` | An array representing `[min_length, max_length]`. |
25
+ | `start` | `string` | `""` | A regex pattern required at the **start** of the username. |
26
+ | `end` | `string` | `""` | A regex pattern required at the **end** of the username. |
27
+ | `prefix` | `string` | `""` | A literal string prefix (e.g., `@` or `#`). |
28
+ | `domain` | `string` | `undefined` | A literal domain (e.g., `@gmail.com`). Escaped automatically. |
29
+ | `domainPattern` | `string` | `undefined` | A regex pattern for the domain (e.g., `@[a-z]+\.com`). |
30
+ | `transform` | `UsernameTransform` | `null` | `'lowercase'`, `'uppercase'`, or a custom function. |
31
+
32
+ ---
33
+
34
+ ## ๐Ÿ“– API Reference
35
+
36
+ ### 1. `isValidUsername(string, options)`
37
+ **Use case:** Form validation. Use this to check if a user's input in a text field is valid.
38
+
39
+ * **Returns:** `boolean`
40
+ * **Throws:** `TypeError` if the first argument is not a string.
41
+
42
+ ```javascript
43
+ // Example: Validating a simple username
44
+ const isOk = isValidUsername('Yasmin_99', { length: [3, 10] });
45
+ console.log(isOk); // true
46
+ ```
47
+
48
+ ### 2. `extractUsernames(text, options)`
49
+ **Use case:** Data scraping or parsing. Use this to pull all usernames out of a large block of text.
50
+
51
+ * **Returns:** `string[]` (An array of matched usernames).
52
+ * **Note:** If you provide an array of options, the transformation from the *first* option will be applied to all matches.
53
+
54
+ ```javascript
55
+ const text = "Contact @Admin or @Moderator_1";
56
+ const users = extractUsernames(text, {
57
+ prefix: '@',
58
+ transform: 'lowercase'
59
+ });
60
+ console.log(users); // ['@admin', '@moderator_1']
61
+ ```
62
+
63
+ ### 3. `findUsernameRegex(options)`
64
+ **Use case:** Advanced regex creation. Generates a global (`/g`) regular expression for use with `.match()` or `.replace()`.
65
+
66
+ * **Returns:** `RegExp`
67
+
68
+ ### 4. `usernameRegex(options)`
69
+ **Use case:** Strict matching. Generates a regex that matches the **entire** string from start to finish (`^...$`).
70
+
71
+ * **Returns:** `RegExp`
72
+
73
+ ---
74
+
75
+ ## ๐Ÿ› ๏ธ Real-World Workflow Examples
76
+
77
+ ### Scenario A: Social Media Style (The "@" Prefix)
78
+ You are building a chat app where users are mentioned using `@username`.
79
+
80
+ ```javascript
81
+ const socialOptions = {
82
+ prefix: '@',
83
+ length: [3, 15],
84
+ validValues: '[a-zA-Z0-9_]'
85
+ };
86
+
87
+ // Extracting mentions from a chat message
88
+ const message = "Hello @yasmin, welcome to the group @dev_user!";
89
+ const mentions = extractUsernames(message, socialOptions);
90
+ // Result: ["@yasmin", "@dev_user"]
91
+ ```
92
+
93
+ ### Scenario B: Matrix/Identity Style (Domain required)
94
+ You need to find users on a specific Matrix server.
95
+
96
+ ```javascript
97
+ const matrixOptions = {
98
+ prefix: '@',
99
+ domain: '@matrix.org',
100
+ length: [3, 20]
101
+ };
102
+
103
+ const text = "Check in with @alice@matrix.org and @bob@matrix.org";
104
+ const users = extractUsernames(text, matrixOptions);
105
+ console.log(users);
106
+ // Result: ["@alice@matrix.org", "@bob@matrix.org"]
107
+ ```
108
+
109
+ ### Scenario C: Multi-Format Parsing (Complex)
110
+ Your system supports both `#hashtag` style and `@username` style.
111
+
112
+ ```javascript
113
+ const multiOptions = [
114
+ { prefix: '@', length: [3, 10] },
115
+ { prefix: '#', length: [3, 15] }
116
+ ];
117
+
118
+ const text = "Follow @user and use #coding";
119
+ const matches = extractUsernames(text, multiOptions);
120
+ console.log(matches);
121
+ // Result: ["@user", "#coding"]
122
+ ```
123
+
124
+ ---
125
+
126
+ ## โš ๏ธ Error Handling
127
+
128
+ This library is designed to be "fail-fast." If you pass incorrect types, it will throw specific errors to help you debug immediately:
129
+
130
+ * **`TypeError`**: Thrown if you pass a number where a string is expected, or if an object property is missing its required type.
131
+ * **`RangeError`**: Thrown if your `length` array has a minimum value greater than the maximum (e.g., `[20, 5]`) or if lengths are negative.
@@ -0,0 +1,267 @@
1
+ # ๐ŸŽฎ Discord Pattern Templates
2
+
3
+ > A declarative catalog of **35 regular-expression templates** that describe Discord's
4
+ > markup, mentions, links and CDN assets.
5
+
6
+ This module contains **no logic**. It is a frozen, plain-object registry. All the
7
+ intelligence lives in the engine; this file only declares *what* a
8
+ Discord artifact looks like.
9
+
10
+ ---
11
+
12
+ ## ๐Ÿ“‘ Table of Contents
13
+
14
+ 1. [What is this file?](#-what-is-this-file)
15
+ 2. [The 60-second mental model](#-the-60-second-mental-model)
16
+ 3. [Template catalog](#-template-catalog)
17
+ - [Markup & mentions](#-markup--mentions)
18
+ - [Links & invites](#-links--invites)
19
+ - [CDN assets](#-cdn-assets)
20
+ 4. [Daily usage recipes](#-daily-usage-recipes)
21
+ 5. [Testing your changes](#-testing-your-changes)
22
+ 6. [Adding a new template](#-adding-a-new-template)
23
+ 7. [Quick reference](#-quick-reference)
24
+
25
+ ---
26
+
27
+ ## ๐Ÿ“Œ What is this file?
28
+
29
+ `Discord` is a **data-only module**. It exports a single frozen object:
30
+
31
+ ```javascript
32
+ import DiscordRegex from 'tiny-essentials/regexp/Username/Discord';
33
+
34
+ DiscordRegex.userMention;
35
+ // { prefix: '<@', validValues: '[0-9]', length: [17, 22], domain: '>' }
36
+ ```
37
+
38
+ Each key is a **`UsernameRegexTemplate`** โ€” a plain object that the engine
39
+ translates into a `RegExp`. Nothing is compiled until you call the engine.
40
+
41
+ **Use it when you need to:**
42
+
43
+ - โœ… Validate that a string is a real Discord snowflake mention.
44
+ - โœ… Extract every CDN URL from a message before it is deleted or cached.
45
+ - โœ… Detect invite links for anti-spam / moderation.
46
+ - โœ… Build a syntax highlighter for Discord-flavoured markdown.
47
+
48
+ **Do not use it for:** authentication, permission checks, or anything where a
49
+ regex is the only line of defence. A regex proves *shape*, never *authorization*.
50
+
51
+ ---
52
+
53
+ ## ๐Ÿง  The 60-second mental model
54
+
55
+ Every template is expanded by the engine in this exact order:
56
+
57
+ ```text
58
+ ^ {start} {prefix} (?:{validValues}){min,max} {domainPart} $
59
+ โ”” raw โ”€โ”˜ โ””escapedโ”˜ โ””โ”€โ”€โ”€โ”€ the "core" โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”” suffix โ”€โ”€โ”˜
60
+ ```
61
+
62
+ | Step | Function | Reads |
63
+ | :--- | :--- | :--- |
64
+ | 1 | `getPrefix()` | `start`, `prefix` |
65
+ | 2 | `usernameStringRegexBuilder()` | `validValues`, `length` |
66
+ | 3 | `getDomainPart()` | `domainPattern` **or** `domain`, plus `end` |
67
+
68
+ The result is a **single-line, fully anchored** pattern. There is no `m` flag
69
+ and no `s` flag, so `.` never matches a newline.
70
+
71
+ ---
72
+
73
+ ## ๐Ÿ“š Template Catalog
74
+
75
+ ### ๐Ÿท๏ธ Markup & mentions
76
+
77
+ | Key | Example match | Notes |
78
+ | :--- | :--- | :--- |
79
+ | `spoiler` | `\|\|hidden text\|\|` | 1โ€“2000 chars. Content excludes a lone `\|`. |
80
+ | `mediaSpoiler` | `SPOILER_cat.png` | Discord's attachment spoiler prefix. |
81
+ | `userMention` | `<@123456789012345678>` | Snowflake = 17โ€“22 digits. |
82
+ | `nicknameMention` | `<@!123456789012345678>` | Mention with server nickname. |
83
+ | `roleMention` | `<@&123456789012345678>` | Role ping. |
84
+ | `channelMention` | `<#123456789012345678>` | Text, voice, forum, stage โ€” all types. |
85
+ | `customEmoji` | `<:party_parrot:123456789012345678>` | Name: 2โ€“32 chars. |
86
+ | `animatedEmoji` | `<a:party_parrot:123456789012345678>` | Same, with the `a:` marker. |
87
+ | `timestamp` | `<t:1700000000:R>` | Style is optional. |
88
+ | `slashCommand` | `</ping:123456789012345678>` | Also matches subcommands. |
89
+ | `gameProfile` | `<@$123456789012345678>` | Game profile mention. |
90
+ | `guildNavigation` | `<id:customize>` | Also `<id:linked-roles:ID>`. |
91
+
92
+ **Why `spoiler` is ReDoS-safe** โ€” the content class is
93
+ `[^|]|\|(?!\|)`. The two alternatives are mutually exclusive on the first
94
+ character, so the engine never has to backtrack. It stays linear even at
95
+ `{1,2000}`.
96
+
97
+ ---
98
+
99
+ ### ๐Ÿ”— Links & invites
100
+
101
+ | Key | Example match | Notes |
102
+ | :--- | :--- | :--- |
103
+ | `messageLink` | `https://discord.com/channels/111โ€ฆ/222โ€ฆ/333โ€ฆ` | Accepts `@me` for DMs. |
104
+ | `inviteLink` | `https://discord.gg/abc123` | Also `discord.com/invite/โ€ฆ`. |
105
+
106
+ Both keep the query string attached via `end: OPTIONAL_QUERY_STRING`, so
107
+ `?utm_source=discord` stays inside the match instead of being silently dropped.
108
+
109
+ ---
110
+
111
+ ### ๐Ÿ–ผ๏ธ CDN assets
112
+
113
+ Every CDN template shares the same skeleton:
114
+
115
+ ```text
116
+ https?://(?:cdn\.discordapp\.com|media\.discordapp\.net)/<path>/<SNOWFLAKE>/<HASH>.<ext>
117
+ ```
118
+
119
+ | Key | Path segment |
120
+ | :--- | :--- |
121
+ | `cdnAttachment` | `/attachments/CHANNEL/ATTACHMENT/FILENAME` |
122
+ | `cdnEmoji` | `/emojis/EMOJI_ID.ext` |
123
+ | `cdnGuildIcon` | `/icons/GUILD/HASH.ext` |
124
+ | `cdnGuildSplash` | `/splashes/GUILD/HASH.ext` |
125
+ | `cdnGuildDiscoverySplash` | `/discovery-splashes/GUILD/HASH.ext` |
126
+ | `cdnBanner` | `/banners/ID/HASH.ext` |
127
+ | `cdnDefaultUserAvatar` | `/embed/avatars/0.ext` |
128
+ | `cdnUserAvatar` | `/avatars/USER/HASH.ext` |
129
+ | `cdnGuildMemberAvatar` | `/guilds/GUILD/users/USER/avatars/HASH.ext` |
130
+ | `cdnGuildMemberBanner` | `/guilds/GUILD/users/USER/banners/HASH.ext` |
131
+ | `cdnAvatarDecoration` | `/avatar-decoration-presets/HASH.ext` |
132
+ | `cdnApplicationIcon` | `/app-icons/APP/HASH.ext` |
133
+ | `cdnApplicationAsset` | `/app-assets/APP/HASH.ext` |
134
+ | `cdnAchievementIcon` | `/app-assets/APP/achievements/ID/icons/HASH.ext` |
135
+ | `cdnStorePageAsset` | `/app-assets/APP/store/HASH` |
136
+ | `cdnStickerPackBanner` | `/app-assets/APP/store/HASH.ext` |
137
+ | `cdnTeamIcon` | `/team-icons/TEAM/HASH.ext` |
138
+ | `cdnSticker` | `/stickers/STICKER.ext` |
139
+ | `cdnRoleIcon` | `/role-icons/ROLE/HASH.ext` |
140
+ | `cdnGuildScheduledEventCover` | `/guild-events/EVENT/HASH.ext` |
141
+ | `cdnGuildTagBadge` | `/guild-tag-badges/GUILD/HASH.ext` |
142
+
143
+ **Accepted extensions:** `jpg`, `jpeg`, `png`, `webp`, `gif`, `avif`.
144
+
145
+ ---
146
+
147
+ ## ๐Ÿš€ Daily usage recipes
148
+
149
+ ### 1. Validate a single mention
150
+
151
+ ```javascript
152
+ import { isValidUsername } from 'tiny-essentials/regexp/Username';
153
+ import DiscordRegex from 'tiny-essentials/regexp/Username/templates/Discord';
154
+
155
+ isValidUsername('<@123456789012345678>', DiscordRegex.userMention);
156
+ // true
157
+ ```
158
+
159
+ ### 2. Extract every mention from a message
160
+
161
+ ```javascript
162
+ import { extractUsernames } from 'tiny-essentials/regexp/Username';
163
+ import DiscordRegex from 'tiny-essentials/regexp/Username/templates/Discord';
164
+
165
+ const mentions = extractUsernames(
166
+ 'hey <@123456789012345678> and <@987654321098765432>',
167
+ [DiscordRegex.userMention, DiscordRegex.nicknameMention],
168
+ );
169
+ // ['<@123456789012345678>', '<@987654321098765432>']
170
+ ```
171
+
172
+ ### 3. Build a reusable validator once
173
+
174
+ ```javascript
175
+ import { usernameRegex } from 'tiny-essentials/regexp/Username';
176
+ import DiscordRegex from 'tiny-essentials/regexp/Username/templates/Discord';
177
+
178
+ // Build the RegExp once and reuse it โ€” never rebuild inside a loop.
179
+ const INVITE = usernameRegex(DiscordRegex.inviteLink);
180
+
181
+ export const isInvite = (text) => INVITE.test(text);
182
+ ```
183
+
184
+ ### 4. Normalize mentions to lowercase
185
+
186
+ ```javascript
187
+ const rules = { ...DiscordRegex.customEmoji, transform: 'lowercase' };
188
+ const emojis = extractUsernames('<:Party_Parrot:123456789012345678>', rules);
189
+ // ['<:party_parrot:123456789012345678>']
190
+ ```
191
+
192
+ ---
193
+
194
+ ## ๐Ÿงช Testing your changes
195
+
196
+ Because this file is pure data, a snapshot test is enough:
197
+
198
+ ```javascript
199
+ import { describe, it, expect } from 'vitest';
200
+ import { usernameRegex } from 'tiny-essentials/regexp/Username';
201
+ import DiscordRegex from 'tiny-essentials/regexp/Username/templates/Discord';
202
+
203
+ describe('Discord', () => {
204
+ it('matches a standard user mention', () => {
205
+ expect(usernameRegex(DiscordRegex.userMention).test('<@123456789012345678>')).toBe(true);
206
+ });
207
+
208
+ it('rejects a mention with a short snowflake', () => {
209
+ expect(usernameRegex(DiscordRegex.userMention).test('<@123>')).toBe(false);
210
+ });
211
+
212
+ it('keeps the query string on a CDN attachment', () => {
213
+ const url = 'https://cdn.discordapp.com/attachments/111111111111111111/222222222222222222/a.png?ex=1';
214
+ expect(usernameRegex(DiscordRegex.cdnAttachment).test(url)).toBe(true);
215
+ });
216
+ });
217
+ ```
218
+
219
+ **Always test the negative case.** A pattern that matches everything is worse
220
+ than no pattern at all.
221
+
222
+ ---
223
+
224
+ ## โž• Adding a new template
225
+
226
+ 1. **Pick the right section.** Keep CDN entries at the bottom, grouped.
227
+ 2. **Reuse the shared constants.** `SNOWFLAKE`, `CDN_HOST`, `CDN_EXT`,
228
+ `CDN_HASH` and `OPTIONAL_QUERY_STRING` already exist. Do not duplicate them.
229
+ 3. **Prefer `prefix`/`domain` over `start`/`domainPattern`** unless you truly
230
+ need regex. Escaped literals are safer.
231
+ 4. **Add the JSDoc block** with `@type {UsernameRegexTemplate}` so the editor
232
+ keeps autocompleting.
233
+ 5. **Add a row to the catalog table** in this document.
234
+
235
+ ```javascript
236
+ /**
237
+ * CDN: Soundboard Sound
238
+ * Format: https://cdn.discordapp.com/soundboard-sounds/ID
239
+ * @type {UsernameRegexTemplate}
240
+ */
241
+ cdnSoundboardSound: {
242
+ start: `${CDN_HOST}/soundboard-sounds/`,
243
+ validValues: '[0-9]',
244
+ length: [17, 22],
245
+ end: OPTIONAL_QUERY_STRING,
246
+ },
247
+ ```
248
+
249
+ ---
250
+
251
+ ## ๐Ÿ“‹ Quick reference
252
+
253
+ ```javascript
254
+ import DiscordRegex from 'tiny-essentials/regexp/Username/templates/Discord';
255
+
256
+ // 35 keys, all frozen at the top level.
257
+ Object.keys(DiscordRegex).length; // 35
258
+
259
+ // Every value follows the same shape:
260
+ // { start?, prefix?, validValues, length, domain?, domainPattern?, end? }
261
+ ```
262
+
263
+ | Group | Count | Keys |
264
+ | :--- | :--: | :--- |
265
+ | Markup & mentions | 12 | `spoiler`, `mediaSpoiler`, `userMention`, `nicknameMention`, `roleMention`, `channelMention`, `customEmoji`, `animatedEmoji`, `timestamp`, `slashCommand`, `gameProfile`, `guildNavigation` |
266
+ | Links & invites | 2 | `messageLink`, `inviteLink` |
267
+ | CDN assets | 21 | `cdn*` |
@@ -0,0 +1,131 @@
1
+ # ๐Ÿงฉ Matrix Protocol Regex Templates
2
+
3
+ > A battle-tested collection of Regular Expression templates for parsing
4
+ > [Matrix](https://matrix.org) identifiers: users, rooms, events, groups,
5
+ > permalinks, URIs, HTML mentions, and media URIs.
6
+
7
+ ---
8
+
9
+ ## ๐Ÿ“– Table of Contents
10
+
11
+ - [What is this?](#-what-is-this)
12
+ - [Template Catalog](#-template-catalog)
13
+ - [Quick Start](#-quick-start)
14
+ - [Testing Cheatsheet](#-testing-cheatsheet)
15
+ - [References](#-references)
16
+
17
+ ---
18
+
19
+ ## ๐ŸŽฏ What is this?
20
+
21
+ `MatrixProtocol` is a **pure data module**. It does not export functions.
22
+ It exports a single frozen object where every key is a **template** that
23
+ describes *one* Matrix identifier shape.
24
+
25
+ The heavy lifting (turning a template into a `RegExp`) is done by the
26
+ sibling module. Think of it like this:
27
+
28
+ ```
29
+ tiny-essentials/regexp/Username/templates/MatrixProtocol โ†’ the recipe (what a Matrix ID looks like)
30
+ tiny-essentials/regexp/Username โ†’ the chef (turns the recipe into a RegExp)
31
+ ```
32
+
33
+ **Why split it?** Because a template is data. Data can be serialized,
34
+ snapshotted, diffed in code review, and reused across runtimes. A raw
35
+ `RegExp` literal cannot.
36
+
37
+ ---
38
+
39
+ ## ๐Ÿ“š Template Catalog
40
+
41
+ | Key | Matches | Example |
42
+ | --- | --- | --- |
43
+ | `userName` | User ID | `@alice:matrix.org` |
44
+ | `roomName` | Room alias | `#general:matrix.org` |
45
+ | `roomId` | Room ID | `!AbCdEf:matrix.org` |
46
+ | `eventId` | Event ID (v1โ€“v3+) | `$abc123:matrix.org` |
47
+ | `groupId` | Legacy group / space | `+mygroup:matrix.org` |
48
+ | `matrixToLink` | `matrix.to` permalink | `https://matrix.to/#/@alice:matrix.org` |
49
+ | `matrixUri` | RFC 8922 URI | `matrix:u/alice:matrix.org` |
50
+ | `htmlMention` | HTML anchor mention | `<a href="https://matrix.to/#/@alice:matrix.org">Alice</a>` |
51
+ | `mxcUri` | Media content URI | `mxc://matrix.org/AbC123` |
52
+
53
+ ---
54
+
55
+ ## ๐Ÿš€ Quick Start
56
+
57
+ ### 1. Import the template you need
58
+
59
+ ```javascript
60
+ import MatrixProtocolRegex from 'tiny-essentials/regexp/Username/templates/MatrixProtocol';
61
+ import { isValidUsername, usernameRegex, findUsernameRegex, extractUsernames } from 'tiny-essentials/regexp/Username';
62
+ ```
63
+
64
+ ### 2. Validate a single identifier
65
+
66
+ ```javascript
67
+ import { isValidUsername } from 'tiny-essentials/regexp/Username';
68
+ import MatrixProtocolRegex from 'tiny-essentials/regexp/Username/templates/MatrixProtocol';
69
+
70
+ isValidUsername('@alice:matrix.org', MatrixProtocolRegex.userName);
71
+ // => true
72
+
73
+ isValidUsername('@Alice:matrix.org', MatrixProtocolRegex.userName);
74
+ // => false (Matrix user IDs are lowercase-only)
75
+ ```
76
+
77
+ ### 3. Extract every Matrix ID from a wall of text
78
+
79
+ ```javascript
80
+ import { extractUsernames } from 'tiny-essentials/regexp/Username';
81
+ import MatrixProtocolRegex from 'tiny-essentials/regexp/Username/templates/MatrixProtocol';
82
+
83
+ const message = `
84
+ Hey, ping @alice:matrix.org or join #general:matrix.org
85
+ Docs: https://matrix.to/#/@bob:example.com
86
+ `;
87
+
88
+ extractUsernames(message, [
89
+ MatrixProtocolRegex.userName,
90
+ MatrixProtocolRegex.roomName,
91
+ MatrixProtocolRegex.matrixToLink,
92
+ ]);
93
+ // => [
94
+ // '@alice:matrix.org',
95
+ // '#general:matrix.org',
96
+ // 'https://matrix.to/#/@bob:example.com'
97
+ // ]
98
+ ```
99
+
100
+ ---
101
+
102
+ ## ๐Ÿงช Testing Cheatsheet
103
+
104
+ A quick table of inputs and their expected results, ready to be turned
105
+ into a test suite.
106
+
107
+ | Template | Input | Valid? |
108
+ | --- | --- | --- |
109
+ | `userName` | `@alice:matrix.org` | โœ… |
110
+ | `userName` | `@Alice:matrix.org` | โŒ uppercase |
111
+ | `userName` | `@alice:localhost` | โŒ no TLD |
112
+ | `roomName` | `#General:matrix.org` | โœ… |
113
+ | `roomId` | `!AbC-123:matrix.org` | โœ… |
114
+ | `eventId` | `$AbC123` | โœ… |
115
+ | `eventId` | `$AbC123:matrix.org` | โœ… |
116
+ | `groupId` | `+mygroup:matrix.org` | โœ… |
117
+ | `matrixToLink` | `https://matrix.to/#/@a:b.org` | โœ… |
118
+ | `matrixToLink` | `matrix.to/#/@a:b.org` | โœ… |
119
+ | `matrixUri` | `matrix:u/alice:matrix.org` | โœ… |
120
+ | `matrixUri` | `matrix:roomid/abc:matrix.org` | โœ… |
121
+ | `mxcUri` | `mxc://matrix.org/AbC123` | โœ… |
122
+ | `mxcUri` | `mxc://matrix.org/` | โŒ empty media ID |
123
+
124
+ ---
125
+
126
+ ## ๐Ÿ”— References
127
+
128
+ - [Matrix Identifier Grammar](https://spec.matrix.org/latest/appendices/#identifier-grammar)
129
+ - [Matrix Client-Server API](https://spec.matrix.org/latest/client-server-api/)
130
+ - [RFC 8922 โ€” The `matrix:` URI Scheme](https://www.rfc-editor.org/rfc/rfc8922)
131
+ - [matrix.to](https://matrix.to) โ€” Permalink resolver