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,399 @@
|
|
|
1
|
+
import { resolve, relative } from 'path';
|
|
2
|
+
import { build } from 'vite';
|
|
3
|
+
/**
|
|
4
|
+
* @typedef {Object} TinyWebWorkerConfig
|
|
5
|
+
* @property {string} entry - The source file path for the Web Worker (e.g., 'src/workers/myWorker.mjs').
|
|
6
|
+
* @property {string} filename - The output filename for the Web Worker (e.g., 'myWorker.js').
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* @typedef {Object} TinyVitePwaOptions
|
|
10
|
+
* @property {Record<any, any>} manifest - The Web App Manifest object.
|
|
11
|
+
* @property {string} manifestPath - The URL path where the manifest should be served.
|
|
12
|
+
* @property {string} srcDir - The source directory containing the Service Worker.
|
|
13
|
+
* @property {string} filename - The name of the Service Worker file.
|
|
14
|
+
* @property {boolean} [injectRegister=true] - Optional. Whether to automatically inject the SW registration script into the HTML <head>.
|
|
15
|
+
* @property {boolean} [injectManifestToGlobal=true] - Optional. Whether to inject the manifest into the global scope via Vite's `define`.
|
|
16
|
+
* @property {RegistrationOptions} [swRegistrationOptions] - Optional. Registration options for the Service Worker.
|
|
17
|
+
* @property {TinyWebWorkerConfig[]} [webWorkers] - Optional. A list of Web Workers to be bundled and served alongside the PWA.
|
|
18
|
+
*/
|
|
19
|
+
// ANSI Color Codes
|
|
20
|
+
const colors = {
|
|
21
|
+
reset: '\x1b[0m',
|
|
22
|
+
bright: '\x1b[1m',
|
|
23
|
+
dim: '\x1b[2m',
|
|
24
|
+
red: '\x1b[31m',
|
|
25
|
+
green: '\x1b[32m',
|
|
26
|
+
yellow: '\x1b[33m',
|
|
27
|
+
blue: '\x1b[34m',
|
|
28
|
+
magenta: '\x1b[35m',
|
|
29
|
+
cyan: '\x1b[36m',
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Internal logger to maintain consistent plugin output formatting using ANSI colors.
|
|
33
|
+
*/
|
|
34
|
+
const logger = {
|
|
35
|
+
prefix: `${colors.cyan}[tiny-vite-pwa]${colors.reset}`,
|
|
36
|
+
info: (/** @type {string} */ msg) => console.log(`${logger.prefix} ${colors.blue}[INFO]${colors.reset} ${msg}`),
|
|
37
|
+
success: (/** @type {string} */ msg) => console.log(`${logger.prefix} ${colors.green}[SUCCESS]${colors.reset} ${msg}${colors.reset}`),
|
|
38
|
+
warn: (/** @type {string} */ msg) => console.warn(`${logger.prefix} ${colors.yellow}[WARN]${colors.reset} ${msg}${colors.reset}`),
|
|
39
|
+
error: (/** @type {string} */ msg, /** @type {Error} */ err) => console.error(`${logger.prefix} ${colors.red}[ERROR]${colors.reset} ${msg}${colors.reset}`, err || ''),
|
|
40
|
+
log: (/** @type {string} */ msg) => console.log(msg),
|
|
41
|
+
dim: (/** @type {string} */ msg) => console.log(`${colors.dim}${msg}${colors.reset}`),
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Custom PWA Plugin.
|
|
45
|
+
* Resolves Manifest, Dev HMR, Service Worker, and multiple Web Workers bundling.
|
|
46
|
+
*
|
|
47
|
+
* NOTE: The Service Worker and Web Worker files are always served from the root directory of the website.
|
|
48
|
+
*
|
|
49
|
+
* TypeScript Support: To enable IntelliSense and avoid type errors when using
|
|
50
|
+
* the injected '__TINY_PWA_MANIFEST__' global variable, add the following to your `env.d.ts` file:
|
|
51
|
+
*
|
|
52
|
+
* ```typescript
|
|
53
|
+
* declare global {
|
|
54
|
+
* interface Window {
|
|
55
|
+
* __TINY_PWA_MANIFEST__: Record<string, any>;
|
|
56
|
+
* }
|
|
57
|
+
* }
|
|
58
|
+
* ```
|
|
59
|
+
*
|
|
60
|
+
* @param {TinyVitePwaOptions} options - The configuration options for the plugin.
|
|
61
|
+
* @returns {import('vite').Plugin} The Vite plugin object.
|
|
62
|
+
*/
|
|
63
|
+
const TinyVitePwaPlugin = (options) => {
|
|
64
|
+
// --- Strict Runtime Validation ---
|
|
65
|
+
if (typeof options !== 'object' || options === null) {
|
|
66
|
+
throw new TypeError('The "options" argument must be a non-null object.');
|
|
67
|
+
}
|
|
68
|
+
if (typeof options.manifest !== 'object' || options.manifest === null) {
|
|
69
|
+
throw new TypeError('The "manifest" property must be an object.');
|
|
70
|
+
}
|
|
71
|
+
if (typeof options.manifestPath !== 'string') {
|
|
72
|
+
throw new TypeError('The "manifestPath" property must be a string.');
|
|
73
|
+
}
|
|
74
|
+
if (typeof options.srcDir !== 'string') {
|
|
75
|
+
throw new TypeError('The "srcDir" property must be a string.');
|
|
76
|
+
}
|
|
77
|
+
if (typeof options.filename !== 'string') {
|
|
78
|
+
throw new TypeError('The "filename" property must be a string.');
|
|
79
|
+
}
|
|
80
|
+
if (options.injectRegister !== undefined && typeof options.injectRegister !== 'boolean') {
|
|
81
|
+
throw new TypeError('The "injectRegister" property must be a boolean.');
|
|
82
|
+
}
|
|
83
|
+
if (options.injectManifestToGlobal !== undefined &&
|
|
84
|
+
typeof options.injectManifestToGlobal !== 'boolean') {
|
|
85
|
+
throw new TypeError('The "injectManifestToGlobal" property must be a boolean.');
|
|
86
|
+
}
|
|
87
|
+
if (options.swRegistrationOptions !== undefined &&
|
|
88
|
+
(typeof options.swRegistrationOptions !== 'object' ||
|
|
89
|
+
options.swRegistrationOptions === null ||
|
|
90
|
+
Array.isArray(options.swRegistrationOptions))) {
|
|
91
|
+
throw new TypeError('The "swRegistrationOptions" property must be an object.');
|
|
92
|
+
}
|
|
93
|
+
const filenamePattern = /^[a-zA-Z0-9._-]+$/;
|
|
94
|
+
if (!filenamePattern.test(options.filename)) {
|
|
95
|
+
throw new RangeError('The "filename" property contains invalid characters. To prevent injection, only alphanumeric characters, dots (.), underscores (_), and hyphens (-) are allowed.');
|
|
96
|
+
}
|
|
97
|
+
// Validate Web Workers Array if provided
|
|
98
|
+
if (options.webWorkers !== undefined) {
|
|
99
|
+
if (!Array.isArray(options.webWorkers)) {
|
|
100
|
+
throw new TypeError('The "webWorkers" property must be an array.');
|
|
101
|
+
}
|
|
102
|
+
options.webWorkers.forEach((ww, index) => {
|
|
103
|
+
if (typeof ww !== 'object' || ww === null) {
|
|
104
|
+
throw new TypeError(`webWorkers[${index}] must be a non-null object.`);
|
|
105
|
+
}
|
|
106
|
+
if (typeof ww.entry !== 'string') {
|
|
107
|
+
throw new TypeError(`webWorkers[${index}].entry must be a string.`);
|
|
108
|
+
}
|
|
109
|
+
if (typeof ww.filename !== 'string') {
|
|
110
|
+
throw new TypeError(`webWorkers[${index}].filename must be a string.`);
|
|
111
|
+
}
|
|
112
|
+
if (!filenamePattern.test(ww.filename)) {
|
|
113
|
+
throw new RangeError(`webWorkers[${index}].filename contains invalid characters.`);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
const { manifest, manifestPath, srcDir, filename, swRegistrationOptions, webWorkers = [], } = options;
|
|
118
|
+
const injectRegister = options.injectRegister ?? true;
|
|
119
|
+
const injectManifestToGlobal = options.injectManifestToGlobal ?? true;
|
|
120
|
+
/** @type {string} */
|
|
121
|
+
let swSourcePath;
|
|
122
|
+
/** @type {Array<{ entryPath: string, filename: string }>} */
|
|
123
|
+
let resolvedWebWorkers = [];
|
|
124
|
+
/** @type {import('vite').ResolvedConfig} */
|
|
125
|
+
let viteConfig;
|
|
126
|
+
return {
|
|
127
|
+
name: 'tiny-vite-pwa',
|
|
128
|
+
// Capture Vite configuration to use during build mode
|
|
129
|
+
configResolved(config) {
|
|
130
|
+
viteConfig = config;
|
|
131
|
+
swSourcePath = resolve(config.root, srcDir, filename);
|
|
132
|
+
// Resolve absolute paths for Web Workers
|
|
133
|
+
resolvedWebWorkers = webWorkers.map((ww) => ({
|
|
134
|
+
entryPath: resolve(config.root, ww.entry, ww.filename),
|
|
135
|
+
filename: ww.filename,
|
|
136
|
+
}));
|
|
137
|
+
},
|
|
138
|
+
config(config) {
|
|
139
|
+
const define = { ...config.define };
|
|
140
|
+
if (injectManifestToGlobal)
|
|
141
|
+
define.__TINY_PWA_MANIFEST__ = JSON.stringify(manifest);
|
|
142
|
+
return { ...config, define };
|
|
143
|
+
},
|
|
144
|
+
// REQUIREMENTS 1 & 4 (DEV Mode): Serve the manifest, Service Worker, and Web Workers
|
|
145
|
+
configureServer(server) {
|
|
146
|
+
// Extract server info to build a clickable URL
|
|
147
|
+
const serverConfig = server.config.server || {};
|
|
148
|
+
let host = serverConfig.host;
|
|
149
|
+
if (host === true) {
|
|
150
|
+
host = '0.0.0.0';
|
|
151
|
+
}
|
|
152
|
+
else if (typeof host !== 'string') {
|
|
153
|
+
host = 'localhost';
|
|
154
|
+
}
|
|
155
|
+
const port = serverConfig.port;
|
|
156
|
+
const isHttps = serverConfig.https ? true : false;
|
|
157
|
+
const protocol = isHttps ? 'https' : 'http';
|
|
158
|
+
// If host is 0.0.0.0, use localhost so the link is clickable in the terminal
|
|
159
|
+
const displayHost = host === '0.0.0.0' ? 'localhost' : host;
|
|
160
|
+
const baseUrl = `${protocol}://${displayHost}:${port}`;
|
|
161
|
+
const normalizedManifestPath = manifestPath.startsWith('/')
|
|
162
|
+
? manifestPath
|
|
163
|
+
: `/${manifestPath}`;
|
|
164
|
+
const swUrl = `/${filename}`;
|
|
165
|
+
server.middlewares.use(async (req, res, next) => {
|
|
166
|
+
// We parse the incoming request URL to extract only the pathname.
|
|
167
|
+
// This ensures that requests with query parameters (e.g., /sw.js?v=123)
|
|
168
|
+
// are correctly matched to the file paths.
|
|
169
|
+
const requestUrl = new URL(req.url ?? '', 'http://localhost');
|
|
170
|
+
const pathname = requestUrl.pathname;
|
|
171
|
+
// Serve manifest.json dynamically
|
|
172
|
+
if (pathname === normalizedManifestPath) {
|
|
173
|
+
res.setHeader('Content-Type', 'application/json');
|
|
174
|
+
res.end(JSON.stringify(manifest, null, 2));
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
// Serve the Service Worker in Dev mode using Vite's transformer
|
|
178
|
+
if (pathname === swUrl) {
|
|
179
|
+
try {
|
|
180
|
+
const transformed = await server.transformRequest(swSourcePath);
|
|
181
|
+
if (transformed) {
|
|
182
|
+
res.setHeader('Content-Type', 'application/javascript');
|
|
183
|
+
res.end(transformed.code);
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch (e) {
|
|
188
|
+
logger.error('Error transforming the SW in dev:', e instanceof Error ? e : new Error('Unknown Error'));
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// Serve Web Workers in Dev mode
|
|
192
|
+
for (const ww of resolvedWebWorkers) {
|
|
193
|
+
if (pathname === `/${ww.filename}`) {
|
|
194
|
+
try {
|
|
195
|
+
const transformed = await server.transformRequest(ww.entryPath);
|
|
196
|
+
if (transformed) {
|
|
197
|
+
res.setHeader('Content-Type', 'application/javascript');
|
|
198
|
+
res.end(transformed.code);
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
catch (e) {
|
|
203
|
+
logger.error(`Error transforming Web Worker (${ww.filename}) in dev:`, e instanceof Error ? e : new Error('Unknown Error'));
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
next();
|
|
208
|
+
});
|
|
209
|
+
logger.success(`Manifest available at: ${baseUrl}${normalizedManifestPath}`);
|
|
210
|
+
logger.success(`Service Worker available at: ${baseUrl}${swUrl}`);
|
|
211
|
+
resolvedWebWorkers.forEach((ww) => {
|
|
212
|
+
logger.success(`Web Worker available at: ${baseUrl}/${ww.filename}`);
|
|
213
|
+
});
|
|
214
|
+
logger.warn(`NOTE: If your Service Worker implements client-side routing, ensure it is configured to bypass interception for the manifest, SW, and WW files.`);
|
|
215
|
+
},
|
|
216
|
+
// REQUIREMENT 3: Monitor SW and WW changes and notify the frontend
|
|
217
|
+
handleHotUpdate({ file, server }) {
|
|
218
|
+
// Check for Service Worker updates
|
|
219
|
+
if (file.startsWith(resolve(viteConfig.root, srcDir))) {
|
|
220
|
+
logger.info('Service Worker change detected. Notifying frontend...');
|
|
221
|
+
// Send a custom event via Vite's WebSocket
|
|
222
|
+
server.ws.send({
|
|
223
|
+
type: 'custom',
|
|
224
|
+
event: 'pwa:sw-updated',
|
|
225
|
+
data: { message: 'The Service Worker file has been changed.' },
|
|
226
|
+
});
|
|
227
|
+
// Return an empty array so Vite does not attempt a full page reload automatically
|
|
228
|
+
return [];
|
|
229
|
+
}
|
|
230
|
+
// Check for Web Worker updates
|
|
231
|
+
for (const ww of resolvedWebWorkers) {
|
|
232
|
+
if (file === ww.entryPath) {
|
|
233
|
+
logger.info(`Web Worker change detected (${ww.filename}). Notifying frontend...`);
|
|
234
|
+
server.ws.send({
|
|
235
|
+
type: 'custom',
|
|
236
|
+
event: 'pwa:ww-updated',
|
|
237
|
+
data: {
|
|
238
|
+
message: `The Web Worker file ${ww.filename} has been changed.`,
|
|
239
|
+
filename: ww.filename,
|
|
240
|
+
},
|
|
241
|
+
});
|
|
242
|
+
return [];
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
},
|
|
246
|
+
// INJECT HTML SCRIPT: Inject the SW registration code and the Manifest link into the output HTML
|
|
247
|
+
transformIndexHtml() {
|
|
248
|
+
// In production mode, we append a timestamp to the URL to force cache busting.
|
|
249
|
+
// In development mode, we omit the timestamp to avoid generating unnecessary logs on every reload.
|
|
250
|
+
const isBuild = viteConfig && viteConfig.command === 'build';
|
|
251
|
+
/**
|
|
252
|
+
* Safely appends a cache-busting timestamp to a URL string.
|
|
253
|
+
* @param {string} urlStr - The base URL path.
|
|
254
|
+
* @returns {string} The URL path with the 'v' parameter appended correctly.
|
|
255
|
+
*/
|
|
256
|
+
const getVersionedUrl = (urlStr) => {
|
|
257
|
+
// We use a dummy base ('http://localhost') because the URL constructor
|
|
258
|
+
// requires an absolute URL to parse relative paths correctly.
|
|
259
|
+
const url = new URL(urlStr, 'http://localhost');
|
|
260
|
+
// .set() is smart: it uses '?' if no params exist, or '&' if they do.
|
|
261
|
+
url.searchParams.set('v', Date.now().toString());
|
|
262
|
+
// We return only the pathname and search (e.g., "/sw.js?v=123")
|
|
263
|
+
// to keep the injection relative for the HTML.
|
|
264
|
+
return url.pathname + url.search;
|
|
265
|
+
};
|
|
266
|
+
const swUrl = getVersionedUrl(`/${filename}`);
|
|
267
|
+
// Prepare the manifest URL with cache busting for production
|
|
268
|
+
const normalizedManifestHref = manifestPath.startsWith('/')
|
|
269
|
+
? manifestPath
|
|
270
|
+
: `/${manifestPath}`;
|
|
271
|
+
const manifestUrl = getVersionedUrl(normalizedManifestHref);
|
|
272
|
+
/** @type {import('vite').HtmlTagDescriptor[]} */
|
|
273
|
+
const insertData = [];
|
|
274
|
+
// Manifest
|
|
275
|
+
logger.info(`Injecting Manifest into HTML: ${manifestUrl}`);
|
|
276
|
+
insertData.push({
|
|
277
|
+
tag: 'link',
|
|
278
|
+
injectTo: 'head',
|
|
279
|
+
attrs: {
|
|
280
|
+
rel: 'manifest',
|
|
281
|
+
href: manifestUrl,
|
|
282
|
+
},
|
|
283
|
+
});
|
|
284
|
+
// SW
|
|
285
|
+
if (injectRegister) {
|
|
286
|
+
logger.info(`Injecting Service Worker into HTML: ${swUrl}`);
|
|
287
|
+
// Prepare the registration options string safely using JSON.stringify
|
|
288
|
+
// If no options are provided, swOptionsString remains an empty string.
|
|
289
|
+
const swOptionsString = swRegistrationOptions
|
|
290
|
+
? `, ${JSON.stringify(swRegistrationOptions)}`
|
|
291
|
+
: '';
|
|
292
|
+
insertData.push({
|
|
293
|
+
tag: 'script',
|
|
294
|
+
injectTo: 'head',
|
|
295
|
+
children: `
|
|
296
|
+
if ('serviceWorker' in navigator) {
|
|
297
|
+
window.addEventListener('load', () => {
|
|
298
|
+
navigator.serviceWorker.register('${swUrl}'${swOptionsString})${!isBuild ? `.then(() => console.log('[tiny-vite-pwa] SW registered.')).catch(err => console.error('[tiny-vite-pwa] SW error:', err))` : ''};
|
|
299
|
+
});
|
|
300
|
+
};`
|
|
301
|
+
.replace(/\n/g, '')
|
|
302
|
+
.replace(/ /g, '')
|
|
303
|
+
.trim(),
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
return insertData;
|
|
307
|
+
},
|
|
308
|
+
// REQUIREMENT 1 (PROD Mode): Save the manifest to the dist directory
|
|
309
|
+
generateBundle() {
|
|
310
|
+
// Remove the leading slash from the path to prevent Rollup errors
|
|
311
|
+
const emitPath = manifestPath.replace(/^\//, '');
|
|
312
|
+
this.emitFile({
|
|
313
|
+
type: 'asset',
|
|
314
|
+
fileName: emitPath,
|
|
315
|
+
source: JSON.stringify(manifest),
|
|
316
|
+
});
|
|
317
|
+
},
|
|
318
|
+
// REQUIREMENT 4 (PROD Mode): Bundle the Service Worker and Web Workers separately
|
|
319
|
+
async closeBundle() {
|
|
320
|
+
// Only run this during the build command (production)
|
|
321
|
+
if (viteConfig.command === 'build') {
|
|
322
|
+
const projectRoot = viteConfig.root || process.cwd();
|
|
323
|
+
logger.dim('--------------------------------------------------');
|
|
324
|
+
logger.log(` Mode: ${colors.bright}${viteConfig.mode}${colors.reset}`);
|
|
325
|
+
// --- Build Service Worker ---
|
|
326
|
+
const relativeSourceSW = relative(projectRoot, swSourcePath);
|
|
327
|
+
const relativeDestSW = relative(projectRoot, resolve(viteConfig.build.outDir, filename));
|
|
328
|
+
const manifestDestPath = resolve(viteConfig.build.outDir, manifestPath.replace(/^\//, ''));
|
|
329
|
+
const relativeDestManifest = relative(projectRoot, manifestDestPath);
|
|
330
|
+
logger.info('Initiating Service Worker bundling process...');
|
|
331
|
+
// Manifest Info
|
|
332
|
+
logger.log(` Manifest: ${colors.cyan}${relativeDestManifest}${colors.reset}`);
|
|
333
|
+
// Service Worker Info
|
|
334
|
+
logger.log(` SW Source: ${colors.cyan}${relativeSourceSW}${colors.reset}`);
|
|
335
|
+
logger.log(` SW Dest: ${colors.cyan}${relativeDestSW}${colors.reset}`);
|
|
336
|
+
try {
|
|
337
|
+
await build({
|
|
338
|
+
configFile: false, // Ignore the main vite.config.js to prevent infinite loops
|
|
339
|
+
mode: viteConfig.mode,
|
|
340
|
+
build: {
|
|
341
|
+
outDir: viteConfig.build.outDir,
|
|
342
|
+
emptyOutDir: false, // IMPORTANT: Do not delete the React build that was just completed
|
|
343
|
+
lib: {
|
|
344
|
+
entry: swSourcePath,
|
|
345
|
+
name: 'ServiceWorker',
|
|
346
|
+
formats: ['iife'], // IIFE bundles all imports into a single file (classic SW standard)
|
|
347
|
+
fileName: () => filename,
|
|
348
|
+
},
|
|
349
|
+
rollupOptions: {
|
|
350
|
+
// Ensures no hashes are added to the SW filename
|
|
351
|
+
output: { entryFileNames: filename },
|
|
352
|
+
},
|
|
353
|
+
},
|
|
354
|
+
});
|
|
355
|
+
logger.success('Service Worker bundled successfully.');
|
|
356
|
+
}
|
|
357
|
+
catch (e) {
|
|
358
|
+
logger.error('Failed to bundle the Service Worker.', e instanceof Error ? e : new Error('Unknown Error'));
|
|
359
|
+
}
|
|
360
|
+
// --- Build Web Workers ---
|
|
361
|
+
if (resolvedWebWorkers.length > 0) {
|
|
362
|
+
logger.dim('--------------------------------------------------');
|
|
363
|
+
logger.info('Initiating Web Workers bundling process...');
|
|
364
|
+
for (const ww of resolvedWebWorkers) {
|
|
365
|
+
const relativeSourceWW = relative(projectRoot, ww.entryPath);
|
|
366
|
+
const relativeDestWW = relative(projectRoot, resolve(viteConfig.build.outDir, ww.filename));
|
|
367
|
+
logger.log(` WW Source: ${colors.cyan}${relativeSourceWW}${colors.reset}`);
|
|
368
|
+
logger.log(` WW Dest: ${colors.cyan}${relativeDestWW}${colors.reset}`);
|
|
369
|
+
try {
|
|
370
|
+
await build({
|
|
371
|
+
configFile: false,
|
|
372
|
+
mode: viteConfig.mode,
|
|
373
|
+
build: {
|
|
374
|
+
outDir: viteConfig.build.outDir,
|
|
375
|
+
emptyOutDir: false,
|
|
376
|
+
lib: {
|
|
377
|
+
entry: ww.entryPath,
|
|
378
|
+
name: ww.filename.replace(/\.[^/.]+$/, ''),
|
|
379
|
+
formats: ['iife'],
|
|
380
|
+
fileName: () => ww.filename,
|
|
381
|
+
},
|
|
382
|
+
rollupOptions: {
|
|
383
|
+
output: { entryFileNames: ww.filename },
|
|
384
|
+
},
|
|
385
|
+
},
|
|
386
|
+
});
|
|
387
|
+
logger.success(`Web Worker (${ww.filename}) bundled successfully.`);
|
|
388
|
+
}
|
|
389
|
+
catch (e) {
|
|
390
|
+
logger.error(`Failed to bundle the Web Worker (${ww.filename}).`, e instanceof Error ? e : new Error('Unknown Error'));
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
logger.dim('--------------------------------------------------');
|
|
395
|
+
}
|
|
396
|
+
},
|
|
397
|
+
};
|
|
398
|
+
};
|
|
399
|
+
export default TinyVitePwaPlugin;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var path = require('path');
|
|
4
|
+
var fs = require('fs');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Plugin to copy index.html to 404.html for GitHub Pages compatibility.
|
|
8
|
+
* @returns {import('vite').Plugin}
|
|
9
|
+
*/
|
|
10
|
+
const CopyIndexToGithub404 = () => {
|
|
11
|
+
/**
|
|
12
|
+
* Variable to store the output directory captured from Vite
|
|
13
|
+
* @type {string}
|
|
14
|
+
*/
|
|
15
|
+
let outDir;
|
|
16
|
+
|
|
17
|
+
return {
|
|
18
|
+
name: 'github-copy-index-to-404',
|
|
19
|
+
// Capture Vite configuration to know the actual output directory
|
|
20
|
+
configResolved(config) {
|
|
21
|
+
outDir = config.build.outDir;
|
|
22
|
+
},
|
|
23
|
+
closeBundle() {
|
|
24
|
+
if (!outDir) return;
|
|
25
|
+
const indexPath = path.resolve(outDir, 'index.html');
|
|
26
|
+
const targetPath = path.resolve(outDir, '404.html');
|
|
27
|
+
|
|
28
|
+
if (fs.existsSync(indexPath)) {
|
|
29
|
+
fs.copyFileSync(indexPath, targetPath);
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
exports.CopyIndexToGithub404 = CopyIndexToGithub404;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"githubUtils.d.mts","sourceRoot":"","sources":["../../../../../../src/v1/webTemplates/vite/7.3/plugins/githubUtils.mjs"],"names":[],"mappings":"AAGA;;;GAGG;AACH,eAAO,MAAM,oBAAoB,QAFpB,OAAO,MAAM,EAAE,MAyB3B,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { resolve } from 'path';
|
|
2
|
+
import { existsSync, copyFileSync } from 'fs';
|
|
3
|
+
/**
|
|
4
|
+
* Plugin to copy index.html to 404.html for GitHub Pages compatibility.
|
|
5
|
+
* @returns {import('vite').Plugin}
|
|
6
|
+
*/
|
|
7
|
+
export const CopyIndexToGithub404 = () => {
|
|
8
|
+
/**
|
|
9
|
+
* Variable to store the output directory captured from Vite
|
|
10
|
+
* @type {string}
|
|
11
|
+
*/
|
|
12
|
+
let outDir;
|
|
13
|
+
return {
|
|
14
|
+
name: 'github-copy-index-to-404',
|
|
15
|
+
// Capture Vite configuration to know the actual output directory
|
|
16
|
+
configResolved(config) {
|
|
17
|
+
outDir = config.build.outDir;
|
|
18
|
+
},
|
|
19
|
+
closeBundle() {
|
|
20
|
+
if (!outDir)
|
|
21
|
+
return;
|
|
22
|
+
const indexPath = resolve(outDir, 'index.html');
|
|
23
|
+
const targetPath = resolve(outDir, '404.html');
|
|
24
|
+
if (existsSync(indexPath)) {
|
|
25
|
+
copyFileSync(indexPath, targetPath);
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# JavaScript RegExp: Reuse vs. Re-instantiation
|
|
2
|
+
|
|
3
|
+
This document serves as a guide for professional developers on when it is efficient and safe to reuse a `RegExp` object in JavaScript, and when doing so can lead to critical bugs.
|
|
4
|
+
|
|
5
|
+
## 1. When to Reuse a RegExp
|
|
6
|
+
|
|
7
|
+
Reusing a `RegExp` object (storing it in a `const` outside of a function or loop) is a best practice in several scenarios.
|
|
8
|
+
|
|
9
|
+
### A. Static Patterns (Single Source of Truth)
|
|
10
|
+
If you have a pattern that never changes, such as an email validation pattern, a phone number format, or a specific error code format, you should define it once.
|
|
11
|
+
* **Why:** It ensures consistency across your entire application. If the validation rule changes, you only update it in one location.
|
|
12
|
+
|
|
13
|
+
### B. Performance Optimization (Pre-compilation)
|
|
14
|
+
When you define a regex using the literal syntax (e.g., `/pattern/`) or the `new RegExp()` constructor, the JavaScript engine must compile that pattern into an internal format.
|
|
15
|
+
* **Why:** If you are performing a regex operation inside a loop that runs thousands of times, defining the regex *inside* the loop forces the engine to re-compile the pattern on every iteration. Defining it *outside* the loop performs the compilation only once.
|
|
16
|
+
|
|
17
|
+
### Example: Efficient Reuse
|
|
18
|
+
```javascript
|
|
19
|
+
// GOOD: Compiled once, reused many times
|
|
20
|
+
const EMAIL_PATTERN = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
21
|
+
|
|
22
|
+
function validateEmails(emailList) {
|
|
23
|
+
return emailList.map(email => EMAIL_PATTERN.test(email));
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## 2. When NEVER to Reuse a RegExp
|
|
30
|
+
|
|
31
|
+
There are specific technical reasons why reusing a regex can cause your application to fail.
|
|
32
|
+
|
|
33
|
+
### A. The `lastIndex` Trap (Stateful Regex)
|
|
34
|
+
This is the most critical reason to avoid reuse. When a `RegExp` has the global (`g`) or sticky (`y`) flag, it becomes **stateful**. It maintains a property called `lastIndex`, which tracks the position where the next match should begin.
|
|
35
|
+
|
|
36
|
+
* **The Problem:** If you use `.test()` or `.exec()` on a global regex, the `lastIndex` is updated after every match. If you reuse that same regex instance later, it will start searching from the *previous* position rather than the beginning of the string, often leading to false negatives.
|
|
37
|
+
|
|
38
|
+
### Example: The `lastIndex` Bug
|
|
39
|
+
```javascript
|
|
40
|
+
// BAD: Reusing a global regex leads to unpredictable results
|
|
41
|
+
const SEARCH_PATTERN = /abc/g;
|
|
42
|
+
const str = "abcabc";
|
|
43
|
+
|
|
44
|
+
console.log(SEARCH_PATTERN.test(str)); // true (lastIndex is now 3)
|
|
45
|
+
console.log(SEARCH_PATTERN.test(str)); // false! (Starts searching at index 3, finds nothing)
|
|
46
|
+
|
|
47
|
+
// FIX: Either do not use the 'g' flag if you only need to test once,
|
|
48
|
+
// or reset the index manually:
|
|
49
|
+
SEARCH_PATTERN.lastIndex = 0;
|
|
50
|
+
console.log(SEARCH_PATTERN.test(str)); // true
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### B. Dynamic Patterns
|
|
54
|
+
If the pattern itself depends on a variable (e.g., searching for a user-provided string), you cannot use a static constant.
|
|
55
|
+
* **Why:** A constant is immutable. If the search criteria change, you must instantiate a new `RegExp` using the `new RegExp(patternString)` constructor.
|
|
56
|
+
|
|
57
|
+
### Example: Dynamic Pattern
|
|
58
|
+
```javascript
|
|
59
|
+
// GOOD: Creating a new instance because the pattern changes
|
|
60
|
+
function findUser(userName) {
|
|
61
|
+
// We must create a new instance because 'userName' is dynamic
|
|
62
|
+
const dynamicPattern = new RegExp(userName, 'i');
|
|
63
|
+
return dynamicPattern.test(currentData);
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Summary Table
|
|
68
|
+
|
|
69
|
+
| Scenario | Action | Reason |
|
|
70
|
+
| :--- | :--- | :--- |
|
|
71
|
+
| **Static Pattern (e.g., Email)** | **Reuse** | Consistency and Performance. |
|
|
72
|
+
| **Inside a Loop (Static Pattern)** | **Reuse** | Avoids repeated compilation overhead. |
|
|
73
|
+
| **Regex with `g` or `y` flags** | **Avoid Reuse** | Prevents `lastIndex` state bugs. |
|
|
74
|
+
| **Pattern depends on variables** | **Do Not Reuse** | The pattern is not constant. |
|