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.
- package/README.md +1 -1
- package/changelog/1/28/19.md +24 -0
- package/changelog/1/29/0.md +58 -0
- package/dist/v1/ColorSafeStringify.min.js +1 -1
- package/dist/v1/TinyAdvancedRaffle.min.js +1 -1
- package/dist/v1/TinyAfterScrollWatcher.min.js +1 -1
- package/dist/v1/TinyAnalogClock.min.js +1 -1
- package/dist/v1/TinyArrayComparator.min.js +1 -1
- package/dist/v1/TinyArrayPaginator.min.js +1 -1
- package/dist/v1/TinyBasicsEs.min.js +1 -1
- package/dist/v1/TinyBrowserMonitor.min.js +1 -0
- package/dist/v1/TinyClassManager.min.js +1 -1
- package/dist/v1/TinyClipboard.min.js +1 -1
- package/dist/v1/TinyCloner.min.js +1 -0
- package/dist/v1/TinyColorConverter.min.js +1 -1
- package/dist/v1/TinyColorValidator.min.js +1 -1
- package/dist/v1/TinyCookieConsent.min.js +1 -1
- package/dist/v1/TinyDayNightCycle.min.js +1 -1
- package/dist/v1/TinyDebugger.min.js +1 -1
- package/dist/v1/TinyDomReadyManager.min.js +1 -1
- package/dist/v1/TinyDragDropDetector.min.js +1 -1
- package/dist/v1/TinyDragger.min.js +1 -1
- package/dist/v1/TinyElementObserver.min.js +1 -1
- package/dist/v1/TinyEssentials.min.js +1 -1
- package/dist/v1/TinyGamepad.min.js +1 -1
- package/dist/v1/TinyHtml.min.js +1 -1
- package/dist/v1/TinyHtmlTagRegexBuilder.min.js +1 -0
- package/dist/v1/TinyHttpResponseRegistry.min.js +1 -0
- package/dist/v1/TinyI18.min.js +1 -1
- package/dist/v1/TinyIframeEvents.min.js +1 -1
- package/dist/v1/TinyInventory.min.js +1 -1
- package/dist/v1/TinyInventoryTrader.min.js +1 -1
- package/dist/v1/TinyLevelUp.min.js +1 -1
- package/dist/v1/TinyLoadingScreen.min.js +1 -1
- package/dist/v1/TinyLocalStorage.min.js +1 -1
- package/dist/v1/TinyMaInSys.min.js +1 -1
- package/dist/v1/TinyMapCache.min.js +1 -0
- package/dist/v1/TinyMediaPlayer.min.js +1 -1
- package/dist/v1/TinyNeedBar.min.js +1 -1
- package/dist/v1/TinyNewWinEvents.min.js +1 -1
- package/dist/v1/TinyNotificationAdapter.min.js +1 -0
- package/dist/v1/TinyNotifications.min.js +1 -1
- package/dist/v1/TinyNotifyCenter.min.js +1 -1
- package/dist/v1/TinyOPFSFileSystem.min.js +1 -0
- package/dist/v1/TinyPasswordValidator.min.js +1 -0
- package/dist/v1/TinyPluginPackage.min.js +1 -0
- package/dist/v1/TinyPromiseQueue.min.js +1 -1
- package/dist/v1/TinyPushManager.min.js +1 -0
- package/dist/v1/TinyPushPayload.min.js +1 -0
- package/dist/v1/TinyPushRouter.min.js +1 -0
- package/dist/v1/TinyRadioFm.min.js +1 -1
- package/dist/v1/TinyRateLimiter.min.js +1 -1
- package/dist/v1/TinyRegexEs.min.js +1 -0
- package/dist/v1/TinyRouter.min.js +1 -0
- package/dist/v1/TinyServiceWorker.min.js +1 -0
- package/dist/v1/TinyServiceWorkerEngine.min.js +1 -0
- package/dist/v1/TinySetMapPackage.min.js +1 -0
- package/dist/v1/TinySimpleDice.min.js +1 -1
- package/dist/v1/TinySmartScroller.min.js +1 -1
- package/dist/v1/TinyStorageBucketFileSystem.min.js +1 -0
- package/dist/v1/TinyTextDiffer.min.js +1 -1
- package/dist/v1/TinyTextRangeEditor.min.js +1 -1
- package/dist/v1/TinyTextarea.min.js +1 -1
- package/dist/v1/TinyThrottledApi.min.js +1 -0
- package/dist/v1/TinyTimeout.min.js +1 -1
- package/dist/v1/TinyToastNotify.min.js +1 -1
- package/dist/v1/TinyUploadClicker.min.js +1 -1
- package/dist/v1/TinyUriParser.min.js +1 -0
- package/dist/v1/TinyVersion.min.js +1 -0
- package/dist/v1/TinyWebWorker.min.js +1 -0
- package/dist/v1/TinyWebWorkerEngine.min.js +1 -0
- package/dist/v1/UltraRandomMsgGen.min.js +1 -1
- package/dist/v1/basics/array.cjs +2 -2
- package/dist/v1/basics/array.d.mts +2 -0
- package/dist/v1/basics/array.d.mts.map +1 -1
- package/dist/v1/basics/array.mjs +2 -1
- package/dist/v1/basics/browserDetector.cjs +37 -12
- package/dist/v1/basics/browserDetector.d.mts +8 -0
- package/dist/v1/basics/browserDetector.d.mts.map +1 -1
- package/dist/v1/basics/browserDetector.mjs +32 -13
- package/dist/v1/basics/crypto.cjs +23 -0
- package/dist/v1/basics/crypto.d.mts +10 -0
- package/dist/v1/basics/crypto.d.mts.map +1 -0
- package/dist/v1/basics/crypto.mjs +18 -0
- package/dist/v1/basics/html.cjs +0 -3
- package/dist/v1/basics/html.d.mts.map +1 -1
- package/dist/v1/basics/html.mjs +0 -2
- package/dist/v1/basics/index.cjs +8 -1
- package/dist/v1/basics/index.d.mts +6 -5
- package/dist/v1/basics/index.d.mts.map +1 -1
- package/dist/v1/basics/index.mjs +6 -5
- package/dist/v1/basics/objChecker.cjs +88 -0
- package/dist/v1/basics/objChecker.d.mts +26 -0
- package/dist/v1/basics/objChecker.d.mts.map +1 -1
- package/dist/v1/basics/objChecker.mjs +74 -0
- package/dist/v1/basics/objFilter.cjs +234 -93
- package/dist/v1/basics/objFilter.d.mts +96 -22
- package/dist/v1/basics/objFilter.d.mts.map +1 -1
- package/dist/v1/basics/objFilter.mjs +216 -92
- package/dist/v1/basics/promiseUtils.cjs +48 -12
- package/dist/v1/basics/promiseUtils.d.mts +45 -12
- package/dist/v1/basics/promiseUtils.d.mts.map +1 -1
- package/dist/v1/basics/promiseUtils.mjs +47 -12
- package/dist/v1/basics/text.cjs +0 -12
- package/dist/v1/basics/text.d.mts +0 -10
- package/dist/v1/basics/text.d.mts.map +1 -1
- package/dist/v1/basics/text.mjs +0 -10
- package/dist/v1/css/TinyCookieConsent.min.css +1 -0
- package/dist/v1/css/TinyCookieConsent.min.css.map +1 -0
- package/dist/v1/css/TinyDraggerExample.min.css +1 -0
- package/dist/v1/css/TinyDraggerExample.min.css.map +1 -0
- package/dist/v1/css/TinyLoadingScreen.min.css +1 -0
- package/dist/v1/css/TinyLoadingScreen.min.css.map +1 -0
- package/dist/v1/css/TinyNotify.min.css +1 -0
- package/dist/v1/css/TinyNotify.min.css.map +1 -0
- package/dist/v1/css/aiMarker.min.css +1 -0
- package/dist/v1/css/aiMarker.min.css.map +1 -0
- package/dist/v1/index.cjs +88 -3
- package/dist/v1/index.d.mts +31 -6
- package/dist/v1/index.d.mts.map +1 -1
- package/dist/v1/index.mjs +32 -7
- package/dist/v1/jsdoc/EventEmitter.cjs +4 -0
- package/dist/v1/jsdoc/EventEmitter.d.mts +33 -0
- package/dist/v1/jsdoc/EventEmitter.d.mts.map +1 -0
- package/dist/v1/jsdoc/EventEmitter.mjs +18 -0
- package/dist/v1/libs/array/TinyArrayComparator.cjs +240 -25
- package/dist/v1/libs/array/TinyArrayComparator.d.mts +130 -22
- package/dist/v1/libs/array/TinyArrayComparator.d.mts.map +1 -1
- package/dist/v1/libs/array/TinyArrayComparator.mjs +210 -24
- package/dist/v1/libs/fs/constants.cjs +74 -0
- package/dist/v1/libs/fs/constants.d.mts +22 -0
- package/dist/v1/libs/fs/constants.d.mts.map +1 -0
- package/dist/v1/libs/fs/constants.mjs +53 -0
- package/dist/v1/libs/fs/encoding.cjs +118 -0
- package/dist/v1/libs/fs/encoding.d.mts +50 -0
- package/dist/v1/libs/fs/encoding.d.mts.map +1 -0
- package/dist/v1/libs/fs/encoding.mjs +102 -0
- package/dist/v1/libs/fs/error.cjs +188 -0
- package/dist/v1/libs/fs/error.d.mts +105 -0
- package/dist/v1/libs/fs/error.d.mts.map +1 -0
- package/dist/v1/libs/fs/error.mjs +158 -0
- package/dist/v1/libs/fs/handle.cjs +121 -0
- package/dist/v1/libs/fs/handle.d.mts +56 -0
- package/dist/v1/libs/fs/handle.d.mts.map +1 -0
- package/dist/v1/libs/fs/handle.mjs +100 -0
- package/dist/v1/libs/fs/index.cjs +700 -0
- package/dist/v1/libs/fs/index.d.mts +377 -0
- package/dist/v1/libs/fs/index.d.mts.map +1 -0
- package/dist/v1/libs/fs/index.mjs +630 -0
- package/dist/v1/libs/fs/path.cjs +234 -0
- package/dist/v1/libs/fs/path.d.mts +176 -0
- package/dist/v1/libs/fs/path.d.mts.map +1 -0
- package/dist/v1/libs/fs/path.mjs +197 -0
- package/dist/v1/libs/fs/plugins/OPFS/StorageBucket.cjs +202 -0
- package/dist/v1/libs/fs/plugins/OPFS/StorageBucket.d.mts +121 -0
- package/dist/v1/libs/fs/plugins/OPFS/StorageBucket.d.mts.map +1 -0
- package/dist/v1/libs/fs/plugins/OPFS/StorageBucket.mjs +172 -0
- package/dist/v1/libs/fs/plugins/OPFS/index.cjs +334 -0
- package/dist/v1/libs/fs/plugins/OPFS/index.d.mts +98 -0
- package/dist/v1/libs/fs/plugins/OPFS/index.d.mts.map +1 -0
- package/dist/v1/libs/fs/plugins/OPFS/index.mjs +300 -0
- package/dist/v1/libs/fs/stats.cjs +245 -0
- package/dist/v1/libs/fs/stats.d.mts +226 -0
- package/dist/v1/libs/fs/stats.d.mts.map +1 -0
- package/dist/v1/libs/fs/stats.mjs +197 -0
- package/dist/v1/libs/html/events/TinyIframeEvents.cjs +10 -1
- package/dist/v1/libs/html/events/TinyIframeEvents.d.mts +9 -2
- package/dist/v1/libs/html/events/TinyIframeEvents.d.mts.map +1 -1
- package/dist/v1/libs/html/events/TinyIframeEvents.mjs +8 -1
- package/dist/v1/libs/html/events/TinyNewWinEvents.cjs +14 -3
- package/dist/v1/libs/html/events/TinyNewWinEvents.d.mts +21 -5
- package/dist/v1/libs/html/events/TinyNewWinEvents.d.mts.map +1 -1
- package/dist/v1/libs/html/events/TinyNewWinEvents.mjs +12 -3
- package/dist/v1/libs/html/scroll/TinySmartScroller.cjs +13 -1
- package/dist/v1/libs/html/scroll/TinySmartScroller.d.mts +29 -2
- package/dist/v1/libs/html/scroll/TinySmartScroller.d.mts.map +1 -1
- package/dist/v1/libs/html/scroll/TinySmartScroller.mjs +11 -1
- package/dist/v1/libs/math/TinyAdvancedRaffle.cjs +13 -1
- package/dist/v1/libs/math/TinyAdvancedRaffle.d.mts +32 -2
- package/dist/v1/libs/math/TinyAdvancedRaffle.d.mts.map +1 -1
- package/dist/v1/libs/math/TinyAdvancedRaffle.mjs +11 -1
- package/dist/v1/libs/math/TinyTimeout.cjs +0 -14
- package/dist/v1/libs/math/TinyTimeout.d.mts +0 -11
- package/dist/v1/libs/math/TinyTimeout.d.mts.map +1 -1
- package/dist/v1/libs/math/TinyTimeout.mjs +0 -13
- package/dist/v1/libs/media/TinyMediaPlayer/index.cjs +25 -1
- package/dist/v1/libs/media/TinyMediaPlayer/index.d.mts +35 -2
- package/dist/v1/libs/media/TinyMediaPlayer/index.d.mts.map +1 -1
- package/dist/v1/libs/media/TinyMediaPlayer/index.mjs +23 -1
- package/dist/v1/libs/media/TinyMediaPlayer.cjs +2 -2
- package/dist/v1/libs/media/TinyMediaPlayer.d.mts +2 -2
- package/dist/v1/libs/media/TinyMediaPlayer.d.mts.map +1 -1
- package/dist/v1/libs/media/TinyMediaPlayer.mjs +2 -2
- package/dist/v1/libs/media/TinyRadioFm.cjs +19 -1
- package/dist/v1/libs/media/TinyRadioFm.d.mts +78 -2
- package/dist/v1/libs/media/TinyRadioFm.d.mts.map +1 -1
- package/dist/v1/libs/media/TinyRadioFm.mjs +17 -1
- package/dist/v1/libs/plugin/TinyPlugin.cjs +1630 -0
- package/dist/v1/libs/plugin/TinyPlugin.d.mts +753 -0
- package/dist/v1/libs/plugin/TinyPlugin.d.mts.map +1 -0
- package/dist/v1/libs/plugin/TinyPlugin.mjs +1376 -0
- package/dist/v1/libs/plugin/TinyVersion.cjs +204 -0
- package/dist/v1/libs/plugin/TinyVersion.d.mts +70 -0
- package/dist/v1/libs/plugin/TinyVersion.d.mts.map +1 -0
- package/dist/v1/libs/plugin/TinyVersion.mjs +179 -0
- package/dist/v1/libs/router/TinyRouter.cjs +661 -0
- package/dist/v1/libs/router/TinyRouter.d.mts +320 -0
- package/dist/v1/libs/router/TinyRouter.d.mts.map +1 -0
- package/dist/v1/libs/router/TinyRouter.mjs +572 -0
- package/dist/v1/libs/storage/TinyLocalStorage.cjs +20 -1
- package/dist/v1/libs/storage/TinyLocalStorage.d.mts +64 -2
- package/dist/v1/libs/storage/TinyLocalStorage.d.mts.map +1 -1
- package/dist/v1/libs/storage/TinyLocalStorage.mjs +18 -1
- package/dist/v1/libs/storage/TinyMapCache.cjs +373 -0
- package/dist/v1/libs/storage/TinyMapCache.d.mts +274 -0
- package/dist/v1/libs/storage/TinyMapCache.d.mts.map +1 -0
- package/dist/v1/libs/storage/TinyMapCache.mjs +333 -0
- package/dist/v1/libs/storage/TinySetMapDatabase.cjs +1167 -0
- package/dist/v1/libs/storage/TinySetMapDatabase.d.mts +603 -0
- package/dist/v1/libs/storage/TinySetMapDatabase.d.mts.map +1 -0
- package/dist/v1/libs/storage/TinySetMapDatabase.mjs +1059 -0
- package/dist/v1/libs/sw/browser/TinyNotificationAdapter.cjs +126 -0
- package/dist/v1/libs/sw/browser/TinyNotificationAdapter.d.mts +132 -0
- package/dist/v1/libs/sw/browser/TinyNotificationAdapter.d.mts.map +1 -0
- package/dist/v1/libs/sw/browser/TinyNotificationAdapter.mjs +109 -0
- package/dist/v1/libs/sw/browser/TinyPushManager.cjs +310 -0
- package/dist/v1/libs/sw/browser/TinyPushManager.d.mts +168 -0
- package/dist/v1/libs/sw/browser/TinyPushManager.d.mts.map +1 -0
- package/dist/v1/libs/sw/browser/TinyPushManager.mjs +264 -0
- package/dist/v1/libs/sw/browser/TinyServiceWorker.cjs +1060 -0
- package/dist/v1/libs/sw/browser/TinyServiceWorker.d.mts +348 -0
- package/dist/v1/libs/sw/browser/TinyServiceWorker.d.mts.map +1 -0
- package/dist/v1/libs/sw/browser/TinyServiceWorker.mjs +933 -0
- package/dist/v1/libs/sw/browser/plugins/TabManager.cjs +315 -0
- package/dist/v1/libs/sw/browser/plugins/TabManager.d.mts +178 -0
- package/dist/v1/libs/sw/browser/plugins/TabManager.d.mts.map +1 -0
- package/dist/v1/libs/sw/browser/plugins/TabManager.mjs +274 -0
- package/dist/v1/libs/sw/browser/utils.cjs +28 -0
- package/dist/v1/libs/sw/browser/utils.d.mts +8 -0
- package/dist/v1/libs/sw/browser/utils.d.mts.map +1 -0
- package/dist/v1/libs/sw/browser/utils.mjs +21 -0
- package/dist/v1/libs/sw/service/TinyPushRouter.cjs +222 -0
- package/dist/v1/libs/sw/service/TinyPushRouter.d.mts +138 -0
- package/dist/v1/libs/sw/service/TinyPushRouter.d.mts.map +1 -0
- package/dist/v1/libs/sw/service/TinyPushRouter.mjs +201 -0
- package/dist/v1/libs/sw/service/TinyServiceWorkerEngine.cjs +3016 -0
- package/dist/v1/libs/sw/service/TinyServiceWorkerEngine.d.mts +993 -0
- package/dist/v1/libs/sw/service/TinyServiceWorkerEngine.d.mts.map +1 -0
- package/dist/v1/libs/sw/service/TinyServiceWorkerEngine.mjs +2558 -0
- package/dist/v1/libs/sw/service/plugins/GlobBypassPlugin.cjs +88 -0
- package/dist/v1/libs/sw/service/plugins/GlobBypassPlugin.d.mts +32 -0
- package/dist/v1/libs/sw/service/plugins/GlobBypassPlugin.d.mts.map +1 -0
- package/dist/v1/libs/sw/service/plugins/GlobBypassPlugin.mjs +69 -0
- package/dist/v1/libs/sw/service/plugins/GlobCachePlugin.cjs +112 -0
- package/dist/v1/libs/sw/service/plugins/GlobCachePlugin.d.mts +31 -0
- package/dist/v1/libs/sw/service/plugins/GlobCachePlugin.d.mts.map +1 -0
- package/dist/v1/libs/sw/service/plugins/GlobCachePlugin.mjs +91 -0
- package/dist/v1/libs/sw/service/plugins/Ping.cjs +32 -0
- package/dist/v1/libs/sw/service/plugins/Ping.d.mts +9 -0
- package/dist/v1/libs/sw/service/plugins/Ping.d.mts.map +1 -0
- package/dist/v1/libs/sw/service/plugins/Ping.mjs +25 -0
- package/dist/v1/libs/sw/service/plugins/TabManager.cjs +457 -0
- package/dist/v1/libs/sw/service/plugins/TabManager.d.mts +91 -0
- package/dist/v1/libs/sw/service/plugins/TabManager.d.mts.map +1 -0
- package/dist/v1/libs/sw/service/plugins/TabManager.mjs +372 -0
- package/dist/v1/libs/sw/service/plugins/ViteFileDetector.cjs +180 -0
- package/dist/v1/libs/sw/service/plugins/ViteFileDetector.d.mts +28 -0
- package/dist/v1/libs/sw/service/plugins/ViteFileDetector.d.mts.map +1 -0
- package/dist/v1/libs/sw/service/plugins/ViteFileDetector.mjs +148 -0
- package/dist/v1/libs/sw/service/shared/TinyPushPayload.cjs +199 -0
- package/dist/v1/libs/sw/service/shared/TinyPushPayload.d.mts +80 -0
- package/dist/v1/libs/sw/service/shared/TinyPushPayload.d.mts.map +1 -0
- package/dist/v1/libs/sw/service/shared/TinyPushPayload.mjs +174 -0
- package/dist/v1/libs/sw/utils.cjs +57 -0
- package/dist/v1/libs/sw/utils.d.mts +173 -0
- package/dist/v1/libs/sw/utils.d.mts.map +1 -0
- package/dist/v1/libs/sw/utils.mjs +50 -0
- package/dist/v1/libs/text/TinyI18/Browser-NON-DOM.cjs +57 -0
- package/dist/v1/libs/text/TinyI18/Browser-NON-DOM.d.mts +39 -0
- package/dist/v1/libs/text/TinyI18/Browser-NON-DOM.d.mts.map +1 -0
- package/dist/v1/libs/text/TinyI18/Browser-NON-DOM.mjs +48 -0
- package/dist/v1/libs/text/TinyI18/Browser.cjs +64 -0
- package/dist/v1/libs/text/TinyI18/Browser.d.mts +47 -0
- package/dist/v1/libs/text/TinyI18/Browser.d.mts.map +1 -0
- package/dist/v1/libs/text/TinyI18/Browser.mjs +57 -0
- package/dist/v1/libs/text/TinyI18/Node.cjs +49 -0
- package/dist/v1/libs/text/TinyI18/Node.d.mts +38 -0
- package/dist/v1/libs/text/TinyI18/Node.d.mts.map +1 -0
- package/dist/v1/libs/text/TinyI18/Node.mjs +43 -0
- package/dist/v1/libs/text/TinyI18/browser-utils.cjs +17 -0
- package/dist/v1/libs/text/TinyI18/browser-utils.d.mts +8 -0
- package/dist/v1/libs/text/TinyI18/browser-utils.d.mts.map +1 -0
- package/dist/v1/libs/text/TinyI18/browser-utils.mjs +13 -0
- package/dist/v1/libs/text/{TinyI18.cjs โ TinyI18/index.cjs} +205 -104
- package/dist/v1/libs/text/{TinyI18.d.mts โ TinyI18/index.d.mts} +141 -92
- package/dist/v1/libs/text/TinyI18/index.d.mts.map +1 -0
- package/dist/v1/libs/text/{TinyI18.mjs โ TinyI18/index.mjs} +195 -101
- package/dist/v1/libs/tools/TinyBrowserMonitor.cjs +1088 -0
- package/dist/v1/libs/tools/TinyBrowserMonitor.d.mts +621 -0
- package/dist/v1/libs/tools/TinyBrowserMonitor.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinyBrowserMonitor.mjs +940 -0
- package/dist/v1/libs/tools/TinyDebugger.cjs +180 -19
- package/dist/v1/libs/tools/TinyDebugger.d.mts +220 -24
- package/dist/v1/libs/tools/TinyDebugger.d.mts.map +1 -1
- package/dist/v1/libs/tools/TinyDebugger.mjs +161 -19
- package/dist/v1/libs/tools/TinyHtmlTagRegexBuilder.cjs +256 -0
- package/dist/v1/libs/tools/TinyHtmlTagRegexBuilder.d.mts +125 -0
- package/dist/v1/libs/tools/TinyHtmlTagRegexBuilder.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinyHtmlTagRegexBuilder.mjs +223 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser-NON-DOM.cjs +23 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser-NON-DOM.d.mts +17 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser-NON-DOM.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser-NON-DOM.mjs +19 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser.cjs +23 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser.d.mts +17 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/Browser.mjs +19 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/EmptyRequestCodes.cjs +390 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/EmptyRequestCodes.d.mts +9 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/EmptyRequestCodes.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/EmptyRequestCodes.mjs +387 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/JsDoc.cjs +2 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/JsDoc.d.mts +27 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/JsDoc.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/JsDoc.mjs +12 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/MozillaRequestCodes/LICENSE +53 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/MozillaRequestCodes/index.cjs +405 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/MozillaRequestCodes/index.d.mts +34 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/MozillaRequestCodes/index.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/MozillaRequestCodes/index.mjs +342 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/Node.cjs +23 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/Node.d.mts +17 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/Node.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/Node.mjs +19 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/RequestCodes.cjs +327 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/RequestCodes.d.mts +9 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/RequestCodes.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/RequestCodes.mjs +324 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/index.cjs +268 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/index.d.mts +107 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/index.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinyHttpResponseRegistry/index.mjs +238 -0
- package/dist/v1/libs/tools/TinyPasswordValidator.cjs +491 -0
- package/dist/v1/libs/tools/TinyPasswordValidator.d.mts +246 -0
- package/dist/v1/libs/tools/TinyPasswordValidator.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinyPasswordValidator.mjs +434 -0
- package/dist/v1/libs/tools/TinyPkgExportValidator.cjs +48 -0
- package/dist/v1/libs/tools/TinyPkgExportValidator.d.mts +14 -0
- package/dist/v1/libs/tools/TinyPkgExportValidator.d.mts.map +1 -1
- package/dist/v1/libs/tools/TinyPkgExportValidator.mjs +44 -0
- package/dist/v1/libs/tools/TinySiteMap.cjs +1029 -0
- package/dist/v1/libs/tools/TinySiteMap.d.mts +429 -0
- package/dist/v1/libs/tools/TinySiteMap.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinySiteMap.mjs +910 -0
- package/dist/v1/libs/tools/TinySiteMapStream.cjs +121 -0
- package/dist/v1/libs/tools/TinySiteMapStream.d.mts +51 -0
- package/dist/v1/libs/tools/TinySiteMapStream.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinySiteMapStream.mjs +85 -0
- package/dist/v1/libs/tools/TinyURLSecurityVerifier.cjs +444 -0
- package/dist/v1/libs/tools/TinyURLSecurityVerifier.d.mts +217 -0
- package/dist/v1/libs/tools/TinyURLSecurityVerifier.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinyURLSecurityVerifier.mjs +394 -0
- package/dist/v1/libs/tools/TinyUriParser/BlueSky.cjs +613 -0
- package/dist/v1/libs/tools/TinyUriParser/BlueSky.d.mts +152 -0
- package/dist/v1/libs/tools/TinyUriParser/BlueSky.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinyUriParser/BlueSky.mjs +527 -0
- package/dist/v1/libs/tools/TinyUriParser/Discord.cjs +1119 -0
- package/dist/v1/libs/tools/TinyUriParser/Discord.d.mts +306 -0
- package/dist/v1/libs/tools/TinyUriParser/Discord.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinyUriParser/Discord.mjs +968 -0
- package/dist/v1/libs/tools/TinyUriParser/MatrixProtocol.cjs +469 -0
- package/dist/v1/libs/tools/TinyUriParser/MatrixProtocol.d.mts +80 -0
- package/dist/v1/libs/tools/TinyUriParser/MatrixProtocol.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinyUriParser/MatrixProtocol.mjs +379 -0
- package/dist/v1/libs/tools/TinyUriParser.cjs +217 -0
- package/dist/v1/libs/tools/TinyUriParser.d.mts +109 -0
- package/dist/v1/libs/tools/TinyUriParser.d.mts.map +1 -0
- package/dist/v1/libs/tools/TinyUriParser.mjs +183 -0
- package/dist/v1/libs/utils/TinyCloner.cjs +466 -0
- package/dist/v1/libs/utils/TinyCloner.d.mts +221 -0
- package/dist/v1/libs/utils/TinyCloner.d.mts.map +1 -0
- package/dist/v1/libs/utils/TinyCloner.mjs +416 -0
- package/dist/v1/libs/utils/TinyPromiseQueue.cjs +1 -1
- package/dist/v1/libs/utils/TinyPromiseQueue.d.mts +2 -2
- package/dist/v1/libs/utils/TinyPromiseQueue.d.mts.map +1 -1
- package/dist/v1/libs/utils/TinyPromiseQueue.mjs +1 -1
- package/dist/v1/libs/utils/TinyThrottledApi.cjs +333 -0
- package/dist/v1/libs/utils/TinyThrottledApi.d.mts +163 -0
- package/dist/v1/libs/utils/TinyThrottledApi.d.mts.map +1 -0
- package/dist/v1/libs/utils/TinyThrottledApi.mjs +294 -0
- package/dist/v1/libs/worker/browser/TinyWebWorker.cjs +342 -0
- package/dist/v1/libs/worker/browser/TinyWebWorker.d.mts +97 -0
- package/dist/v1/libs/worker/browser/TinyWebWorker.d.mts.map +1 -0
- package/dist/v1/libs/worker/browser/TinyWebWorker.mjs +305 -0
- package/dist/v1/libs/worker/engine/TinyWebWorkerEngine.cjs +346 -0
- package/dist/v1/libs/worker/engine/TinyWebWorkerEngine.d.mts +127 -0
- package/dist/v1/libs/worker/engine/TinyWebWorkerEngine.d.mts.map +1 -0
- package/dist/v1/libs/worker/engine/TinyWebWorkerEngine.mjs +304 -0
- package/dist/v1/regexp/Email.cjs +185 -0
- package/dist/v1/regexp/Email.d.mts +73 -0
- package/dist/v1/regexp/Email.d.mts.map +1 -0
- package/dist/v1/regexp/Email.mjs +153 -0
- package/dist/v1/regexp/Glob.cjs +293 -0
- package/dist/v1/regexp/Glob.d.mts +45 -0
- package/dist/v1/regexp/Glob.d.mts.map +1 -0
- package/dist/v1/regexp/Glob.mjs +260 -0
- package/dist/v1/regexp/Ipv4.cjs +57 -0
- package/dist/v1/regexp/Ipv4.d.mts +29 -0
- package/dist/v1/regexp/Ipv4.d.mts.map +1 -0
- package/dist/v1/regexp/Ipv4.mjs +45 -0
- package/dist/v1/regexp/Ipv6.cjs +67 -0
- package/dist/v1/regexp/Ipv6.d.mts +29 -0
- package/dist/v1/regexp/Ipv6.d.mts.map +1 -0
- package/dist/v1/regexp/Ipv6.mjs +54 -0
- package/dist/v1/regexp/SegmentExtractor.cjs +145 -0
- package/dist/v1/regexp/SegmentExtractor.d.mts +91 -0
- package/dist/v1/regexp/SegmentExtractor.d.mts.map +1 -0
- package/dist/v1/regexp/SegmentExtractor.mjs +116 -0
- package/dist/v1/regexp/UrlDetector.cjs +125 -0
- package/dist/v1/regexp/UrlDetector.d.mts +67 -0
- package/dist/v1/regexp/UrlDetector.d.mts.map +1 -0
- package/dist/v1/regexp/UrlDetector.mjs +102 -0
- package/dist/v1/regexp/Username/index.cjs +233 -0
- package/dist/v1/regexp/Username/index.d.mts +77 -0
- package/dist/v1/regexp/Username/index.d.mts.map +1 -0
- package/dist/v1/regexp/Username/index.mjs +199 -0
- package/dist/v1/regexp/Username/jsDoc.cjs +2 -0
- package/dist/v1/regexp/Username/jsDoc.d.mts +57 -0
- package/dist/v1/regexp/Username/jsDoc.d.mts.map +1 -0
- package/dist/v1/regexp/Username/jsDoc.mjs +18 -0
- package/dist/v1/regexp/Username/templates/BlueSky.cjs +56 -0
- package/dist/v1/regexp/Username/templates/BlueSky.d.mts +35 -0
- package/dist/v1/regexp/Username/templates/BlueSky.d.mts.map +1 -0
- package/dist/v1/regexp/Username/templates/BlueSky.mjs +52 -0
- package/dist/v1/regexp/Username/templates/Discord.cjs +505 -0
- package/dist/v1/regexp/Username/templates/Discord.d.mts +209 -0
- package/dist/v1/regexp/Username/templates/Discord.d.mts.map +1 -0
- package/dist/v1/regexp/Username/templates/Discord.mjs +458 -0
- package/dist/v1/regexp/Username/templates/MatrixProtocol.cjs +143 -0
- package/dist/v1/regexp/Username/templates/MatrixProtocol.d.mts +70 -0
- package/dist/v1/regexp/Username/templates/MatrixProtocol.d.mts.map +1 -0
- package/dist/v1/regexp/Username/templates/MatrixProtocol.mjs +128 -0
- package/dist/v1/regexp/Username/templates/deprecated/Discord.cjs +24 -0
- package/dist/v1/regexp/Username/templates/deprecated/Discord.d.mts +17 -0
- package/dist/v1/regexp/Username/templates/deprecated/Discord.d.mts.map +1 -0
- package/dist/v1/regexp/Username/templates/deprecated/Discord.mjs +20 -0
- package/dist/v1/regexp/Username/templates/index.cjs +11 -0
- package/dist/v1/regexp/Username/templates/index.d.mts +5 -0
- package/dist/v1/regexp/Username/templates/index.d.mts.map +1 -0
- package/dist/v1/regexp/Username/templates/index.mjs +4 -0
- package/dist/v1/regexp/index.cjs +41 -0
- package/dist/v1/regexp/index.d.mts +9 -0
- package/dist/v1/regexp/index.d.mts.map +1 -0
- package/dist/v1/regexp/index.mjs +8 -0
- package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Browser.cjs +64 -0
- package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Browser.d.mts +11 -0
- package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Browser.d.mts.map +1 -0
- package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Browser.mjs +51 -0
- package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/FileInput.cjs +66 -0
- package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/FileInput.d.mts +11 -0
- package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/FileInput.d.mts.map +1 -0
- package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/FileInput.mjs +51 -0
- package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Node.cjs +39 -0
- package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Node.d.mts +11 -0
- package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Node.d.mts.map +1 -0
- package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Node.mjs +28 -0
- package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Template.cjs +494 -0
- package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Template.d.mts +142 -0
- package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Template.d.mts.map +1 -0
- package/dist/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Template.mjs +445 -0
- package/dist/v1/webTemplates/bootstrap/5.3/html/BootstrapDialogs.cjs +725 -0
- package/dist/v1/webTemplates/bootstrap/5.3/html/BootstrapDialogs.d.mts +293 -0
- package/dist/v1/webTemplates/bootstrap/5.3/html/BootstrapDialogs.d.mts.map +1 -0
- package/dist/v1/webTemplates/bootstrap/5.3/html/BootstrapDialogs.mjs +614 -0
- package/dist/v1/webTemplates/bootstrap/5.3/scss/input/Placeholder-Colors-Fix.scss +64 -0
- package/dist/v1/webTemplates/bootstrap/5.3/scss/spacing/Spacing-Plus.scss +31 -0
- package/dist/v1/webTemplates/media/MediaValidator/v1/Browser/index.cjs +135 -0
- package/dist/v1/webTemplates/media/MediaValidator/v1/Browser/index.d.mts +83 -0
- package/dist/v1/webTemplates/media/MediaValidator/v1/Browser/index.d.mts.map +1 -0
- package/dist/v1/webTemplates/media/MediaValidator/v1/Browser/index.mjs +120 -0
- package/dist/v1/webTemplates/media/MediaValidator/v1/Node/index.cjs +127 -0
- package/dist/v1/webTemplates/media/MediaValidator/v1/Node/index.d.mts +95 -0
- package/dist/v1/webTemplates/media/MediaValidator/v1/Node/index.d.mts.map +1 -0
- package/dist/v1/webTemplates/media/MediaValidator/v1/Node/index.mjs +109 -0
- package/dist/v1/webTemplates/multiformats/14.0/IPFSHasher/index.cjs +83 -0
- package/dist/v1/webTemplates/multiformats/14.0/IPFSHasher/index.d.mts +46 -0
- package/dist/v1/webTemplates/multiformats/14.0/IPFSHasher/index.d.mts.map +1 -0
- package/dist/v1/webTemplates/multiformats/14.0/IPFSHasher/index.mjs +71 -0
- package/dist/v1/webTemplates/vite/7.3/plugins/TinyVitePwaPlugin.cjs +493 -0
- package/dist/v1/webTemplates/vite/7.3/plugins/TinyVitePwaPlugin.d.mts +67 -0
- package/dist/v1/webTemplates/vite/7.3/plugins/TinyVitePwaPlugin.d.mts.map +1 -0
- package/dist/v1/webTemplates/vite/7.3/plugins/TinyVitePwaPlugin.mjs +399 -0
- package/dist/v1/webTemplates/vite/7.3/plugins/githubUtils.cjs +35 -0
- package/dist/v1/webTemplates/vite/7.3/plugins/githubUtils.d.mts +6 -0
- package/dist/v1/webTemplates/vite/7.3/plugins/githubUtils.d.mts.map +1 -0
- package/dist/v1/webTemplates/vite/7.3/plugins/githubUtils.mjs +29 -0
- package/docs/info/RegExp.md +74 -0
- package/docs/v1/Exports.md +111 -0
- package/docs/v1/README.md +117 -13
- package/docs/v1/basics/asyncReplace.md +2 -0
- package/docs/v1/basics/browserDetector.md +28 -11
- package/docs/v1/basics/crypto.md +85 -0
- package/docs/v1/basics/deprecated/html.md +2 -0
- package/docs/v1/basics/deprecated/objFilter.md +2 -0
- package/docs/v1/basics/html.md +2 -0
- package/docs/v1/basics/objChecker.md +55 -0
- package/docs/v1/basics/objFilter.md +57 -86
- package/docs/v1/basics/promiseUtils.md +12 -3
- package/docs/v1/basics/text.md +0 -1
- package/docs/v1/libs/array/TinyArrayComparator.md +50 -39
- package/docs/v1/libs/fs/TinyFS.md +752 -0
- package/docs/v1/libs/fs/TinyOPFSFileSystem.md +495 -0
- package/docs/v1/libs/fs/TinyStorageBucketFileSystem.md +407 -0
- package/docs/v1/libs/plugin/TinyPlugin.md +441 -0
- package/docs/v1/libs/plugin/TinyVersion.md +145 -0
- package/docs/v1/libs/router/TinyRouter.md +216 -0
- package/docs/v1/libs/storage/TinyMapCache.md +219 -0
- package/docs/v1/libs/storage/TinySetMapDatabase.md +478 -0
- package/docs/v1/libs/sw/browser/TinyNotificationAdapter.md +280 -0
- package/docs/v1/libs/sw/browser/TinyPushManager.md +782 -0
- package/docs/v1/libs/sw/browser/TinyServiceWorker.md +365 -0
- package/docs/v1/libs/sw/browser/plugins/TabManager.md +133 -0
- package/docs/v1/libs/sw/service/TinyPushRouter.md +314 -0
- package/docs/v1/libs/sw/service/TinyServiceWorkerEngine.md +748 -0
- package/docs/v1/libs/sw/service/plugins/GlobBypassPlugin.md +229 -0
- package/docs/v1/libs/sw/service/plugins/GlobCachePlugin.md +91 -0
- package/docs/v1/libs/sw/service/plugins/Ping.md +36 -0
- package/docs/v1/libs/sw/service/plugins/TabManager.md +64 -0
- package/docs/v1/libs/sw/service/plugins/ViteFileDetector.md +92 -0
- package/docs/v1/libs/sw/service/shared/TinyPushPayload.md +316 -0
- package/docs/v1/libs/text/TinyI18.md +80 -56
- package/docs/v1/libs/tools/TinyBrowserMonitor.md +170 -0
- package/docs/v1/libs/tools/TinyDebugger.md +117 -1
- package/docs/v1/libs/tools/TinyHtmlTagRegexBuilder.md +141 -0
- package/docs/v1/libs/tools/TinyHttpResponseRegistry.md +129 -0
- package/docs/v1/libs/tools/TinyPasswordValidator.md +153 -0
- package/docs/v1/libs/tools/TinyPkgExportValidator.md +45 -1
- package/docs/v1/libs/tools/TinySiteMap.md +134 -0
- package/docs/v1/libs/tools/TinySiteMapStream.md +97 -0
- package/docs/v1/libs/tools/TinyURLSecurityVerifier.md +146 -0
- package/docs/v1/libs/tools/TinyUriParser/Discord.md +374 -0
- package/docs/v1/libs/tools/TinyUriParser/MatrixProtocol.md +54 -0
- package/docs/v1/libs/tools/TinyUriParser.md +128 -0
- package/docs/v1/libs/utils/TinyCloner.md +126 -0
- package/docs/v1/libs/utils/TinyPromiseQueue.md +1 -1
- package/docs/v1/libs/utils/TinyThrottledApi.md +219 -0
- package/docs/v1/libs/worker/browser/TinyWebWorker.md +331 -0
- package/docs/v1/libs/worker/engine/TinyWebWorkerEngine.md +137 -0
- package/docs/v1/regexp/Email.md +127 -0
- package/docs/v1/regexp/Glob.md +155 -0
- package/docs/v1/regexp/IPv4.md +103 -0
- package/docs/v1/regexp/IPv6.md +122 -0
- package/docs/v1/regexp/SegmentExtractor.md +120 -0
- package/docs/v1/regexp/UrlDetector.md +117 -0
- package/docs/v1/regexp/Username/Base.md +131 -0
- package/docs/v1/regexp/Username/Discord.md +267 -0
- package/docs/v1/regexp/Username/MatrixProtocol.md +131 -0
- package/docs/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters.md +569 -0
- package/docs/v1/webTemplates/bootstrap/5.3/html/BootstrapDialogs.md +174 -0
- package/docs/v1/webTemplates/media/MediaValidator/v1/Browser.md +123 -0
- package/docs/v1/webTemplates/media/MediaValidator/v1/Node.md +136 -0
- package/docs/v1/webTemplates/multiformats/14.0/IPFSHasher.md +310 -0
- package/docs/v1/webTemplates/vite/7.3/plugins/TinyVitePwaPlugin.md +131 -0
- package/docs/v1/webTemplates/vite/7.3/plugins/githubUtils.md +50 -0
- package/package.json +313 -18
- package/types/EventEmitter.d.ts +48 -0
- 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
|