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,152 @@
|
|
|
1
|
+
export type BlueSkyWebUrlKind = '' | 'post' | 'feed' | 'lists';
|
|
2
|
+
export type BlueSkyHandleData = {
|
|
3
|
+
/**
|
|
4
|
+
* - The discriminator for a handle element.
|
|
5
|
+
*/
|
|
6
|
+
dataType: 'handle';
|
|
7
|
+
/**
|
|
8
|
+
* - The full normalized handle, without the leading `@`.
|
|
9
|
+
*/
|
|
10
|
+
handle: string;
|
|
11
|
+
/**
|
|
12
|
+
* - The DNS labels, in order (e.g., `['alice', 'bsky', 'social']`).
|
|
13
|
+
*/
|
|
14
|
+
labels: string[];
|
|
15
|
+
/**
|
|
16
|
+
* - The number of DNS labels.
|
|
17
|
+
*/
|
|
18
|
+
labelCount: number;
|
|
19
|
+
/**
|
|
20
|
+
* - The top-level domain (the last label).
|
|
21
|
+
*/
|
|
22
|
+
tld: string;
|
|
23
|
+
/**
|
|
24
|
+
* - The best-effort registrable domain (last two labels).
|
|
25
|
+
*/
|
|
26
|
+
domain: string;
|
|
27
|
+
/**
|
|
28
|
+
* - Everything before the registrable domain, or `null`.
|
|
29
|
+
*/
|
|
30
|
+
subdomain: string | null;
|
|
31
|
+
/**
|
|
32
|
+
* - Whether the handle ends with `bsky.social`.
|
|
33
|
+
*/
|
|
34
|
+
isBskyHosted: boolean;
|
|
35
|
+
/**
|
|
36
|
+
* - The logical inverse of `isBskyHosted`.
|
|
37
|
+
*/
|
|
38
|
+
isCustomDomain: boolean;
|
|
39
|
+
};
|
|
40
|
+
export type BlueSkyDidData = {
|
|
41
|
+
/**
|
|
42
|
+
* - The discriminator for a DID element.
|
|
43
|
+
*/
|
|
44
|
+
dataType: 'did';
|
|
45
|
+
/**
|
|
46
|
+
* - The DID method.
|
|
47
|
+
*/
|
|
48
|
+
method: 'plc' | 'web';
|
|
49
|
+
/**
|
|
50
|
+
* - The raw, method-specific identifier.
|
|
51
|
+
*/
|
|
52
|
+
identifier: string;
|
|
53
|
+
/**
|
|
54
|
+
* - The decoded domain (only for `did:web`).
|
|
55
|
+
*/
|
|
56
|
+
domain: string | null;
|
|
57
|
+
/**
|
|
58
|
+
* - The decoded TCP port (only for `did:web`).
|
|
59
|
+
*/
|
|
60
|
+
port: number | null;
|
|
61
|
+
/**
|
|
62
|
+
* - The decoded path segments (only for `did:web`).
|
|
63
|
+
*/
|
|
64
|
+
pathSegments: string[];
|
|
65
|
+
};
|
|
66
|
+
export type BlueSkyAtUriData = {
|
|
67
|
+
/**
|
|
68
|
+
* - The discriminator for an AT URI element.
|
|
69
|
+
*/
|
|
70
|
+
dataType: 'at_uri';
|
|
71
|
+
/**
|
|
72
|
+
* - The authority segment (a DID or a handle).
|
|
73
|
+
*/
|
|
74
|
+
authority: string;
|
|
75
|
+
/**
|
|
76
|
+
* - The kind of authority.
|
|
77
|
+
*/
|
|
78
|
+
authorityType: 'did' | 'handle';
|
|
79
|
+
/**
|
|
80
|
+
* - The collection NSID (e.g., `app.bsky.feed.post`).
|
|
81
|
+
*/
|
|
82
|
+
collection: string;
|
|
83
|
+
/**
|
|
84
|
+
* - The NSID split by dots.
|
|
85
|
+
*/
|
|
86
|
+
collectionParts: string[];
|
|
87
|
+
/**
|
|
88
|
+
* - The record key.
|
|
89
|
+
*/
|
|
90
|
+
rkey: string;
|
|
91
|
+
};
|
|
92
|
+
export type BlueSkyWebUrlData = {
|
|
93
|
+
/**
|
|
94
|
+
* - The discriminator for a web URL element.
|
|
95
|
+
*/
|
|
96
|
+
dataType: 'web_url';
|
|
97
|
+
/**
|
|
98
|
+
* - The resource kind, or an empty string for a profile.
|
|
99
|
+
*/
|
|
100
|
+
kind: BlueSkyWebUrlKind;
|
|
101
|
+
/**
|
|
102
|
+
* - The record key, or an empty string for a profile.
|
|
103
|
+
*/
|
|
104
|
+
rkey: string;
|
|
105
|
+
/**
|
|
106
|
+
* - The kind of actor.
|
|
107
|
+
*/
|
|
108
|
+
actorType: 'did' | 'handle';
|
|
109
|
+
/**
|
|
110
|
+
* - The fully parsed actor.
|
|
111
|
+
*/
|
|
112
|
+
actor: BlueSkyHandleData | BlueSkyDidData;
|
|
113
|
+
/**
|
|
114
|
+
* - The equivalent AT URI, or `null` for a profile.
|
|
115
|
+
*/
|
|
116
|
+
atUri: BlueSkyAtUriData | null;
|
|
117
|
+
};
|
|
118
|
+
export type BlueSkyHashtagData = {
|
|
119
|
+
/**
|
|
120
|
+
* - The discriminator for a hashtag element.
|
|
121
|
+
*/
|
|
122
|
+
dataType: 'hashtag';
|
|
123
|
+
/**
|
|
124
|
+
* - The tag, without the leading `#`.
|
|
125
|
+
*/
|
|
126
|
+
tag: string;
|
|
127
|
+
};
|
|
128
|
+
/**
|
|
129
|
+
* A parser pair for BlueSky handles (`@alice.bsky.social`).
|
|
130
|
+
*/
|
|
131
|
+
export declare const BlueSkyHandleParser: import("../TinyUriParser.mjs").ParserPair<"handle", BlueSkyHandleData>;
|
|
132
|
+
/**
|
|
133
|
+
* A parser pair for BlueSky DIDs (`did:plc:...`, `did:web:...`).
|
|
134
|
+
*/
|
|
135
|
+
export declare const BlueSkyDidParser: import("../TinyUriParser.mjs").ParserPair<"did", BlueSkyDidData>;
|
|
136
|
+
/**
|
|
137
|
+
* A parser pair for BlueSky AT URIs (`at://...`).
|
|
138
|
+
*/
|
|
139
|
+
export declare const BlueSkyAtUriParser: import("../TinyUriParser.mjs").ParserPair<"at_uri", BlueSkyAtUriData>;
|
|
140
|
+
/**
|
|
141
|
+
* A parser pair for BlueSky web URLs (`https://bsky.app/...`).
|
|
142
|
+
*/
|
|
143
|
+
export declare const BlueSkyWebUrlParser: import("../TinyUriParser.mjs").ParserPair<"web_url", BlueSkyWebUrlData>;
|
|
144
|
+
/**
|
|
145
|
+
* A parser pair for BlueSky hashtags (`#javascript`).
|
|
146
|
+
*/
|
|
147
|
+
export declare const BlueSkyHashtagParser: import("../TinyUriParser.mjs").ParserPair<"hashtag", BlueSkyHashtagData>;
|
|
148
|
+
/**
|
|
149
|
+
* An array of BlueSky parser pairs, ordered from the most specific to the most permissive.
|
|
150
|
+
*/
|
|
151
|
+
export declare const BlueSkyProtocolParsers: readonly (import("../TinyUriParser.mjs").ParserPair<"at_uri", BlueSkyAtUriData> | import("../TinyUriParser.mjs").ParserPair<"did", BlueSkyDidData> | import("../TinyUriParser.mjs").ParserPair<"handle", BlueSkyHandleData> | import("../TinyUriParser.mjs").ParserPair<"hashtag", BlueSkyHashtagData> | import("../TinyUriParser.mjs").ParserPair<"web_url", BlueSkyWebUrlData>)[];
|
|
152
|
+
//# sourceMappingURL=BlueSky.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BlueSky.d.mts","sourceRoot":"","sources":["../../../../../src/v1/libs/tools/TinyUriParser/BlueSky.mjs"],"names":[],"mappings":"AASG,YAA0C,iBAAiB,GAAjD,EAAE,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAmB;AAK3D,YAAkB,iBAAiB,GACnC;;;;IAAqB,QAAQ,EAAlB,QAAQ,CACnB;;;;IAAmB,MAAM,EAAd,MAAM,CACjB;;;;IAAqB,MAAM,EAAhB,MAAM,EAAE,CACnB;;;;IAAmB,UAAU,EAAlB,MAAM,CACjB;;;;IAAmB,GAAG,EAAX,MAAM,CACjB;;;;IAAmB,MAAM,EAAd,MAAM,CACjB;;;;IAA0B,SAAS,EAAxB,MAAM,GAAG,IAAI,CACxB;;;;IAAoB,YAAY,EAArB,OAAO,CAClB;;;;IAAoB,cAAc,EAAvB,OAAO,CACpB;CAAA,CAAA;AAIE,YAAkB,cAAc,GAChC;;;;IAAkB,QAAQ,EAAf,KAAK,CAChB;;;;IAA0B,MAAM,EAArB,KAAK,GAAG,KAAK,CACxB;;;;IAAmB,UAAU,EAAlB,MAAM,CACjB;;;;IAA0B,MAAM,EAArB,MAAM,GAAG,IAAI,CACxB;;;;IAA0B,IAAI,EAAnB,MAAM,GAAG,IAAI,CACxB;;;;IAAqB,YAAY,EAAtB,MAAM,EAAE,CACrB;CAAA,CAAA;AAIE,YAAkB,gBAAgB,GAClC;;;;IAAqB,QAAQ,EAAlB,QAAQ,CACnB;;;;IAAmB,SAAS,EAAjB,MAAM,CACjB;;;;IAA6B,aAAa,EAA/B,KAAK,GAAG,QAAQ,CAC3B;;;;IAAmB,UAAU,EAAlB,MAAM,CACjB;;;;IAAqB,eAAe,EAAzB,MAAM,EAAE,CACnB;;;;IAAmB,IAAI,EAAZ,MAAM,CACnB;CAAA,CAAA;AAIE,YAAkB,iBAAiB,GACnC;;;;IAAsB,QAAQ,EAAnB,SAAS,CACpB;;;;IAA8B,IAAI,EAAvB,iBAAiB,CAC5B;;;;IAAmB,IAAI,EAAZ,MAAM,CACjB;;;;IAA6B,SAAS,EAA3B,KAAK,GAAG,QAAQ,CAC3B;;;;IAA+C,KAAK,EAAzC,iBAAiB,GAAG,cAAc,CAC7C;;;;IAAoC,KAAK,EAA9B,gBAAgB,GAAG,IAAI,CACpC;CAAA,CAAA;AAIE,YAAkB,kBAAkB,GACpC;;;;IAAsB,QAAQ,EAAnB,SAAS,CACpB;;;;IAAmB,GAAG,EAAX,MAAM,CACnB;CAAA,CAAA;AAgeD;;GAEG;AACH,eAAO,MAAM,mBAAmB,wEAK/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,kEAK5B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,uEAK9B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,yEAK/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,0EAKhC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB,qXAMjC,CAAC"}
|
|
@@ -0,0 +1,527 @@
|
|
|
1
|
+
import TinyUriParser from '../TinyUriParser.mjs';
|
|
2
|
+
/**
|
|
3
|
+
* BlueSky (AT Protocol) Text Elements
|
|
4
|
+
* Official Documentation: https://docs.bsky.app/docs/advanced-guides/api-directory
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* The kind of BlueSky resource referenced by a web URL.
|
|
8
|
+
* @typedef {'' | 'post' | 'feed' | 'lists'} BlueSkyWebUrlKind
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Represents a parsed BlueSky handle, decomposed into its DNS components.
|
|
12
|
+
* @typedef {Object} BlueSkyHandleData
|
|
13
|
+
* @property {'handle'} dataType - The discriminator for a handle element.
|
|
14
|
+
* @property {string} handle - The full normalized handle, without the leading `@`.
|
|
15
|
+
* @property {string[]} labels - The DNS labels, in order (e.g., `['alice', 'bsky', 'social']`).
|
|
16
|
+
* @property {number} labelCount - The number of DNS labels.
|
|
17
|
+
* @property {string} tld - The top-level domain (the last label).
|
|
18
|
+
* @property {string} domain - The best-effort registrable domain (last two labels).
|
|
19
|
+
* @property {string | null} subdomain - Everything before the registrable domain, or `null`.
|
|
20
|
+
* @property {boolean} isBskyHosted - Whether the handle ends with `bsky.social`.
|
|
21
|
+
* @property {boolean} isCustomDomain - The logical inverse of `isBskyHosted`.
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* Represents a parsed BlueSky Decentralized Identifier (DID).
|
|
25
|
+
* @typedef {Object} BlueSkyDidData
|
|
26
|
+
* @property {'did'} dataType - The discriminator for a DID element.
|
|
27
|
+
* @property {'plc' | 'web'} method - The DID method.
|
|
28
|
+
* @property {string} identifier - The raw, method-specific identifier.
|
|
29
|
+
* @property {string | null} domain - The decoded domain (only for `did:web`).
|
|
30
|
+
* @property {number | null} port - The decoded TCP port (only for `did:web`).
|
|
31
|
+
* @property {string[]} pathSegments - The decoded path segments (only for `did:web`).
|
|
32
|
+
*/
|
|
33
|
+
/**
|
|
34
|
+
* Represents a parsed AT URI.
|
|
35
|
+
* @typedef {Object} BlueSkyAtUriData
|
|
36
|
+
* @property {'at_uri'} dataType - The discriminator for an AT URI element.
|
|
37
|
+
* @property {string} authority - The authority segment (a DID or a handle).
|
|
38
|
+
* @property {'did' | 'handle'} authorityType - The kind of authority.
|
|
39
|
+
* @property {string} collection - The collection NSID (e.g., `app.bsky.feed.post`).
|
|
40
|
+
* @property {string[]} collectionParts - The NSID split by dots.
|
|
41
|
+
* @property {string} rkey - The record key.
|
|
42
|
+
*/
|
|
43
|
+
/**
|
|
44
|
+
* Represents a parsed BlueSky web URL, with its actor and AT URI fully resolved.
|
|
45
|
+
* @typedef {Object} BlueSkyWebUrlData
|
|
46
|
+
* @property {'web_url'} dataType - The discriminator for a web URL element.
|
|
47
|
+
* @property {BlueSkyWebUrlKind} kind - The resource kind, or an empty string for a profile.
|
|
48
|
+
* @property {string} rkey - The record key, or an empty string for a profile.
|
|
49
|
+
* @property {'did' | 'handle'} actorType - The kind of actor.
|
|
50
|
+
* @property {BlueSkyHandleData | BlueSkyDidData} actor - The fully parsed actor.
|
|
51
|
+
* @property {BlueSkyAtUriData | null} atUri - The equivalent AT URI, or `null` for a profile.
|
|
52
|
+
*/
|
|
53
|
+
/**
|
|
54
|
+
* Represents a parsed BlueSky hashtag.
|
|
55
|
+
* @typedef {Object} BlueSkyHashtagData
|
|
56
|
+
* @property {'hashtag'} dataType - The discriminator for a hashtag element.
|
|
57
|
+
* @property {string} tag - The tag, without the leading `#`.
|
|
58
|
+
*/
|
|
59
|
+
/**
|
|
60
|
+
* Maps a BlueSky web URL kind to its canonical collection NSID.
|
|
61
|
+
* @type {Readonly<Record<'post' | 'feed' | 'lists', string>>}
|
|
62
|
+
*/
|
|
63
|
+
const WEB_KIND_TO_COLLECTION = Object.freeze({
|
|
64
|
+
post: 'app.bsky.feed.post',
|
|
65
|
+
feed: 'app.bsky.feed.generator',
|
|
66
|
+
lists: 'app.bsky.graph.list',
|
|
67
|
+
});
|
|
68
|
+
/**
|
|
69
|
+
* The maximum length of a BlueSky handle, in characters.
|
|
70
|
+
* @type {number}
|
|
71
|
+
*/
|
|
72
|
+
const HANDLE_MAX_LENGTH = 253;
|
|
73
|
+
/**
|
|
74
|
+
* The maximum length of a single DNS label, in characters.
|
|
75
|
+
* @type {number}
|
|
76
|
+
*/
|
|
77
|
+
const HANDLE_LABEL_MAX_LENGTH = 63;
|
|
78
|
+
/**
|
|
79
|
+
* The suffix used by BlueSky-hosted accounts.
|
|
80
|
+
* @type {string}
|
|
81
|
+
*/
|
|
82
|
+
const BSKY_HOSTED_SUFFIX = 'bsky.social';
|
|
83
|
+
/**
|
|
84
|
+
* A single DNS label: alphanumeric, with internal hyphens, 1-63 characters.
|
|
85
|
+
* @type {RegExp}
|
|
86
|
+
*/
|
|
87
|
+
const handleLabelRegex = /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i;
|
|
88
|
+
/**
|
|
89
|
+
* Matches a BlueSky handle, with an optional leading `@`.
|
|
90
|
+
* @type {RegExp}
|
|
91
|
+
*/
|
|
92
|
+
const handleRegex = /^@?(?<handle>(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,})$/;
|
|
93
|
+
/**
|
|
94
|
+
* Matches a BlueSky DID.
|
|
95
|
+
* @type {RegExp}
|
|
96
|
+
*/
|
|
97
|
+
const didRegex = /^did:(?<method>plc|web):(?<identifier>[a-zA-Z0-9._:%-]+)$/;
|
|
98
|
+
/**
|
|
99
|
+
* Matches an AT URI.
|
|
100
|
+
* @type {RegExp}
|
|
101
|
+
*/
|
|
102
|
+
const atUriRegex = /^at:\/\/(?<authority>[^/]+)\/(?<collection>[^/]+)\/(?<rkey>[^/]+)$/;
|
|
103
|
+
/**
|
|
104
|
+
* Matches a BlueSky web URL.
|
|
105
|
+
* @type {RegExp}
|
|
106
|
+
*/
|
|
107
|
+
const webUrlRegex = /^https?:\/\/bsky\.app\/profile\/(?<actor>[^/]+)(?:\/(?<kind>post|feed|lists)\/(?<rkey>[^/?#]+))?\/?$/;
|
|
108
|
+
/**
|
|
109
|
+
* Matches a BlueSky hashtag.
|
|
110
|
+
* @type {RegExp}
|
|
111
|
+
*/
|
|
112
|
+
const hashtagRegex = /^#(?<tag>\p{L}[\p{L}\p{N}_]*)$/u;
|
|
113
|
+
/**
|
|
114
|
+
* Builds the canonical DID string from its decomposed parts.
|
|
115
|
+
* @param {BlueSkyDidData} data - The parsed DID data.
|
|
116
|
+
* @returns {string} The full DID string (e.g., `did:plc:abc123`).
|
|
117
|
+
*/
|
|
118
|
+
const buildDidString = (data) => `did:${data.method}:${data.identifier}`;
|
|
119
|
+
/**
|
|
120
|
+
* Builds the canonical AT URI string from its decomposed parts.
|
|
121
|
+
* @param {BlueSkyAtUriData} data - The parsed AT URI data.
|
|
122
|
+
* @returns {string} The full AT URI string (e.g., `at://did:plc:abc/app.bsky.feed.post/123`).
|
|
123
|
+
*/
|
|
124
|
+
const buildAtUriString = (data) => `at://${data.authority}/${data.collection}/${data.rkey}`;
|
|
125
|
+
/**
|
|
126
|
+
* Decomposes a validated, lowercase handle into its DNS components.
|
|
127
|
+
* @param {string} handle - The normalized, lowercase handle.
|
|
128
|
+
* @returns {BlueSkyHandleData} The decomposed handle data.
|
|
129
|
+
*/
|
|
130
|
+
const decomposeHandle = (handle) => {
|
|
131
|
+
const labels = handle.split('.');
|
|
132
|
+
const isBskyHosted = handle === BSKY_HOSTED_SUFFIX || handle.endsWith(`.${BSKY_HOSTED_SUFFIX}`);
|
|
133
|
+
const subLabels = labels.slice(0, -2);
|
|
134
|
+
return {
|
|
135
|
+
dataType: 'handle',
|
|
136
|
+
handle,
|
|
137
|
+
labels,
|
|
138
|
+
labelCount: labels.length,
|
|
139
|
+
tld: labels[labels.length - 1],
|
|
140
|
+
domain: labels.slice(-2).join('.'),
|
|
141
|
+
subdomain: subLabels.length > 0 ? subLabels.join('.') : null,
|
|
142
|
+
isBskyHosted,
|
|
143
|
+
isCustomDomain: !isBskyHosted,
|
|
144
|
+
};
|
|
145
|
+
};
|
|
146
|
+
/**
|
|
147
|
+
* Validates a parsed BlueSky handle object.
|
|
148
|
+
* @param {BlueSkyHandleData} data - The handle data to validate.
|
|
149
|
+
* @returns {void}
|
|
150
|
+
* @throws {TypeError} If any property is missing or of an invalid type.
|
|
151
|
+
* @throws {RangeError} If any length constraint is violated.
|
|
152
|
+
* @throws {SyntaxError} If any DNS label is malformed.
|
|
153
|
+
*/
|
|
154
|
+
const validateHandleData = (data) => {
|
|
155
|
+
if (typeof data.handle !== 'string' || data.handle.length === 0) {
|
|
156
|
+
throw new TypeError('BlueSkyHandleData: handle must be a non-empty string.');
|
|
157
|
+
}
|
|
158
|
+
if (data.handle.length > HANDLE_MAX_LENGTH) {
|
|
159
|
+
throw new RangeError(`BlueSkyHandleData: handle must not exceed ${HANDLE_MAX_LENGTH} characters.`);
|
|
160
|
+
}
|
|
161
|
+
if (!Array.isArray(data.labels) || data.labels.length < 2) {
|
|
162
|
+
throw new TypeError('BlueSkyHandleData: labels must contain at least two entries.');
|
|
163
|
+
}
|
|
164
|
+
for (const label of data.labels) {
|
|
165
|
+
if (typeof label !== 'string' || label.length === 0 || label.length > HANDLE_LABEL_MAX_LENGTH) {
|
|
166
|
+
throw new RangeError('BlueSkyHandleData: each label must be between 1 and 63 characters.');
|
|
167
|
+
}
|
|
168
|
+
if (!handleLabelRegex.test(label)) {
|
|
169
|
+
throw new SyntaxError(`BlueSkyHandleData: invalid DNS label "${label}".`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
if (data.labelCount !== data.labels.length) {
|
|
173
|
+
throw new TypeError('BlueSkyHandleData: labelCount must match the number of labels.');
|
|
174
|
+
}
|
|
175
|
+
if (data.tld !== data.labels[data.labels.length - 1]) {
|
|
176
|
+
throw new TypeError('BlueSkyHandleData: tld must match the last label.');
|
|
177
|
+
}
|
|
178
|
+
if (typeof data.domain !== 'string' || !data.domain.includes('.')) {
|
|
179
|
+
throw new TypeError('BlueSkyHandleData: domain must be a dotted string.');
|
|
180
|
+
}
|
|
181
|
+
if (data.subdomain !== null && typeof data.subdomain !== 'string') {
|
|
182
|
+
throw new TypeError('BlueSkyHandleData: subdomain must be a string or null.');
|
|
183
|
+
}
|
|
184
|
+
if (typeof data.isBskyHosted !== 'boolean' || typeof data.isCustomDomain !== 'boolean') {
|
|
185
|
+
throw new TypeError('BlueSkyHandleData: hosting flags must be booleans.');
|
|
186
|
+
}
|
|
187
|
+
if (data.isBskyHosted === data.isCustomDomain) {
|
|
188
|
+
throw new TypeError('BlueSkyHandleData: hosting flags must be complementary.');
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
/**
|
|
192
|
+
* Decodes the method-specific identifier of a `did:web` DID.
|
|
193
|
+
* @param {string} identifier - The raw identifier (e.g., `example.com%3A3000:user:alice`).
|
|
194
|
+
* @returns {{ domain: string, port: number | null, pathSegments: string[] }} The decoded parts.
|
|
195
|
+
*/
|
|
196
|
+
const decodeDidWeb = (identifier) => {
|
|
197
|
+
const [hostPart, ...pathSegments] = identifier.split(':');
|
|
198
|
+
const decodedHost = decodeURIComponent(hostPart);
|
|
199
|
+
const separatorIndex = decodedHost.indexOf(':');
|
|
200
|
+
if (separatorIndex === -1) {
|
|
201
|
+
return { domain: decodedHost, port: null, pathSegments };
|
|
202
|
+
}
|
|
203
|
+
return {
|
|
204
|
+
domain: decodedHost.slice(0, separatorIndex),
|
|
205
|
+
port: Number(decodedHost.slice(separatorIndex + 1)),
|
|
206
|
+
pathSegments,
|
|
207
|
+
};
|
|
208
|
+
};
|
|
209
|
+
/**
|
|
210
|
+
* Validates a parsed BlueSky DID object.
|
|
211
|
+
* @param {BlueSkyDidData} data - The DID data to validate.
|
|
212
|
+
* @returns {void}
|
|
213
|
+
* @throws {TypeError} If any property is missing or of an invalid type.
|
|
214
|
+
* @throws {RangeError} If the port is out of range.
|
|
215
|
+
*/
|
|
216
|
+
const validateDidData = (data) => {
|
|
217
|
+
if (data.method !== 'plc' && data.method !== 'web') {
|
|
218
|
+
throw new TypeError(`BlueSkyDidData: invalid method "${data.method}".`);
|
|
219
|
+
}
|
|
220
|
+
if (typeof data.identifier !== 'string' || data.identifier.length === 0) {
|
|
221
|
+
throw new TypeError('BlueSkyDidData: identifier must be a non-empty string.');
|
|
222
|
+
}
|
|
223
|
+
if (!Array.isArray(data.pathSegments)) {
|
|
224
|
+
throw new TypeError('BlueSkyDidData: pathSegments must be an array.');
|
|
225
|
+
}
|
|
226
|
+
if (data.method === 'web') {
|
|
227
|
+
if (typeof data.domain !== 'string' || data.domain.length === 0) {
|
|
228
|
+
throw new TypeError('BlueSkyDidData: domain is required for did:web.');
|
|
229
|
+
}
|
|
230
|
+
if (data.port !== null &&
|
|
231
|
+
(!Number.isInteger(data.port) || data.port < 1 || data.port > 65535)) {
|
|
232
|
+
throw new RangeError('BlueSkyDidData: port must be a valid TCP port or null.');
|
|
233
|
+
}
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
if (data.domain !== null || data.port !== null) {
|
|
237
|
+
throw new TypeError('BlueSkyDidData: only did:web supports domain and port.');
|
|
238
|
+
}
|
|
239
|
+
};
|
|
240
|
+
/**
|
|
241
|
+
* Validates a parsed AT URI object.
|
|
242
|
+
* @param {BlueSkyAtUriData} data - The AT URI data to validate.
|
|
243
|
+
* @returns {void}
|
|
244
|
+
* @throws {TypeError} If any property is missing or of an invalid type.
|
|
245
|
+
*/
|
|
246
|
+
const validateAtUriData = (data) => {
|
|
247
|
+
if (typeof data.authority !== 'string' || data.authority.length === 0) {
|
|
248
|
+
throw new TypeError('BlueSkyAtUriData: authority must be a non-empty string.');
|
|
249
|
+
}
|
|
250
|
+
if (data.authorityType !== 'did' && data.authorityType !== 'handle') {
|
|
251
|
+
throw new TypeError(`BlueSkyAtUriData: invalid authorityType "${data.authorityType}".`);
|
|
252
|
+
}
|
|
253
|
+
if (typeof data.collection !== 'string' || !data.collection.includes('.')) {
|
|
254
|
+
throw new TypeError('BlueSkyAtUriData: collection must be a dotted NSID.');
|
|
255
|
+
}
|
|
256
|
+
if (!Array.isArray(data.collectionParts) || data.collectionParts.join('.') !== data.collection) {
|
|
257
|
+
throw new TypeError('BlueSkyAtUriData: collectionParts must match the collection.');
|
|
258
|
+
}
|
|
259
|
+
if (typeof data.rkey !== 'string' || data.rkey.length === 0) {
|
|
260
|
+
throw new TypeError('BlueSkyAtUriData: rkey must be a non-empty string.');
|
|
261
|
+
}
|
|
262
|
+
};
|
|
263
|
+
/**
|
|
264
|
+
* Validates a parsed BlueSky web URL object.
|
|
265
|
+
* @param {BlueSkyWebUrlData} data - The web URL data to validate.
|
|
266
|
+
* @returns {void}
|
|
267
|
+
* @throws {TypeError} If any property is missing, of an invalid type, or inconsistent.
|
|
268
|
+
*/
|
|
269
|
+
const validateWebUrlData = (data) => {
|
|
270
|
+
if (!['', 'post', 'feed', 'lists'].includes(data.kind)) {
|
|
271
|
+
throw new TypeError(`BlueSkyWebUrlData: invalid kind "${data.kind}".`);
|
|
272
|
+
}
|
|
273
|
+
if (data.actorType !== 'did' && data.actorType !== 'handle') {
|
|
274
|
+
throw new TypeError(`BlueSkyWebUrlData: invalid actorType "${data.actorType}".`);
|
|
275
|
+
}
|
|
276
|
+
if (data.actor === null || typeof data.actor !== 'object') {
|
|
277
|
+
throw new TypeError('BlueSkyWebUrlData: actor must be a parsed object.');
|
|
278
|
+
}
|
|
279
|
+
if (data.actor.dataType !== data.actorType) {
|
|
280
|
+
throw new TypeError('BlueSkyWebUrlData: actorType must match the parsed actor.');
|
|
281
|
+
}
|
|
282
|
+
if (typeof data.rkey !== 'string') {
|
|
283
|
+
throw new TypeError('BlueSkyWebUrlData: rkey must be a string.');
|
|
284
|
+
}
|
|
285
|
+
if (data.atUri !== null && data.atUri.dataType !== 'at_uri') {
|
|
286
|
+
throw new TypeError('BlueSkyWebUrlData: atUri must be a parsed AT URI or null.');
|
|
287
|
+
}
|
|
288
|
+
if (data.kind !== '' && data.atUri === null) {
|
|
289
|
+
throw new TypeError('BlueSkyWebUrlData: atUri is required when kind is set.');
|
|
290
|
+
}
|
|
291
|
+
if (data.kind === '' && data.atUri !== null) {
|
|
292
|
+
throw new TypeError('BlueSkyWebUrlData: atUri must be null for a profile URL.');
|
|
293
|
+
}
|
|
294
|
+
};
|
|
295
|
+
/**
|
|
296
|
+
* Validates a parsed BlueSky hashtag object.
|
|
297
|
+
* @param {BlueSkyHashtagData} data - The hashtag data to validate.
|
|
298
|
+
* @returns {void}
|
|
299
|
+
* @throws {TypeError} If any property is missing or of an invalid type.
|
|
300
|
+
*/
|
|
301
|
+
const validateHashtagData = (data) => {
|
|
302
|
+
if (typeof data.tag !== 'string' || data.tag.length === 0) {
|
|
303
|
+
throw new TypeError('BlueSkyHashtagData: tag must be a non-empty string.');
|
|
304
|
+
}
|
|
305
|
+
};
|
|
306
|
+
/**
|
|
307
|
+
* Parses a BlueSky handle element into its DNS components.
|
|
308
|
+
* @param {string} uri - The raw handle string (e.g., `@alice.bsky.social`).
|
|
309
|
+
* @returns {BlueSkyHandleData} The parsed handle data.
|
|
310
|
+
* @throws {TypeError} If the input is not a string or fails validation.
|
|
311
|
+
* @throws {SyntaxError} If the input does not match the handle grammar.
|
|
312
|
+
*/
|
|
313
|
+
const parseHandle = (uri) => {
|
|
314
|
+
if (typeof uri !== 'string') {
|
|
315
|
+
throw new TypeError('BlueSkyHandleData: uri must be a string.');
|
|
316
|
+
}
|
|
317
|
+
const match = handleRegex.exec(uri);
|
|
318
|
+
if (!match || !match.groups) {
|
|
319
|
+
throw new SyntaxError(`Invalid BlueSky handle: ${uri}`);
|
|
320
|
+
}
|
|
321
|
+
const data = decomposeHandle(match.groups.handle.toLowerCase());
|
|
322
|
+
validateHandleData(data);
|
|
323
|
+
return data;
|
|
324
|
+
};
|
|
325
|
+
/**
|
|
326
|
+
* Parses a BlueSky DID element.
|
|
327
|
+
* @param {string} uri - The raw DID string (e.g., `did:plc:abc123`).
|
|
328
|
+
* @returns {BlueSkyDidData} The parsed DID data.
|
|
329
|
+
* @throws {TypeError} If the input is not a string or fails validation.
|
|
330
|
+
* @throws {SyntaxError} If the input does not match the DID grammar.
|
|
331
|
+
*/
|
|
332
|
+
const parseDid = (uri) => {
|
|
333
|
+
if (typeof uri !== 'string') {
|
|
334
|
+
throw new TypeError('BlueSkyDidData: uri must be a string.');
|
|
335
|
+
}
|
|
336
|
+
const match = didRegex.exec(uri);
|
|
337
|
+
if (!match || !match.groups) {
|
|
338
|
+
throw new SyntaxError(`Invalid BlueSky DID: ${uri}`);
|
|
339
|
+
}
|
|
340
|
+
const method = /** @type {'plc' | 'web'} */ (match.groups.method);
|
|
341
|
+
const decoded = method === 'web'
|
|
342
|
+
? decodeDidWeb(match.groups.identifier)
|
|
343
|
+
: { domain: null, port: null, pathSegments: [] };
|
|
344
|
+
/** @type {BlueSkyDidData} */
|
|
345
|
+
const data = {
|
|
346
|
+
dataType: 'did',
|
|
347
|
+
method,
|
|
348
|
+
identifier: match.groups.identifier,
|
|
349
|
+
...decoded,
|
|
350
|
+
};
|
|
351
|
+
validateDidData(data);
|
|
352
|
+
return data;
|
|
353
|
+
};
|
|
354
|
+
/**
|
|
355
|
+
* Parses a BlueSky AT URI element.
|
|
356
|
+
* @param {string} uri - The raw AT URI string.
|
|
357
|
+
* @returns {BlueSkyAtUriData} The parsed AT URI data.
|
|
358
|
+
* @throws {TypeError} If the input is not a string or fails validation.
|
|
359
|
+
* @throws {SyntaxError} If the input does not match the AT URI grammar.
|
|
360
|
+
*/
|
|
361
|
+
const parseAtUri = (uri) => {
|
|
362
|
+
if (typeof uri !== 'string') {
|
|
363
|
+
throw new TypeError('BlueSkyAtUriData: uri must be a string.');
|
|
364
|
+
}
|
|
365
|
+
const match = atUriRegex.exec(uri);
|
|
366
|
+
if (!match || !match.groups) {
|
|
367
|
+
throw new SyntaxError(`Invalid BlueSky AT URI: ${uri}`);
|
|
368
|
+
}
|
|
369
|
+
const { authority, collection, rkey } = match.groups;
|
|
370
|
+
/** @type {BlueSkyAtUriData} */
|
|
371
|
+
const data = {
|
|
372
|
+
dataType: 'at_uri',
|
|
373
|
+
authority,
|
|
374
|
+
authorityType: authority.startsWith('did:') ? 'did' : 'handle',
|
|
375
|
+
collection,
|
|
376
|
+
collectionParts: collection.split('.'),
|
|
377
|
+
rkey,
|
|
378
|
+
};
|
|
379
|
+
validateAtUriData(data);
|
|
380
|
+
return data;
|
|
381
|
+
};
|
|
382
|
+
/**
|
|
383
|
+
* Extracts the canonical string form from a parsed BlueSky actor.
|
|
384
|
+
* Narrows the union via the `dataType` discriminant.
|
|
385
|
+
* @param {BlueSkyHandleData | BlueSkyDidData} actor - The parsed actor.
|
|
386
|
+
* @returns {string} The canonical actor string (a handle or a DID).
|
|
387
|
+
*/
|
|
388
|
+
const getActorString = (actor) => (actor.dataType === 'did' ? buildDidString(actor) : actor.handle);
|
|
389
|
+
/**
|
|
390
|
+
* Parses a BlueSky web URL element by delegating to the handle, DID and AT URI parsers.
|
|
391
|
+
* @param {string} uri - The raw web URL string.
|
|
392
|
+
* @returns {BlueSkyWebUrlData} The parsed web URL data.
|
|
393
|
+
* @throws {TypeError} If the input is not a string or fails validation.
|
|
394
|
+
* @throws {SyntaxError} If the input does not match the web URL grammar.
|
|
395
|
+
*/
|
|
396
|
+
const parseWebUrl = (uri) => {
|
|
397
|
+
if (typeof uri !== 'string') {
|
|
398
|
+
throw new TypeError('BlueSkyWebUrlData: uri must be a string.');
|
|
399
|
+
}
|
|
400
|
+
const match = webUrlRegex.exec(uri);
|
|
401
|
+
if (!match || !match.groups) {
|
|
402
|
+
throw new SyntaxError(`Invalid BlueSky web URL: ${uri}`);
|
|
403
|
+
}
|
|
404
|
+
const { actor: rawActor } = match.groups;
|
|
405
|
+
const kind = /** @type {BlueSkyWebUrlKind} */ (match.groups.kind ?? '');
|
|
406
|
+
const rkey = match.groups.rkey ?? '';
|
|
407
|
+
// Delegate to the existing parsers instead of duplicating their logic.
|
|
408
|
+
const actor = rawActor.startsWith('did:') ? parseDid(rawActor) : parseHandle(rawActor);
|
|
409
|
+
const actorType = actor.dataType;
|
|
410
|
+
const actorString = getActorString(actor);
|
|
411
|
+
const collection = kind === '' ? null : WEB_KIND_TO_COLLECTION[kind];
|
|
412
|
+
const atUri = collection && rkey ? parseAtUri(`at://${actorString}/${collection}/${rkey}`) : null;
|
|
413
|
+
/** @type {BlueSkyWebUrlData} */
|
|
414
|
+
const data = {
|
|
415
|
+
dataType: 'web_url',
|
|
416
|
+
kind,
|
|
417
|
+
rkey,
|
|
418
|
+
actorType,
|
|
419
|
+
actor,
|
|
420
|
+
atUri,
|
|
421
|
+
};
|
|
422
|
+
validateWebUrlData(data);
|
|
423
|
+
return data;
|
|
424
|
+
};
|
|
425
|
+
/**
|
|
426
|
+
* Parses a BlueSky hashtag element.
|
|
427
|
+
* @param {string} uri - The raw hashtag string (e.g., `#javascript`).
|
|
428
|
+
* @returns {BlueSkyHashtagData} The parsed hashtag data.
|
|
429
|
+
* @throws {TypeError} If the input is not a string or fails validation.
|
|
430
|
+
* @throws {SyntaxError} If the input does not match the hashtag grammar.
|
|
431
|
+
*/
|
|
432
|
+
const parseHashtag = (uri) => {
|
|
433
|
+
if (typeof uri !== 'string') {
|
|
434
|
+
throw new TypeError('BlueSkyHashtagData: uri must be a string.');
|
|
435
|
+
}
|
|
436
|
+
const match = hashtagRegex.exec(uri);
|
|
437
|
+
if (!match || !match.groups) {
|
|
438
|
+
throw new SyntaxError(`Invalid BlueSky hashtag: ${uri}`);
|
|
439
|
+
}
|
|
440
|
+
/** @type {BlueSkyHashtagData} */
|
|
441
|
+
const data = { dataType: 'hashtag', tag: match.groups.tag };
|
|
442
|
+
validateHashtagData(data);
|
|
443
|
+
return data;
|
|
444
|
+
};
|
|
445
|
+
/**
|
|
446
|
+
* Reconstructs a BlueSky handle string from parsed data.
|
|
447
|
+
* @param {BlueSkyHandleData} data - The handle data.
|
|
448
|
+
* @returns {string} The reconstructed handle string.
|
|
449
|
+
* @throws {TypeError} If the data is invalid.
|
|
450
|
+
*/
|
|
451
|
+
const stringifyHandle = (data) => {
|
|
452
|
+
validateHandleData(data);
|
|
453
|
+
return `@${data.handle}`;
|
|
454
|
+
};
|
|
455
|
+
/**
|
|
456
|
+
* Reconstructs a BlueSky DID string from parsed data.
|
|
457
|
+
* @param {BlueSkyDidData} data - The DID data.
|
|
458
|
+
* @returns {string} The reconstructed DID string.
|
|
459
|
+
* @throws {TypeError} If the data is invalid.
|
|
460
|
+
*/
|
|
461
|
+
const stringifyDid = (data) => {
|
|
462
|
+
validateDidData(data);
|
|
463
|
+
return buildDidString(data);
|
|
464
|
+
};
|
|
465
|
+
/**
|
|
466
|
+
* Reconstructs a BlueSky AT URI string from parsed data.
|
|
467
|
+
* @param {BlueSkyAtUriData} data - The AT URI data.
|
|
468
|
+
* @returns {string} The reconstructed AT URI string.
|
|
469
|
+
* @throws {TypeError} If the data is invalid.
|
|
470
|
+
*/
|
|
471
|
+
const stringifyAtUri = (data) => {
|
|
472
|
+
validateAtUriData(data);
|
|
473
|
+
return buildAtUriString(data);
|
|
474
|
+
};
|
|
475
|
+
/**
|
|
476
|
+
* Reconstructs a BlueSky web URL string from parsed data.
|
|
477
|
+
* @param {BlueSkyWebUrlData} data - The web URL data.
|
|
478
|
+
* @returns {string} The reconstructed web URL string.
|
|
479
|
+
* @throws {TypeError} If the data is invalid.
|
|
480
|
+
*/
|
|
481
|
+
const stringifyWebUrl = (data) => {
|
|
482
|
+
validateWebUrlData(data);
|
|
483
|
+
const actorString = getActorString(data.actor);
|
|
484
|
+
if (!data.kind)
|
|
485
|
+
return `https://bsky.app/profile/${actorString}`;
|
|
486
|
+
return `https://bsky.app/profile/${actorString}/${data.kind}/${data.rkey}`;
|
|
487
|
+
};
|
|
488
|
+
/**
|
|
489
|
+
* Reconstructs a BlueSky hashtag string from parsed data.
|
|
490
|
+
* @param {BlueSkyHashtagData} data - The hashtag data.
|
|
491
|
+
* @returns {string} The reconstructed hashtag string.
|
|
492
|
+
* @throws {TypeError} If the data is invalid.
|
|
493
|
+
*/
|
|
494
|
+
const stringifyHashtag = (data) => {
|
|
495
|
+
validateHashtagData(data);
|
|
496
|
+
return `#${data.tag}`;
|
|
497
|
+
};
|
|
498
|
+
/**
|
|
499
|
+
* A parser pair for BlueSky handles (`@alice.bsky.social`).
|
|
500
|
+
*/
|
|
501
|
+
export const BlueSkyHandleParser = TinyUriParser.buildParserPair('handle', (uriString) => handleRegex.test(uriString), parseHandle, stringifyHandle);
|
|
502
|
+
/**
|
|
503
|
+
* A parser pair for BlueSky DIDs (`did:plc:...`, `did:web:...`).
|
|
504
|
+
*/
|
|
505
|
+
export const BlueSkyDidParser = TinyUriParser.buildParserPair('did', (uriString) => didRegex.test(uriString), parseDid, stringifyDid);
|
|
506
|
+
/**
|
|
507
|
+
* A parser pair for BlueSky AT URIs (`at://...`).
|
|
508
|
+
*/
|
|
509
|
+
export const BlueSkyAtUriParser = TinyUriParser.buildParserPair('at_uri', (uriString) => atUriRegex.test(uriString), parseAtUri, stringifyAtUri);
|
|
510
|
+
/**
|
|
511
|
+
* A parser pair for BlueSky web URLs (`https://bsky.app/...`).
|
|
512
|
+
*/
|
|
513
|
+
export const BlueSkyWebUrlParser = TinyUriParser.buildParserPair('web_url', (uriString) => webUrlRegex.test(uriString), parseWebUrl, stringifyWebUrl);
|
|
514
|
+
/**
|
|
515
|
+
* A parser pair for BlueSky hashtags (`#javascript`).
|
|
516
|
+
*/
|
|
517
|
+
export const BlueSkyHashtagParser = TinyUriParser.buildParserPair('hashtag', (uriString) => hashtagRegex.test(uriString), parseHashtag, stringifyHashtag);
|
|
518
|
+
/**
|
|
519
|
+
* An array of BlueSky parser pairs, ordered from the most specific to the most permissive.
|
|
520
|
+
*/
|
|
521
|
+
export const BlueSkyProtocolParsers = Object.freeze([
|
|
522
|
+
BlueSkyWebUrlParser,
|
|
523
|
+
BlueSkyAtUriParser,
|
|
524
|
+
BlueSkyDidParser,
|
|
525
|
+
BlueSkyHashtagParser,
|
|
526
|
+
BlueSkyHandleParser,
|
|
527
|
+
]);
|