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,374 @@
|
|
|
1
|
+
# 📡 TinyUriParser & Discord URI Toolkit
|
|
2
|
+
|
|
3
|
+
> A tiny, dependency-free toolkit for parsing and rebuilding Discord URIs,
|
|
4
|
+
> mentions, invites, CDN assets, and more — with strict runtime validation.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 📖 Table of Contents
|
|
9
|
+
|
|
10
|
+
1. [Overview](#-overview)
|
|
11
|
+
2. [Installation](#-installation)
|
|
12
|
+
3. [Core Concepts](#-core-concepts)
|
|
13
|
+
4. [TinyUriParser API](#-tinyuriparser-api)
|
|
14
|
+
5. [Discord Module](#-discord-module-discordmjs)
|
|
15
|
+
- [Mentions](#1--mentions)
|
|
16
|
+
- [Game Profiles](#2--game-profiles)
|
|
17
|
+
- [Guild Navigation](#3--guild-navigation)
|
|
18
|
+
- [Emojis](#4--emojis)
|
|
19
|
+
- [Timestamps](#5--timestamps)
|
|
20
|
+
- [Commands](#6--commands)
|
|
21
|
+
- [Invites](#7--invites)
|
|
22
|
+
- [Message Links](#8--message-links)
|
|
23
|
+
- [CDN Assets](#9--cdn-assets)
|
|
24
|
+
6. [Known Issues](#-known-issues)
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 🎯 Overview
|
|
29
|
+
|
|
30
|
+
This project has two layers:
|
|
31
|
+
|
|
32
|
+
| Layer | File | Responsibility |
|
|
33
|
+
| --- | --- | --- |
|
|
34
|
+
| 🧩 **Engine** | `TinyUriParser` | Generic, protocol-agnostic URI parser/stringifier. |
|
|
35
|
+
| 💬 **Discord** | `TinyUriParser/Discord` | All Discord-specific parsers built on top of the engine. |
|
|
36
|
+
|
|
37
|
+
The engine knows **nothing** about Discord. It only knows how to:
|
|
38
|
+
|
|
39
|
+
1. Test a string against a set of registered parsers.
|
|
40
|
+
2. Return a structured `{ type, data }` object.
|
|
41
|
+
3. Rebuild the original string from that object.
|
|
42
|
+
|
|
43
|
+
The Discord module plugs into the engine by exporting **parser pairs**.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## 📦 Installation
|
|
48
|
+
|
|
49
|
+
```js
|
|
50
|
+
// Import the engine
|
|
51
|
+
import TinyUriParser from 'tiny-essentials/libs/tools/TinyUriParser';
|
|
52
|
+
|
|
53
|
+
// Import the Discord parser collection
|
|
54
|
+
import { DiscordProtocolParsers } from 'tiny-essentials/libs/tools/TinyUriParser/Discord';
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## 🧩 Core Concepts
|
|
60
|
+
|
|
61
|
+
### What is a `ParserPair`?
|
|
62
|
+
|
|
63
|
+
A `ParserPair` is an immutable tuple with **exactly four** elements:
|
|
64
|
+
|
|
65
|
+
```js
|
|
66
|
+
[type, checker, parser, stringify]
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
| Index | Name | Type | Purpose |
|
|
70
|
+
| --- | --- | --- | --- |
|
|
71
|
+
| 0 | `type` | `string` | Unique identifier (e.g., `'emoji'`). |
|
|
72
|
+
| 1 | `checker` | `(uri: string) => boolean` | Returns `true` if this parser can handle the URI. |
|
|
73
|
+
| 2 | `parser` | `(uri: string) => ParsedUri` | Converts the URI into a structured object. |
|
|
74
|
+
| 3 | `stringify` | `(data: object) => string` | Rebuilds the URI from parsed data. |
|
|
75
|
+
|
|
76
|
+
### The `ParsedUri` shape
|
|
77
|
+
|
|
78
|
+
Every parser returns an object with this shape:
|
|
79
|
+
|
|
80
|
+
```js
|
|
81
|
+
{
|
|
82
|
+
type: 'emoji', // The parser category
|
|
83
|
+
data: { /* parser-specific payload */ }
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## 🔧 TinyUriParser API
|
|
90
|
+
|
|
91
|
+
### `TinyUriParser.buildParserPair(type, checker, parser, stringify)`
|
|
92
|
+
|
|
93
|
+
Static factory. Creates a frozen `ParserPair`.
|
|
94
|
+
|
|
95
|
+
```js
|
|
96
|
+
const MyPair = TinyUriParser.buildParserPair(
|
|
97
|
+
'greeting',
|
|
98
|
+
(uri) => uri.startsWith('hello:'),
|
|
99
|
+
(uri) => ({ dataType: 'greeting', name: uri.slice(6) }),
|
|
100
|
+
(data) => `hello:${data.name}`,
|
|
101
|
+
);
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### `new TinyUriParser(...parsers)`
|
|
105
|
+
|
|
106
|
+
Creates a new parser registry.
|
|
107
|
+
|
|
108
|
+
```js
|
|
109
|
+
const parser = new TinyUriParser(...DiscordProtocolParsers);
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### `parser.parse(uri)`
|
|
113
|
+
|
|
114
|
+
Parses a URI string into a `{ type, data }` object.
|
|
115
|
+
|
|
116
|
+
```js
|
|
117
|
+
const result = parser.parse('<:party:123456789>');
|
|
118
|
+
// { type: 'emoji', data: { dataType: 'emoji', name: 'party', id: '123456789', animated: false } }
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### `parser.stringify(parsedObject)`
|
|
122
|
+
|
|
123
|
+
Rebuilds the original URI from a parsed object.
|
|
124
|
+
|
|
125
|
+
```js
|
|
126
|
+
parser.stringify(result);
|
|
127
|
+
// '<:party:123456789>'
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### `parser.parsers`
|
|
131
|
+
|
|
132
|
+
Returns a **copy** of the registered parser pairs. Mutating the result does not affect the instance.
|
|
133
|
+
|
|
134
|
+
### `parser.size`
|
|
135
|
+
|
|
136
|
+
Returns the number of registered parsers.
|
|
137
|
+
|
|
138
|
+
### `parser.destroy()`
|
|
139
|
+
|
|
140
|
+
Clears internal state and marks the instance as destroyed. All subsequent calls throw.
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## 💬 Discord Module
|
|
145
|
+
|
|
146
|
+
### 📥 Importing
|
|
147
|
+
|
|
148
|
+
```js
|
|
149
|
+
import TinyUriParser from 'tiny-essentials/libs/tools/TinyUriParser';
|
|
150
|
+
import {
|
|
151
|
+
DiscordProtocolParsers,
|
|
152
|
+
DiscordMentionParser,
|
|
153
|
+
DiscordEmojiParser,
|
|
154
|
+
// ...etc
|
|
155
|
+
} from 'tiny-essentials/libs/tools/TinyUriParser/Discord';
|
|
156
|
+
|
|
157
|
+
const parser = new TinyUriParser(...DiscordProtocolParsers);
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
> ⚠️ **Order matters.** `DiscordProtocolParsers` is pre-sorted from the most
|
|
161
|
+
> specific parser to the most permissive. Always spread it as-is.
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
### 1. 👤 Mentions
|
|
166
|
+
|
|
167
|
+
Parses `<@id>`, `<@!id>`, `<@&id>` and `<#id>`.
|
|
168
|
+
|
|
169
|
+
| Input | `target` | `isNickname` |
|
|
170
|
+
| --- | --- | --- |
|
|
171
|
+
| `<@123>` | `'user'` | `false` |
|
|
172
|
+
| `<@!123>` | `'user'` | `true` |
|
|
173
|
+
| `<@&123>` | `'role'` | `false` |
|
|
174
|
+
| `<#123>` | `'channel'` | `false` |
|
|
175
|
+
|
|
176
|
+
```js
|
|
177
|
+
parser.parse('<@!42>');
|
|
178
|
+
// { type: 'mention', data: { dataType: 'mention', target: 'user', id: '42', isNickname: true } }
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
### 2. 🎮 Game Profiles
|
|
184
|
+
|
|
185
|
+
Parses `<@$id>`.
|
|
186
|
+
|
|
187
|
+
```js
|
|
188
|
+
parser.parse('<@$1402418491272986635>');
|
|
189
|
+
// { type: 'game_profile', data: { dataType: 'game_profile', id: '1402418491272986635' } }
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
### 3. 🧭 Guild Navigation
|
|
195
|
+
|
|
196
|
+
Parses `<id:type>` and `<id:linked-roles:roleId>`.
|
|
197
|
+
|
|
198
|
+
| Target | Description |
|
|
199
|
+
| --- | --- |
|
|
200
|
+
| `customize` | Opens the "Customize" tab. |
|
|
201
|
+
| `browse` | Opens the "Browse Channels" tab. |
|
|
202
|
+
| `guide` | Opens the server guide. |
|
|
203
|
+
| `linked-roles` | Requires a `roleId`. |
|
|
204
|
+
|
|
205
|
+
```js
|
|
206
|
+
parser.parse('<id:linked-roles:123456789>');
|
|
207
|
+
// { type: 'guild_navigation', data: { dataType: 'guild_navigation', target: 'linked-roles', roleId: '123456789' } }
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
### 4. 😀 Emojis
|
|
213
|
+
|
|
214
|
+
Parses `<:name:id>` and `<a:name:id>`.
|
|
215
|
+
|
|
216
|
+
```js
|
|
217
|
+
parser.parse('<a:party:123456789>');
|
|
218
|
+
// { type: 'emoji', data: { dataType: 'emoji', name: 'party', id: '123456789', animated: true } }
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
### 5. ⏰ Timestamps
|
|
224
|
+
|
|
225
|
+
Parses `<t:unix>` and `<t:unix:style>`.
|
|
226
|
+
|
|
227
|
+
| Style | Meaning |
|
|
228
|
+
| --- | --- |
|
|
229
|
+
| `t` | Short time (16:20) |
|
|
230
|
+
| `T` | Long time (16:20:30) |
|
|
231
|
+
| `d` | Short date (20/04/2024) |
|
|
232
|
+
| `D` | Long date (20 April 2024) |
|
|
233
|
+
| `f` | Short date/time |
|
|
234
|
+
| `F` | Long date/time |
|
|
235
|
+
| `R` | Relative ("2 hours ago") |
|
|
236
|
+
| `s` | Short date/time (lowercase) |
|
|
237
|
+
| `S` | Long date/time (uppercase) |
|
|
238
|
+
|
|
239
|
+
```js
|
|
240
|
+
parser.parse('<t:1618953630:R>');
|
|
241
|
+
// { type: 'timestamp', data: { dataType: 'timestamp', timestamp: 1618953630, style: 'R' } }
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
### 6. ⌨️ Commands
|
|
247
|
+
|
|
248
|
+
Parses `</name:id>`, `</name sub:id>` and `</name group sub:id>`.
|
|
249
|
+
|
|
250
|
+
```js
|
|
251
|
+
parser.parse('</play music:123456789>');
|
|
252
|
+
// {
|
|
253
|
+
// type: 'command',
|
|
254
|
+
// data: {
|
|
255
|
+
// dataType: 'command',
|
|
256
|
+
// name: 'play music',
|
|
257
|
+
// command: 'play',
|
|
258
|
+
// subcommandGroup: null,
|
|
259
|
+
// subcommand: 'music',
|
|
260
|
+
// id: '123456789'
|
|
261
|
+
// }
|
|
262
|
+
// }
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
---
|
|
266
|
+
|
|
267
|
+
### 7. 🔗 Invites
|
|
268
|
+
|
|
269
|
+
Parses clean and whitespace-obfuscated invite links.
|
|
270
|
+
|
|
271
|
+
| Input | `host` | `kind` | `obfuscated` |
|
|
272
|
+
| --- | --- | --- | --- |
|
|
273
|
+
| `discord.gg/abc` | `'discord.gg'` | `null` | `false` |
|
|
274
|
+
| `discord.com/invite/abc` | `'discord.com'` | `'invite'` | `false` |
|
|
275
|
+
| `discord.com/servers/abc` | `'discord.com'` | `'servers'` | `false` |
|
|
276
|
+
| `discord . gg / abc` | `'discord.gg'` | `null` | `true` |
|
|
277
|
+
|
|
278
|
+
```js
|
|
279
|
+
parser.parse('discord.gg/abc?ref=friend');
|
|
280
|
+
// {
|
|
281
|
+
// type: 'invite',
|
|
282
|
+
// data: {
|
|
283
|
+
// dataType: 'invite',
|
|
284
|
+
// code: 'abc',
|
|
285
|
+
// host: 'discord.gg',
|
|
286
|
+
// kind: null,
|
|
287
|
+
// obfuscated: false,
|
|
288
|
+
// params: { ref: 'friend' }
|
|
289
|
+
// }
|
|
290
|
+
// }
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
### 8. ✉️ Message Links
|
|
296
|
+
|
|
297
|
+
Parses `https://discord.com/channels/<guild>/<channel>/<message>`.
|
|
298
|
+
|
|
299
|
+
```js
|
|
300
|
+
parser.parse('https://discord.com/channels/1/2/3');
|
|
301
|
+
// {
|
|
302
|
+
// type: 'message_link',
|
|
303
|
+
// data: {
|
|
304
|
+
// dataType: 'message_link',
|
|
305
|
+
// guildId: '1',
|
|
306
|
+
// channelId: '2',
|
|
307
|
+
// messageId: '3',
|
|
308
|
+
// params: {}
|
|
309
|
+
// }
|
|
310
|
+
// }
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
---
|
|
314
|
+
|
|
315
|
+
### 9. 🖼️ CDN Assets
|
|
316
|
+
|
|
317
|
+
Parses URLs from `cdn.discordapp.com` and `media.discordapp.net`.
|
|
318
|
+
|
|
319
|
+
**Supported asset kinds** (in match order):
|
|
320
|
+
|
|
321
|
+
```
|
|
322
|
+
attachment, guild_member_avatar, guild_member_banner, achievement_icon,
|
|
323
|
+
sticker_pack_banner, store_page_asset, application_asset, application_icon,
|
|
324
|
+
guild_icon, guild_splash, guild_discovery_splash, banner, default_user_avatar,
|
|
325
|
+
user_avatar, avatar_decoration, team_icon, emoji, sticker, role_icon,
|
|
326
|
+
guild_scheduled_event_cover, guild_tag_badge
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
```js
|
|
330
|
+
parser.parse('https://cdn.discordapp.com/icons/123/abc.png?size=128');
|
|
331
|
+
// {
|
|
332
|
+
// type: 'cdn_asset',
|
|
333
|
+
// data: {
|
|
334
|
+
// dataType: 'cdn_asset',
|
|
335
|
+
// kind: 'guild_icon',
|
|
336
|
+
// host: 'cdn.discordapp.com',
|
|
337
|
+
// path: 'icons/123/abc.png',
|
|
338
|
+
// hash: 'abc',
|
|
339
|
+
// ext: 'png',
|
|
340
|
+
// filename: null,
|
|
341
|
+
// spoiler: false,
|
|
342
|
+
// segments: { guildId: '123' },
|
|
343
|
+
// params: { size: '128' }
|
|
344
|
+
// }
|
|
345
|
+
// }
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
---
|
|
349
|
+
|
|
350
|
+
## ⚠️ Known Issues
|
|
351
|
+
|
|
352
|
+
### 🐛 Syntax errors (blocking)
|
|
353
|
+
|
|
354
|
+
The following lines are **missing an opening parenthesis** before the template
|
|
355
|
+
literal. They will throw a `SyntaxError` at parse time:
|
|
356
|
+
|
|
357
|
+
```js
|
|
358
|
+
// ❌ Broken
|
|
359
|
+
throw new TypeError`Parser at index ${index} must be an array.`);
|
|
360
|
+
|
|
361
|
+
// ✅ Fixed
|
|
362
|
+
throw new TypeError(`Parser at index ${index} must be an array.`);
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
This pattern repeats in **`TinyUriParser`** (3 occurrences) and
|
|
366
|
+
**`Discord`** (18 occurrences). Also check:
|
|
367
|
+
|
|
368
|
+
```js
|
|
369
|
+
// ❌ Broken
|
|
370
|
+
return { regex: new RegExp`^${pattern}$`), names };
|
|
371
|
+
|
|
372
|
+
// ✅ Fixed
|
|
373
|
+
return { regex: new RegExp(`^${pattern}$`), names };
|
|
374
|
+
```
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# 🧩 Matrix Protocol Parser Documentation
|
|
2
|
+
|
|
3
|
+
Welcome to the official documentation for the **Matrix Protocol Parser** module! 🚀
|
|
4
|
+
|
|
5
|
+
This module is a specialized tool designed to identify, parse, and reconstruct various types of Matrix-related URIs. Whether you are dealing with MXC content, Matrix scheme URIs, shorthand identifiers, or web URLs, this module provides a unified interface to handle them safely and predictably.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 🌟 Overview
|
|
10
|
+
|
|
11
|
+
The primary goal of this module is to take a raw string (a URI) and convert it into a **strongly typed JavaScript object**. This object can then be used to extract specific information, such as a server domain, a user ID, or a room ID, without needing to manually write complex Regular Expressions every time.
|
|
12
|
+
|
|
13
|
+
It is built on top of `TinyUriParser` to ensure a consistent "Parse $\rightarrow$ Validate $\rightarrow$ Reconstruct" workflow.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 🛠 Supported URI Formats
|
|
18
|
+
|
|
19
|
+
The module identifies and handles four distinct types of Matrix identifiers:
|
|
20
|
+
|
|
21
|
+
| Format Type | Example Input | Description |
|
|
22
|
+
| :--- | :--- | :--- |
|
|
23
|
+
| **MXC URI** | `mxc://matrix.org/abc123def` | Used for Matrix Content (media, files). |
|
|
24
|
+
| **Matrix Scheme** | `matrix:r/!room:server.com` | The formal protocol for Matrix resources. |
|
|
25
|
+
| **Shorthand** | `#room:server.com` or `@user:server.com` | The common human-readable format. |
|
|
26
|
+
| **Web URL** | `https://matrix.to/#/!room:server.com` | Full URLs used in web browsers. |
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 💎 Core Data Structures
|
|
31
|
+
|
|
32
|
+
When you parse a URI, the module returns a specific object structure. Understanding these "shapes" is crucial for your logic.
|
|
33
|
+
|
|
34
|
+
### 1. `MXCData` 📦
|
|
35
|
+
Used when parsing `mxc://` links.
|
|
36
|
+
- `dataType`: Always `'mxc'`.
|
|
37
|
+
- `server`: The domain (e.g., `'matrix.org'`).
|
|
38
|
+
- `dataId`: The unique content identifier.
|
|
39
|
+
|
|
40
|
+
### 2. `MatrixSchemeData` 🗺️
|
|
41
|
+
The most complex and versatile structure.
|
|
42
|
+
- `dataType`: Always `'matrix_scheme'`.
|
|
43
|
+
- `type`: The resource type (`'roomId'`, `'room'`, `'user'`, or `'event'`).
|
|
44
|
+
- `subType`: The specific sub-category (used when the type is an `event`).
|
|
45
|
+
- `resourceId`: The cleaned ID (e.g., `!room_id` becomes `room_id`).
|
|
46
|
+
- `server`: The Matrix server domain (can be `null`).
|
|
47
|
+
- `params`: A dictionary of query parameters (e.g., `{ via: 'server.com' }`).
|
|
48
|
+
- `eventId`: Present only if the type is `'event'`.
|
|
49
|
+
|
|
50
|
+
### 3. `MatrixWebData` 🌐
|
|
51
|
+
Used when parsing full browser URLs.
|
|
52
|
+
- `dataType`: Always `'matrix_web_url'`.
|
|
53
|
+
- `decodedFragment`: The part of the URL after the `#`.
|
|
54
|
+
- `parsed`: A nested `MatrixSchemeData` object containing the actual resource info.
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# 🧩 TinyUriParser Documentation
|
|
2
|
+
|
|
3
|
+
Welcome to the **TinyUriParser** documentation! 🚀
|
|
4
|
+
|
|
5
|
+
This project provides a lightweight, highly extensible engine designed to transform complex URI strings (like those used in the Matrix protocol) into structured JavaScript objects, and then reconstruct those objects back into their original URI strings.
|
|
6
|
+
|
|
7
|
+
## 📖 Overview
|
|
8
|
+
|
|
9
|
+
In modern messaging protocols, URIs are often used to identify users or rooms (e.g., `@user:example.com`). Manually parsing these using Regex every time can lead to repetitive and error-prone code.
|
|
10
|
+
|
|
11
|
+
`TinyUriParser` solves this by allowing you to define "Parser Pairs"—a set of rules that tell the engine:
|
|
12
|
+
1. **How to recognize** a specific URI type.
|
|
13
|
+
2. **How to turn** that string into a data object.
|
|
14
|
+
3. **How to turn** that data object back into a string.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 🏗️ The Building Block: `ParserPair`
|
|
19
|
+
|
|
20
|
+
Before using the parser, you must understand the `ParserPair`. This is a "tuple" (a fixed-length array) that acts as the blueprint for a specific URI type.
|
|
21
|
+
|
|
22
|
+
A `ParserPair` consists of exactly four elements:
|
|
23
|
+
|
|
24
|
+
| Index | Name | Type | Description |
|
|
25
|
+
| :--- | :--- | :--- | :--- |
|
|
26
|
+
| `0` | **Type** | `string` | A unique name for this URI category (e.g., `'user'`). |
|
|
27
|
+
| `1` | **Checker** | `function` | A function that returns `true` if the URI matches this type. |
|
|
28
|
+
| `2` | **Parser** | `function` | A function that takes the URI string and returns a data object. |
|
|
29
|
+
| `3` | **Stringifier**| `function` | A function that takes the data object and returns the original URI string. |
|
|
30
|
+
|
|
31
|
+
### 🛠️ How to create a Pair
|
|
32
|
+
Instead of creating the array manually, always use the `static buildParserPair` method.
|
|
33
|
+
|
|
34
|
+
```javascript
|
|
35
|
+
const myPair = TinyUriParser.buildParserPair(
|
|
36
|
+
'user',
|
|
37
|
+
(uri) => uri.startsWith('@'), // Checker
|
|
38
|
+
(uri) => ({ id: uri.split(':')[0] }), // Parser
|
|
39
|
+
(data) => `@${data.id}:example.com` // Stringifier
|
|
40
|
+
);
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## 🚀 Getting Started
|
|
46
|
+
|
|
47
|
+
Here is a step-by-step guide on how to implement `TinyUriParser` in your daily development.
|
|
48
|
+
|
|
49
|
+
### 1. Define your Parsing Logic
|
|
50
|
+
First, decide how you want to handle your specific URIs.
|
|
51
|
+
|
|
52
|
+
```javascript
|
|
53
|
+
// 1. The Checker: Does this string look like a user URI?
|
|
54
|
+
const isUserUri = (uri) => uri.startsWith('@');
|
|
55
|
+
|
|
56
|
+
// 2. The Parser: Convert "@alice:matrix.org" -> { username: "alice", domain: "matrix.org" }
|
|
57
|
+
const parseUser = (uri) => {
|
|
58
|
+
const [user, domain] = uri.slice(1).split(':');
|
|
59
|
+
return { username: user, domain: domain };
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
// 3. The Stringifier: Convert { username: "alice", domain: "matrix.org" } -> "@alice:matrix.org"
|
|
63
|
+
const stringifyUser = (data) => `@${data.username}:${data.domain}`;
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 2. Initialize the Engine
|
|
67
|
+
Create an instance of `TinyUriParser` and pass your pairs into the constructor.
|
|
68
|
+
|
|
69
|
+
```javascript
|
|
70
|
+
import TinyUriParser from 'tiny-essentials/libs/tools/TinyUriParser';
|
|
71
|
+
|
|
72
|
+
const parserEngine = new TinyUriParser(
|
|
73
|
+
TinyUriParser.buildParserPair('user', isUserUri, parseUser, stringifyUser)
|
|
74
|
+
);
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### 3. Parsing a URI (String ➡️ Object)
|
|
78
|
+
Use the `.parse()` method to turn a raw string into a usable object.
|
|
79
|
+
|
|
80
|
+
```javascript
|
|
81
|
+
try {
|
|
82
|
+
const result = parserEngine.parse('@alice:matrix.org');
|
|
83
|
+
console.log(result);
|
|
84
|
+
// Output: { type: 'user', data: { username: 'alice', domain: 'matrix.org' } }
|
|
85
|
+
} catch (error) {
|
|
86
|
+
console.error("Parsing failed:", error.message);
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### 4. Reconstructing a URI (Object ➡️ String)
|
|
91
|
+
Use the `.stringify()` method to turn your object back into a valid URI string.
|
|
92
|
+
|
|
93
|
+
```javascript
|
|
94
|
+
const userObject = { type: 'user', data: { username: 'bob', domain: 'example.com' } };
|
|
95
|
+
|
|
96
|
+
const originalUri = parserEngine.stringify(userObject);
|
|
97
|
+
console.log(originalUri);
|
|
98
|
+
// Output: "@bob:example.com"
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### 5. Resource Cleanup
|
|
102
|
+
To prevent memory leaks in long-running applications, use the `.destroy()` method to clean up the instance.
|
|
103
|
+
|
|
104
|
+
```javascript
|
|
105
|
+
// Destroys the instance and clears the memory of all stored URI parsers
|
|
106
|
+
parserEngine.destroy();
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## ⚠️ Error Handling
|
|
112
|
+
|
|
113
|
+
The `TinyUriParser` is designed to be strict to ensure data integrity. You should always wrap your calls in `try...catch` blocks.
|
|
114
|
+
|
|
115
|
+
| Error Type | Cause |
|
|
116
|
+
| :--- | :--- |
|
|
117
|
+
| `TypeError` | You passed a non-string to `.parse()`, or the `ParserPair` was constructed incorrectly. |
|
|
118
|
+
| `Error` | The URI provided does not match any registered parser, or no reconstructor exists for the provided type. |
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## 📊 Technical Specifications
|
|
123
|
+
|
|
124
|
+
* **Complexity (Time):**
|
|
125
|
+
* `parse()`: $O(N)$, where $N$ is the number of registered parsers.
|
|
126
|
+
* `stringify()`: $O(N)$, where $N$ is the number of registered parsers.
|
|
127
|
+
* **Immutability:** All `ParserPair` objects are frozen using `Object.freeze()`.
|
|
128
|
+
* **Uniqueness:** Parsers are stored in a `Set` to prevent duplicate registration.
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# 🧩 TinyCloner Documentation
|
|
2
|
+
|
|
3
|
+
Welcome to the **TinyCloner** official documentation! 🚀
|
|
4
|
+
|
|
5
|
+
`TinyCloner` is a highly modular, plugin-based deep cloning engine. Unlike standard `JSON.parse(JSON.stringify(obj))` hacks, TinyCloner is designed for professional environments where you need precision, extensibility, and total control over how specific data types are duplicated.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## ✨ Key Features
|
|
10
|
+
|
|
11
|
+
* **🔌 Plugin-Based Architecture:** Easily extend the cloner to handle custom classes, Dates, Sets, Maps, or any complex object.
|
|
12
|
+
* **🛡️ Strict Validation:** Built-in runtime checks ensure that plugins and options adhere to the required interfaces, preventing silent failures.
|
|
13
|
+
* **⚖️ Global vs. Instance Control:** Manage cloning rules globally for your whole application, or create isolated instances for specific tasks.
|
|
14
|
+
* **🔄 Deep & Shallow Modes:** Effortlessly switch between deep and shallow cloning.
|
|
15
|
+
* **🔒 Isolation Mode:** Create "sandboxed" cloners that ignore global settings to prevent side effects in complex applications.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 🚀 Getting Started
|
|
20
|
+
|
|
21
|
+
### 1. Basic Cloning (The Quick Way)
|
|
22
|
+
If you just need to clone something using the default settings, use the static `clone` method.
|
|
23
|
+
|
|
24
|
+
```javascript
|
|
25
|
+
import TinyCloner from 'tiny-essentials/libs/utils/TinyCloner';
|
|
26
|
+
|
|
27
|
+
const original = { name: 'Yasmin', skills: ['Coding', 'Logic'] };
|
|
28
|
+
|
|
29
|
+
// Perform a Deep Clone (Default)
|
|
30
|
+
const deepCopy = TinyCloner.clone(original);
|
|
31
|
+
deepCopy.skills.push('Architecture');
|
|
32
|
+
|
|
33
|
+
console.log(original.skills); // ['Coding', 'Logic'] -> Safe!
|
|
34
|
+
console.log(deepCopy.skills); // ['Coding', 'Logic', 'Architecture']
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### 2. Shallow Cloning
|
|
38
|
+
If you want to copy the top-level properties but keep references to nested objects, pass `false` as the second argument.
|
|
39
|
+
|
|
40
|
+
```javascript
|
|
41
|
+
const shallowCopy = TinyCloner.clone(original, false);
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## 🏗️ Advanced Usage: The Instance Pattern
|
|
47
|
+
|
|
48
|
+
In large applications, you might not want to change the global behavior of `TinyCloner`. For this, you should create an **Instance**.
|
|
49
|
+
|
|
50
|
+
### 🛡️ Using `isolationMode`
|
|
51
|
+
When you create an instance with `isolationMode: true`, it becomes a "sandbox." It will only use the plugins you explicitly give it, ignoring any changes made to the global `TinyCloner` settings.
|
|
52
|
+
|
|
53
|
+
```javascript
|
|
54
|
+
// This instance is "immune" to global plugin changes
|
|
55
|
+
const privateCloner = new TinyCloner({ isolationMode: true });
|
|
56
|
+
|
|
57
|
+
// This instance will follow the global rules (default behavior)
|
|
58
|
+
const standardCloner = new TinyCloner();
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## 🛠️ Extending the Cloner (Custom Plugins)
|
|
64
|
+
|
|
65
|
+
This is where `TinyCloner` shines. You can teach it how to handle new types by creating a `CloningPlugin`.
|
|
66
|
+
|
|
67
|
+
### 📝 The Plugin Interface
|
|
68
|
+
Every plugin must follow this structure:
|
|
69
|
+
1. `id`: A unique string.
|
|
70
|
+
2. `canHandle(item)`: Returns `true` if the plugin should process the item.
|
|
71
|
+
3. `clone(item, isDeep, cloner)`: The logic to duplicate the item.
|
|
72
|
+
|
|
73
|
+
### 💡 Example: Adding a `Date` Plugin
|
|
74
|
+
```javascript
|
|
75
|
+
import TinyCloner from 'tiny-essentials/libs/utils/TinyCloner';
|
|
76
|
+
|
|
77
|
+
const datePlugin = {
|
|
78
|
+
id: 'date-plugin',
|
|
79
|
+
canHandle: (item) => item instanceof Date,
|
|
80
|
+
clone: (item, isDeep, cloner) => {
|
|
81
|
+
return new Date(item.getTime());
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
// Add it to the global registry
|
|
86
|
+
TinyCloner.addPlugin(datePlugin);
|
|
87
|
+
|
|
88
|
+
const data = { timestamp: new Date() };
|
|
89
|
+
const clonedData = TinyCloner.clone(data);
|
|
90
|
+
|
|
91
|
+
console.log(clonedData.timestamp instanceof Date); // true
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## 📖 API Reference
|
|
97
|
+
|
|
98
|
+
### 🌍 Static Methods (Global Management)
|
|
99
|
+
Use these to configure how `TinyCloner` behaves across your entire project.
|
|
100
|
+
|
|
101
|
+
| Method | Description |
|
|
102
|
+
| :--- | :--- |
|
|
103
|
+
| `TinyCloner.clone(item, isDeep)` | The primary method to clone any item. |
|
|
104
|
+
| `TinyCloner.addPlugin(plugin, pos, index)` | Adds a plugin to `start`, `end`, or a specific `index`. |
|
|
105
|
+
| `TinyCloner.removePlugin(id)` | Removes a plugin by its unique ID. |
|
|
106
|
+
| `TinyCloner.hasPlugin(id)` | Checks if a plugin exists globally. |
|
|
107
|
+
| `TinyCloner.plugins` (get/set) | Get/Replace the entire global plugin array. |
|
|
108
|
+
| `TinyCloner.set defaultIsDeep(bool)` | Sets the global default for deep cloning. |
|
|
109
|
+
|
|
110
|
+
### 👤 Instance Methods (Local Management)
|
|
111
|
+
Use these when working with a `new TinyCloner()` instance.
|
|
112
|
+
|
|
113
|
+
| Method | Description |
|
|
114
|
+
| :--- | :--- |
|
|
115
|
+
| `cloner.clone(item, isDeep)` | Clones an item using instance-specific rules. |
|
|
116
|
+
| `cloner.addPlugin(plugin, ...)` | Adds a plugin only to this specific instance. |
|
|
117
|
+
| `cloner.removePlugin(id)` | Removes a plugin only from this instance. |
|
|
118
|
+
| `cloner.plugins` (get/set) | Access the instance's specific plugin list. |
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## ⚠️ Best Practices
|
|
123
|
+
|
|
124
|
+
1. **Always Use `id`:** When creating plugins, ensure the `id` is unique to avoid confusion during debugging.
|
|
125
|
+
2. **Prefer Instances for Libraries:** If you are building a library that uses `TinyCloner`, **always** create an instance (`new TinyCloner()`) instead of using the static methods. This prevents your library from accidentally changing the global settings of the user's project. 🛡️
|
|
126
|
+
3. **Validate your Plugins:** Use `TinyCloner.validatePlugin(myPlugin)` during your unit tests to ensure your custom logic is compatible.
|
|
@@ -67,7 +67,7 @@ If the task is canceled before execution, it will be rejected with the message:
|
|
|
67
67
|
|
|
68
68
|
#### Parameters:
|
|
69
69
|
- `task` (`Function`): A function that returns a `Promise` to be executed sequentially.
|
|
70
|
-
- `delay` (`number
|
|
70
|
+
- `delay` (`number`): Optional delay (in ms) before the task is executed.
|
|
71
71
|
- `id` (`string`): Optional ID to identify the task in the queue.
|
|
72
72
|
|
|
73
73
|
#### Returns:
|