tiny-essentials 1.28.19 → 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/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 +569 -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 +303 -13
- package/types/EventEmitter.d.ts +48 -0
- package/dist/v1/libs/text/TinyI18.d.mts.map +0 -1
|
@@ -0,0 +1,494 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Describes a single filter that claims layers by matching their names.
|
|
5
|
+
* @typedef {Object} FilterConfig
|
|
6
|
+
* @property {string} id - Filter identifier (e.g., 'artist1').
|
|
7
|
+
* @property {string} color - Color in HEX format (e.g., '#ffffff').
|
|
8
|
+
* @property {string|string[]} [startsWith] - Prefix(es) the layer name must start with.
|
|
9
|
+
* @property {string|string[]} [endsWith] - Suffix(es) the layer name must end with.
|
|
10
|
+
* @property {string|string[]} [contains] - Substring(s) the layer name must contain.
|
|
11
|
+
* @property {string|string[]} [equals] - Exact value(s) the layer name must be equal to.
|
|
12
|
+
* @property {RegExp|RegExp[]} [matches] - Regular expression(s) the layer name must satisfy. Avoid the global (g) flag, as it makes the RegExp stateful.
|
|
13
|
+
* @property {(layerName: string) => boolean} [test] - Custom predicate for advanced matching.
|
|
14
|
+
* @property {boolean|FolderOptions} [folder] - When enabled, the filter also matches folders, claiming every layer inside them.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Describes how the layers nested inside a claimed folder must be handled.
|
|
19
|
+
* @typedef {Object} FolderOptions
|
|
20
|
+
* @property {'inherit'|'exclude'|'custom'} [subfolders='inherit'] - How nested folders are handled. 'inherit' applies the parent filter to every subfolder, 'exclude' leaves subfolders untouched, and 'custom' delegates to 'childFilter'.
|
|
21
|
+
* @property {FilterConfig|FilterConfig[]} [childFilter] - Filter(s) matched against nested folders when 'subfolders' is 'custom'.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Describes the fallback configuration applied to layers that no filter claims.
|
|
26
|
+
* @typedef {Object} DefaultConfig
|
|
27
|
+
* @property {string} color - Color in HEX format for layers that do not match filters.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Describes the complete result produced by processing a PSD file.
|
|
32
|
+
* @template {Buffer|Blob} Data
|
|
33
|
+
* @typedef {Object} ProcessedPsdResult
|
|
34
|
+
* @property {Data} fullImageBuffer - PNG Buffer or Blob of the complete reconstructed image.
|
|
35
|
+
* @property {Array<{ id: string, buffer: Data }>} separatedImages - Array containing the results of each isolated color.
|
|
36
|
+
* @property {Record<string, number>} stats - Object reporting the integer number of pixels claimed by each filter.
|
|
37
|
+
* @property {LayerVectorData[]} vectorData - Vector representation of every layer that was processed, in painting order.
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Describes the position and size of a layer inside the document.
|
|
42
|
+
* @typedef {Object} VectorBounds
|
|
43
|
+
* @property {number} x - The horizontal offset of the layer inside the document, in pixels.
|
|
44
|
+
* @property {number} y - The vertical offset of the layer inside the document, in pixels.
|
|
45
|
+
* @property {number} width - The width of the layer, in pixels.
|
|
46
|
+
* @property {number} height - The height of the layer, in pixels.
|
|
47
|
+
*/
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Describes the vector representation of a single processed layer.
|
|
51
|
+
* @typedef {Object} LayerVectorData
|
|
52
|
+
* @property {string} name - The original name of the layer inside the PSD file.
|
|
53
|
+
* @property {string} filterId - The ID of the filter that claimed this layer, or 'unfiltered'.
|
|
54
|
+
* @property {number} opacity - The effective opacity of the layer, from 0 to 1.
|
|
55
|
+
* @property {VectorBounds} bounds - The bounding box of the layer in the document space.
|
|
56
|
+
*/
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Converts a hexadecimal color to a strict RGBA array.
|
|
60
|
+
* @param {string} hex - Hexadecimal color.
|
|
61
|
+
* @returns {number[]} Array containing [R, G, B, A].
|
|
62
|
+
* @throws {Error} If the color is not a valid HEX string.
|
|
63
|
+
*/
|
|
64
|
+
function hexToRgba(hex) {
|
|
65
|
+
if (typeof hex !== 'string' || !hex.startsWith('#')) {
|
|
66
|
+
throw new Error(`Invalid color received: ${hex}. You must use a HEX string starting with #.`);
|
|
67
|
+
}
|
|
68
|
+
const cleanHex = hex.replace('#', '');
|
|
69
|
+
const normalizedHex =
|
|
70
|
+
cleanHex.length === 3
|
|
71
|
+
? cleanHex
|
|
72
|
+
.split('')
|
|
73
|
+
.map((c) => c + c)
|
|
74
|
+
.join('')
|
|
75
|
+
: cleanHex;
|
|
76
|
+
|
|
77
|
+
const bigint = parseInt(normalizedHex, 16);
|
|
78
|
+
return [(bigint >> 16) & 255, (bigint >> 8) & 255, bigint & 255, 255];
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Builds the vector representation of a single PSD layer.
|
|
83
|
+
* @param {any} layer - The raw ag-psd layer node.
|
|
84
|
+
* @param {string} filterId - The ID of the filter that claimed this layer.
|
|
85
|
+
* @param {number} opacity - The effective opacity of the layer, from 0 to 1.
|
|
86
|
+
* @returns {LayerVectorData} The vector data describing the layer geometry.
|
|
87
|
+
* @throws {TypeError} If the layer, filterId, or opacity are invalid.
|
|
88
|
+
*/
|
|
89
|
+
function buildLayerVectorData(layer, filterId, opacity) {
|
|
90
|
+
if (layer === null || typeof layer !== 'object') {
|
|
91
|
+
throw new TypeError("The 'layer' argument must be a valid PSD layer object.");
|
|
92
|
+
}
|
|
93
|
+
if (typeof filterId !== 'string') {
|
|
94
|
+
throw new TypeError("The 'filterId' argument must be a string.");
|
|
95
|
+
}
|
|
96
|
+
if (typeof opacity !== 'number' || Number.isNaN(opacity)) {
|
|
97
|
+
throw new TypeError("The 'opacity' argument must be a valid number.");
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return {
|
|
101
|
+
name: typeof layer.name === 'string' ? layer.name : '',
|
|
102
|
+
filterId: filterId,
|
|
103
|
+
opacity: opacity,
|
|
104
|
+
bounds: {
|
|
105
|
+
x: typeof layer.left === 'number' ? layer.left : 0,
|
|
106
|
+
y: typeof layer.top === 'number' ? layer.top : 0,
|
|
107
|
+
width: layer.canvas ? layer.canvas.width : 0,
|
|
108
|
+
height: layer.canvas ? layer.canvas.height : 0,
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Normalizes a value into an array so it can be iterated uniformly.
|
|
115
|
+
* @template T
|
|
116
|
+
* @param {T|T[]} value - A single value or an array of values.
|
|
117
|
+
* @returns {T[]} The value wrapped in an array when it is not one already.
|
|
118
|
+
*/
|
|
119
|
+
function toArray(value) {
|
|
120
|
+
return Array.isArray(value) ? value : [value];
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Compiles a single filter configuration into a reusable predicate.
|
|
125
|
+
* All criteria declared in the filter are combined with a logical AND.
|
|
126
|
+
* Values inside a single criterion are combined with a logical OR.
|
|
127
|
+
* @param {FilterConfig} filter - The filter configuration to compile.
|
|
128
|
+
* @returns {(layerName: string) => boolean} A predicate that returns true when a layer name matches.
|
|
129
|
+
* @throws {TypeError} If the filter or any of its properties are invalid.
|
|
130
|
+
*/
|
|
131
|
+
function buildFilterPredicate(filter) {
|
|
132
|
+
if (filter === null || typeof filter !== 'object') {
|
|
133
|
+
throw new TypeError('Each filter must be a valid object.');
|
|
134
|
+
}
|
|
135
|
+
if (typeof filter.id !== 'string' || filter.id.length === 0) {
|
|
136
|
+
throw new TypeError("Each filter must declare a non-empty string 'id'.");
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** @type {Array<(layerName: string) => boolean>} */
|
|
140
|
+
const criteria = [];
|
|
141
|
+
|
|
142
|
+
if (filter.startsWith !== undefined) {
|
|
143
|
+
const patterns = toArray(filter.startsWith);
|
|
144
|
+
criteria.push((name) => patterns.some((pattern) => name.startsWith(pattern)));
|
|
145
|
+
}
|
|
146
|
+
if (filter.endsWith !== undefined) {
|
|
147
|
+
const patterns = toArray(filter.endsWith);
|
|
148
|
+
criteria.push((name) => patterns.some((pattern) => name.endsWith(pattern)));
|
|
149
|
+
}
|
|
150
|
+
if (filter.contains !== undefined) {
|
|
151
|
+
const patterns = toArray(filter.contains);
|
|
152
|
+
criteria.push((name) => patterns.some((pattern) => name.includes(pattern)));
|
|
153
|
+
}
|
|
154
|
+
if (filter.equals !== undefined) {
|
|
155
|
+
const patterns = toArray(filter.equals);
|
|
156
|
+
criteria.push((name) => patterns.some((pattern) => name === pattern));
|
|
157
|
+
}
|
|
158
|
+
if (filter.matches !== undefined) {
|
|
159
|
+
const patterns = toArray(filter.matches);
|
|
160
|
+
criteria.push((name) => patterns.some((pattern) => pattern.test(name)));
|
|
161
|
+
}
|
|
162
|
+
if (filter.test !== undefined) {
|
|
163
|
+
if (typeof filter.test !== 'function') {
|
|
164
|
+
throw new TypeError("The 'test' property must be a function.");
|
|
165
|
+
}
|
|
166
|
+
const customTest = filter.test;
|
|
167
|
+
criteria.push((name) => customTest(name) === true);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
if (criteria.length === 0) {
|
|
171
|
+
throw new TypeError(`The filter '${filter.id}' must declare at least one matching criterion.`);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return (layerName) => criteria.every((criterion) => criterion(layerName));
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Normalizes the 'folder' option of a filter into a consistent object.
|
|
179
|
+
* @param {boolean|FolderOptions|undefined} folder - The raw folder option.
|
|
180
|
+
* @returns {{ subfolders: 'inherit'|'exclude'|'custom', childFilter: FilterConfig[] }|null} The normalized options, or null when folder mode is disabled.
|
|
181
|
+
* @throws {TypeError} If the folder option is invalid.
|
|
182
|
+
*/
|
|
183
|
+
function normalizeFolderOptions(folder) {
|
|
184
|
+
if (folder === undefined || folder === false) {
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
if (folder === true) {
|
|
188
|
+
return { subfolders: 'inherit', childFilter: [] };
|
|
189
|
+
}
|
|
190
|
+
if (typeof folder !== 'object' || folder === null) {
|
|
191
|
+
throw new TypeError("The 'folder' option must be a boolean or an object.");
|
|
192
|
+
}
|
|
193
|
+
const subfolders = folder.subfolders ?? 'inherit';
|
|
194
|
+
if (!['inherit', 'exclude', 'custom'].includes(subfolders)) {
|
|
195
|
+
throw new TypeError("The 'subfolders' option must be 'inherit', 'exclude', or 'custom'.");
|
|
196
|
+
}
|
|
197
|
+
return {
|
|
198
|
+
subfolders,
|
|
199
|
+
childFilter: folder.childFilter ? toArray(folder.childFilter) : [],
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Compiles an array of filter configurations into reusable matchers.
|
|
205
|
+
* @param {FilterConfig[]} filters - The filter configurations to compile.
|
|
206
|
+
* @returns {Array<{ id: string, predicate: (layerName: string) => boolean, folder: { subfolders: string, childFilter: FilterConfig[] }|null }>} The compiled matchers.
|
|
207
|
+
*/
|
|
208
|
+
function buildMatchers(filters) {
|
|
209
|
+
return filters.map((filter) => ({
|
|
210
|
+
id: filter.id,
|
|
211
|
+
predicate: buildFilterPredicate(filter),
|
|
212
|
+
folder: normalizeFolderOptions(filter.folder),
|
|
213
|
+
}));
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Recursively collects every filter, including the ones nested inside folder options.
|
|
218
|
+
* @param {FilterConfig[]} filters - The filters to expand.
|
|
219
|
+
* @param {FilterConfig[]} [acc] - The accumulator used during recursion.
|
|
220
|
+
* @returns {FilterConfig[]} Every filter, flattened.
|
|
221
|
+
*/
|
|
222
|
+
function flattenFilters(filters, acc = []) {
|
|
223
|
+
for (const filter of filters) {
|
|
224
|
+
acc.push(filter);
|
|
225
|
+
if (filter.folder && typeof filter.folder === 'object' && filter.folder.childFilter) {
|
|
226
|
+
flattenFilters(toArray(filter.folder.childFilter), acc);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return acc;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Resolves the filter id for a single layer name.
|
|
234
|
+
* @param {string} layerName - The name of the layer.
|
|
235
|
+
* @param {ReturnType<typeof buildMatchers>} matchers - The active matchers.
|
|
236
|
+
* @returns {string} The id of the first matching filter, or 'unfiltered'.
|
|
237
|
+
*/
|
|
238
|
+
function resolveLayerFilterId(layerName, matchers) {
|
|
239
|
+
if (typeof layerName !== 'string') {
|
|
240
|
+
return 'unfiltered';
|
|
241
|
+
}
|
|
242
|
+
for (const matcher of matchers) {
|
|
243
|
+
if (matcher.predicate(layerName)) {
|
|
244
|
+
return matcher.id;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return 'unfiltered';
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Finds the first folder matcher that claims the given folder name.
|
|
252
|
+
* @param {string} folderName - The name of the folder.
|
|
253
|
+
* @param {ReturnType<typeof buildMatchers>} matchers - The active matchers.
|
|
254
|
+
* @returns {ReturnType<typeof buildMatchers>[number]|null} The matching matcher, or null when no folder matcher applies.
|
|
255
|
+
*/
|
|
256
|
+
function findFolderMatcher(folderName, matchers) {
|
|
257
|
+
if (typeof folderName !== 'string') {
|
|
258
|
+
return null;
|
|
259
|
+
}
|
|
260
|
+
for (const matcher of matchers) {
|
|
261
|
+
if (matcher.folder && matcher.predicate(folderName)) {
|
|
262
|
+
return matcher;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return null;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Traverses the PSD tree, resolving the filter id of every visible layer.
|
|
270
|
+
* @param {any[]} children - The PSD nodes to traverse.
|
|
271
|
+
* @param {ReturnType<typeof buildMatchers>} matchers - The matchers active in the current scope.
|
|
272
|
+
* @param {boolean} parentVisible - Whether the parent node is visible.
|
|
273
|
+
* @param {Array<{ layer: any, filterId: string }>} result - The output array, in painting order.
|
|
274
|
+
* @returns {void} This function mutates the 'result' array instead of returning a value.
|
|
275
|
+
*/
|
|
276
|
+
function collectLayers(children, matchers, parentVisible, result) {
|
|
277
|
+
for (const layer of children) {
|
|
278
|
+
const isVisible = parentVisible && layer.hidden !== true;
|
|
279
|
+
if (!isVisible) {
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
if (layer.children) {
|
|
284
|
+
const matcher = findFolderMatcher(layer.name, matchers);
|
|
285
|
+
if (matcher) {
|
|
286
|
+
collectClaimedLayers(layer, matcher, matchers, result);
|
|
287
|
+
} else {
|
|
288
|
+
collectLayers(layer.children, matchers, isVisible, result);
|
|
289
|
+
}
|
|
290
|
+
} else {
|
|
291
|
+
result.push({ layer, filterId: resolveLayerFilterId(layer.name, matchers) });
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Claims every layer inside a folder for a given matcher, honoring the subfolder strategy.
|
|
298
|
+
* @param {any} folder - The folder node that was claimed.
|
|
299
|
+
* @param {ReturnType<typeof buildMatchers>[number]} matcher - The matcher that claimed the folder.
|
|
300
|
+
* @param {ReturnType<typeof buildMatchers>} matchers - The matchers active in the parent scope.
|
|
301
|
+
* @param {Array<{ layer: any, filterId: string }>} result - The output array, in painting order.
|
|
302
|
+
* @returns {void} This function mutates the 'result' array instead of returning a value.
|
|
303
|
+
*/
|
|
304
|
+
function collectClaimedLayers(folder, matcher, matchers, result) {
|
|
305
|
+
const options = matcher.folder;
|
|
306
|
+
for (const child of folder.children) {
|
|
307
|
+
if (child.hidden === true) {
|
|
308
|
+
continue;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
if (!child.children) {
|
|
312
|
+
result.push({ layer: child, filterId: matcher.id });
|
|
313
|
+
continue;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
const subfolders = options?.subfolders;
|
|
317
|
+
if (subfolders === 'inherit') {
|
|
318
|
+
collectClaimedLayers(child, matcher, matchers, result);
|
|
319
|
+
} else if (subfolders === 'exclude') {
|
|
320
|
+
collectLayers([child], matchers, true, result);
|
|
321
|
+
} else if (subfolders === 'custom') {
|
|
322
|
+
const childMatchers = buildMatchers(options?.childFilter ?? []);
|
|
323
|
+
collectLayers([child], childMatchers, true, result);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* Creates a PSD processing function bound to a specific runtime environment.
|
|
330
|
+
* The returned function extracts solid colors, resolves which filter claims each pixel,
|
|
331
|
+
* and produces both a composite image and one image per filter.
|
|
332
|
+
* @template {Buffer | ArrayBuffer} ValidatorResult
|
|
333
|
+
* @template {Buffer|Blob} Data
|
|
334
|
+
* @template {string | Blob | HTMLInputElement} PsdInput
|
|
335
|
+
* @template {import('canvas').Canvas | HTMLCanvasElement} UniversalCanvas
|
|
336
|
+
* @template {import('canvas').CanvasRenderingContext2D | CanvasRenderingContext2D} UniversalCanvasRenderingContext2D
|
|
337
|
+
* @template {import('canvas').ImageData | ImageData} UniversalImageData
|
|
338
|
+
*
|
|
339
|
+
* @param {(psdInput: PsdInput) => Promise<ValidatorResult>} validator - Loads the PSD source and returns its raw bytes for the current environment.
|
|
340
|
+
* @param {(width: number, height: number) => UniversalCanvas} createCanvas - Factory that allocates a canvas compatible with the current environment.
|
|
341
|
+
* @param {typeof import('ag-psd').readPsd} readPsd - The ag-psd parser used to decode the raw bytes into a PSD tree.
|
|
342
|
+
* @param {(canvas: UniversalCanvas) => Promise<Data>} exportCanvas - Injected function to handle environment-specific export.
|
|
343
|
+
*/
|
|
344
|
+
function createProcessPsdSolidFilters(validator, createCanvas, readPsd, exportCanvas) {
|
|
345
|
+
/**
|
|
346
|
+
* Extracts solid colors and calculates the area of each claimed filter in the PSD.
|
|
347
|
+
* @param {PsdInput} psdInput - The absolute path, URL, or Blob file of the PSD.
|
|
348
|
+
* @param {FilterConfig[]} filters - The configurations to capture specific layers.
|
|
349
|
+
* @param {DefaultConfig} defaultConfig - The fallback configuration for the remaining layers.
|
|
350
|
+
* @returns {Promise<ProcessedPsdResult<Data>>} Results of the separated and reconstructed images, and pixel statistics.
|
|
351
|
+
* @throws {Error|TypeError} If the parameters or the file are invalid.
|
|
352
|
+
* @beta
|
|
353
|
+
*/
|
|
354
|
+
return async function processPsdSolidFilters(psdInput, filters, defaultConfig) {
|
|
355
|
+
if (!Array.isArray(filters)) {
|
|
356
|
+
throw new TypeError("The 'filters' argument must be an array.");
|
|
357
|
+
}
|
|
358
|
+
if (!defaultConfig || typeof defaultConfig.color !== 'string') {
|
|
359
|
+
throw new Error("The 'defaultConfig' argument must have a 'color' property of type string.");
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// 1. PSD Reading and Preparation
|
|
363
|
+
const buffer = await validator(psdInput);
|
|
364
|
+
const psd = readPsd(buffer);
|
|
365
|
+
const W = psd.width;
|
|
366
|
+
const H = psd.height;
|
|
367
|
+
|
|
368
|
+
const allFilters = flattenFilters(filters);
|
|
369
|
+
|
|
370
|
+
const colorMap = new Map();
|
|
371
|
+
for (const f of allFilters) {
|
|
372
|
+
colorMap.set(f.id, hexToRgba(f.color));
|
|
373
|
+
}
|
|
374
|
+
colorMap.set('unfiltered', hexToRgba(defaultConfig.color));
|
|
375
|
+
|
|
376
|
+
// 1D array to store which ID dominates each pixel in the space (W * H)
|
|
377
|
+
const ownerMap = new Array(W * H).fill(null);
|
|
378
|
+
const matchers = buildMatchers(filters);
|
|
379
|
+
/** @type {Array<{ layer: any, filterId: string }>} */
|
|
380
|
+
const resolvedLayers = [];
|
|
381
|
+
collectLayers(psd.children || [], matchers, true, resolvedLayers);
|
|
382
|
+
|
|
383
|
+
/** @type {LayerVectorData[]} */
|
|
384
|
+
const vectorData = [];
|
|
385
|
+
|
|
386
|
+
// 2. Pixel-by-Pixel Processing (Bottom-Up)
|
|
387
|
+
for (const { layer, filterId } of resolvedLayers) {
|
|
388
|
+
if (!layer.canvas) continue; // Ignores layers that do not have image data
|
|
389
|
+
|
|
390
|
+
// Layer opacity affects pixel alpha
|
|
391
|
+
const layerOpacity = layer.opacity !== undefined ? layer.opacity / 255 : 1;
|
|
392
|
+
|
|
393
|
+
vectorData.push(buildLayerVectorData(layer, filterId, layerOpacity));
|
|
394
|
+
|
|
395
|
+
const ctx = layer.canvas.getContext('2d');
|
|
396
|
+
const imgData = ctx.getImageData(0, 0, layer.canvas.width, layer.canvas.height);
|
|
397
|
+
const data = imgData.data;
|
|
398
|
+
|
|
399
|
+
for (let y = 0; y < layer.canvas.height; y++) {
|
|
400
|
+
for (let x = 0; x < layer.canvas.width; x++) {
|
|
401
|
+
const idx = (y * layer.canvas.width + x) * 4;
|
|
402
|
+
const alpha = data[idx + 3] * layerOpacity;
|
|
403
|
+
|
|
404
|
+
// Threshold: If it is minimally visible, it captures the pixel.
|
|
405
|
+
// This ensures that pure colors completely overlap what is behind.
|
|
406
|
+
if (alpha > 1) {
|
|
407
|
+
const globalX = layer.left + x;
|
|
408
|
+
const globalY = layer.top + y;
|
|
409
|
+
|
|
410
|
+
// Only renders if the pixel falls within the main document canvas
|
|
411
|
+
if (globalX >= 0 && globalX < W && globalY >= 0 && globalY < H) {
|
|
412
|
+
ownerMap[globalY * W + globalX] = filterId;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
// 3. Final Image Generation and Data Counting
|
|
420
|
+
/** @type {Record<string, number>} */
|
|
421
|
+
const stats = { unclaimed: 0 };
|
|
422
|
+
/** @type {Record<string, { canvas: UniversalCanvas; ctx: UniversalCanvasRenderingContext2D; imgData: UniversalImageData }>} */
|
|
423
|
+
const separatedData = {};
|
|
424
|
+
const ids = ['unfiltered', ...new Set(allFilters.map((f) => f.id))];
|
|
425
|
+
|
|
426
|
+
ids.forEach((id) => {
|
|
427
|
+
stats[id] = 0;
|
|
428
|
+
const c = createCanvas(W, H);
|
|
429
|
+
separatedData[id] = {
|
|
430
|
+
canvas: c,
|
|
431
|
+
// @ts-ignore
|
|
432
|
+
ctx: c.getContext('2d'),
|
|
433
|
+
// @ts-ignore
|
|
434
|
+
imgData: c.getContext('2d').createImageData(W, H),
|
|
435
|
+
};
|
|
436
|
+
});
|
|
437
|
+
|
|
438
|
+
const fullCanvas = createCanvas(W, H);
|
|
439
|
+
const fullCtx = fullCanvas.getContext('2d');
|
|
440
|
+
// @ts-ignore
|
|
441
|
+
const fullImgData = fullCtx.createImageData(W, H);
|
|
442
|
+
|
|
443
|
+
// Mapping the Winning Pixels
|
|
444
|
+
for (let i = 0; i < ownerMap.length; i++) {
|
|
445
|
+
const ownerId = ownerMap[i];
|
|
446
|
+
if (ownerId === null) {
|
|
447
|
+
stats.unclaimed++;
|
|
448
|
+
continue;
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
stats[ownerId]++; // Increments filter INT
|
|
452
|
+
|
|
453
|
+
const color = colorMap.get(ownerId);
|
|
454
|
+
const pixelStart = i * 4;
|
|
455
|
+
|
|
456
|
+
// Write to the Complete Composite Image
|
|
457
|
+
fullImgData.data[pixelStart] = color[0]; // R
|
|
458
|
+
fullImgData.data[pixelStart + 1] = color[1]; // G
|
|
459
|
+
fullImgData.data[pixelStart + 2] = color[2]; // B
|
|
460
|
+
fullImgData.data[pixelStart + 3] = 255; // 100% Solid Opacity
|
|
461
|
+
|
|
462
|
+
// Write to the Specific Filter Image
|
|
463
|
+
const targetData = separatedData[ownerId].imgData.data;
|
|
464
|
+
targetData[pixelStart] = color[0];
|
|
465
|
+
targetData[pixelStart + 1] = color[1];
|
|
466
|
+
targetData[pixelStart + 2] = color[2];
|
|
467
|
+
targetData[pixelStart + 3] = 255;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
// 4. Finalization and Asynchronous Data Export
|
|
471
|
+
// @ts-ignore
|
|
472
|
+
fullCtx.putImageData(fullImgData, 0, 0);
|
|
473
|
+
const fullBuffer = await exportCanvas(fullCanvas);
|
|
474
|
+
|
|
475
|
+
const separatedImagesArray = [];
|
|
476
|
+
for (const id of ids) {
|
|
477
|
+
// @ts-ignore
|
|
478
|
+
separatedData[id].ctx.putImageData(separatedData[id].imgData, 0, 0);
|
|
479
|
+
separatedImagesArray.push({
|
|
480
|
+
id: id,
|
|
481
|
+
buffer: await exportCanvas(separatedData[id].canvas),
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
return {
|
|
486
|
+
fullImageBuffer: fullBuffer,
|
|
487
|
+
separatedImages: separatedImagesArray,
|
|
488
|
+
stats: stats,
|
|
489
|
+
vectorData: vectorData,
|
|
490
|
+
};
|
|
491
|
+
};
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
exports.createProcessPsdSolidFilters = createProcessPsdSolidFilters;
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Describes a single filter that claims layers by matching their names.
|
|
3
|
+
* @typedef {Object} FilterConfig
|
|
4
|
+
* @property {string} id - Filter identifier (e.g., 'artist1').
|
|
5
|
+
* @property {string} color - Color in HEX format (e.g., '#ffffff').
|
|
6
|
+
* @property {string|string[]} [startsWith] - Prefix(es) the layer name must start with.
|
|
7
|
+
* @property {string|string[]} [endsWith] - Suffix(es) the layer name must end with.
|
|
8
|
+
* @property {string|string[]} [contains] - Substring(s) the layer name must contain.
|
|
9
|
+
* @property {string|string[]} [equals] - Exact value(s) the layer name must be equal to.
|
|
10
|
+
* @property {RegExp|RegExp[]} [matches] - Regular expression(s) the layer name must satisfy. Avoid the global (g) flag, as it makes the RegExp stateful.
|
|
11
|
+
* @property {(layerName: string) => boolean} [test] - Custom predicate for advanced matching.
|
|
12
|
+
* @property {boolean|FolderOptions} [folder] - When enabled, the filter also matches folders, claiming every layer inside them.
|
|
13
|
+
*/
|
|
14
|
+
export type FilterConfig = {
|
|
15
|
+
/**
|
|
16
|
+
* - Filter identifier (e.g., 'artist1').
|
|
17
|
+
*/
|
|
18
|
+
id: string;
|
|
19
|
+
/**
|
|
20
|
+
* - Color in HEX format (e.g., '#ffffff').
|
|
21
|
+
*/
|
|
22
|
+
color: string;
|
|
23
|
+
/**
|
|
24
|
+
* - Prefix(es) the layer name must start with.
|
|
25
|
+
*/
|
|
26
|
+
startsWith?: string | string[];
|
|
27
|
+
/**
|
|
28
|
+
* - Suffix(es) the layer name must end with.
|
|
29
|
+
*/
|
|
30
|
+
endsWith?: string | string[];
|
|
31
|
+
/**
|
|
32
|
+
* - Substring(s) the layer name must contain.
|
|
33
|
+
*/
|
|
34
|
+
contains?: string | string[];
|
|
35
|
+
/**
|
|
36
|
+
* - Exact value(s) the layer name must be equal to.
|
|
37
|
+
*/
|
|
38
|
+
equals?: string | string[];
|
|
39
|
+
/**
|
|
40
|
+
* - Regular expression(s) the layer name must satisfy. Avoid the global (g) flag, as it makes the RegExp stateful.
|
|
41
|
+
*/
|
|
42
|
+
matches?: RegExp | RegExp[];
|
|
43
|
+
/**
|
|
44
|
+
* - Custom predicate for advanced matching.
|
|
45
|
+
*/
|
|
46
|
+
test?: (layerName: string) => boolean;
|
|
47
|
+
/**
|
|
48
|
+
* - When enabled, the filter also matches folders, claiming every layer inside them.
|
|
49
|
+
*/
|
|
50
|
+
folder?: boolean | FolderOptions;
|
|
51
|
+
};
|
|
52
|
+
export type FolderOptions = {
|
|
53
|
+
/**
|
|
54
|
+
* - How nested folders are handled. 'inherit' applies the parent filter to every subfolder, 'exclude' leaves subfolders untouched, and 'custom' delegates to 'childFilter'.
|
|
55
|
+
*/
|
|
56
|
+
subfolders?: 'inherit' | 'exclude' | 'custom';
|
|
57
|
+
/**
|
|
58
|
+
* - Filter(s) matched against nested folders when 'subfolders' is 'custom'.
|
|
59
|
+
*/
|
|
60
|
+
childFilter?: FilterConfig | FilterConfig[];
|
|
61
|
+
};
|
|
62
|
+
export type DefaultConfig = {
|
|
63
|
+
/**
|
|
64
|
+
* - Color in HEX format for layers that do not match filters.
|
|
65
|
+
*/
|
|
66
|
+
color: string;
|
|
67
|
+
};
|
|
68
|
+
export type ProcessedPsdResult<Data extends Buffer | Blob> = {
|
|
69
|
+
/**
|
|
70
|
+
* - PNG Buffer or Blob of the complete reconstructed image.
|
|
71
|
+
*/
|
|
72
|
+
fullImageBuffer: Data;
|
|
73
|
+
/**
|
|
74
|
+
* - Array containing the results of each isolated color.
|
|
75
|
+
*/
|
|
76
|
+
separatedImages: Array<{
|
|
77
|
+
id: string;
|
|
78
|
+
buffer: Data;
|
|
79
|
+
}>;
|
|
80
|
+
/**
|
|
81
|
+
* - Object reporting the integer number of pixels claimed by each filter.
|
|
82
|
+
*/
|
|
83
|
+
stats: Record<string, number>;
|
|
84
|
+
/**
|
|
85
|
+
* - Vector representation of every layer that was processed, in painting order.
|
|
86
|
+
*/
|
|
87
|
+
vectorData: LayerVectorData[];
|
|
88
|
+
};
|
|
89
|
+
export type VectorBounds = {
|
|
90
|
+
/**
|
|
91
|
+
* - The horizontal offset of the layer inside the document, in pixels.
|
|
92
|
+
*/
|
|
93
|
+
x: number;
|
|
94
|
+
/**
|
|
95
|
+
* - The vertical offset of the layer inside the document, in pixels.
|
|
96
|
+
*/
|
|
97
|
+
y: number;
|
|
98
|
+
/**
|
|
99
|
+
* - The width of the layer, in pixels.
|
|
100
|
+
*/
|
|
101
|
+
width: number;
|
|
102
|
+
/**
|
|
103
|
+
* - The height of the layer, in pixels.
|
|
104
|
+
*/
|
|
105
|
+
height: number;
|
|
106
|
+
};
|
|
107
|
+
export type LayerVectorData = {
|
|
108
|
+
/**
|
|
109
|
+
* - The original name of the layer inside the PSD file.
|
|
110
|
+
*/
|
|
111
|
+
name: string;
|
|
112
|
+
/**
|
|
113
|
+
* - The ID of the filter that claimed this layer, or 'unfiltered'.
|
|
114
|
+
*/
|
|
115
|
+
filterId: string;
|
|
116
|
+
/**
|
|
117
|
+
* - The effective opacity of the layer, from 0 to 1.
|
|
118
|
+
*/
|
|
119
|
+
opacity: number;
|
|
120
|
+
/**
|
|
121
|
+
* - The bounding box of the layer in the document space.
|
|
122
|
+
*/
|
|
123
|
+
bounds: VectorBounds;
|
|
124
|
+
};
|
|
125
|
+
/**
|
|
126
|
+
* Creates a PSD processing function bound to a specific runtime environment.
|
|
127
|
+
* The returned function extracts solid colors, resolves which filter claims each pixel,
|
|
128
|
+
* and produces both a composite image and one image per filter.
|
|
129
|
+
* @template {Buffer | ArrayBuffer} ValidatorResult
|
|
130
|
+
* @template {Buffer|Blob} Data
|
|
131
|
+
* @template {string | Blob | HTMLInputElement} PsdInput
|
|
132
|
+
* @template {import('canvas').Canvas | HTMLCanvasElement} UniversalCanvas
|
|
133
|
+
* @template {import('canvas').CanvasRenderingContext2D | CanvasRenderingContext2D} UniversalCanvasRenderingContext2D
|
|
134
|
+
* @template {import('canvas').ImageData | ImageData} UniversalImageData
|
|
135
|
+
*
|
|
136
|
+
* @param {(psdInput: PsdInput) => Promise<ValidatorResult>} validator - Loads the PSD source and returns its raw bytes for the current environment.
|
|
137
|
+
* @param {(width: number, height: number) => UniversalCanvas} createCanvas - Factory that allocates a canvas compatible with the current environment.
|
|
138
|
+
* @param {typeof import('ag-psd').readPsd} readPsd - The ag-psd parser used to decode the raw bytes into a PSD tree.
|
|
139
|
+
* @param {(canvas: UniversalCanvas) => Promise<Data>} exportCanvas - Injected function to handle environment-specific export.
|
|
140
|
+
*/
|
|
141
|
+
export declare function createProcessPsdSolidFilters<ValidatorResult extends Buffer | ArrayBuffer, Data extends Buffer | Blob, PsdInput extends string | Blob | HTMLInputElement, UniversalCanvas extends import('canvas').Canvas | HTMLCanvasElement, UniversalCanvasRenderingContext2D extends import('canvas').CanvasRenderingContext2D | CanvasRenderingContext2D, UniversalImageData extends import('canvas').ImageData | ImageData>(validator: (psdInput: PsdInput) => Promise<ValidatorResult>, createCanvas: (width: number, height: number) => UniversalCanvas, readPsd: typeof import('ag-psd').readPsd, exportCanvas: (canvas: UniversalCanvas) => Promise<Data>): (psdInput: PsdInput, filters: FilterConfig[], defaultConfig: DefaultConfig) => Promise<ProcessedPsdResult<Data>>;
|
|
142
|
+
//# sourceMappingURL=Template.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Template.d.mts","sourceRoot":"","sources":["../../../../../../src/v1/webTemplates/ag-psd/31.0/ProcessSolidFilters/Template.mjs"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAVA,YAAkB,YAAY,GAC9B;;;;IAAmB,EAAE,EAAV,MAAM,CACjB;;;;IAAmB,KAAK,EAAb,MAAM,CACjB;;;;IAA6B,UAAU,AAAvC,CACA,EADW,MAAM,GAAC,MAAM,EAAE,CAC1B;;;;IAA6B,QAAQ,AAArC,CACA,EADW,MAAM,GAAC,MAAM,EAAE,CAC1B;;;;IAA6B,QAAQ,AAArC,CACA,EADW,MAAM,GAAC,MAAM,EAAE,CAC1B;;;;IAA6B,MAAM,AAAnC,CACA,EADW,MAAM,GAAC,MAAM,EAAE,CAC1B;;;;IAA6B,OAAO,AAApC,CACA,EADW,MAAM,GAAC,MAAM,EAAE,CAC1B;;;;IAA4C,IAAI,AAAhD,CACA,EADW,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CACzC;;;;IAAmC,MAAM,AAAzC,CACF,EADa,OAAO,GAAC,aAAa,CAClC;CAAA,CAAA;AAIE,YAAkB,aAAa,GAC/B;;;;IAA0C,UAAU,AAApD,CACA,EADW,SAAS,GAAC,SAAS,GAAC,QAAQ,CACvC;;;;IAAyC,WAAW,AAApD,CACF,EADa,YAAY,GAAC,YAAY,EAAE,CACxC;CAAA,CAAA;AAIE,YAAkB,aAAa,GAC/B;;;;IAAmB,KAAK,EAAb,MAAM,CACnB;CAAA,CAAA;AAKE,YAAkB,kBAAkB,CADZ,IAAI,SAAjB,MAAM,GAAC,IAAU,IAE5B;;;;IAAiB,eAAe,EAArB,IAAI,CACf;;;;IAAgD,eAAe,EAApD,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,IAAI,CAAA;KAAE,CAAC,CAC9C;;;;IAAmC,KAAK,EAA7B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CACjC;;;;IAA8B,UAAU,EAA7B,eAAe,EAAE,CAC9B;CAAA,CAAA;AAIE,YAAkB,YAAY,GAC9B;;;;IAAmB,CAAC,EAAT,MAAM,CACjB;;;;IAAmB,CAAC,EAAT,MAAM,CACjB;;;;IAAmB,KAAK,EAAb,MAAM,CACjB;;;;IAAmB,MAAM,EAAd,MAAM,CACnB;CAAA,CAAA;AAIE,YAAkB,eAAe,GACjC;;;;IAAmB,IAAI,EAAZ,MAAM,CACjB;;;;IAAmB,QAAQ,EAAhB,MAAM,CACjB;;;;IAAmB,OAAO,EAAf,MAAM,CACjB;;;;IAAyB,MAAM,EAApB,YAAY,CACzB;CAAA,CAAA;AAgRD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,4BAA4B,CAZR,eAAe,SAArC,MAAM,GAAG,WAA4B,EACxB,IAAI,SAAjB,MAAM,GAAC,IAAU,EACiB,QAAQ,SAA1C,MAAM,GAAG,IAAI,GAAG,gBAA0B,EACG,eAAe,SAA5D,OAAO,QAAQ,EAAE,MAAM,GAAG,iBAAkC,EACU,iCAAiC,SAAvG,OAAO,QAAQ,EAAE,wBAAwB,GAAG,wBAA2D,EAC/D,kBAAkB,SAA1D,OAAO,QAAQ,EAAE,SAAS,GAAG,SAA6B,EAO3B,SAAS,EAL3C,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC,eAAe,CAKJ,EAAE,YAAY,EAJzD,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,eAIsB,EAAE,OAAO,EAHlE,cAAc,QAAQ,EAAE,OAG0C,EAAE,YAAY,EAFhF,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAEuC,cAG9E,QAAQ,WACR,YAAY,EAAE,iBACd,aAAa,KACX,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CA8I/C"}
|