tiny-essentials 1.28.19 → 1.29.1
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/changelog/1/29/1.md +11 -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/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 +30 -4
- package/dist/v1/webTemplates/bootstrap/5.3/html/BootstrapDialogs.d.mts +5 -2
- package/dist/v1/webTemplates/bootstrap/5.3/html/BootstrapDialogs.d.mts.map +1 -1
- package/dist/v1/webTemplates/bootstrap/5.3/html/BootstrapDialogs.mjs +29 -5
- 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 +101 -0
- package/docs/v1/README.md +113 -15
- 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 +565 -0
- package/docs/v1/webTemplates/bootstrap/5.3/html/BootstrapDialogs.md +19 -7
- 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 +340 -22
- package/types/EventEmitter.d.ts +48 -0
- package/dist/v1/libs/text/TinyI18.d.mts.map +0 -1
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var cid = require('multiformats/cid');
|
|
4
|
+
var sha2 = require('multiformats/hashes/sha2');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Multicodec code for the dag-pb format.
|
|
8
|
+
* @type {number}
|
|
9
|
+
*/
|
|
10
|
+
const CODEC_DAG_PB = 0x70;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Multicodec code for raw binary data.
|
|
14
|
+
* @type {number}
|
|
15
|
+
*/
|
|
16
|
+
const CODEC_RAW = 0x55;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @typedef {Object} CIDGenerationResult
|
|
20
|
+
* @property {string} cidString - The string representation of the CID.
|
|
21
|
+
* @property {'v0' | 'v1'} version - The CID version that was generated.
|
|
22
|
+
* @property {'sha256'} hashAlgorithm - The algorithm used for hashing.
|
|
23
|
+
* @property {number} codec - The multicodec code of the content.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* A utility class to generate IPFS Content Identifiers (CIDs) locally.
|
|
28
|
+
*/
|
|
29
|
+
class IPFSHasher {
|
|
30
|
+
/** @type {'v0' | 'v1'} */
|
|
31
|
+
#version;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* @param {'v0' | 'v1'} [version='v1'] - The CID version to generate.
|
|
35
|
+
* @throws {TypeError} If the version is not 'v0' or 'v1'.
|
|
36
|
+
*/
|
|
37
|
+
constructor(version = 'v1') {
|
|
38
|
+
if (version !== 'v0' && version !== 'v1') {
|
|
39
|
+
throw new TypeError('Invalid CID version. Use "v0" or "v1".');
|
|
40
|
+
}
|
|
41
|
+
this.#version = version;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Generates a CID from the provided data.
|
|
46
|
+
*
|
|
47
|
+
* @param {Uint8Array} data - The raw data to be hashed.
|
|
48
|
+
* @returns {Promise<CIDGenerationResult>} A promise resolving to the CID result.
|
|
49
|
+
* @throws {TypeError} If the input data is not a Uint8Array.
|
|
50
|
+
*/
|
|
51
|
+
async generate(data) {
|
|
52
|
+
if (!(data instanceof Uint8Array)) {
|
|
53
|
+
throw new TypeError(`Expected Uint8Array, but received ${typeof data}.`);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// sha256.digest is asynchronous and must be awaited.
|
|
57
|
+
const hash = await sha2.sha256.digest(data);
|
|
58
|
+
|
|
59
|
+
/** @type {CID} */
|
|
60
|
+
let cid$1;
|
|
61
|
+
/** @type {number} */
|
|
62
|
+
let codec;
|
|
63
|
+
|
|
64
|
+
if (this.#version === 'v0') {
|
|
65
|
+
// CIDv0 is locked to dag-pb + sha256. The codec is implicit.
|
|
66
|
+
codec = CODEC_DAG_PB;
|
|
67
|
+
cid$1 = cid.CID.createV0(hash);
|
|
68
|
+
} else {
|
|
69
|
+
// CIDv1 is explicit: we choose the raw codec for file bytes.
|
|
70
|
+
codec = CODEC_RAW;
|
|
71
|
+
cid$1 = cid.CID.create(1, codec, hash);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return {
|
|
75
|
+
cidString: cid$1.toString(),
|
|
76
|
+
version: this.#version,
|
|
77
|
+
hashAlgorithm: 'sha256',
|
|
78
|
+
codec,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
module.exports = IPFSHasher;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export type CIDGenerationResult = {
|
|
2
|
+
/**
|
|
3
|
+
* - The string representation of the CID.
|
|
4
|
+
*/
|
|
5
|
+
cidString: string;
|
|
6
|
+
/**
|
|
7
|
+
* - The CID version that was generated.
|
|
8
|
+
*/
|
|
9
|
+
version: 'v0' | 'v1';
|
|
10
|
+
/**
|
|
11
|
+
* - The algorithm used for hashing.
|
|
12
|
+
*/
|
|
13
|
+
hashAlgorithm: 'sha256';
|
|
14
|
+
/**
|
|
15
|
+
* - The multicodec code of the content.
|
|
16
|
+
*/
|
|
17
|
+
codec: number;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* @typedef {Object} CIDGenerationResult
|
|
21
|
+
* @property {string} cidString - The string representation of the CID.
|
|
22
|
+
* @property {'v0' | 'v1'} version - The CID version that was generated.
|
|
23
|
+
* @property {'sha256'} hashAlgorithm - The algorithm used for hashing.
|
|
24
|
+
* @property {number} codec - The multicodec code of the content.
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* A utility class to generate IPFS Content Identifiers (CIDs) locally.
|
|
28
|
+
*/
|
|
29
|
+
declare class IPFSHasher {
|
|
30
|
+
#private;
|
|
31
|
+
/**
|
|
32
|
+
* @param {'v0' | 'v1'} [version='v1'] - The CID version to generate.
|
|
33
|
+
* @throws {TypeError} If the version is not 'v0' or 'v1'.
|
|
34
|
+
*/
|
|
35
|
+
constructor(version?: 'v0' | 'v1');
|
|
36
|
+
/**
|
|
37
|
+
* Generates a CID from the provided data.
|
|
38
|
+
*
|
|
39
|
+
* @param {Uint8Array} data - The raw data to be hashed.
|
|
40
|
+
* @returns {Promise<CIDGenerationResult>} A promise resolving to the CID result.
|
|
41
|
+
* @throws {TypeError} If the input data is not a Uint8Array.
|
|
42
|
+
*/
|
|
43
|
+
generate(data: Uint8Array): Promise<CIDGenerationResult>;
|
|
44
|
+
}
|
|
45
|
+
export default IPFSHasher;
|
|
46
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../../../../../src/v1/webTemplates/multiformats/14.0/IPFSHasher/index.mjs"],"names":[],"mappings":"AAgBG,YAAkB,mBAAmB,GACrC;;;;IAAmB,SAAS,EAAjB,MAAM,CACjB;;;;IAAwB,OAAO,EAApB,IAAI,GAAG,IAAI,CACtB;;;;IAAqB,aAAa,EAAvB,QAAQ,CACnB;;;;IAAmB,KAAK,EAAb,MAAM,CACnB;CAAA,CAAA;AAND;;;;;;GAMG;AAEH;;GAEG;AACH,cAAM,UAAU;;IAId;;;OAGG;IACH,YAAY,OAAO,AAHhB,CACA,EADQ,IAAI,GAAG,IAGQ,EAKzB;IAED;;;;;;OAMG;IACG,QAAQ,CAAC,IAAI,EAJR,UAIQ,GAHN,OAAO,CAAC,mBAAmB,CAAC,CAgCxC;CACF;eAEc,UAAU"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { CID } from 'multiformats/cid';
|
|
2
|
+
import { sha256 } from 'multiformats/hashes/sha2';
|
|
3
|
+
/**
|
|
4
|
+
* Multicodec code for the dag-pb format.
|
|
5
|
+
* @type {number}
|
|
6
|
+
*/
|
|
7
|
+
const CODEC_DAG_PB = 0x70;
|
|
8
|
+
/**
|
|
9
|
+
* Multicodec code for raw binary data.
|
|
10
|
+
* @type {number}
|
|
11
|
+
*/
|
|
12
|
+
const CODEC_RAW = 0x55;
|
|
13
|
+
/**
|
|
14
|
+
* @typedef {Object} CIDGenerationResult
|
|
15
|
+
* @property {string} cidString - The string representation of the CID.
|
|
16
|
+
* @property {'v0' | 'v1'} version - The CID version that was generated.
|
|
17
|
+
* @property {'sha256'} hashAlgorithm - The algorithm used for hashing.
|
|
18
|
+
* @property {number} codec - The multicodec code of the content.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* A utility class to generate IPFS Content Identifiers (CIDs) locally.
|
|
22
|
+
*/
|
|
23
|
+
class IPFSHasher {
|
|
24
|
+
/** @type {'v0' | 'v1'} */
|
|
25
|
+
#version;
|
|
26
|
+
/**
|
|
27
|
+
* @param {'v0' | 'v1'} [version='v1'] - The CID version to generate.
|
|
28
|
+
* @throws {TypeError} If the version is not 'v0' or 'v1'.
|
|
29
|
+
*/
|
|
30
|
+
constructor(version = 'v1') {
|
|
31
|
+
if (version !== 'v0' && version !== 'v1') {
|
|
32
|
+
throw new TypeError('Invalid CID version. Use "v0" or "v1".');
|
|
33
|
+
}
|
|
34
|
+
this.#version = version;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Generates a CID from the provided data.
|
|
38
|
+
*
|
|
39
|
+
* @param {Uint8Array} data - The raw data to be hashed.
|
|
40
|
+
* @returns {Promise<CIDGenerationResult>} A promise resolving to the CID result.
|
|
41
|
+
* @throws {TypeError} If the input data is not a Uint8Array.
|
|
42
|
+
*/
|
|
43
|
+
async generate(data) {
|
|
44
|
+
if (!(data instanceof Uint8Array)) {
|
|
45
|
+
throw new TypeError(`Expected Uint8Array, but received ${typeof data}.`);
|
|
46
|
+
}
|
|
47
|
+
// sha256.digest is asynchronous and must be awaited.
|
|
48
|
+
const hash = await sha256.digest(data);
|
|
49
|
+
/** @type {CID} */
|
|
50
|
+
let cid;
|
|
51
|
+
/** @type {number} */
|
|
52
|
+
let codec;
|
|
53
|
+
if (this.#version === 'v0') {
|
|
54
|
+
// CIDv0 is locked to dag-pb + sha256. The codec is implicit.
|
|
55
|
+
codec = CODEC_DAG_PB;
|
|
56
|
+
cid = CID.createV0(hash);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// CIDv1 is explicit: we choose the raw codec for file bytes.
|
|
60
|
+
codec = CODEC_RAW;
|
|
61
|
+
cid = CID.create(1, codec, hash);
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
cidString: cid.toString(),
|
|
65
|
+
version: this.#version,
|
|
66
|
+
hashAlgorithm: 'sha256',
|
|
67
|
+
codec,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
export default IPFSHasher;
|
|
@@ -0,0 +1,493 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var path = require('path');
|
|
4
|
+
var vite = require('vite');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @typedef {Object} TinyWebWorkerConfig
|
|
8
|
+
* @property {string} entry - The source file path for the Web Worker (e.g., 'src/workers/myWorker.mjs').
|
|
9
|
+
* @property {string} filename - The output filename for the Web Worker (e.g., 'myWorker.js').
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @typedef {Object} TinyVitePwaOptions
|
|
14
|
+
* @property {Record<any, any>} manifest - The Web App Manifest object.
|
|
15
|
+
* @property {string} manifestPath - The URL path where the manifest should be served.
|
|
16
|
+
* @property {string} srcDir - The source directory containing the Service Worker.
|
|
17
|
+
* @property {string} filename - The name of the Service Worker file.
|
|
18
|
+
* @property {boolean} [injectRegister=true] - Optional. Whether to automatically inject the SW registration script into the HTML <head>.
|
|
19
|
+
* @property {boolean} [injectManifestToGlobal=true] - Optional. Whether to inject the manifest into the global scope via Vite's `define`.
|
|
20
|
+
* @property {RegistrationOptions} [swRegistrationOptions] - Optional. Registration options for the Service Worker.
|
|
21
|
+
* @property {TinyWebWorkerConfig[]} [webWorkers] - Optional. A list of Web Workers to be bundled and served alongside the PWA.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
// ANSI Color Codes
|
|
25
|
+
const colors = {
|
|
26
|
+
reset: '\x1b[0m',
|
|
27
|
+
bright: '\x1b[1m',
|
|
28
|
+
dim: '\x1b[2m',
|
|
29
|
+
red: '\x1b[31m',
|
|
30
|
+
green: '\x1b[32m',
|
|
31
|
+
yellow: '\x1b[33m',
|
|
32
|
+
blue: '\x1b[34m',
|
|
33
|
+
cyan: '\x1b[36m',
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Internal logger to maintain consistent plugin output formatting using ANSI colors.
|
|
38
|
+
*/
|
|
39
|
+
const logger = {
|
|
40
|
+
prefix: `${colors.cyan}[tiny-vite-pwa]${colors.reset}`,
|
|
41
|
+
info: (/** @type {string} */ msg) =>
|
|
42
|
+
console.log(`${logger.prefix} ${colors.blue}[INFO]${colors.reset} ${msg}`),
|
|
43
|
+
success: (/** @type {string} */ msg) =>
|
|
44
|
+
console.log(`${logger.prefix} ${colors.green}[SUCCESS]${colors.reset} ${msg}${colors.reset}`),
|
|
45
|
+
warn: (/** @type {string} */ msg) =>
|
|
46
|
+
console.warn(`${logger.prefix} ${colors.yellow}[WARN]${colors.reset} ${msg}${colors.reset}`),
|
|
47
|
+
error: (/** @type {string} */ msg, /** @type {Error} */ err) =>
|
|
48
|
+
console.error(
|
|
49
|
+
`${logger.prefix} ${colors.red}[ERROR]${colors.reset} ${msg}${colors.reset}`,
|
|
50
|
+
err || '',
|
|
51
|
+
),
|
|
52
|
+
log: (/** @type {string} */ msg) => console.log(msg),
|
|
53
|
+
dim: (/** @type {string} */ msg) => console.log(`${colors.dim}${msg}${colors.reset}`),
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Custom PWA Plugin.
|
|
58
|
+
* Resolves Manifest, Dev HMR, Service Worker, and multiple Web Workers bundling.
|
|
59
|
+
*
|
|
60
|
+
* NOTE: The Service Worker and Web Worker files are always served from the root directory of the website.
|
|
61
|
+
*
|
|
62
|
+
* TypeScript Support: To enable IntelliSense and avoid type errors when using
|
|
63
|
+
* the injected '__TINY_PWA_MANIFEST__' global variable, add the following to your `env.d.ts` file:
|
|
64
|
+
*
|
|
65
|
+
* ```typescript
|
|
66
|
+
* declare global {
|
|
67
|
+
* interface Window {
|
|
68
|
+
* __TINY_PWA_MANIFEST__: Record<string, any>;
|
|
69
|
+
* }
|
|
70
|
+
* }
|
|
71
|
+
* ```
|
|
72
|
+
*
|
|
73
|
+
* @param {TinyVitePwaOptions} options - The configuration options for the plugin.
|
|
74
|
+
* @returns {import('vite').Plugin} The Vite plugin object.
|
|
75
|
+
*/
|
|
76
|
+
const TinyVitePwaPlugin = (options) => {
|
|
77
|
+
// --- Strict Runtime Validation ---
|
|
78
|
+
if (typeof options !== 'object' || options === null) {
|
|
79
|
+
throw new TypeError('The "options" argument must be a non-null object.');
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (typeof options.manifest !== 'object' || options.manifest === null) {
|
|
83
|
+
throw new TypeError('The "manifest" property must be an object.');
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (typeof options.manifestPath !== 'string') {
|
|
87
|
+
throw new TypeError('The "manifestPath" property must be a string.');
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (typeof options.srcDir !== 'string') {
|
|
91
|
+
throw new TypeError('The "srcDir" property must be a string.');
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (typeof options.filename !== 'string') {
|
|
95
|
+
throw new TypeError('The "filename" property must be a string.');
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (options.injectRegister !== undefined && typeof options.injectRegister !== 'boolean') {
|
|
99
|
+
throw new TypeError('The "injectRegister" property must be a boolean.');
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (
|
|
103
|
+
options.injectManifestToGlobal !== undefined &&
|
|
104
|
+
typeof options.injectManifestToGlobal !== 'boolean'
|
|
105
|
+
) {
|
|
106
|
+
throw new TypeError('The "injectManifestToGlobal" property must be a boolean.');
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (
|
|
110
|
+
options.swRegistrationOptions !== undefined &&
|
|
111
|
+
(typeof options.swRegistrationOptions !== 'object' ||
|
|
112
|
+
options.swRegistrationOptions === null ||
|
|
113
|
+
Array.isArray(options.swRegistrationOptions))
|
|
114
|
+
) {
|
|
115
|
+
throw new TypeError('The "swRegistrationOptions" property must be an object.');
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const filenamePattern = /^[a-zA-Z0-9._-]+$/;
|
|
119
|
+
if (!filenamePattern.test(options.filename)) {
|
|
120
|
+
throw new RangeError(
|
|
121
|
+
'The "filename" property contains invalid characters. To prevent injection, only alphanumeric characters, dots (.), underscores (_), and hyphens (-) are allowed.',
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Validate Web Workers Array if provided
|
|
126
|
+
if (options.webWorkers !== undefined) {
|
|
127
|
+
if (!Array.isArray(options.webWorkers)) {
|
|
128
|
+
throw new TypeError('The "webWorkers" property must be an array.');
|
|
129
|
+
}
|
|
130
|
+
options.webWorkers.forEach((ww, index) => {
|
|
131
|
+
if (typeof ww !== 'object' || ww === null) {
|
|
132
|
+
throw new TypeError(`webWorkers[${index}] must be a non-null object.`);
|
|
133
|
+
}
|
|
134
|
+
if (typeof ww.entry !== 'string') {
|
|
135
|
+
throw new TypeError(`webWorkers[${index}].entry must be a string.`);
|
|
136
|
+
}
|
|
137
|
+
if (typeof ww.filename !== 'string') {
|
|
138
|
+
throw new TypeError(`webWorkers[${index}].filename must be a string.`);
|
|
139
|
+
}
|
|
140
|
+
if (!filenamePattern.test(ww.filename)) {
|
|
141
|
+
throw new RangeError(`webWorkers[${index}].filename contains invalid characters.`);
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const {
|
|
147
|
+
manifest,
|
|
148
|
+
manifestPath,
|
|
149
|
+
srcDir,
|
|
150
|
+
filename,
|
|
151
|
+
swRegistrationOptions,
|
|
152
|
+
webWorkers = [],
|
|
153
|
+
} = options;
|
|
154
|
+
const injectRegister = options.injectRegister ?? true;
|
|
155
|
+
const injectManifestToGlobal = options.injectManifestToGlobal ?? true;
|
|
156
|
+
|
|
157
|
+
/** @type {string} */
|
|
158
|
+
let swSourcePath;
|
|
159
|
+
/** @type {Array<{ entryPath: string, filename: string }>} */
|
|
160
|
+
let resolvedWebWorkers = [];
|
|
161
|
+
/** @type {import('vite').ResolvedConfig} */
|
|
162
|
+
let viteConfig;
|
|
163
|
+
|
|
164
|
+
return {
|
|
165
|
+
name: 'tiny-vite-pwa',
|
|
166
|
+
|
|
167
|
+
// Capture Vite configuration to use during build mode
|
|
168
|
+
configResolved(config) {
|
|
169
|
+
viteConfig = config;
|
|
170
|
+
swSourcePath = path.resolve(config.root, srcDir, filename);
|
|
171
|
+
|
|
172
|
+
// Resolve absolute paths for Web Workers
|
|
173
|
+
resolvedWebWorkers = webWorkers.map((ww) => ({
|
|
174
|
+
entryPath: path.resolve(config.root, ww.entry, ww.filename),
|
|
175
|
+
filename: ww.filename,
|
|
176
|
+
}));
|
|
177
|
+
},
|
|
178
|
+
|
|
179
|
+
config(config) {
|
|
180
|
+
const define = { ...config.define };
|
|
181
|
+
if (injectManifestToGlobal) define.__TINY_PWA_MANIFEST__ = JSON.stringify(manifest);
|
|
182
|
+
return { ...config, define };
|
|
183
|
+
},
|
|
184
|
+
|
|
185
|
+
// REQUIREMENTS 1 & 4 (DEV Mode): Serve the manifest, Service Worker, and Web Workers
|
|
186
|
+
configureServer(server) {
|
|
187
|
+
// Extract server info to build a clickable URL
|
|
188
|
+
const serverConfig = server.config.server || {};
|
|
189
|
+
let host = serverConfig.host;
|
|
190
|
+
if (host === true) {
|
|
191
|
+
host = '0.0.0.0';
|
|
192
|
+
} else if (typeof host !== 'string') {
|
|
193
|
+
host = 'localhost';
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const port = serverConfig.port;
|
|
197
|
+
const isHttps = serverConfig.https ? true : false;
|
|
198
|
+
|
|
199
|
+
const protocol = isHttps ? 'https' : 'http';
|
|
200
|
+
|
|
201
|
+
// If host is 0.0.0.0, use localhost so the link is clickable in the terminal
|
|
202
|
+
const displayHost = host === '0.0.0.0' ? 'localhost' : host;
|
|
203
|
+
const baseUrl = `${protocol}://${displayHost}:${port}`;
|
|
204
|
+
|
|
205
|
+
const normalizedManifestPath = manifestPath.startsWith('/')
|
|
206
|
+
? manifestPath
|
|
207
|
+
: `/${manifestPath}`;
|
|
208
|
+
const swUrl = `/${filename}`;
|
|
209
|
+
|
|
210
|
+
server.middlewares.use(async (req, res, next) => {
|
|
211
|
+
// We parse the incoming request URL to extract only the pathname.
|
|
212
|
+
// This ensures that requests with query parameters (e.g., /sw.js?v=123)
|
|
213
|
+
// are correctly matched to the file paths.
|
|
214
|
+
const requestUrl = new URL(req.url ?? '', 'http://localhost');
|
|
215
|
+
const pathname = requestUrl.pathname;
|
|
216
|
+
|
|
217
|
+
// Serve manifest.json dynamically
|
|
218
|
+
if (pathname === normalizedManifestPath) {
|
|
219
|
+
res.setHeader('Content-Type', 'application/json');
|
|
220
|
+
res.end(JSON.stringify(manifest, null, 2));
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// Serve the Service Worker in Dev mode using Vite's transformer
|
|
225
|
+
if (pathname === swUrl) {
|
|
226
|
+
try {
|
|
227
|
+
const transformed = await server.transformRequest(swSourcePath);
|
|
228
|
+
if (transformed) {
|
|
229
|
+
res.setHeader('Content-Type', 'application/javascript');
|
|
230
|
+
res.end(transformed.code);
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
} catch (e) {
|
|
234
|
+
logger.error(
|
|
235
|
+
'Error transforming the SW in dev:',
|
|
236
|
+
e instanceof Error ? e : new Error('Unknown Error'),
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// Serve Web Workers in Dev mode
|
|
242
|
+
for (const ww of resolvedWebWorkers) {
|
|
243
|
+
if (pathname === `/${ww.filename}`) {
|
|
244
|
+
try {
|
|
245
|
+
const transformed = await server.transformRequest(ww.entryPath);
|
|
246
|
+
if (transformed) {
|
|
247
|
+
res.setHeader('Content-Type', 'application/javascript');
|
|
248
|
+
res.end(transformed.code);
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
} catch (e) {
|
|
252
|
+
logger.error(
|
|
253
|
+
`Error transforming Web Worker (${ww.filename}) in dev:`,
|
|
254
|
+
e instanceof Error ? e : new Error('Unknown Error'),
|
|
255
|
+
);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
next();
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
logger.success(`Manifest available at: ${baseUrl}${normalizedManifestPath}`);
|
|
264
|
+
logger.success(`Service Worker available at: ${baseUrl}${swUrl}`);
|
|
265
|
+
|
|
266
|
+
resolvedWebWorkers.forEach((ww) => {
|
|
267
|
+
logger.success(`Web Worker available at: ${baseUrl}/${ww.filename}`);
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
logger.warn(
|
|
271
|
+
`NOTE: If your Service Worker implements client-side routing, ensure it is configured to bypass interception for the manifest, SW, and WW files.`,
|
|
272
|
+
);
|
|
273
|
+
},
|
|
274
|
+
|
|
275
|
+
// REQUIREMENT 3: Monitor SW and WW changes and notify the frontend
|
|
276
|
+
handleHotUpdate({ file, server }) {
|
|
277
|
+
// Check for Service Worker updates
|
|
278
|
+
if (file.startsWith(path.resolve(viteConfig.root, srcDir))) {
|
|
279
|
+
logger.info('Service Worker change detected. Notifying frontend...');
|
|
280
|
+
// Send a custom event via Vite's WebSocket
|
|
281
|
+
server.ws.send({
|
|
282
|
+
type: 'custom',
|
|
283
|
+
event: 'pwa:sw-updated',
|
|
284
|
+
data: { message: 'The Service Worker file has been changed.' },
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
// Return an empty array so Vite does not attempt a full page reload automatically
|
|
288
|
+
return [];
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// Check for Web Worker updates
|
|
292
|
+
for (const ww of resolvedWebWorkers) {
|
|
293
|
+
if (file === ww.entryPath) {
|
|
294
|
+
logger.info(`Web Worker change detected (${ww.filename}). Notifying frontend...`);
|
|
295
|
+
server.ws.send({
|
|
296
|
+
type: 'custom',
|
|
297
|
+
event: 'pwa:ww-updated',
|
|
298
|
+
data: {
|
|
299
|
+
message: `The Web Worker file ${ww.filename} has been changed.`,
|
|
300
|
+
filename: ww.filename,
|
|
301
|
+
},
|
|
302
|
+
});
|
|
303
|
+
return [];
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
},
|
|
307
|
+
|
|
308
|
+
// INJECT HTML SCRIPT: Inject the SW registration code and the Manifest link into the output HTML
|
|
309
|
+
transformIndexHtml() {
|
|
310
|
+
// In production mode, we append a timestamp to the URL to force cache busting.
|
|
311
|
+
// In development mode, we omit the timestamp to avoid generating unnecessary logs on every reload.
|
|
312
|
+
const isBuild = viteConfig && viteConfig.command === 'build';
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* Safely appends a cache-busting timestamp to a URL string.
|
|
316
|
+
* @param {string} urlStr - The base URL path.
|
|
317
|
+
* @returns {string} The URL path with the 'v' parameter appended correctly.
|
|
318
|
+
*/
|
|
319
|
+
const getVersionedUrl = (urlStr) => {
|
|
320
|
+
// We use a dummy base ('http://localhost') because the URL constructor
|
|
321
|
+
// requires an absolute URL to parse relative paths correctly.
|
|
322
|
+
const url = new URL(urlStr, 'http://localhost');
|
|
323
|
+
|
|
324
|
+
// .set() is smart: it uses '?' if no params exist, or '&' if they do.
|
|
325
|
+
url.searchParams.set('v', Date.now().toString());
|
|
326
|
+
|
|
327
|
+
// We return only the pathname and search (e.g., "/sw.js?v=123")
|
|
328
|
+
// to keep the injection relative for the HTML.
|
|
329
|
+
return url.pathname + url.search;
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
const swUrl = getVersionedUrl(`/${filename}`);
|
|
333
|
+
|
|
334
|
+
// Prepare the manifest URL with cache busting for production
|
|
335
|
+
const normalizedManifestHref = manifestPath.startsWith('/')
|
|
336
|
+
? manifestPath
|
|
337
|
+
: `/${manifestPath}`;
|
|
338
|
+
const manifestUrl = getVersionedUrl(normalizedManifestHref);
|
|
339
|
+
|
|
340
|
+
/** @type {import('vite').HtmlTagDescriptor[]} */
|
|
341
|
+
const insertData = [];
|
|
342
|
+
|
|
343
|
+
// Manifest
|
|
344
|
+
logger.info(`Injecting Manifest into HTML: ${manifestUrl}`);
|
|
345
|
+
insertData.push({
|
|
346
|
+
tag: 'link',
|
|
347
|
+
injectTo: 'head',
|
|
348
|
+
attrs: {
|
|
349
|
+
rel: 'manifest',
|
|
350
|
+
href: manifestUrl,
|
|
351
|
+
},
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
// SW
|
|
355
|
+
if (injectRegister) {
|
|
356
|
+
logger.info(`Injecting Service Worker into HTML: ${swUrl}`);
|
|
357
|
+
|
|
358
|
+
// Prepare the registration options string safely using JSON.stringify
|
|
359
|
+
// If no options are provided, swOptionsString remains an empty string.
|
|
360
|
+
const swOptionsString = swRegistrationOptions
|
|
361
|
+
? `, ${JSON.stringify(swRegistrationOptions)}`
|
|
362
|
+
: '';
|
|
363
|
+
|
|
364
|
+
insertData.push({
|
|
365
|
+
tag: 'script',
|
|
366
|
+
injectTo: 'head',
|
|
367
|
+
children: `
|
|
368
|
+
if ('serviceWorker' in navigator) {
|
|
369
|
+
window.addEventListener('load', () => {
|
|
370
|
+
navigator.serviceWorker.register('${swUrl}'${swOptionsString})${!isBuild ? `.then(() => console.log('[tiny-vite-pwa] SW registered.')).catch(err => console.error('[tiny-vite-pwa] SW error:', err))` : ''};
|
|
371
|
+
});
|
|
372
|
+
};`
|
|
373
|
+
.replace(/\n/g, '')
|
|
374
|
+
.replace(/ /g, '')
|
|
375
|
+
.trim(),
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
return insertData;
|
|
380
|
+
},
|
|
381
|
+
|
|
382
|
+
// REQUIREMENT 1 (PROD Mode): Save the manifest to the dist directory
|
|
383
|
+
generateBundle() {
|
|
384
|
+
// Remove the leading slash from the path to prevent Rollup errors
|
|
385
|
+
const emitPath = manifestPath.replace(/^\//, '');
|
|
386
|
+
this.emitFile({
|
|
387
|
+
type: 'asset',
|
|
388
|
+
fileName: emitPath,
|
|
389
|
+
source: JSON.stringify(manifest),
|
|
390
|
+
});
|
|
391
|
+
},
|
|
392
|
+
|
|
393
|
+
// REQUIREMENT 4 (PROD Mode): Bundle the Service Worker and Web Workers separately
|
|
394
|
+
async closeBundle() {
|
|
395
|
+
// Only run this during the build command (production)
|
|
396
|
+
if (viteConfig.command === 'build') {
|
|
397
|
+
const projectRoot = viteConfig.root || process.cwd();
|
|
398
|
+
|
|
399
|
+
logger.dim('--------------------------------------------------');
|
|
400
|
+
logger.log(` Mode: ${colors.bright}${viteConfig.mode}${colors.reset}`);
|
|
401
|
+
|
|
402
|
+
// --- Build Service Worker ---
|
|
403
|
+
const relativeSourceSW = path.relative(projectRoot, swSourcePath);
|
|
404
|
+
const relativeDestSW = path.relative(projectRoot, path.resolve(viteConfig.build.outDir, filename));
|
|
405
|
+
|
|
406
|
+
const manifestDestPath = path.resolve(viteConfig.build.outDir, manifestPath.replace(/^\//, ''));
|
|
407
|
+
const relativeDestManifest = path.relative(projectRoot, manifestDestPath);
|
|
408
|
+
|
|
409
|
+
logger.info('Initiating Service Worker bundling process...');
|
|
410
|
+
|
|
411
|
+
// Manifest Info
|
|
412
|
+
logger.log(` Manifest: ${colors.cyan}${relativeDestManifest}${colors.reset}`);
|
|
413
|
+
|
|
414
|
+
// Service Worker Info
|
|
415
|
+
logger.log(` SW Source: ${colors.cyan}${relativeSourceSW}${colors.reset}`);
|
|
416
|
+
logger.log(` SW Dest: ${colors.cyan}${relativeDestSW}${colors.reset}`);
|
|
417
|
+
|
|
418
|
+
try {
|
|
419
|
+
await vite.build({
|
|
420
|
+
configFile: false, // Ignore the main vite.config.js to prevent infinite loops
|
|
421
|
+
mode: viteConfig.mode,
|
|
422
|
+
build: {
|
|
423
|
+
outDir: viteConfig.build.outDir,
|
|
424
|
+
emptyOutDir: false, // IMPORTANT: Do not delete the React build that was just completed
|
|
425
|
+
lib: {
|
|
426
|
+
entry: swSourcePath,
|
|
427
|
+
name: 'ServiceWorker',
|
|
428
|
+
formats: ['iife'], // IIFE bundles all imports into a single file (classic SW standard)
|
|
429
|
+
fileName: () => filename,
|
|
430
|
+
},
|
|
431
|
+
rollupOptions: {
|
|
432
|
+
// Ensures no hashes are added to the SW filename
|
|
433
|
+
output: { entryFileNames: filename },
|
|
434
|
+
},
|
|
435
|
+
},
|
|
436
|
+
});
|
|
437
|
+
logger.success('Service Worker bundled successfully.');
|
|
438
|
+
} catch (e) {
|
|
439
|
+
logger.error(
|
|
440
|
+
'Failed to bundle the Service Worker.',
|
|
441
|
+
e instanceof Error ? e : new Error('Unknown Error'),
|
|
442
|
+
);
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
// --- Build Web Workers ---
|
|
446
|
+
if (resolvedWebWorkers.length > 0) {
|
|
447
|
+
logger.dim('--------------------------------------------------');
|
|
448
|
+
logger.info('Initiating Web Workers bundling process...');
|
|
449
|
+
|
|
450
|
+
for (const ww of resolvedWebWorkers) {
|
|
451
|
+
const relativeSourceWW = path.relative(projectRoot, ww.entryPath);
|
|
452
|
+
const relativeDestWW = path.relative(
|
|
453
|
+
projectRoot,
|
|
454
|
+
path.resolve(viteConfig.build.outDir, ww.filename),
|
|
455
|
+
);
|
|
456
|
+
|
|
457
|
+
logger.log(` WW Source: ${colors.cyan}${relativeSourceWW}${colors.reset}`);
|
|
458
|
+
logger.log(` WW Dest: ${colors.cyan}${relativeDestWW}${colors.reset}`);
|
|
459
|
+
|
|
460
|
+
try {
|
|
461
|
+
await vite.build({
|
|
462
|
+
configFile: false,
|
|
463
|
+
mode: viteConfig.mode,
|
|
464
|
+
build: {
|
|
465
|
+
outDir: viteConfig.build.outDir,
|
|
466
|
+
emptyOutDir: false,
|
|
467
|
+
lib: {
|
|
468
|
+
entry: ww.entryPath,
|
|
469
|
+
name: ww.filename.replace(/\.[^/.]+$/, ''),
|
|
470
|
+
formats: ['iife'],
|
|
471
|
+
fileName: () => ww.filename,
|
|
472
|
+
},
|
|
473
|
+
rollupOptions: {
|
|
474
|
+
output: { entryFileNames: ww.filename },
|
|
475
|
+
},
|
|
476
|
+
},
|
|
477
|
+
});
|
|
478
|
+
logger.success(`Web Worker (${ww.filename}) bundled successfully.`);
|
|
479
|
+
} catch (e) {
|
|
480
|
+
logger.error(
|
|
481
|
+
`Failed to bundle the Web Worker (${ww.filename}).`,
|
|
482
|
+
e instanceof Error ? e : new Error('Unknown Error'),
|
|
483
|
+
);
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
logger.dim('--------------------------------------------------');
|
|
488
|
+
}
|
|
489
|
+
},
|
|
490
|
+
};
|
|
491
|
+
};
|
|
492
|
+
|
|
493
|
+
module.exports = TinyVitePwaPlugin;
|