@akashjs/runtime 0.2.6 → 0.2.7
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/dist/a11y.cjs +2 -0
- package/dist/a11y.cjs.map +1 -0
- package/dist/a11y.d.cts +99 -0
- package/dist/a11y.d.ts +99 -0
- package/dist/a11y.js +2 -0
- package/dist/a11y.js.map +1 -0
- package/dist/async-component.cjs +2 -0
- package/dist/async-component.cjs.map +1 -0
- package/dist/async-component.d.cts +44 -0
- package/dist/async-component.d.ts +44 -0
- package/dist/async-component.js +2 -0
- package/dist/async-component.js.map +1 -0
- package/dist/await-block.cjs +2 -0
- package/dist/await-block.cjs.map +1 -0
- package/dist/await-block.d.cts +37 -0
- package/dist/await-block.d.ts +37 -0
- package/dist/await-block.js +2 -0
- package/dist/await-block.js.map +1 -0
- package/dist/browser.cjs +2 -0
- package/dist/browser.cjs.map +1 -0
- package/dist/browser.d.cts +125 -0
- package/dist/browser.d.ts +125 -0
- package/dist/browser.js +2 -0
- package/dist/browser.js.map +1 -0
- package/dist/chunk-2HLDEWRT.cjs +2 -0
- package/dist/chunk-2HLDEWRT.cjs.map +1 -0
- package/dist/{chunk-2U643GJZ.cjs → chunk-2LKFIID7.cjs} +2 -2
- package/dist/{chunk-2U643GJZ.cjs.map → chunk-2LKFIID7.cjs.map} +1 -1
- package/dist/chunk-34PQECMN.cjs +2 -0
- package/dist/chunk-34PQECMN.cjs.map +1 -0
- package/dist/chunk-36VM3RJW.cjs +2 -0
- package/dist/chunk-36VM3RJW.cjs.map +1 -0
- package/dist/chunk-3PGU24B5.cjs +3 -0
- package/dist/chunk-3PGU24B5.cjs.map +1 -0
- package/dist/chunk-3XREYIJH.cjs +2 -0
- package/dist/chunk-3XREYIJH.cjs.map +1 -0
- package/dist/chunk-45DPEU7T.cjs +2 -0
- package/dist/chunk-45DPEU7T.cjs.map +1 -0
- package/dist/chunk-4J3QBQVW.js +4 -0
- package/dist/chunk-4J3QBQVW.js.map +1 -0
- package/dist/{chunk-2Q6SYE5O.cjs → chunk-4NQEIKH5.cjs} +2 -2
- package/dist/{chunk-2Q6SYE5O.cjs.map → chunk-4NQEIKH5.cjs.map} +1 -1
- package/dist/chunk-5QCWH6QA.cjs +4 -0
- package/dist/chunk-5QCWH6QA.cjs.map +1 -0
- package/dist/chunk-6O46EMQS.cjs +2 -0
- package/dist/chunk-6O46EMQS.cjs.map +1 -0
- package/dist/chunk-7IJUJUXE.cjs +2 -0
- package/dist/chunk-7IJUJUXE.cjs.map +1 -0
- package/dist/chunk-7UX5CSGZ.cjs +2 -0
- package/dist/chunk-7UX5CSGZ.cjs.map +1 -0
- package/dist/chunk-7VBH4F3P.js +2 -0
- package/dist/chunk-7VBH4F3P.js.map +1 -0
- package/dist/chunk-7ZPSYZHD.cjs +2 -0
- package/dist/chunk-7ZPSYZHD.cjs.map +1 -0
- package/dist/chunk-AOFLE33X.js +5 -0
- package/dist/chunk-AOFLE33X.js.map +1 -0
- package/dist/chunk-AQQQVDBQ.cjs +2 -0
- package/dist/chunk-AQQQVDBQ.cjs.map +1 -0
- package/dist/chunk-AXB5GHGO.js +2 -0
- package/dist/chunk-AXB5GHGO.js.map +1 -0
- package/dist/chunk-AZCELE44.cjs +2 -0
- package/dist/chunk-AZCELE44.cjs.map +1 -0
- package/dist/chunk-BB7P6HTR.js +2 -0
- package/dist/chunk-BB7P6HTR.js.map +1 -0
- package/dist/chunk-BGSF77LF.js +2 -0
- package/dist/chunk-BGSF77LF.js.map +1 -0
- package/dist/chunk-BHP3UTTQ.cjs +3 -0
- package/dist/chunk-BHP3UTTQ.cjs.map +1 -0
- package/dist/chunk-CP6SK2B4.js +2 -0
- package/dist/{chunk-5NHDEY2C.js.map → chunk-CP6SK2B4.js.map} +1 -1
- package/dist/chunk-DFYXFKCH.cjs +2 -0
- package/dist/chunk-DFYXFKCH.cjs.map +1 -0
- package/dist/chunk-DHFVVFZF.cjs +2 -0
- package/dist/chunk-DHFVVFZF.cjs.map +1 -0
- package/dist/chunk-DP7G45QM.cjs +13 -0
- package/dist/chunk-DP7G45QM.cjs.map +1 -0
- package/dist/chunk-E6RB7PRO.js +2 -0
- package/dist/chunk-E6RB7PRO.js.map +1 -0
- package/dist/chunk-F4FXIPR3.js +2 -0
- package/dist/chunk-F4FXIPR3.js.map +1 -0
- package/dist/chunk-F6VSSM2P.js +2 -0
- package/dist/chunk-F6VSSM2P.js.map +1 -0
- package/dist/chunk-FUVSCPU4.cjs +2 -0
- package/dist/chunk-FUVSCPU4.cjs.map +1 -0
- package/dist/chunk-FVF3T4JJ.js +2 -0
- package/dist/chunk-FVF3T4JJ.js.map +1 -0
- package/dist/chunk-FVWHMFX6.cjs +5 -0
- package/dist/chunk-FVWHMFX6.cjs.map +1 -0
- package/dist/chunk-IHEW6F2H.js +2 -0
- package/dist/chunk-IHEW6F2H.js.map +1 -0
- package/dist/chunk-IJS2EMSE.js +2 -0
- package/dist/chunk-IJS2EMSE.js.map +1 -0
- package/dist/chunk-IKVHLORY.cjs +11 -0
- package/dist/chunk-IKVHLORY.cjs.map +1 -0
- package/dist/chunk-IQGSDFBI.cjs +2 -0
- package/dist/chunk-IQGSDFBI.cjs.map +1 -0
- package/dist/chunk-J6KDUWX6.cjs +2 -0
- package/dist/chunk-J6KDUWX6.cjs.map +1 -0
- package/dist/chunk-JD3LDHUI.cjs +2 -0
- package/dist/chunk-JD3LDHUI.cjs.map +1 -0
- package/dist/chunk-JEYTB4AG.js +2 -0
- package/dist/chunk-JEYTB4AG.js.map +1 -0
- package/dist/chunk-JFLZJPVN.js +2 -0
- package/dist/chunk-JFLZJPVN.js.map +1 -0
- package/dist/chunk-JLPJ22CE.js +2 -0
- package/dist/chunk-JLPJ22CE.js.map +1 -0
- package/dist/chunk-JQCN42XX.js +2 -0
- package/dist/chunk-JQCN42XX.js.map +1 -0
- package/dist/chunk-K2HB5VFA.cjs +2 -0
- package/dist/chunk-K2HB5VFA.cjs.map +1 -0
- package/dist/chunk-K7TMUF3F.cjs +2 -0
- package/dist/chunk-K7TMUF3F.cjs.map +1 -0
- package/dist/chunk-KE7BJTCD.js +2 -0
- package/dist/chunk-KE7BJTCD.js.map +1 -0
- package/dist/chunk-KMEGUPH2.js +3 -0
- package/dist/chunk-KMEGUPH2.js.map +1 -0
- package/dist/chunk-KUPL3ZVD.js +2 -0
- package/dist/chunk-KUPL3ZVD.js.map +1 -0
- package/dist/chunk-L3ZZX36S.js +2 -0
- package/dist/chunk-L3ZZX36S.js.map +1 -0
- package/dist/chunk-LD4C62JY.cjs +2 -0
- package/dist/chunk-LD4C62JY.cjs.map +1 -0
- package/dist/chunk-LWQPLKL6.cjs +20 -0
- package/dist/chunk-LWQPLKL6.cjs.map +1 -0
- package/dist/chunk-M5IACTFC.cjs +17 -0
- package/dist/chunk-M5IACTFC.cjs.map +1 -0
- package/dist/chunk-MADMPRT2.js +20 -0
- package/dist/chunk-MADMPRT2.js.map +1 -0
- package/dist/chunk-MDHWM3C2.js +2 -0
- package/dist/chunk-MDHWM3C2.js.map +1 -0
- package/dist/chunk-N3ITIHHM.js +5 -0
- package/dist/chunk-N3ITIHHM.js.map +1 -0
- package/dist/chunk-N5APNCPB.js +2 -0
- package/dist/chunk-N5APNCPB.js.map +1 -0
- package/dist/{chunk-U53YRJNV.js → chunk-NBYFHJWB.js} +3 -3
- package/dist/{chunk-U53YRJNV.js.map → chunk-NBYFHJWB.js.map} +1 -1
- package/dist/chunk-NCXMNJUN.js +2 -0
- package/dist/chunk-NCXMNJUN.js.map +1 -0
- package/dist/chunk-NEQ5TENE.cjs +2 -0
- package/dist/chunk-NEQ5TENE.cjs.map +1 -0
- package/dist/chunk-NGU2W4PD.cjs +2 -0
- package/dist/chunk-NGU2W4PD.cjs.map +1 -0
- package/dist/{chunk-ZYVQQ5VR.cjs → chunk-NHDYQTC5.cjs} +3 -3
- package/dist/{chunk-ZYVQQ5VR.cjs.map → chunk-NHDYQTC5.cjs.map} +1 -1
- package/dist/chunk-NJXXC5JB.js +2 -0
- package/dist/chunk-NJXXC5JB.js.map +1 -0
- package/dist/chunk-NQEY7DR5.cjs +2 -0
- package/dist/chunk-NQEY7DR5.cjs.map +1 -0
- package/dist/chunk-OQV3NYDH.js +3 -0
- package/dist/chunk-OQV3NYDH.js.map +1 -0
- package/dist/chunk-OZ4GNBKA.js +2 -0
- package/dist/chunk-OZ4GNBKA.js.map +1 -0
- package/dist/chunk-PPNEAFKE.cjs +5 -0
- package/dist/chunk-PPNEAFKE.cjs.map +1 -0
- package/dist/chunk-PYASLKWF.js +2 -0
- package/dist/chunk-PYASLKWF.js.map +1 -0
- package/dist/chunk-Q6S7SUOM.js +2 -0
- package/dist/chunk-Q6S7SUOM.js.map +1 -0
- package/dist/chunk-QE2TJ6P5.cjs +2 -0
- package/dist/chunk-QE2TJ6P5.cjs.map +1 -0
- package/dist/chunk-QNVMBXVH.js +2 -0
- package/dist/chunk-QNVMBXVH.js.map +1 -0
- package/dist/chunk-QQ725EZL.js +2 -0
- package/dist/chunk-QQ725EZL.js.map +1 -0
- package/dist/chunk-QQTZQ6UX.cjs +2 -0
- package/dist/chunk-QQTZQ6UX.cjs.map +1 -0
- package/dist/{chunk-AVVJKYT3.cjs → chunk-QSPRVXFV.cjs} +2 -2
- package/dist/{chunk-AVVJKYT3.cjs.map → chunk-QSPRVXFV.cjs.map} +1 -1
- package/dist/chunk-QTQ6RUX4.cjs +5 -0
- package/dist/chunk-QTQ6RUX4.cjs.map +1 -0
- package/dist/chunk-R65RPMQX.cjs +2 -0
- package/dist/chunk-R65RPMQX.cjs.map +1 -0
- package/dist/chunk-R7NUVVHP.js +2 -0
- package/dist/{chunk-5A7KDBDU.js.map → chunk-R7NUVVHP.js.map} +1 -1
- package/dist/chunk-SXYPAP4B.js +2 -0
- package/dist/chunk-SXYPAP4B.js.map +1 -0
- package/dist/chunk-T2RVAQEU.js +2 -0
- package/dist/chunk-T2RVAQEU.js.map +1 -0
- package/dist/chunk-T7A5YOEG.cjs +2 -0
- package/dist/chunk-T7A5YOEG.cjs.map +1 -0
- package/dist/chunk-TDKDZ3QJ.cjs +2 -0
- package/dist/chunk-TDKDZ3QJ.cjs.map +1 -0
- package/dist/chunk-TFEHO7SF.cjs +2 -0
- package/dist/chunk-TFEHO7SF.cjs.map +1 -0
- package/dist/chunk-TSFY5HKB.js +17 -0
- package/dist/chunk-TSFY5HKB.js.map +1 -0
- package/dist/chunk-TYTEJYUQ.cjs +2 -0
- package/dist/chunk-TYTEJYUQ.cjs.map +1 -0
- package/dist/chunk-TZHEZW6R.js +11 -0
- package/dist/chunk-TZHEZW6R.js.map +1 -0
- package/dist/chunk-U65WRXZC.js +13 -0
- package/dist/chunk-U65WRXZC.js.map +1 -0
- package/dist/chunk-UT4MWGJ3.js +2 -0
- package/dist/chunk-UT4MWGJ3.js.map +1 -0
- package/dist/chunk-V2JDKH3W.cjs +2 -0
- package/dist/chunk-V2JDKH3W.cjs.map +1 -0
- package/dist/chunk-VNDSKBXQ.cjs +2 -0
- package/dist/chunk-VNDSKBXQ.cjs.map +1 -0
- package/dist/chunk-VO4FCKHM.js +2 -0
- package/dist/chunk-VO4FCKHM.js.map +1 -0
- package/dist/chunk-VUMMC2P5.js +2 -0
- package/dist/chunk-VUMMC2P5.js.map +1 -0
- package/dist/chunk-VUSNUBNI.js +2 -0
- package/dist/chunk-VUSNUBNI.js.map +1 -0
- package/dist/chunk-VWTULWXF.js +2 -0
- package/dist/{chunk-TKFJGLUO.js.map → chunk-VWTULWXF.js.map} +1 -1
- package/dist/chunk-VX7PSSOU.js +5 -0
- package/dist/chunk-VX7PSSOU.js.map +1 -0
- package/dist/chunk-WLSXJU2N.js +13 -0
- package/dist/chunk-WLSXJU2N.js.map +1 -0
- package/dist/chunk-WOZWFMOK.cjs +2 -0
- package/dist/chunk-WOZWFMOK.cjs.map +1 -0
- package/dist/chunk-WTDTVWCQ.cjs +2 -0
- package/dist/chunk-WTDTVWCQ.cjs.map +1 -0
- package/dist/chunk-WZ5ULION.js +2 -0
- package/dist/chunk-WZ5ULION.js.map +1 -0
- package/dist/chunk-XPLIEN2G.cjs +13 -0
- package/dist/chunk-XPLIEN2G.cjs.map +1 -0
- package/dist/chunk-XWVNLE2W.cjs +2 -0
- package/dist/chunk-XWVNLE2W.cjs.map +1 -0
- package/dist/chunk-XZR3J626.cjs +2 -0
- package/dist/chunk-XZR3J626.cjs.map +1 -0
- package/dist/chunk-YDO5KARN.js +2 -0
- package/dist/chunk-YDO5KARN.js.map +1 -0
- package/dist/chunk-YURIYBTN.cjs +2 -0
- package/dist/chunk-YURIYBTN.cjs.map +1 -0
- package/dist/chunk-YXKQTEPR.js +2 -0
- package/dist/chunk-YXKQTEPR.js.map +1 -0
- package/dist/chunk-Z6K4FYG6.js +2 -0
- package/dist/chunk-Z6K4FYG6.js.map +1 -0
- package/dist/chunk-ZJULEDLY.js +2 -0
- package/dist/chunk-ZJULEDLY.js.map +1 -0
- package/dist/{component-C1WnFcRp.d.ts → component-CPVtkASo.d.ts} +2 -3
- package/dist/{component-C1WnFcRp.d.cts → component-CxlupKuc.d.cts} +2 -3
- package/dist/composables.cjs +2 -0
- package/dist/composables.cjs.map +1 -0
- package/dist/composables.d.cts +103 -0
- package/dist/composables.d.ts +103 -0
- package/dist/composables.js +2 -0
- package/dist/composables.js.map +1 -0
- package/dist/{context-CB1mCq2h.d.cts → context-Cwt7QCpk.d.cts} +1 -9
- package/dist/{context-CB1mCq2h.d.ts → context-Cwt7QCpk.d.ts} +1 -9
- package/dist/core.cjs +1 -1
- package/dist/core.d.cts +5 -4
- package/dist/core.d.ts +5 -4
- package/dist/core.js +1 -1
- package/dist/css.cjs +2 -0
- package/dist/css.cjs.map +1 -0
- package/dist/css.d.cts +42 -0
- package/dist/css.d.ts +42 -0
- package/dist/css.js +2 -0
- package/dist/css.js.map +1 -0
- package/dist/data-table.cjs +2 -0
- package/dist/data-table.cjs.map +1 -0
- package/dist/data-table.d.cts +97 -0
- package/dist/data-table.d.ts +97 -0
- package/dist/data-table.js +2 -0
- package/dist/data-table.js.map +1 -0
- package/dist/deep-signal.cjs +2 -0
- package/dist/deep-signal.cjs.map +1 -0
- package/dist/deep-signal.d.cts +48 -0
- package/dist/deep-signal.d.ts +48 -0
- package/dist/deep-signal.js +2 -0
- package/dist/deep-signal.js.map +1 -0
- package/dist/defer.cjs +2 -0
- package/dist/defer.cjs.map +1 -0
- package/dist/defer.d.cts +55 -0
- package/dist/defer.d.ts +55 -0
- package/dist/defer.js +2 -0
- package/dist/defer.js.map +1 -0
- package/dist/deprecation.cjs +2 -0
- package/dist/deprecation.cjs.map +1 -0
- package/dist/deprecation.d.cts +119 -0
- package/dist/deprecation.d.ts +119 -0
- package/dist/deprecation.js +2 -0
- package/dist/deprecation.js.map +1 -0
- package/dist/{devtools-overlay-CJWKBTP4.js → devtools-overlay-3WRM6GKM.js} +3 -3
- package/dist/{devtools-overlay-CJWKBTP4.js.map → devtools-overlay-3WRM6GKM.js.map} +1 -1
- package/dist/{devtools-overlay-EQ3G755P.cjs → devtools-overlay-WJGSIB4N.cjs} +4 -4
- package/dist/{devtools-overlay-EQ3G755P.cjs.map → devtools-overlay-WJGSIB4N.cjs.map} +1 -1
- package/dist/devtools.cjs +2 -0
- package/dist/devtools.cjs.map +1 -0
- package/dist/devtools.d.cts +78 -0
- package/dist/devtools.d.ts +78 -0
- package/dist/devtools.js +2 -0
- package/dist/devtools.js.map +1 -0
- package/dist/di.cjs +2 -0
- package/dist/di.cjs.map +1 -0
- package/dist/di.d.cts +93 -0
- package/dist/di.d.ts +93 -0
- package/dist/di.js +2 -0
- package/dist/di.js.map +1 -0
- package/dist/directive.cjs +2 -0
- package/dist/directive.cjs.map +1 -0
- package/dist/directive.d.cts +102 -0
- package/dist/directive.d.ts +102 -0
- package/dist/directive.js +2 -0
- package/dist/directive.js.map +1 -0
- package/dist/error-boundary.cjs +2 -0
- package/dist/error-boundary.cjs.map +1 -0
- package/dist/error-boundary.d.cts +17 -0
- package/dist/error-boundary.d.ts +17 -0
- package/dist/error-boundary.js +2 -0
- package/dist/error-boundary.js.map +1 -0
- package/dist/error-hints.cjs +2 -0
- package/dist/error-hints.cjs.map +1 -0
- package/dist/error-hints.d.cts +17 -0
- package/dist/error-hints.d.ts +17 -0
- package/dist/error-hints.js +2 -0
- package/dist/error-hints.js.map +1 -0
- package/dist/errors.cjs +2 -0
- package/dist/errors.cjs.map +1 -0
- package/dist/errors.d.cts +35 -0
- package/dist/errors.d.ts +35 -0
- package/dist/errors.js +2 -0
- package/dist/errors.js.map +1 -0
- package/dist/event-bus.cjs +2 -0
- package/dist/event-bus.cjs.map +1 -0
- package/dist/event-bus.d.cts +68 -0
- package/dist/event-bus.d.ts +68 -0
- package/dist/event-bus.js +2 -0
- package/dist/event-bus.js.map +1 -0
- package/dist/event-modifiers.cjs +2 -0
- package/dist/event-modifiers.cjs.map +1 -0
- package/dist/event-modifiers.d.cts +130 -0
- package/dist/event-modifiers.d.ts +130 -0
- package/dist/event-modifiers.js +2 -0
- package/dist/event-modifiers.js.map +1 -0
- package/dist/flip.cjs +2 -0
- package/dist/flip.cjs.map +1 -0
- package/dist/flip.d.cts +66 -0
- package/dist/flip.d.ts +66 -0
- package/dist/flip.js +2 -0
- package/dist/flip.js.map +1 -0
- package/dist/head.cjs +2 -0
- package/dist/head.cjs.map +1 -0
- package/dist/head.d.cts +70 -0
- package/dist/head.d.ts +70 -0
- package/dist/head.js +2 -0
- package/dist/head.js.map +1 -0
- package/dist/hydration.cjs +2 -0
- package/dist/hydration.cjs.map +1 -0
- package/dist/hydration.d.cts +84 -0
- package/dist/hydration.d.ts +84 -0
- package/dist/hydration.js +2 -0
- package/dist/hydration.js.map +1 -0
- package/dist/image.cjs +2 -0
- package/dist/image.cjs.map +1 -0
- package/dist/image.d.cts +54 -0
- package/dist/image.d.ts +54 -0
- package/dist/image.js +2 -0
- package/dist/image.js.map +1 -0
- package/dist/index.cjs +1 -63
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +50 -3155
- package/dist/index.d.ts +50 -3155
- package/dist/index.js +1 -63
- package/dist/index.js.map +1 -1
- package/dist/infinite-scroll.cjs +2 -0
- package/dist/infinite-scroll.cjs.map +1 -0
- package/dist/infinite-scroll.d.cts +49 -0
- package/dist/infinite-scroll.d.ts +49 -0
- package/dist/infinite-scroll.js +2 -0
- package/dist/infinite-scroll.js.map +1 -0
- package/dist/leak-detector.cjs +2 -0
- package/dist/leak-detector.cjs.map +1 -0
- package/dist/leak-detector.d.cts +71 -0
- package/dist/leak-detector.d.ts +71 -0
- package/dist/leak-detector.js +2 -0
- package/dist/leak-detector.js.map +1 -0
- package/dist/machine.cjs +1 -1
- package/dist/machine.d.cts +1 -1
- package/dist/machine.d.ts +1 -1
- package/dist/machine.js +1 -1
- package/dist/offline.cjs +1 -1
- package/dist/offline.d.cts +1 -1
- package/dist/offline.d.ts +1 -1
- package/dist/offline.js +1 -1
- package/dist/perf.cjs +2 -0
- package/dist/perf.cjs.map +1 -0
- package/dist/perf.d.cts +97 -0
- package/dist/perf.d.ts +97 -0
- package/dist/perf.js +2 -0
- package/dist/perf.js.map +1 -0
- package/dist/pipes.cjs +2 -0
- package/dist/pipes.cjs.map +1 -0
- package/dist/pipes.d.cts +130 -0
- package/dist/pipes.d.ts +130 -0
- package/dist/pipes.js +2 -0
- package/dist/pipes.js.map +1 -0
- package/dist/plugin.cjs +2 -0
- package/dist/plugin.cjs.map +1 -0
- package/dist/plugin.d.cts +70 -0
- package/dist/plugin.d.ts +70 -0
- package/dist/plugin.js +2 -0
- package/dist/plugin.js.map +1 -0
- package/dist/portal.cjs +2 -0
- package/dist/portal.cjs.map +1 -0
- package/dist/portal.d.cts +30 -0
- package/dist/portal.d.ts +30 -0
- package/dist/portal.js +2 -0
- package/dist/portal.js.map +1 -0
- package/dist/pwa.cjs +1 -1
- package/dist/pwa.d.cts +1 -1
- package/dist/pwa.d.ts +1 -1
- package/dist/pwa.js +1 -1
- package/dist/query-state.cjs +2 -0
- package/dist/query-state.cjs.map +1 -0
- package/dist/query-state.d.cts +82 -0
- package/dist/query-state.d.ts +82 -0
- package/dist/query-state.js +2 -0
- package/dist/query-state.js.map +1 -0
- package/dist/reconcile.cjs +2 -0
- package/dist/reconcile.cjs.map +1 -0
- package/dist/reconcile.d.cts +42 -0
- package/dist/reconcile.d.ts +42 -0
- package/dist/reconcile.js +2 -0
- package/dist/reconcile.js.map +1 -0
- package/dist/scheduler-CKi1esN-.d.cts +9 -0
- package/dist/scheduler-CKi1esN-.d.ts +9 -0
- package/dist/security.cjs +2 -0
- package/dist/security.cjs.map +1 -0
- package/dist/security.d.cts +193 -0
- package/dist/security.d.ts +193 -0
- package/dist/security.js +2 -0
- package/dist/security.js.map +1 -0
- package/dist/seo.cjs +2 -0
- package/dist/seo.cjs.map +1 -0
- package/dist/seo.d.cts +118 -0
- package/dist/seo.d.ts +118 -0
- package/dist/seo.js +2 -0
- package/dist/seo.js.map +1 -0
- package/dist/{signals-C7XfOHHR.d.cts → signals-DionyGGY.d.cts} +7 -0
- package/dist/{signals-C7XfOHHR.d.ts → signals-DionyGGY.d.ts} +7 -0
- package/dist/snippets.cjs +2 -0
- package/dist/snippets.cjs.map +1 -0
- package/dist/snippets.d.cts +109 -0
- package/dist/snippets.d.ts +109 -0
- package/dist/snippets.js +2 -0
- package/dist/snippets.js.map +1 -0
- package/dist/ssg.cjs +2 -0
- package/dist/ssg.cjs.map +1 -0
- package/dist/ssg.d.cts +82 -0
- package/dist/ssg.d.ts +82 -0
- package/dist/ssg.js +2 -0
- package/dist/ssg.js.map +1 -0
- package/dist/ssr.cjs +1 -1
- package/dist/ssr.d.cts +2 -1
- package/dist/ssr.d.ts +2 -1
- package/dist/ssr.js +1 -1
- package/dist/store.cjs +1 -1
- package/dist/store.d.cts +1 -1
- package/dist/store.d.ts +1 -1
- package/dist/store.js +1 -1
- package/dist/suspense.cjs +2 -0
- package/dist/suspense.cjs.map +1 -0
- package/dist/suspense.d.cts +36 -0
- package/dist/suspense.d.ts +36 -0
- package/dist/suspense.js +2 -0
- package/dist/suspense.js.map +1 -0
- package/dist/switch.cjs +2 -0
- package/dist/switch.cjs.map +1 -0
- package/dist/switch.d.cts +48 -0
- package/dist/switch.d.ts +48 -0
- package/dist/switch.js +2 -0
- package/dist/switch.js.map +1 -0
- package/dist/sync.cjs +1 -1
- package/dist/sync.d.cts +1 -1
- package/dist/sync.d.ts +1 -1
- package/dist/sync.js +1 -1
- package/dist/test.cjs +2 -2
- package/dist/test.cjs.map +1 -1
- package/dist/test.d.cts +5 -4
- package/dist/test.d.ts +5 -4
- package/dist/test.js +2 -2
- package/dist/test.js.map +1 -1
- package/dist/theme.cjs +2 -0
- package/dist/theme.cjs.map +1 -0
- package/dist/theme.d.cts +56 -0
- package/dist/theme.d.ts +56 -0
- package/dist/theme.js +2 -0
- package/dist/theme.js.map +1 -0
- package/dist/toast.cjs +2 -0
- package/dist/toast.cjs.map +1 -0
- package/dist/toast.d.cts +66 -0
- package/dist/toast.d.ts +66 -0
- package/dist/toast.js +2 -0
- package/dist/toast.js.map +1 -0
- package/dist/transition.cjs +2 -0
- package/dist/transition.cjs.map +1 -0
- package/dist/transition.d.cts +90 -0
- package/dist/transition.d.ts +90 -0
- package/dist/transition.js +2 -0
- package/dist/transition.js.map +1 -0
- package/dist/tweened.cjs +2 -0
- package/dist/tweened.cjs.map +1 -0
- package/dist/tweened.d.cts +59 -0
- package/dist/tweened.d.ts +59 -0
- package/dist/tweened.js +2 -0
- package/dist/tweened.js.map +1 -0
- package/dist/types-DjZCk1xT.d.cts +4 -0
- package/dist/types-DjZCk1xT.d.ts +4 -0
- package/dist/view-transition.cjs +2 -0
- package/dist/view-transition.cjs.map +1 -0
- package/dist/view-transition.d.cts +80 -0
- package/dist/view-transition.d.ts +80 -0
- package/dist/view-transition.js +2 -0
- package/dist/view-transition.js.map +1 -0
- package/dist/virtual-list.cjs +2 -0
- package/dist/virtual-list.cjs.map +1 -0
- package/dist/virtual-list.d.cts +67 -0
- package/dist/virtual-list.d.ts +67 -0
- package/dist/virtual-list.js +2 -0
- package/dist/virtual-list.js.map +1 -0
- package/dist/watch.cjs +2 -0
- package/dist/watch.cjs.map +1 -0
- package/dist/watch.d.cts +70 -0
- package/dist/watch.d.ts +70 -0
- package/dist/watch.js +2 -0
- package/dist/watch.js.map +1 -0
- package/dist/web-component.cjs +2 -0
- package/dist/web-component.cjs.map +1 -0
- package/dist/web-component.d.cts +51 -0
- package/dist/web-component.d.ts +51 -0
- package/dist/web-component.js +2 -0
- package/dist/web-component.js.map +1 -0
- package/package.json +249 -11
- package/dist/chunk-35DJOBEO.cjs +0 -2
- package/dist/chunk-35DJOBEO.cjs.map +0 -1
- package/dist/chunk-3GRR4VW2.js +0 -13
- package/dist/chunk-3GRR4VW2.js.map +0 -1
- package/dist/chunk-5A7KDBDU.js +0 -2
- package/dist/chunk-5NHDEY2C.js +0 -2
- package/dist/chunk-6GGYM5SF.cjs +0 -5
- package/dist/chunk-6GGYM5SF.cjs.map +0 -1
- package/dist/chunk-EEILP4OL.cjs +0 -13
- package/dist/chunk-EEILP4OL.cjs.map +0 -1
- package/dist/chunk-FTTNKDZQ.js +0 -5
- package/dist/chunk-FTTNKDZQ.js.map +0 -1
- package/dist/chunk-H2HNKYN2.js +0 -2
- package/dist/chunk-H2HNKYN2.js.map +0 -1
- package/dist/chunk-TKFJGLUO.js +0 -2
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
'use strict';var r={AK0010:{code:"AK0010",message:"provide() called outside of component setup.",hint:"provide() must be called inside defineComponent()."},AK0012:{code:"AK0012",message:"inject() called outside of component setup.",hint:"inject() must be called inside defineComponent()."},AK0013:{code:"AK0013",message:"No provider found for injected context.",hint:"Make sure an ancestor component calls provide() with this key."},AK0020:{code:"AK0020",message:"onMount() called outside of component setup.",hint:"onMount() must be called inside defineComponent()."},AK0021:{code:"AK0021",message:"onUnmount() called outside of component setup.",hint:"onUnmount() must be called inside defineComponent()."},AK0022:{code:"AK0022",message:"onError() called outside of component setup.",hint:"onError() must be called inside defineComponent()."},AK0030:{code:"AK0030",message:"Circular dependency detected in computed signal.",hint:"A computed signal is reading itself, directly or via other computeds."},AK0031:{code:"AK0031",message:"Signal set() called during computation.",hint:"Do not set signals inside computed() or during effect execution. Use batch() or set signals in event handlers."},AK0040:{code:"AK0040",message:"Component setup must return a render function.",hint:"The function passed to defineComponent() must return () => AkashNode."},AK0041:{code:"AK0041",message:"Required prop is missing.",hint:"Check that the parent component is passing all required props."},AK0050:{code:"AK0050",message:"useRoute() called outside of router context.",hint:"Make sure your component is rendered inside a router provider."},AK0051:{code:"AK0051",message:"No route matched the current URL.",hint:"Add a catch-all route ([...rest]) to handle unmatched paths."},AK0052:{code:"AK0052",message:"Route guard threw an error.",hint:"Check the guard function for unhandled exceptions."},AK0060:{code:"AK0060",message:"Form submitted while invalid.",hint:"The submit handler was not called because validation failed. Check form.errors()."},AK0061:{code:"AK0061",message:"Async validator timed out.",hint:"The async validator did not resolve within the expected time. Check your async validation logic."},AK0070:{code:"AK0070",message:"HTTP request failed.",hint:"Check the server response status and network connectivity."},AK0071:{code:"AK0071",message:"createResource() fetcher threw an error.",hint:"Check the fetcher function passed to createResource()."}},s="https://akashjs.dev/errors";function i(e,t){let o=r[e];if(!o)return `[AkashJS ${e}] Unknown error code.`;let n=`[AkashJS ${e}] ${o.message}`;return t&&(n+=`
|
|
2
|
+
${t}`),n+=`
|
|
3
|
+
${o.hint}`,n+=`
|
|
4
|
+
See: ${s}/${e}`,n}function d(e,t){return new Error(i(e,t))}function a(e){return r[e]}function c(){return Object.keys(r)}exports.a=i;exports.b=d;exports.c=a;exports.d=c;//# sourceMappingURL=chunk-PPNEAFKE.cjs.map
|
|
5
|
+
//# sourceMappingURL=chunk-PPNEAFKE.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts"],"names":["errors","DOC_BASE","formatError","code","context","def","msg","akashError","getErrorDef","getAllErrorCodes"],"mappings":"aAqBA,IAAMA,EAAmC,CAEvC,MAAA,CAAQ,CACN,IAAA,CAAM,QAAA,CACN,QAAS,8CAAA,CACT,IAAA,CAAM,oDACR,CAAA,CACA,MAAA,CAAQ,CACN,IAAA,CAAM,QAAA,CACN,QAAS,6CAAA,CACT,IAAA,CAAM,mDACR,CAAA,CACA,MAAA,CAAQ,CACN,IAAA,CAAM,QAAA,CACN,QAAS,yCAAA,CACT,IAAA,CAAM,gEACR,CAAA,CAGA,MAAA,CAAQ,CACN,IAAA,CAAM,QAAA,CACN,QAAS,8CAAA,CACT,IAAA,CAAM,oDACR,CAAA,CACA,MAAA,CAAQ,CACN,IAAA,CAAM,QAAA,CACN,QAAS,gDAAA,CACT,IAAA,CAAM,sDACR,CAAA,CACA,OAAQ,CACN,IAAA,CAAM,SACN,OAAA,CAAS,8CAAA,CACT,KAAM,oDACR,CAAA,CAGA,OAAQ,CACN,IAAA,CAAM,SACN,OAAA,CAAS,kDAAA,CACT,KAAM,uEACR,CAAA,CACA,OAAQ,CACN,IAAA,CAAM,SACN,OAAA,CAAS,yCAAA,CACT,KAAM,gHACR,CAAA,CAGA,OAAQ,CACN,IAAA,CAAM,SACN,OAAA,CAAS,gDAAA,CACT,KAAM,uEACR,CAAA,CACA,OAAQ,CACN,IAAA,CAAM,SACN,OAAA,CAAS,2BAAA,CACT,KAAM,gEACR,CAAA,CAGA,MAAA,CAAQ,CACN,KAAM,QAAA,CACN,OAAA,CAAS,+CACT,IAAA,CAAM,gEACR,EACA,MAAA,CAAQ,CACN,KAAM,QAAA,CACN,OAAA,CAAS,oCACT,IAAA,CAAM,8DACR,EACA,MAAA,CAAQ,CACN,KAAM,QAAA,CACN,OAAA,CAAS,8BACT,IAAA,CAAM,oDACR,EAGA,MAAA,CAAQ,CACN,KAAM,QAAA,CACN,OAAA,CAAS,gCACT,IAAA,CAAM,mFACR,EACA,MAAA,CAAQ,CACN,KAAM,QAAA,CACN,OAAA,CAAS,6BACT,IAAA,CAAM,kGACR,EAGA,MAAA,CAAQ,CACN,KAAM,QAAA,CACN,OAAA,CAAS,uBACT,IAAA,CAAM,4DACR,EACA,MAAA,CAAQ,CACN,KAAM,QAAA,CACN,OAAA,CAAS,2CACT,IAAA,CAAM,wDACR,CACF,CAAA,CAIMC,CAAAA,CAAW,6BAKV,SAASC,CAAAA,CAAYC,EAAcC,CAAAA,CAA0B,CAClE,IAAMC,CAAAA,CAAML,CAAAA,CAAOG,CAAI,CAAA,CACvB,GAAI,CAACE,CAAAA,CACH,OAAO,YAAYF,CAAI,CAAA,qBAAA,CAAA,CAGzB,IAAIG,CAAAA,CAAM,CAAA,SAAA,EAAYH,CAAI,CAAA,EAAA,EAAKE,CAAAA,CAAI,OAAO,CAAA,CAAA,CAC1C,OAAID,IACFE,CAAAA,EAAO;AAAA,EAAA,EAAOF,CAAO,IAEvBE,CAAAA,EAAO;AAAA,EAAA,EAAOD,CAAAA,CAAI,IAAI,CAAA,CAAA,CACtBC,CAAAA,EAAO;AAAA,OAAA,EAAYL,CAAQ,CAAA,CAAA,EAAIE,CAAI,CAAA,CAAA,CAC5BG,CACT,CAKO,SAASC,CAAAA,CAAWJ,CAAAA,CAAcC,CAAAA,CAAyB,CAChE,OAAO,IAAI,KAAA,CAAMF,CAAAA,CAAYC,EAAMC,CAAO,CAAC,CAC7C,CAKO,SAASI,CAAAA,CAAYL,CAAAA,CAAoC,CAC9D,OAAOH,EAAOG,CAAI,CACpB,CAKO,SAASM,GAA6B,CAC3C,OAAO,MAAA,CAAO,IAAA,CAAKT,CAAM,CAC3B","file":"chunk-PPNEAFKE.cjs","sourcesContent":["/**\n * Error message catalog.\n *\n * Every AkashJS runtime error has a unique code (AK0001, AK0002, etc.),\n * a one-line description, and a link to detailed documentation.\n *\n * Usage:\n * throw akashError('AK0010', 'provide()');\n */\n\n// --- Error registry ---\n\nexport interface ErrorDef {\n /** Error code */\n code: string;\n /** Short description */\n message: string;\n /** Extended explanation and fix suggestion */\n hint: string;\n}\n\nconst errors: Record<string, ErrorDef> = {\n // --- Context errors (AK001x) ---\n AK0010: {\n code: 'AK0010',\n message: 'provide() called outside of component setup.',\n hint: 'provide() must be called inside defineComponent().',\n },\n AK0012: {\n code: 'AK0012',\n message: 'inject() called outside of component setup.',\n hint: 'inject() must be called inside defineComponent().',\n },\n AK0013: {\n code: 'AK0013',\n message: 'No provider found for injected context.',\n hint: 'Make sure an ancestor component calls provide() with this key.',\n },\n\n // --- Lifecycle errors (AK002x) ---\n AK0020: {\n code: 'AK0020',\n message: 'onMount() called outside of component setup.',\n hint: 'onMount() must be called inside defineComponent().',\n },\n AK0021: {\n code: 'AK0021',\n message: 'onUnmount() called outside of component setup.',\n hint: 'onUnmount() must be called inside defineComponent().',\n },\n AK0022: {\n code: 'AK0022',\n message: 'onError() called outside of component setup.',\n hint: 'onError() must be called inside defineComponent().',\n },\n\n // --- Signal errors (AK003x) ---\n AK0030: {\n code: 'AK0030',\n message: 'Circular dependency detected in computed signal.',\n hint: 'A computed signal is reading itself, directly or via other computeds.',\n },\n AK0031: {\n code: 'AK0031',\n message: 'Signal set() called during computation.',\n hint: 'Do not set signals inside computed() or during effect execution. Use batch() or set signals in event handlers.',\n },\n\n // --- Component errors (AK004x) ---\n AK0040: {\n code: 'AK0040',\n message: 'Component setup must return a render function.',\n hint: 'The function passed to defineComponent() must return () => AkashNode.',\n },\n AK0041: {\n code: 'AK0041',\n message: 'Required prop is missing.',\n hint: 'Check that the parent component is passing all required props.',\n },\n\n // --- Router errors (AK005x) ---\n AK0050: {\n code: 'AK0050',\n message: 'useRoute() called outside of router context.',\n hint: 'Make sure your component is rendered inside a router provider.',\n },\n AK0051: {\n code: 'AK0051',\n message: 'No route matched the current URL.',\n hint: 'Add a catch-all route ([...rest]) to handle unmatched paths.',\n },\n AK0052: {\n code: 'AK0052',\n message: 'Route guard threw an error.',\n hint: 'Check the guard function for unhandled exceptions.',\n },\n\n // --- Form errors (AK006x) ---\n AK0060: {\n code: 'AK0060',\n message: 'Form submitted while invalid.',\n hint: 'The submit handler was not called because validation failed. Check form.errors().',\n },\n AK0061: {\n code: 'AK0061',\n message: 'Async validator timed out.',\n hint: 'The async validator did not resolve within the expected time. Check your async validation logic.',\n },\n\n // --- HTTP errors (AK007x) ---\n AK0070: {\n code: 'AK0070',\n message: 'HTTP request failed.',\n hint: 'Check the server response status and network connectivity.',\n },\n AK0071: {\n code: 'AK0071',\n message: 'createResource() fetcher threw an error.',\n hint: 'Check the fetcher function passed to createResource().',\n },\n};\n\n// --- Public API ---\n\nconst DOC_BASE = 'https://akashjs.dev/errors';\n\n/**\n * Format an AkashJS error with code, message, hint, and doc link.\n */\nexport function formatError(code: string, context?: string): string {\n const def = errors[code];\n if (!def) {\n return `[AkashJS ${code}] Unknown error code.`;\n }\n\n let msg = `[AkashJS ${code}] ${def.message}`;\n if (context) {\n msg += `\\n ${context}`;\n }\n msg += `\\n ${def.hint}`;\n msg += `\\n See: ${DOC_BASE}/${code}`;\n return msg;\n}\n\n/**\n * Create and throw an AkashJS error.\n */\nexport function akashError(code: string, context?: string): Error {\n return new Error(formatError(code, context));\n}\n\n/**\n * Get the error definition for a code.\n */\nexport function getErrorDef(code: string): ErrorDef | undefined {\n return errors[code];\n}\n\n/**\n * Get all registered error codes.\n */\nexport function getAllErrorCodes(): string[] {\n return Object.keys(errors);\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {c}from'./chunk-YXKQTEPR.js';var v=0;function h(u={}){let{maxVisible:T=5,defaultDuration:l=3e3,position:f="top-right"}=u,i=c([]),e=new Map;function o(t,s,n){let r=`toast-${++v}`,p=n?.duration??l,y=n?.dismissible??true,x={id:r,type:t,message:s,duration:p,dismissible:y,createdAt:Date.now()};if(i.update(g=>{let d=[...g,x];if(d.length>T){let O=d.shift();a(O.id);}return d}),p>0){let g=setTimeout(()=>c$1(r),p);e.set(r,g);}return r}function c$1(t){a(t),i.update(s=>s.filter(n=>n.id!==t));}function b(){for(let[t]of e)a(t);i.set([]);}function a(t){let s=e.get(t);s&&(clearTimeout(s),e.delete(t));}return {toasts:(()=>i()),position:f,success:(t,s)=>o("success",t,s),error:(t,s)=>o("error",t,s),info:(t,s)=>o("info",t,s),warning:(t,s)=>o("warning",t,s),add:o,dismiss:c$1,dismissAll:b}}export{h as a};//# sourceMappingURL=chunk-PYASLKWF.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-PYASLKWF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/toast.ts"],"names":["idCounter","createToaster","options","maxVisible","defaultDuration","position","toasts","signal","timers","add","type","message","opts","id","duration","dismissible","toast","list","next","removed","clearTimer","timer","dismiss","t","dismissAll","msg"],"mappings":"oCAyEA,IAAIA,CAAAA,CAAY,CAAA,CAKT,SAASC,CAAAA,CAAcC,CAAAA,CAA0B,EAAC,CAAY,CACnE,GAAM,CACJ,UAAA,CAAAC,CAAAA,CAAa,EACb,eAAA,CAAAC,CAAAA,CAAkB,GAAA,CAClB,QAAA,CAAAC,CAAAA,CAAW,WACb,EAAIH,CAAAA,CAEEI,CAAAA,CAASC,CAAAA,CAAgB,EAAE,CAAA,CAC3BC,EAAS,IAAI,GAAA,CAEnB,SAASC,CAAAA,CAAIC,CAAAA,CAAiBC,CAAAA,CAAiBC,EAA6B,CAC1E,IAAMC,CAAAA,CAAK,CAAA,MAAA,EAAS,EAAEb,CAAS,GACzBc,CAAAA,CAAWF,CAAAA,EAAM,QAAA,EAAYR,CAAAA,CAC7BW,CAAAA,CAAcH,CAAAA,EAAM,aAAe,IAAA,CAEnCI,CAAAA,CAAe,CACnB,EAAA,CAAAH,CAAAA,CACA,IAAA,CAAAH,EACA,OAAA,CAAAC,CAAAA,CACA,QAAA,CAAAG,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,UAAW,IAAA,CAAK,GAAA,EAClB,CAAA,CAaA,GAXAT,CAAAA,CAAO,OAAQW,CAAAA,EAAS,CACtB,IAAMC,CAAAA,CAAO,CAAC,GAAGD,EAAMD,CAAK,CAAA,CAE5B,GAAIE,CAAAA,CAAK,MAAA,CAASf,CAAAA,CAAY,CAC5B,IAAMgB,CAAAA,CAAUD,CAAAA,CAAK,KAAA,EAAM,CAC3BE,CAAAA,CAAWD,EAAQ,EAAE,EACvB,CACA,OAAOD,CACT,CAAC,EAGGJ,CAAAA,CAAW,CAAA,CAAG,CAChB,IAAMO,CAAAA,CAAQ,UAAA,CAAW,IAAMC,GAAAA,CAAQT,CAAE,CAAA,CAAGC,CAAQ,CAAA,CACpDN,CAAAA,CAAO,GAAA,CAAIK,EAAIQ,CAAK,EACtB,CAEA,OAAOR,CACT,CAEA,SAASS,GAAAA,CAAQT,CAAAA,CAAkB,CACjCO,CAAAA,CAAWP,CAAE,CAAA,CACbP,EAAO,MAAA,CAAQW,CAAAA,EAASA,CAAAA,CAAK,MAAA,CAAQM,CAAAA,EAAMA,CAAAA,CAAE,KAAOV,CAAE,CAAC,EACzD,CAEA,SAASW,CAAAA,EAAmB,CAC1B,IAAA,GAAW,CAACX,CAAE,CAAA,GAAKL,CAAAA,CACjBY,CAAAA,CAAWP,CAAE,CAAA,CAEfP,CAAAA,CAAO,GAAA,CAAI,EAAE,EACf,CAEA,SAASc,CAAAA,CAAWP,CAAAA,CAAkB,CACpC,IAAMQ,CAAAA,CAAQb,CAAAA,CAAO,GAAA,CAAIK,CAAE,CAAA,CACvBQ,CAAAA,GACF,YAAA,CAAaA,CAAK,CAAA,CAClBb,EAAO,MAAA,CAAOK,CAAE,CAAA,EAEpB,CAEA,OAAO,CACL,QAAS,IAAMP,CAAAA,EAAO,CAAA,CACtB,QAAA,CAAAD,CAAAA,CACA,OAAA,CAAS,CAACoB,CAAAA,CAAKb,CAAAA,GAASH,CAAAA,CAAI,SAAA,CAAWgB,CAAAA,CAAKb,CAAI,EAChD,KAAA,CAAO,CAACa,CAAAA,CAAKb,CAAAA,GAASH,CAAAA,CAAI,OAAA,CAASgB,EAAKb,CAAI,CAAA,CAC5C,IAAA,CAAM,CAACa,CAAAA,CAAKb,CAAAA,GAASH,EAAI,MAAA,CAAQgB,CAAAA,CAAKb,CAAI,CAAA,CAC1C,OAAA,CAAS,CAACa,EAAKb,CAAAA,GAASH,CAAAA,CAAI,SAAA,CAAWgB,CAAAA,CAAKb,CAAI,CAAA,CAChD,GAAA,CAAAH,CAAAA,CACA,OAAA,CAAAa,GAAAA,CACA,UAAA,CAAAE,CACF,CACF","file":"chunk-PYASLKWF.js","sourcesContent":["/**\n * Toast notification system.\n *\n * Signal-based toast queue with auto-dismiss, stacking, and positions.\n *\n * ```ts\n * const toast = createToaster();\n * toast.success('Saved!');\n * toast.error('Something went wrong');\n * toast.info('Tip: try dark mode', { duration: 5000 });\n * toast.toasts(); // reactive list of active toasts\n * ```\n */\n\nimport { signal } from './signals.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// --- Types ---\n\nexport type ToastType = 'success' | 'error' | 'info' | 'warning';\n\nexport type ToastPosition =\n | 'top-right' | 'top-left' | 'top-center'\n | 'bottom-right' | 'bottom-left' | 'bottom-center';\n\nexport interface Toast {\n id: string;\n type: ToastType;\n message: string;\n duration: number;\n dismissible: boolean;\n createdAt: number;\n}\n\nexport interface ToastOptions {\n /** Duration in ms (default: 3000, 0 = no auto-dismiss) */\n duration?: number;\n /** Whether the toast can be manually dismissed (default: true) */\n dismissible?: boolean;\n}\n\nexport interface ToasterOptions {\n /** Max visible toasts (default: 5) */\n maxVisible?: number;\n /** Default duration in ms (default: 3000) */\n defaultDuration?: number;\n /** Position (default: 'top-right') */\n position?: ToastPosition;\n}\n\nexport interface Toaster {\n /** Active toasts (reactive signal) */\n toasts: ReadonlySignal<Toast[]>;\n /** Position setting */\n position: ToastPosition;\n /** Show a success toast */\n success(message: string, options?: ToastOptions): string;\n /** Show an error toast */\n error(message: string, options?: ToastOptions): string;\n /** Show an info toast */\n info(message: string, options?: ToastOptions): string;\n /** Show a warning toast */\n warning(message: string, options?: ToastOptions): string;\n /** Show a toast with custom type */\n add(type: ToastType, message: string, options?: ToastOptions): string;\n /** Dismiss a specific toast */\n dismiss(id: string): void;\n /** Dismiss all toasts */\n dismissAll(): void;\n}\n\n// --- Implementation ---\n\nlet idCounter = 0;\n\n/**\n * Create a toast notification manager.\n */\nexport function createToaster(options: ToasterOptions = {}): Toaster {\n const {\n maxVisible = 5,\n defaultDuration = 3000,\n position = 'top-right',\n } = options;\n\n const toasts = signal<Toast[]>([]);\n const timers = new Map<string, ReturnType<typeof setTimeout>>();\n\n function add(type: ToastType, message: string, opts?: ToastOptions): string {\n const id = `toast-${++idCounter}`;\n const duration = opts?.duration ?? defaultDuration;\n const dismissible = opts?.dismissible ?? true;\n\n const toast: Toast = {\n id,\n type,\n message,\n duration,\n dismissible,\n createdAt: Date.now(),\n };\n\n toasts.update((list) => {\n const next = [...list, toast];\n // Trim to maxVisible\n if (next.length > maxVisible) {\n const removed = next.shift()!;\n clearTimer(removed.id);\n }\n return next;\n });\n\n // Auto-dismiss\n if (duration > 0) {\n const timer = setTimeout(() => dismiss(id), duration);\n timers.set(id, timer);\n }\n\n return id;\n }\n\n function dismiss(id: string): void {\n clearTimer(id);\n toasts.update((list) => list.filter((t) => t.id !== id));\n }\n\n function dismissAll(): void {\n for (const [id] of timers) {\n clearTimer(id);\n }\n toasts.set([]);\n }\n\n function clearTimer(id: string): void {\n const timer = timers.get(id);\n if (timer) {\n clearTimeout(timer);\n timers.delete(id);\n }\n }\n\n return {\n toasts: (() => toasts()) as ReadonlySignal<Toast[]>,\n position,\n success: (msg, opts) => add('success', msg, opts),\n error: (msg, opts) => add('error', msg, opts),\n info: (msg, opts) => add('info', msg, opts),\n warning: (msg, opts) => add('warning', msg, opts),\n add,\n dismiss,\n dismissAll,\n };\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {s,l}from'./chunk-KE7BJTCD.js';import {c,d}from'./chunk-YXKQTEPR.js';function v(t,i,c,u,m=3){let s,a,n,e,o;typeof t=="object"?(s=t.scrollTop,a=t.containerHeight,n=t.itemHeight,e=t.totalItems,o=t.overscan??3):(s=t,a=i,n=c,e=u,o=m);let r=Math.floor(s/n),l=Math.ceil(a/n),h=Math.max(0,r-o),g=Math.min(e,r+l+o);return {start:h,end:g,totalHeight:e*n,offsetTop:h*n}}function V(t){let i=c(0),c$1=c(t.containerHeight??400),u=t.overscan??3,m=d(()=>v(i(),c$1(),t.itemHeight,t.items().length,u)),s=d(()=>{let e=m();return t.items().slice(e.start,e.end).map((o,r)=>({item:o,index:e.start+r}))});function a(e){let o=e.target;i.set(o.scrollTop);}function n(e){c$1.set(e);}return {range:m,visibleItems:s,onScroll:a,setContainerHeight:n,scrollTop:(()=>i())}}var E=s(t=>{let{itemHeight:i,containerHeight:c$1,overscan:u=3}=t.props,m=c(0);return ()=>{let s=t.props.each,a=c$1??400,n=v(m(),a,i,s.length,u),e=document.createElement("div");e.style.height=`${a}px`,e.style.overflow="auto",e.style.position="relative",e.addEventListener("scroll",()=>{m.set(e.scrollTop);},{passive:true});let o=document.createElement("div");o.style.height=`${n.totalHeight}px`,o.style.position="relative";let r=document.createElement("div");r.style.position="absolute",r.style.top=`${n.offsetTop}px`,r.style.left="0",r.style.right="0";for(let l$1=n.start;l$1<n.end;l$1++){let h=s[l$1];if(!h)continue;let g=l(t.props.children(h,l$1));g instanceof HTMLElement&&(g.style.height=`${i}px`),r.appendChild(g);}return o.appendChild(r),e.appendChild(o),e}});export{v as a,V as b,E as c};//# sourceMappingURL=chunk-Q6S7SUOM.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-Q6S7SUOM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/virtual-list.ts"],"names":["calculateRange","scrollTopOrOpts","containerHeight","itemHeight","totalItems","overscan","st","ch","ih","ti","os","firstVisible","visibleCount","start","end","useVirtualList","options","scrollTop","signal","range","computed","visibleItems","r","item","i","onScroll","target","setContainerHeight","height","VirtualFor","defineComponent","ctx","fixedHeight","items","outer","inner","content","row","nodeToDOM"],"mappings":"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","file":"chunk-Q6S7SUOM.js","sourcesContent":["/**\n * <VirtualFor> — virtualized list rendering.\n *\n * Only renders items visible in the viewport plus a small overscan\n * buffer. Essential for rendering thousands of items without\n * destroying performance.\n *\n * ```html\n * <VirtualFor\n * each={items()}\n * key={(item) => item.id}\n * itemHeight={40}\n * overscan={5}\n * >\n * {(item) => <div class=\"row\">{item.name}</div>}\n * </VirtualFor>\n * ```\n */\n\nimport { signal, effect, computed } from './signals.js';\nimport { defineComponent } from './component.js';\nimport { nodeToDOM } from './dom.js';\nimport type { AkashNode } from './types.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// --- Types ---\n\nexport interface VirtualForProps<T> {\n /** Array of items */\n each: T[];\n /** Key function for reconciliation */\n key: (item: T) => unknown;\n /** Fixed height per item in pixels */\n itemHeight: number;\n /** Container height in pixels (default: auto-detect from parent) */\n containerHeight?: number;\n /** Number of extra items to render above/below viewport */\n overscan?: number;\n /** Render function for each item */\n children: (item: T, index: number) => AkashNode;\n}\n\n// --- Virtual scroll calculations ---\n\nexport interface VirtualRange {\n /** First visible index */\n start: number;\n /** Last visible index (exclusive) */\n end: number;\n /** Total content height in pixels */\n totalHeight: number;\n /** Offset of the first rendered item */\n offsetTop: number;\n}\n\n/**\n * Calculate the visible range given scroll position and dimensions.\n */\nexport function calculateRange(\n scrollTopOrOpts: number | { scrollTop: number; containerHeight: number; itemHeight: number; totalItems: number; overscan?: number },\n containerHeight?: number,\n itemHeight?: number,\n totalItems?: number,\n overscan = 3,\n): VirtualRange {\n let st: number, ch: number, ih: number, ti: number, os: number;\n if (typeof scrollTopOrOpts === 'object') {\n st = scrollTopOrOpts.scrollTop;\n ch = scrollTopOrOpts.containerHeight;\n ih = scrollTopOrOpts.itemHeight;\n ti = scrollTopOrOpts.totalItems;\n os = scrollTopOrOpts.overscan ?? 3;\n } else {\n st = scrollTopOrOpts;\n ch = containerHeight!;\n ih = itemHeight!;\n ti = totalItems!;\n os = overscan;\n }\n\n const firstVisible = Math.floor(st / ih);\n const visibleCount = Math.ceil(ch / ih);\n\n const start = Math.max(0, firstVisible - os);\n const end = Math.min(ti, firstVisible + visibleCount + os);\n\n return {\n start,\n end,\n totalHeight: ti * ih,\n offsetTop: start * ih,\n };\n}\n\n// --- useVirtualList composable ---\n\n/**\n * Low-level virtual list composable for custom implementations.\n *\n * ```ts\n * const { containerRef, range, visibleItems } = useVirtualList({\n * items: () => allItems(),\n * itemHeight: 40,\n * overscan: 5,\n * });\n * ```\n */\nexport function useVirtualList<T>(options: {\n items: () => T[];\n itemHeight: number;\n containerHeight?: number;\n overscan?: number;\n}) {\n const scrollTop = signal(0);\n const containerHeight = signal(options.containerHeight ?? 400);\n const overscan = options.overscan ?? 3;\n\n const range = computed((): VirtualRange => {\n return calculateRange(\n scrollTop(),\n containerHeight(),\n options.itemHeight,\n options.items().length,\n overscan,\n );\n });\n\n const visibleItems = computed(() => {\n const r = range();\n return options.items().slice(r.start, r.end).map((item, i) => ({\n item,\n index: r.start + i,\n }));\n });\n\n function onScroll(e: Event): void {\n const target = e.target as HTMLElement;\n scrollTop.set(target.scrollTop);\n }\n\n function setContainerHeight(height: number): void {\n containerHeight.set(height);\n }\n\n return {\n range,\n visibleItems,\n onScroll,\n setContainerHeight,\n scrollTop: (() => scrollTop()) as ReadonlySignal<number>,\n };\n}\n\n// --- <VirtualFor> component ---\n\nexport const VirtualFor = defineComponent<VirtualForProps<any>>((ctx) => {\n const {\n itemHeight,\n containerHeight: fixedHeight,\n overscan = 3,\n } = ctx.props;\n\n const scrollTop = signal(0);\n\n return () => {\n const items = ctx.props.each;\n const height = fixedHeight ?? 400;\n\n const r = calculateRange(scrollTop(), height, itemHeight, items.length, overscan);\n\n // Outer container (scrollable)\n const outer = document.createElement('div');\n outer.style.height = `${height}px`;\n outer.style.overflow = 'auto';\n outer.style.position = 'relative';\n\n outer.addEventListener('scroll', () => {\n scrollTop.set(outer.scrollTop);\n }, { passive: true });\n\n // Inner spacer (total height)\n const inner = document.createElement('div');\n inner.style.height = `${r.totalHeight}px`;\n inner.style.position = 'relative';\n\n // Rendered items container\n const content = document.createElement('div');\n content.style.position = 'absolute';\n content.style.top = `${r.offsetTop}px`;\n content.style.left = '0';\n content.style.right = '0';\n\n // Render visible items\n for (let i = r.start; i < r.end; i++) {\n const item = items[i];\n if (!item) continue;\n\n const row = nodeToDOM(ctx.props.children(item, i));\n if (row instanceof HTMLElement) {\n row.style.height = `${itemHeight}px`;\n }\n content.appendChild(row);\n }\n\n inner.appendChild(content);\n outer.appendChild(inner);\n return outer;\n };\n});\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var chunkWOZWFMOK_cjs=require('./chunk-WOZWFMOK.cjs');function m(o,t){let e=chunkWOZWFMOK_cjs.c(0),n=chunkWOZWFMOK_cjs.c(t?.immediate!==false),u=null;function a(){l(),u=setInterval(()=>e.update(r=>r+1),o);}function l(){u&&(clearInterval(u),u=null);}return n()&&a(),{count:(()=>e()),isActive:(()=>n()),pause(){n.set(false),l();},resume(){n.set(true),a();},reset(){e.set(0);},dispose(){l();}}}function f(o){let t=chunkWOZWFMOK_cjs.c(false),e=null;function n(){u(),t.set(false),e=setTimeout(()=>t.set(true),o);}function u(){e&&(clearTimeout(e),e=null);}return n(),{ready:(()=>t()),restart(){n();},dispose(){u();}}}function d(o,t){let e=chunkWOZWFMOK_cjs.c(o()),n=null;return chunkWOZWFMOK_cjs.e(()=>{let u=o();return n&&clearTimeout(n),n=setTimeout(()=>e.set(u),t),()=>{n&&clearTimeout(n);}}),(()=>e())}function T(o,t){let e=chunkWOZWFMOK_cjs.c(o()),n=0,u=null;return chunkWOZWFMOK_cjs.e(()=>{let a=o(),l=Date.now(),r=l-n;return r>=t?(e.set(a),n=l):(u&&clearTimeout(u),u=setTimeout(()=>{e.set(a),n=Date.now();},t-r)),()=>{u&&clearTimeout(u);}}),(()=>e())}function p(o=0,t){let e=t?.min??-1/0,n=t?.max??1/0,u=l=>Math.min(n,Math.max(e,l)),a=chunkWOZWFMOK_cjs.c(u(o));return {count:(()=>a()),inc(l=1){a.update(r=>u(r+l));},dec(l=1){a.update(r=>u(r-l));},set(l){a.set(u(l));},reset(){a.set(u(o));}}}function y(o=false){let t=chunkWOZWFMOK_cjs.c(o);return {value:(()=>t()),toggle(){t.update(e=>!e);},setTrue(){t.set(true);},setFalse(){t.set(false);}}}function g(o){let t,e=chunkWOZWFMOK_cjs.c(void 0);return chunkWOZWFMOK_cjs.e(()=>{let n=o();e.set(t),t=n;}),(()=>e())}exports.a=m;exports.b=f;exports.c=d;exports.d=T;exports.e=p;exports.f=y;exports.g=g;//# sourceMappingURL=chunk-QE2TJ6P5.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-QE2TJ6P5.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/composables.ts"],"names":["useInterval","ms","options","count","signal","isActive","timer","start","stop","c","useTimeout","ready","useDebounce","source","delay","debounced","effect","value","useThrottle","interval","throttled","lastUpdate","now","elapsed","useCounter","initial","min","max","clamp","v","delta","useToggle","usePrevious","lastValue","tracked","current"],"mappings":"mEAoBO,SAASA,CAAAA,CAAYC,EAAYC,CAAAA,CAAmC,CACzE,IAAMC,CAAAA,CAAQC,mBAAAA,CAAO,CAAC,CAAA,CAChBC,CAAAA,CAAWD,mBAAAA,CAAOF,GAAS,SAAA,GAAc,KAAK,EAChDI,CAAAA,CAA+C,IAAA,CAEnD,SAASC,CAAAA,EAAQ,CACfC,CAAAA,EAAK,CACLF,CAAAA,CAAQ,WAAA,CAAY,IAAMH,CAAAA,CAAM,MAAA,CAAQM,GAAMA,CAAAA,CAAI,CAAC,EAAGR,CAAE,EAC1D,CAEA,SAASO,CAAAA,EAAO,CACVF,IAAS,aAAA,CAAcA,CAAK,CAAA,CAAGA,CAAAA,CAAQ,IAAA,EAC7C,CAEA,OAAID,CAAAA,EAAS,EAAGE,CAAAA,EAAM,CAEf,CACL,KAAA,EAAQ,IAAMJ,CAAAA,EAAM,CAAA,CACpB,UAAW,IAAME,CAAAA,IACjB,KAAA,EAAQ,CAAEA,CAAAA,CAAS,GAAA,CAAI,KAAK,CAAA,CAAGG,IAAQ,CAAA,CACvC,MAAA,EAAS,CAAEH,CAAAA,CAAS,GAAA,CAAI,IAAI,CAAA,CAAGE,CAAAA,GAAS,CAAA,CACxC,KAAA,EAAQ,CAAEJ,EAAM,GAAA,CAAI,CAAC,EAAG,CAAA,CACxB,OAAA,EAAU,CAAEK,CAAAA,GAAQ,CACtB,CACF,CAYO,SAASE,EAAWT,CAAAA,CAAY,CACrC,IAAMU,CAAAA,CAAQP,mBAAAA,CAAO,KAAK,EACtBE,CAAAA,CAA8C,IAAA,CAElD,SAASC,CAAAA,EAAQ,CACfC,CAAAA,GACAG,CAAAA,CAAM,GAAA,CAAI,KAAK,CAAA,CACfL,CAAAA,CAAQ,WAAW,IAAMK,CAAAA,CAAM,GAAA,CAAI,IAAI,CAAA,CAAGV,CAAE,EAC9C,CAEA,SAASO,GAAO,CACVF,CAAAA,GAAS,aAAaA,CAAK,CAAA,CAAGA,CAAAA,CAAQ,IAAA,EAC5C,CAEA,OAAAC,GAAM,CAEC,CACL,OAAQ,IAAMI,CAAAA,IACd,OAAA,EAAU,CAAEJ,CAAAA,GAAS,CAAA,CACrB,OAAA,EAAU,CAAEC,CAAAA,GAAQ,CACtB,CACF,CAcO,SAASI,EAAeC,CAAAA,CAAiBC,CAAAA,CAAkC,CAChF,IAAMC,CAAAA,CAAYX,mBAAAA,CAAUS,GAAQ,CAAA,CAChCP,EAA8C,IAAA,CAElD,OAAAU,oBAAO,IAAM,CACX,IAAMC,CAAAA,CAAQJ,CAAAA,EAAO,CACrB,OAAIP,CAAAA,EAAO,YAAA,CAAaA,CAAK,CAAA,CAC7BA,CAAAA,CAAQ,UAAA,CAAW,IAAMS,CAAAA,CAAU,GAAA,CAAIE,CAAK,CAAA,CAAGH,CAAK,CAAA,CAC7C,IAAM,CAAMR,CAAAA,EAAO,aAAaA,CAAK,EAAG,CACjD,CAAC,CAAA,EAEO,IAAMS,CAAAA,EAAU,CAC1B,CAYO,SAASG,CAAAA,CAAeL,CAAAA,CAAiBM,CAAAA,CAAqC,CACnF,IAAMC,CAAAA,CAAYhB,oBAAUS,CAAAA,EAAQ,CAAA,CAChCQ,CAAAA,CAAa,CAAA,CACbf,CAAAA,CAA8C,KAElD,OAAAU,mBAAAA,CAAO,IAAM,CACX,IAAMC,EAAQJ,CAAAA,EAAO,CACfS,CAAAA,CAAM,IAAA,CAAK,GAAA,EAAI,CACfC,EAAUD,CAAAA,CAAMD,CAAAA,CAEtB,OAAIE,CAAAA,EAAWJ,CAAAA,EACbC,EAAU,GAAA,CAAIH,CAAK,CAAA,CACnBI,CAAAA,CAAaC,CAAAA,GAEThB,CAAAA,EAAO,aAAaA,CAAK,CAAA,CAC7BA,EAAQ,UAAA,CAAW,IAAM,CACvBc,CAAAA,CAAU,GAAA,CAAIH,CAAK,CAAA,CACnBI,CAAAA,CAAa,IAAA,CAAK,MACpB,CAAA,CAAGF,CAAAA,CAAWI,CAAO,CAAA,CAAA,CAEhB,IAAM,CAAMjB,CAAAA,EAAO,YAAA,CAAaA,CAAK,EAAG,CACjD,CAAC,GAEO,IAAMc,CAAAA,GAChB,CAWO,SAASI,EAAWC,CAAAA,CAAU,CAAA,CAAGvB,CAAAA,CAA0C,CAChF,IAAMwB,CAAAA,CAAMxB,GAAS,GAAA,EAAO,EAAA,CAAA,CAAA,CACtByB,CAAAA,CAAMzB,CAAAA,EAAS,GAAA,EAAO,CAAA,CAAA,CAAA,CACtB0B,EAASC,CAAAA,EAAc,IAAA,CAAK,GAAA,CAAIF,CAAAA,CAAK,IAAA,CAAK,GAAA,CAAID,EAAKG,CAAC,CAAC,EACrD1B,CAAAA,CAAQC,mBAAAA,CAAOwB,EAAMH,CAAO,CAAC,CAAA,CACnC,OAAO,CACL,KAAA,EAAQ,IAAMtB,CAAAA,EAAM,CAAA,CACpB,GAAA,CAAI2B,CAAAA,CAAQ,CAAA,CAAG,CAAE3B,EAAM,MAAA,CAAQM,CAAAA,EAAMmB,CAAAA,CAAMnB,CAAAA,CAAIqB,CAAK,CAAC,EAAG,CAAA,CACxD,GAAA,CAAIA,EAAQ,CAAA,CAAG,CAAE3B,EAAM,MAAA,CAAQM,CAAAA,EAAMmB,CAAAA,CAAMnB,CAAAA,CAAIqB,CAAK,CAAC,EAAG,CAAA,CACxD,GAAA,CAAIb,EAAe,CAAEd,CAAAA,CAAM,IAAIyB,CAAAA,CAAMX,CAAK,CAAC,EAAG,CAAA,CAC9C,KAAA,EAAQ,CAAEd,CAAAA,CAAM,GAAA,CAAIyB,EAAMH,CAAO,CAAC,EAAG,CACvC,CACF,CAWO,SAASM,CAAAA,CAAUN,CAAAA,CAAU,MAAO,CACzC,IAAMR,CAAAA,CAAQb,mBAAAA,CAAOqB,CAAO,CAAA,CAC5B,OAAO,CACL,KAAA,EAAQ,IAAMR,CAAAA,EAAM,CAAA,CACpB,MAAA,EAAS,CAAEA,CAAAA,CAAM,MAAA,CAAQY,GAAM,CAACA,CAAC,EAAG,CAAA,CACpC,OAAA,EAAU,CAAEZ,CAAAA,CAAM,GAAA,CAAI,IAAI,EAAG,CAAA,CAC7B,QAAA,EAAW,CAAEA,CAAAA,CAAM,GAAA,CAAI,KAAK,EAAG,CACjC,CACF,CAcO,SAASe,CAAAA,CAAenB,CAAAA,CAAgD,CAC7E,IAAIoB,CAAAA,CACEC,EAAU9B,mBAAAA,CAAsB,MAAS,EAE/C,OAAAY,mBAAAA,CAAO,IAAM,CACX,IAAMmB,CAAAA,CAAUtB,GAAO,CACvBqB,CAAAA,CAAQ,GAAA,CAAID,CAAS,CAAA,CACrBA,CAAAA,CAAYE,EACd,CAAC,CAAA,EAEO,IAAMD,CAAAA,EAAQ,CACxB","file":"chunk-QE2TJ6P5.cjs","sourcesContent":["/**\n * Reactive composables — signal-based utility functions.\n *\n * Timers, debounce, throttle, and other commonly needed\n * reactive primitives that every app uses.\n */\n\nimport { signal, effect } from './signals.js';\nimport type { Signal, ReadonlySignal } from './signals.js';\n\n// --- useInterval ---\n\n/**\n * Create a reactive interval that ticks at a given rate.\n *\n * ```ts\n * const { count, pause, resume, reset } = useInterval(1000);\n * count(); // increments every second\n * ```\n */\nexport function useInterval(ms: number, options?: { immediate?: boolean }) {\n const count = signal(0);\n const isActive = signal(options?.immediate !== false);\n let timer: ReturnType<typeof setInterval> | null = null;\n\n function start() {\n stop();\n timer = setInterval(() => count.update((c) => c + 1), ms);\n }\n\n function stop() {\n if (timer) { clearInterval(timer); timer = null; }\n }\n\n if (isActive()) start();\n\n return {\n count: (() => count()) as ReadonlySignal<number>,\n isActive: (() => isActive()) as ReadonlySignal<boolean>,\n pause() { isActive.set(false); stop(); },\n resume() { isActive.set(true); start(); },\n reset() { count.set(0); },\n dispose() { stop(); },\n };\n}\n\n// --- useTimeout ---\n\n/**\n * Reactive timeout that exposes ready state.\n *\n * ```ts\n * const { ready, restart } = useTimeout(3000);\n * ready(); // false, then true after 3s\n * ```\n */\nexport function useTimeout(ms: number) {\n const ready = signal(false);\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n function start() {\n stop();\n ready.set(false);\n timer = setTimeout(() => ready.set(true), ms);\n }\n\n function stop() {\n if (timer) { clearTimeout(timer); timer = null; }\n }\n\n start();\n\n return {\n ready: (() => ready()) as ReadonlySignal<boolean>,\n restart() { start(); },\n dispose() { stop(); },\n };\n}\n\n// --- useDebounce ---\n\n/**\n * Debounce a signal value. The output updates only after the input\n * stops changing for the given delay.\n *\n * ```ts\n * const search = signal('');\n * const debouncedSearch = useDebounce(search, 300);\n * // debouncedSearch() updates 300ms after last search.set()\n * ```\n */\nexport function useDebounce<T>(source: () => T, delay: number): ReadonlySignal<T> {\n const debounced = signal<T>(source());\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n effect(() => {\n const value = source();\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => debounced.set(value), delay);\n return () => { if (timer) clearTimeout(timer); };\n });\n\n return (() => debounced()) as ReadonlySignal<T>;\n}\n\n// --- useThrottle ---\n\n/**\n * Throttle a signal value. The output updates at most once per interval.\n *\n * ```ts\n * const scrollY = signal(0);\n * const throttled = useThrottle(scrollY, 100);\n * ```\n */\nexport function useThrottle<T>(source: () => T, interval: number): ReadonlySignal<T> {\n const throttled = signal<T>(source());\n let lastUpdate = 0;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n effect(() => {\n const value = source();\n const now = Date.now();\n const elapsed = now - lastUpdate;\n\n if (elapsed >= interval) {\n throttled.set(value);\n lastUpdate = now;\n } else {\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n throttled.set(value);\n lastUpdate = Date.now();\n }, interval - elapsed);\n }\n return () => { if (timer) clearTimeout(timer); };\n });\n\n return (() => throttled()) as ReadonlySignal<T>;\n}\n\n// --- useCounter ---\n\n/**\n * Simple reactive counter with inc/dec/set/reset.\n *\n * ```ts\n * const { count, inc, dec, set, reset } = useCounter(0);\n * ```\n */\nexport function useCounter(initial = 0, options?: { min?: number; max?: number }) {\n const min = options?.min ?? -Infinity;\n const max = options?.max ?? Infinity;\n const clamp = (v: number) => Math.min(max, Math.max(min, v));\n const count = signal(clamp(initial));\n return {\n count: (() => count()) as ReadonlySignal<number>,\n inc(delta = 1) { count.update((c) => clamp(c + delta)); },\n dec(delta = 1) { count.update((c) => clamp(c - delta)); },\n set(value: number) { count.set(clamp(value)); },\n reset() { count.set(clamp(initial)); },\n };\n}\n\n// --- useToggle ---\n\n/**\n * Reactive boolean toggle.\n *\n * ```ts\n * const { value, toggle, setTrue, setFalse } = useToggle(false);\n * ```\n */\nexport function useToggle(initial = false) {\n const value = signal(initial);\n return {\n value: (() => value()) as ReadonlySignal<boolean>,\n toggle() { value.update((v) => !v); },\n setTrue() { value.set(true); },\n setFalse() { value.set(false); },\n };\n}\n\n// --- usePrevious ---\n\n/**\n * Track the previous value of a signal.\n *\n * ```ts\n * const count = signal(0);\n * const prev = usePrevious(count);\n * count.set(1);\n * prev(); // 0\n * ```\n */\nexport function usePrevious<T>(source: () => T): ReadonlySignal<T | undefined> {\n let lastValue: T | undefined;\n const tracked = signal<T | undefined>(undefined);\n\n effect(() => {\n const current = source();\n tracked.set(lastValue);\n lastValue = current;\n });\n\n return (() => tracked()) as ReadonlySignal<T | undefined>;\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {c,d,e}from'./chunk-YXKQTEPR.js';function T(s={}){let{themes:i={light:{},dark:{}},storageKey:t="akash-theme",attribute:f="data-theme",syncSystem:g=true}=s,o=Object.keys(i);function d$1(){return typeof window>"u"?s.defaultTheme??"light":window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function h(){if(typeof window<"u"&&t){let e=localStorage.getItem(t);if(e&&o.includes(e))return e}return s.defaultTheme??d$1()}let n=c(h()),a=d(()=>n()==="dark");function y(e){if(typeof document>"u")return;document.documentElement.setAttribute(f,e);let r=i[e];if(r)for(let[m,p]of Object.entries(r))document.documentElement.style.setProperty(m,p);document.documentElement.classList.remove(...o),document.documentElement.classList.add(e);}return e(()=>{let e=n();y(e),typeof window<"u"&&t&&localStorage.setItem(t,e);}),g&&typeof window<"u"&&window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",r=>{localStorage.getItem(t)||n.set(r.matches?"dark":"light");}),{current:()=>n(),isDark:a,set(e){o.includes(e)&&n.set(e);},toggle(){n.set(a()?"light":"dark");},setSystem(){typeof window<"u"&&t&&localStorage.removeItem(t),n.set(d$1());},themes:o}}export{T as a};//# sourceMappingURL=chunk-QNVMBXVH.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-QNVMBXVH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/theme.ts"],"names":["useTheme","config","themes","storageKey","attribute","syncSystem","themeNames","getSystemTheme","getInitialTheme","stored","current","signal","isDark","computed","applyTheme","name","vars","key","value","effect","e","theme"],"mappings":"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","file":"chunk-QNVMBXVH.js","sourcesContent":["/**\n * Theme / dark mode system.\n *\n * Signal-based theme management with system preference detection,\n * CSS variable injection, and localStorage persistence.\n *\n * ```ts\n * const theme = useTheme({\n * themes: {\n * light: { '--bg': '#fff', '--text': '#111' },\n * dark: { '--bg': '#111', '--text': '#eee' },\n * },\n * });\n *\n * theme.current(); // 'light' or 'dark'\n * theme.toggle(); // switch between light/dark\n * theme.set('dark'); // set explicitly\n * theme.isDark(); // boolean\n * ```\n */\n\nimport { signal, computed, effect } from './signals.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// --- Types ---\n\nexport type ThemeVariables = Record<string, string>;\n\nexport interface ThemeConfig {\n /** Theme definitions (name → CSS variables) */\n themes?: Record<string, ThemeVariables>;\n /** Default theme name (default: auto-detect from system) */\n defaultTheme?: string;\n /** localStorage key for persistence (default: 'akash-theme') */\n storageKey?: string;\n /** CSS attribute to set on <html> (default: 'data-theme') */\n attribute?: string;\n /** Whether to sync with system preference (default: true) */\n syncSystem?: boolean;\n}\n\nexport interface Theme {\n /** Current theme name (reactive) */\n current: ReadonlySignal<string>;\n /** Whether dark mode is active */\n isDark: ReadonlySignal<boolean>;\n /** Set a specific theme */\n set(theme: string): void;\n /** Toggle between light and dark */\n toggle(): void;\n /** Set the system preference strategy */\n setSystem(): void;\n /** Available theme names */\n themes: string[];\n}\n\n// --- Implementation ---\n\n/**\n * Create a theme manager with system preference detection and persistence.\n */\nexport function useTheme(config: ThemeConfig = {}): Theme {\n const {\n themes = {\n light: {},\n dark: {},\n },\n storageKey = 'akash-theme',\n attribute = 'data-theme',\n syncSystem = true,\n } = config;\n\n const themeNames = Object.keys(themes);\n\n // Detect system preference\n function getSystemTheme(): string {\n if (typeof window === 'undefined') return config.defaultTheme ?? 'light';\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n\n // Read persisted theme or use default\n function getInitialTheme(): string {\n if (typeof window !== 'undefined' && storageKey) {\n const stored = localStorage.getItem(storageKey);\n if (stored && themeNames.includes(stored)) return stored;\n }\n return config.defaultTheme ?? getSystemTheme();\n }\n\n const current = signal(getInitialTheme());\n const isDark = computed(() => current() === 'dark');\n\n // Apply theme\n function applyTheme(name: string): void {\n if (typeof document === 'undefined') return;\n\n // Set attribute on <html>\n document.documentElement.setAttribute(attribute, name);\n\n // Apply CSS variables\n const vars = themes[name];\n if (vars) {\n for (const [key, value] of Object.entries(vars)) {\n document.documentElement.style.setProperty(key, value);\n }\n }\n\n // Add/remove class for convenience\n document.documentElement.classList.remove(...themeNames);\n document.documentElement.classList.add(name);\n }\n\n // React to theme changes\n effect(() => {\n const name = current();\n applyTheme(name);\n\n // Persist\n if (typeof window !== 'undefined' && storageKey) {\n localStorage.setItem(storageKey, name);\n }\n });\n\n // Sync with system preference changes\n if (syncSystem && typeof window !== 'undefined') {\n const mql = window.matchMedia('(prefers-color-scheme: dark)');\n mql.addEventListener('change', (e) => {\n // Only auto-switch if user hasn't manually overridden\n const stored = localStorage.getItem(storageKey);\n if (!stored) {\n current.set(e.matches ? 'dark' : 'light');\n }\n });\n }\n\n return {\n current: () => current(),\n isDark,\n set(theme: string) {\n if (themeNames.includes(theme)) {\n current.set(theme);\n }\n },\n toggle() {\n current.set(isDark() ? 'light' : 'dark');\n },\n setSystem() {\n if (typeof window !== 'undefined' && storageKey) {\n localStorage.removeItem(storageKey);\n }\n current.set(getSystemTheme());\n },\n themes: themeNames,\n };\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {c}from'./chunk-YXKQTEPR.js';function b(l){let{onLoadMore:a,hasMore:s,rootMargin:d="200px",threshold:f=0}=l,n=c(false),t=c(false),r=null,e=null,i=false;async function u(){if(!(n()||t()||i)){if(!s()){t.set(true);return}n.set(true);try{await a(),s()||t.set(!0);}finally{n.set(false);}}}function c$1(p){typeof IntersectionObserver>"u"||(r=new IntersectionObserver(g=>{g[0]?.isIntersecting&&u();},{rootMargin:d,threshold:f}),r.observe(p));}function m(){return e||(e=document.createElement("div"),e.setAttribute("data-akash-sentinel",""),e.style.height="1px",e.setAttribute("aria-hidden","true"),requestAnimationFrame(()=>{e&&!i&&c$1(e);}),e)}return {sentinel:m,loading:()=>n(),done:()=>t(),reset(){t.set(false),n.set(false);},dispose(){i=true,r?.disconnect(),r=null;}}}export{b as a};//# sourceMappingURL=chunk-QQ725EZL.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-QQ725EZL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/infinite-scroll.ts"],"names":["useInfiniteScroll","options","onLoadMore","hasMore","rootMargin","threshold","loading","signal","done","observer","sentinelEl","disposed","handleIntersect","createObserver","el","entries","sentinel"],"mappings":"oCAqDO,SAASA,EAAkBC,CAAAA,CAAgD,CAChF,GAAM,CAAE,UAAA,CAAAC,EAAY,OAAA,CAAAC,CAAAA,CAAS,UAAA,CAAAC,CAAAA,CAAa,QAAS,SAAA,CAAAC,CAAAA,CAAY,CAAE,CAAA,CAAIJ,CAAAA,CAE/DK,EAAUC,CAAAA,CAAO,KAAK,CAAA,CACtBC,CAAAA,CAAOD,EAAO,KAAK,CAAA,CACrBE,EAAwC,IAAA,CACxCC,CAAAA,CAAiC,KACjCC,CAAAA,CAAW,KAAA,CAEf,eAAeC,CAAAA,EAAiC,CAC9C,GAAI,EAAAN,CAAAA,IAAaE,CAAAA,EAAK,EAAKG,GAC3B,CAAA,GAAI,CAACR,CAAAA,EAAQ,CAAG,CACdK,CAAAA,CAAK,GAAA,CAAI,IAAI,CAAA,CACb,MACF,CAEAF,CAAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,CAChB,GAAI,CACF,MAAMJ,GAAW,CACZC,CAAAA,IACHK,CAAAA,CAAK,GAAA,CAAI,CAAA,CAAI,EAEjB,QAAE,CACAF,CAAAA,CAAQ,IAAI,KAAK,EACnB,EACF,CAEA,SAASO,IAAeC,CAAAA,CAAuB,CACzC,OAAO,oBAAA,CAAyB,GAAA,GAEpCL,EAAW,IAAI,oBAAA,CACZM,GAAY,CACPA,CAAAA,CAAQ,CAAC,CAAA,EAAG,gBACdH,CAAAA,GAEJ,EACA,CAAE,UAAA,CAAAR,EAAY,SAAA,CAAAC,CAAU,CAC1B,CAAA,CAEAI,EAAS,OAAA,CAAQK,CAAE,GACrB,CAEA,SAASE,GAAwB,CAC/B,OAAIN,CAAAA,GAEJA,CAAAA,CAAa,SAAS,aAAA,CAAc,KAAK,EACzCA,CAAAA,CAAW,YAAA,CAAa,sBAAuB,EAAE,CAAA,CACjDA,EAAW,KAAA,CAAM,MAAA,CAAS,MAC1BA,CAAAA,CAAW,YAAA,CAAa,cAAe,MAAM,CAAA,CAG7C,sBAAsB,IAAM,CACtBA,CAAAA,EAAc,CAACC,GACjBE,GAAAA,CAAeH,CAAU,EAE7B,CAAC,CAAA,CAEMA,EACT,CAEA,OAAO,CACL,QAAA,CAAAM,EACA,OAAA,CAAS,IAAMV,GAAQ,CACvB,IAAA,CAAM,IAAME,CAAAA,EAAK,CACjB,KAAA,EAAQ,CACNA,EAAK,GAAA,CAAI,KAAK,EACdF,CAAAA,CAAQ,GAAA,CAAI,KAAK,EACnB,CAAA,CACA,SAAU,CACRK,CAAAA,CAAW,KACXF,CAAAA,EAAU,UAAA,GACVA,CAAAA,CAAW,KACb,CACF,CACF","file":"chunk-QQ725EZL.js","sourcesContent":["/**\n * Infinite scroll composable.\n *\n * Uses IntersectionObserver to detect when a sentinel element\n * enters the viewport, then triggers loading more data.\n * Pairs with createCursorPagination() from @akashjs/http.\n *\n * ```ts\n * const { sentinel, loading, done } = useInfiniteScroll({\n * onLoadMore: async () => {\n * pager.loadMore();\n * await fetchNextPage();\n * },\n * hasMore: () => pager.hasMore(),\n * });\n * // Append sentinel() element at the end of your list\n * ```\n */\n\nimport { signal } from './signals.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// --- Types ---\n\nexport interface InfiniteScrollOptions {\n /** Callback to load more items */\n onLoadMore: () => Promise<void> | void;\n /** Whether there are more items to load */\n hasMore: () => boolean;\n /** Root margin for the observer (default: '200px') */\n rootMargin?: string;\n /** Threshold for the observer (default: 0) */\n threshold?: number;\n}\n\nexport interface InfiniteScroll {\n /** Sentinel element to place at the end of the list */\n sentinel: () => HTMLElement;\n /** Whether a load is in progress */\n loading: ReadonlySignal<boolean>;\n /** Whether all items have been loaded */\n done: ReadonlySignal<boolean>;\n /** Reset the scroll state */\n reset(): void;\n /** Dispose the observer */\n dispose(): void;\n}\n\n// --- Implementation ---\n\n/**\n * Create an infinite scroll controller.\n */\nexport function useInfiniteScroll(options: InfiniteScrollOptions): InfiniteScroll {\n const { onLoadMore, hasMore, rootMargin = '200px', threshold = 0 } = options;\n\n const loading = signal(false);\n const done = signal(false);\n let observer: IntersectionObserver | null = null;\n let sentinelEl: HTMLElement | null = null;\n let disposed = false;\n\n async function handleIntersect(): Promise<void> {\n if (loading() || done() || disposed) return;\n if (!hasMore()) {\n done.set(true);\n return;\n }\n\n loading.set(true);\n try {\n await onLoadMore();\n if (!hasMore()) {\n done.set(true);\n }\n } finally {\n loading.set(false);\n }\n }\n\n function createObserver(el: HTMLElement): void {\n if (typeof IntersectionObserver === 'undefined') return;\n\n observer = new IntersectionObserver(\n (entries) => {\n if (entries[0]?.isIntersecting) {\n handleIntersect();\n }\n },\n { rootMargin, threshold },\n );\n\n observer.observe(el);\n }\n\n function sentinel(): HTMLElement {\n if (sentinelEl) return sentinelEl;\n\n sentinelEl = document.createElement('div');\n sentinelEl.setAttribute('data-akash-sentinel', '');\n sentinelEl.style.height = '1px';\n sentinelEl.setAttribute('aria-hidden', 'true');\n\n // Start observing\n requestAnimationFrame(() => {\n if (sentinelEl && !disposed) {\n createObserver(sentinelEl);\n }\n });\n\n return sentinelEl;\n }\n\n return {\n sentinel,\n loading: () => loading(),\n done: () => done(),\n reset() {\n done.set(false);\n loading.set(false);\n },\n dispose() {\n disposed = true;\n observer?.disconnect();\n observer = null;\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';function s(e){return {_type:"directive",hooks:e}}function c(e){return s({mounted(n,t){let i=e(n,t);typeof i=="function"&&(n.__directiveCleanup=i);},unmounted(n){n.__directiveCleanup?.();}})}var a=Symbol("akash.directives");function d(e,n,t,i){let o={value:t,arg:i?.arg,modifiers:i?.modifiers},r=e[a]??[];r.push({directive:n,binding:o}),e[a]=r,n.hooks.mounted?.(e,o);}function v(e,n,t){let o=(e[a]??[]).find(r=>r.directive===n);if(o){let r=o.binding.value;o.binding={...o.binding,value:t,oldValue:r},n.hooks.updated?.(e,o.binding);}}function u(e){let n=e[a]??[];for(let t of n)t.directive.hooks.unmounted?.(e,t.binding);delete e[a];}var m=s({mounted(e){requestAnimationFrame(()=>e.focus());}}),l=s({mounted(e,{value:n}){let t=i=>{e.contains(i.target)||n();};document.addEventListener("click",t,true),e.__vClickOutside=t;},unmounted(e){document.removeEventListener("click",e.__vClickOutside,true),delete e.__vClickOutside;}}),T=s({mounted(e,{value:n}){let t=null,i=n.duration??500,o=()=>{t=setTimeout(n.handler,i);},r=()=>{t&&(clearTimeout(t),t=null);};e.addEventListener("pointerdown",o),e.addEventListener("pointerup",r),e.addEventListener("pointerleave",r),e.__vLongPress={start:o,cancel:r};},unmounted(e){let n=e.__vLongPress;n&&(e.removeEventListener("pointerdown",n.start),e.removeEventListener("pointerup",n.cancel),e.removeEventListener("pointerleave",n.cancel));}}),p=s({mounted(e,{value:n}){let t=new IntersectionObserver(i=>{n(i[0].isIntersecting);});t.observe(e),e.__vIntersect=t;},unmounted(e){e.__vIntersect?.disconnect();}}),g=s({mounted(e,{value:n}){let t=new ResizeObserver(i=>{n(i[0]);});t.observe(e),e.__vResize=t;},unmounted(e){e.__vResize?.disconnect();}});exports.a=s;exports.b=c;exports.c=d;exports.d=v;exports.e=u;exports.f=m;exports.g=l;exports.h=T;exports.i=p;exports.j=g;//# sourceMappingURL=chunk-QQTZQ6UX.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-QQTZQ6UX.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/directive.ts"],"names":["defineDirective","hooks","directiveFromFn","fn","el","binding","cleanup","DIRECTIVE_KEY","applyDirective","directive","value","options","states","updateDirective","newValue","state","s","oldValue","removeDirectives","vAutoFocus","vClickOutside","handler","listener","e","vLongPress","timer","duration","start","cancel","fns","vIntersect","callback","observer","entries","vResize"],"mappings":"aA0EO,SAASA,CAAAA,CAAyBC,EAAwC,CAC/E,OAAO,CAAE,KAAA,CAAO,WAAA,CAAa,MAAAA,CAAM,CACrC,CAKO,SAASC,CAAAA,CACdC,EACc,CACd,OAAOH,EAAmB,CACxB,OAAA,CAAQI,CAAAA,CAAIC,CAAAA,CAAS,CACnB,IAAMC,EAAUH,CAAAA,CAAGC,CAAAA,CAAIC,CAAO,CAAA,CAC1B,OAAOC,GAAY,UAAA,GACpBF,CAAAA,CAAW,kBAAA,CAAqBE,CAAAA,EAErC,CAAA,CACA,SAAA,CAAUF,EAAI,CACXA,CAAAA,CAAW,uBACd,CACF,CAAC,CACH,CAMA,IAAMG,CAAAA,CAAgB,MAAA,CAAO,kBAAkB,EAexC,SAASC,CAAAA,CACdJ,EACAK,CAAAA,CACAC,CAAAA,CACAC,EACM,CACN,IAAMN,EAA+B,CACnC,KAAA,CAAOK,EACP,GAAA,CAAKC,CAAAA,EAAS,IACd,SAAA,CAAWA,CAAAA,EAAS,SACtB,CAAA,CAGMC,CAAAA,CAA4BR,CAAAA,CAAWG,CAAa,CAAA,EAAK,GAC/DK,CAAAA,CAAO,IAAA,CAAK,CAAE,SAAA,CAAAH,CAAAA,CAAW,QAAAJ,CAAQ,CAAC,CAAA,CACjCD,CAAAA,CAAWG,CAAa,CAAA,CAAIK,EAG7BH,CAAAA,CAAU,KAAA,CAAM,UAAUL,CAAAA,CAAIC,CAAO,EACvC,CAKO,SAASQ,CAAAA,CACdT,CAAAA,CACAK,CAAAA,CACAK,CAAAA,CACM,CAEN,IAAMC,CAAAA,CAAAA,CAD4BX,EAAWG,CAAa,CAAA,EAAK,EAAC,EAC3C,IAAA,CAAMS,GAAMA,CAAAA,CAAE,SAAA,GAAcP,CAAS,CAAA,CAE1D,GAAIM,EAAO,CACT,IAAME,EAAWF,CAAAA,CAAM,OAAA,CAAQ,KAAA,CAC/BA,CAAAA,CAAM,OAAA,CAAU,CAAE,GAAGA,CAAAA,CAAM,OAAA,CAAS,MAAOD,CAAAA,CAAU,QAAA,CAAAG,CAAS,CAAA,CAC9DR,CAAAA,CAAU,KAAA,CAAM,OAAA,GAAUL,CAAAA,CAAIW,CAAAA,CAAM,OAAO,EAC7C,CACF,CAKO,SAASG,CAAAA,CAAiBd,EAAuB,CACtD,IAAMQ,CAAAA,CAA4BR,CAAAA,CAAWG,CAAa,CAAA,EAAK,EAAC,CAChE,IAAA,IAAWQ,KAASH,CAAAA,CAClBG,CAAAA,CAAM,UAAU,KAAA,CAAM,SAAA,GAAYX,EAAIW,CAAAA,CAAM,OAAO,EAErD,OAAQX,CAAAA,CAAWG,CAAa,EAClC,KAOaY,CAAAA,CAAanB,CAAAA,CAAgB,CACxC,OAAA,CAAQI,CAAAA,CAAI,CACV,sBAAsB,IAAMA,CAAAA,CAAG,OAAO,EACxC,CACF,CAAC,CAAA,CAGYgB,CAAAA,CAAgBpB,CAAAA,CAA4B,CACvD,OAAA,CAAQI,EAAI,CAAE,KAAA,CAAOiB,CAAQ,CAAA,CAAG,CAC9B,IAAMC,CAAAA,CAAYC,CAAAA,EAAa,CACxBnB,CAAAA,CAAG,QAAA,CAASmB,CAAAA,CAAE,MAAc,CAAA,EAAGF,CAAAA,GACtC,CAAA,CACA,QAAA,CAAS,iBAAiB,OAAA,CAASC,CAAAA,CAAU,IAAI,CAAA,CAChDlB,CAAAA,CAAW,gBAAkBkB,EAChC,CAAA,CACA,UAAUlB,CAAAA,CAAI,CACZ,SAAS,mBAAA,CAAoB,OAAA,CAAUA,CAAAA,CAAW,eAAA,CAAiB,IAAI,CAAA,CACvE,OAAQA,CAAAA,CAAW,gBACrB,CACF,CAAC,CAAA,CAGYoB,EAAaxB,CAAAA,CAA4D,CACpF,OAAA,CAAQI,CAAAA,CAAI,CAAE,KAAA,CAAAM,CAAM,CAAA,CAAG,CACrB,IAAIe,CAAAA,CAA8C,IAAA,CAC5CC,EAAWhB,CAAAA,CAAM,QAAA,EAAY,GAAA,CAE7BiB,CAAAA,CAAQ,IAAM,CAAEF,EAAQ,UAAA,CAAWf,CAAAA,CAAM,QAASgB,CAAQ,EAAG,EAC7DE,CAAAA,CAAS,IAAM,CAAMH,CAAAA,GAAS,YAAA,CAAaA,CAAK,CAAA,CAAGA,CAAAA,CAAQ,MAAQ,CAAA,CAEzErB,CAAAA,CAAG,iBAAiB,aAAA,CAAeuB,CAAK,CAAA,CACxCvB,CAAAA,CAAG,gBAAA,CAAiB,WAAA,CAAawB,CAAM,CAAA,CACvCxB,CAAAA,CAAG,iBAAiB,cAAA,CAAgBwB,CAAM,EAEzCxB,CAAAA,CAAW,YAAA,CAAe,CAAE,KAAA,CAAAuB,CAAAA,CAAO,MAAA,CAAAC,CAAO,EAC7C,CAAA,CACA,UAAUxB,CAAAA,CAAI,CACZ,IAAMyB,CAAAA,CAAOzB,CAAAA,CAAW,YAAA,CACpByB,CAAAA,GACFzB,CAAAA,CAAG,mBAAA,CAAoB,cAAeyB,CAAAA,CAAI,KAAK,EAC/CzB,CAAAA,CAAG,mBAAA,CAAoB,YAAayB,CAAAA,CAAI,MAAM,EAC9CzB,CAAAA,CAAG,mBAAA,CAAoB,eAAgByB,CAAAA,CAAI,MAAM,GAErD,CACF,CAAC,EAGYC,CAAAA,CAAa9B,CAAAA,CAAmD,CAC3E,OAAA,CAAQI,CAAAA,CAAI,CAAE,MAAO2B,CAAS,CAAA,CAAG,CAC/B,IAAMC,CAAAA,CAAW,IAAI,oBAAA,CAAsBC,CAAAA,EAAY,CACrDF,CAAAA,CAASE,CAAAA,CAAQ,CAAC,EAAE,cAAc,EACpC,CAAC,CAAA,CACDD,CAAAA,CAAS,QAAQ5B,CAAE,CAAA,CAClBA,CAAAA,CAAW,YAAA,CAAe4B,EAC7B,CAAA,CACA,UAAU5B,CAAAA,CAAI,CACXA,EAAW,YAAA,EAAc,UAAA,GAC5B,CACF,CAAC,EAGY8B,CAAAA,CAAUlC,CAAAA,CAAsD,CAC3E,OAAA,CAAQI,CAAAA,CAAI,CAAE,KAAA,CAAO2B,CAAS,EAAG,CAC/B,IAAMC,CAAAA,CAAW,IAAI,cAAA,CAAgBC,CAAAA,EAAY,CAC/CF,CAAAA,CAASE,CAAAA,CAAQ,CAAC,CAAC,EACrB,CAAC,CAAA,CACDD,CAAAA,CAAS,OAAA,CAAQ5B,CAAE,CAAA,CAClBA,CAAAA,CAAW,UAAY4B,EAC1B,CAAA,CACA,UAAU5B,CAAAA,CAAI,CACXA,EAAW,SAAA,EAAW,UAAA,GACzB,CACF,CAAC","file":"chunk-QQTZQ6UX.cjs","sourcesContent":["/**\n * Custom directive system.\n *\n * Reusable attribute behaviors with lifecycle hooks.\n * Directives attach behavior to elements without components.\n *\n * ```ts\n * const vAutoFocus = defineDirective({\n * mounted(el) { el.focus(); },\n * });\n *\n * const vTooltip = defineDirective<string>({\n * mounted(el, { value }) { addTooltip(el, value); },\n * updated(el, { value }) { updateTooltip(el, value); },\n * unmounted(el) { removeTooltip(el); },\n * });\n *\n * // Usage:\n * applyDirective(el, vAutoFocus);\n * applyDirective(el, vTooltip, 'Hello tooltip');\n * ```\n */\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport interface DirectiveBinding<T = any> {\n /** Current value passed to the directive */\n value: T;\n /** Previous value (on update) */\n oldValue?: T;\n /** Argument (e.g., v-on:click → arg = 'click') */\n arg?: string;\n /** Modifiers (e.g., v-on.prevent → modifiers.prevent = true) */\n modifiers?: Record<string, boolean>;\n}\n\nexport interface DirectiveHooks<T = any> {\n /** Called when the element is inserted into the DOM */\n mounted?: (el: HTMLElement, binding: DirectiveBinding<T>) => void;\n /** Called when the bound value updates */\n updated?: (el: HTMLElement, binding: DirectiveBinding<T>) => void;\n /** Called before the element is removed from the DOM */\n unmounted?: (el: HTMLElement, binding: DirectiveBinding<T>) => void;\n}\n\nexport interface Directive<T = any> {\n _type: 'directive';\n hooks: DirectiveHooks<T>;\n}\n\n// =========================================================================\n// defineDirective\n// =========================================================================\n\n/**\n * Define a custom directive.\n *\n * ```ts\n * const vClickOutside = defineDirective<() => void>({\n * mounted(el, { value: handler }) {\n * const listener = (e: Event) => {\n * if (!el.contains(e.target as Node)) handler();\n * };\n * document.addEventListener('click', listener);\n * (el as any).__clickOutside = listener;\n * },\n * unmounted(el) {\n * document.removeEventListener('click', (el as any).__clickOutside);\n * },\n * });\n * ```\n */\nexport function defineDirective<T = any>(hooks: DirectiveHooks<T>): Directive<T> {\n return { _type: 'directive', hooks };\n}\n\n/**\n * Shorthand: directive from a single function (runs on mount).\n */\nexport function directiveFromFn<T = any>(\n fn: (el: HTMLElement, binding: DirectiveBinding<T>) => void | (() => void),\n): Directive<T> {\n return defineDirective<T>({\n mounted(el, binding) {\n const cleanup = fn(el, binding);\n if (typeof cleanup === 'function') {\n (el as any).__directiveCleanup = cleanup;\n }\n },\n unmounted(el) {\n (el as any).__directiveCleanup?.();\n },\n });\n}\n\n// =========================================================================\n// applyDirective — attach a directive to an element\n// =========================================================================\n\nconst DIRECTIVE_KEY = Symbol('akash.directives');\n\ninterface DirectiveState {\n directive: Directive;\n binding: DirectiveBinding;\n}\n\n/**\n * Apply a directive to an element.\n *\n * ```ts\n * applyDirective(el, vAutoFocus);\n * applyDirective(el, vTooltip, 'Hello');\n * ```\n */\nexport function applyDirective<T>(\n el: HTMLElement,\n directive: Directive<T>,\n value?: T,\n options?: { arg?: string; modifiers?: Record<string, boolean> },\n): void {\n const binding: DirectiveBinding<T> = {\n value: value as T,\n arg: options?.arg,\n modifiers: options?.modifiers,\n };\n\n // Store directive state on element\n const states: DirectiveState[] = (el as any)[DIRECTIVE_KEY] ?? [];\n states.push({ directive, binding });\n (el as any)[DIRECTIVE_KEY] = states;\n\n // Call mounted hook\n directive.hooks.mounted?.(el, binding);\n}\n\n/**\n * Update a directive's value on an element.\n */\nexport function updateDirective<T>(\n el: HTMLElement,\n directive: Directive<T>,\n newValue: T,\n): void {\n const states: DirectiveState[] = (el as any)[DIRECTIVE_KEY] ?? [];\n const state = states.find((s) => s.directive === directive);\n\n if (state) {\n const oldValue = state.binding.value;\n state.binding = { ...state.binding, value: newValue, oldValue };\n directive.hooks.updated?.(el, state.binding);\n }\n}\n\n/**\n * Remove all directives from an element (call on unmount).\n */\nexport function removeDirectives(el: HTMLElement): void {\n const states: DirectiveState[] = (el as any)[DIRECTIVE_KEY] ?? [];\n for (const state of states) {\n state.directive.hooks.unmounted?.(el, state.binding);\n }\n delete (el as any)[DIRECTIVE_KEY];\n}\n\n// =========================================================================\n// Built-in directives\n// =========================================================================\n\n/** Auto-focus an element when mounted */\nexport const vAutoFocus = defineDirective({\n mounted(el) {\n requestAnimationFrame(() => el.focus());\n },\n});\n\n/** Click outside handler */\nexport const vClickOutside = defineDirective<() => void>({\n mounted(el, { value: handler }) {\n const listener = (e: Event) => {\n if (!el.contains(e.target as Node)) handler();\n };\n document.addEventListener('click', listener, true);\n (el as any).__vClickOutside = listener;\n },\n unmounted(el) {\n document.removeEventListener('click', (el as any).__vClickOutside, true);\n delete (el as any).__vClickOutside;\n },\n});\n\n/** Long press handler */\nexport const vLongPress = defineDirective<{ handler: () => void; duration?: number }>({\n mounted(el, { value }) {\n let timer: ReturnType<typeof setTimeout> | null = null;\n const duration = value.duration ?? 500;\n\n const start = () => { timer = setTimeout(value.handler, duration); };\n const cancel = () => { if (timer) { clearTimeout(timer); timer = null; } };\n\n el.addEventListener('pointerdown', start);\n el.addEventListener('pointerup', cancel);\n el.addEventListener('pointerleave', cancel);\n\n (el as any).__vLongPress = { start, cancel };\n },\n unmounted(el) {\n const fns = (el as any).__vLongPress;\n if (fns) {\n el.removeEventListener('pointerdown', fns.start);\n el.removeEventListener('pointerup', fns.cancel);\n el.removeEventListener('pointerleave', fns.cancel);\n }\n },\n});\n\n/** Intersection observer — triggers callback when element enters viewport */\nexport const vIntersect = defineDirective<(isIntersecting: boolean) => void>({\n mounted(el, { value: callback }) {\n const observer = new IntersectionObserver((entries) => {\n callback(entries[0].isIntersecting);\n });\n observer.observe(el);\n (el as any).__vIntersect = observer;\n },\n unmounted(el) {\n (el as any).__vIntersect?.disconnect();\n },\n});\n\n/** Resize observer — triggers callback on element resize */\nexport const vResize = defineDirective<(entry: ResizeObserverEntry) => void>({\n mounted(el, { value: callback }) {\n const observer = new ResizeObserver((entries) => {\n callback(entries[0]);\n });\n observer.observe(el);\n (el as any).__vResize = observer;\n },\n unmounted(el) {\n (el as any).__vResize?.disconnect();\n },\n});\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
'use strict';var chunkNEQ5TENE_cjs=require('./chunk-NEQ5TENE.cjs'),chunkWOZWFMOK_cjs=require('./chunk-WOZWFMOK.cjs');var K=[];function F(c){K.push(...c.plugins);}var k=new Map;function D(c,f){return ()=>{if(k.has(c))return k.get(c);let o=f.state(),n=$(c,o,f);return k.set(c,n),n}}function $(c,f,o){let n={},p=Object.keys(f);for(let e of p)n[e]=chunkWOZWFMOK_cjs.c(f[e]);let i={$id:c};for(let e of p)i[e]=n[e];let h=[],m=[];if(i.$__meta={stateKeys:p,getterKeys:h,actionKeys:m},o.getters)for(let[e,t]of Object.entries(o.getters))h.push(e),i[e]=chunkWOZWFMOK_cjs.d(()=>t.call(i,n));let R=[...K,...o.plugins??[]];if(o.actions)for(let[e,t]of Object.entries(o.actions))m.push(e),i[e]=(...S)=>{for(let s of R)s.onAction?.(i,e,S);return t.apply(i,S)};i.$reset=()=>{let e=o.state();for(let t of p)n[t].set(e[t]);},i.$patch=e=>{chunkWOZWFMOK_cjs.a(()=>{if(typeof e=="function")e(n);else for(let[t,S]of Object.entries(e))t in n&&n[t].set(S);});},i.$snapshot=()=>{let e={};for(let t of p)e[t]=n[t]();return e};let w=new Set,d=null;if(i.$subscribe=e=>{if(w.add(e),!d){let t=true;d=chunkWOZWFMOK_cjs.e(()=>{for(let s of p)n[s]();if(t){t=false;return}let S=i.$snapshot();for(let s of w)s(S);});}return ()=>{w.delete(e),w.size===0&&d&&(d(),d=null);}},o.persist&&typeof window<"u"){let e=O(c,o.persist);for(let t of e){let S=t.storage==="sessionStorage"?sessionStorage:localStorage,s=t.serialize??JSON.stringify,y=t.deserialize??JSON.parse,g=t.pick??p;try{let r=S.getItem(t.key);if(r){let a=y(r);for(let l of g)l in a&&l in n&&n[l].set(a[l]);}}catch{}let u=false,b=true;chunkWOZWFMOK_cjs.e(()=>{for(let r of g)r in n&&n[r]();if(b){b=false;return}u||(u=true,queueMicrotask(()=>{u=false;let r={};for(let a of g)a in n&&(r[a]=n[a].peek());try{S.setItem(t.key,s(r));}catch{}}));}),t.storage!=="sessionStorage"&&window.addEventListener("storage",r=>{if(!(r.key!==t.key||!r.newValue))try{let a=y(r.newValue);for(let l of g)l in a&&l in n&&n[l].set(a[l]);}catch{}});}}if(o.sync&&o.sync.enabled!==false){let e=o.sync,t=e.pick??p,S={};for(let y of t)S[y]=n[y]?.peek?.()??f[y];let s=chunkNEQ5TENE_cjs.d(S,{transport:e.transport,peerId:e.peerId});for(let y of t){if(!(y in n)||!(y in s.state))continue;let g=n[y],u=s.state[y],b=g.set,r=false;g.set=a=>{b.call(g,a),r||u.set(a);},chunkWOZWFMOK_cjs.e(()=>{let a=u();r=true,g.set(a),r=false;});}i.$sync={peers:s.peers,presence:s.presence,peerPresence:s.peerPresence,peerId:s.peerId,connected:s.connected,connect:s.connect.bind(s),disconnect:s.disconnect.bind(s)};}for(let e of R)e.init?.(i);return i}function O(c,f){return f===true?[{key:`akash-store:${c}`}]:f===false?[]:Array.isArray(f)?f.map((o,n)=>({...o,key:o.key??`akash-store:${c}:${n}`})):[{...f,key:f.key??`akash-store:${c}`}]}function _(){k.clear();}function E(){return Object.fromEntries(k)}exports.a=F;exports.b=D;exports.c=_;exports.d=E;//# sourceMappingURL=chunk-QSPRVXFV.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-QSPRVXFV.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/store.ts"],"names":["globalPlugins","configureStores","options","storeInstances","defineStore","id","definition","initialState","store","createStoreInstance","stateSignals","stateKeys","key","signal","getterKeys","actionKeys","getterFn","computed","plugins","actionFn","args","plugin","fresh","partialOrFn","batch","value","snapshot","subscribers","subscribeEffect","callback","isInitial","effect","cb","configs","normalizePersistConfigs","cfg","storage","serialize","deserialize","persistKeys","raw","saved","persistScheduled","isInitialPersist","e","updated","syncOpts","syncKeys","syncState","doc","createSync","localSignal","syncSignal","originalSet","fromSync","remoteVal","persist","p","i","clearStores","__getStoreInstances"],"mappings":"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","file":"chunk-AVVJKYT3.cjs","sourcesContent":["/**\n * Global state management via defineStore().\n *\n * Stores are singleton signal containers that persist across\n * components. They provide shared state, computed getters,\n * and actions — no external library needed.\n *\n * ```ts\n * const useCounterStore = defineStore('counter', {\n * state: () => ({ count: 0, name: 'Counter' }),\n * getters: {\n * doubled: (state) => state.count() * 2,\n * },\n * actions: {\n * increment() { this.count.update(c => c + 1); },\n * reset() { this.count.set(0); },\n * },\n * });\n *\n * // In any component:\n * const store = useCounterStore();\n * store.count(); // 0\n * store.doubled(); // 0\n * store.increment();\n * store.count(); // 1\n * ```\n */\n\nimport { signal, computed, effect } from './signals.js';\nimport { batch } from './scheduler.js';\nimport { createSync } from './sync.js';\nimport type { SyncDoc } from './sync.js';\nimport type { Signal, ReadonlySignal } from './signals.js';\n\n// --- Types ---\n\ntype StateFactory<S> = () => S;\n\ntype Getters<S, G> = {\n [K in keyof G]: (state: SignalifiedState<S>) => G[K];\n};\n\ntype Actions<A> = {\n [K in keyof A]: A[K] extends (...args: infer P) => infer R\n ? (...args: P) => R\n : never;\n};\n\n/** Maps plain state values to signals */\ntype SignalifiedState<S> = {\n [K in keyof S]: Signal<S[K]>;\n};\n\n/** The store instance returned to consumers */\nexport type Store<S, G, A> = SignalifiedState<S> & {\n [K in keyof G]: ReadonlySignal<G[K]>;\n} & {\n [K in keyof A]: A[K] extends (...args: infer P) => infer R\n ? (...args: P) => R\n : never;\n} & {\n /** Reset all state to initial values */\n $reset(): void;\n /** Merge partial state into the store, or apply changes via callback */\n $patch(partialOrFn: Partial<S> | ((state: SignalifiedState<S>) => void)): void;\n /** Subscribe to all state changes */\n $subscribe(callback: (state: S) => void): () => void;\n /** Get a plain snapshot of current state */\n $snapshot(): S;\n /** Store ID */\n $id: string;\n};\n\nexport interface PersistOptions<S> {\n /** Only persist these state keys (default: all) */\n pick?: (keyof S)[];\n /** Storage backend (default: 'localStorage') */\n storage?: 'localStorage' | 'sessionStorage';\n /** Custom storage key (default: 'akash-store:{storeId}') */\n key?: string;\n /** Custom serializer (default: JSON.stringify) */\n serialize?: (value: unknown) => string;\n /** Custom deserializer (default: JSON.parse) */\n deserialize?: (value: string) => unknown;\n}\n\nexport interface StoreSyncOptions {\n /** Sync transport (WebSocket, local, etc.) */\n transport?: import('./sync.js').SyncTransport;\n /** Enable sync — uses provided or default transport */\n enabled?: boolean;\n /** Sync room/channel name (default: store ID) */\n room?: string;\n /** Unique peer ID */\n peerId?: string;\n /** Enable presence tracking */\n presence?: boolean;\n /** Only sync these state keys (default: all) */\n pick?: string[];\n}\n\nexport interface StoreDefinition<S, G, A> {\n state: StateFactory<S>;\n getters?: Getters<S, G>;\n actions?: A & ThisType<\n SignalifiedState<S> &\n { [K in keyof G]: ReadonlySignal<G[K]> } &\n A\n >;\n plugins?: StorePlugin[];\n /** Auto-persist state to storage. true = persist all to localStorage. */\n persist?: boolean | PersistOptions<S> | PersistOptions<S>[];\n /** Sync state across peers via CRDT. Adds real-time collaboration to any store. */\n sync?: StoreSyncOptions;\n}\n\n// --- Plugin system ---\n\nexport interface StorePlugin {\n init?(store: Store<any, any, any>): void;\n onAction?(store: Store<any, any, any>, actionName: string, args: unknown[]): void;\n}\n\nconst globalPlugins: StorePlugin[] = [];\n\n/** Register global plugins that apply to all stores */\nexport function configureStores(options: { plugins: StorePlugin[] }): void {\n globalPlugins.push(...options.plugins);\n}\n\n// --- Store registry (singleton) ---\n\nconst storeInstances = new Map<string, Store<any, any, any>>();\n\n// --- defineStore ---\n\n/**\n * Define a global store. Returns a composable function that\n * always returns the same store instance (singleton).\n */\nexport function defineStore<\n S extends Record<string, unknown>,\n G extends Record<string, unknown> = {},\n A extends Record<string, (...args: any[]) => any> = {},\n>(\n id: string,\n definition: StoreDefinition<S, G, A>,\n): () => Store<S, G, A> {\n return () => {\n // Return existing instance if already created\n if (storeInstances.has(id)) {\n return storeInstances.get(id) as Store<S, G, A>;\n }\n\n const initialState = definition.state();\n const store = createStoreInstance(id, initialState, definition);\n storeInstances.set(id, store);\n return store;\n };\n}\n\nfunction createStoreInstance<\n S extends Record<string, unknown>,\n G extends Record<string, unknown>,\n A extends Record<string, (...args: any[]) => any>,\n>(\n id: string,\n initialState: S,\n definition: StoreDefinition<S, G, A>,\n): Store<S, G, A> {\n // Create signals for each state property\n const stateSignals: Record<string, Signal<unknown>> = {};\n const stateKeys = Object.keys(initialState);\n\n for (const key of stateKeys) {\n stateSignals[key] = signal(initialState[key]);\n }\n\n // Build the store object first so getters can reference other getters via `this`\n const store: any = { $id: id };\n\n // Add state signals\n for (const key of stateKeys) {\n store[key] = stateSignals[key];\n }\n\n // Metadata for devtools — avoids calling functions to classify them\n const getterKeys: string[] = [];\n const actionKeys: string[] = [];\n store.$__meta = { stateKeys, getterKeys, actionKeys };\n\n // Create computed getters — bound to store so `this.otherGetter()` works\n if (definition.getters) {\n for (const [key, getterFn] of Object.entries(definition.getters)) {\n getterKeys.push(key);\n store[key] = computed(() =>\n (getterFn as Function).call(store, stateSignals),\n );\n }\n }\n\n // Collect all plugins (global + per-store)\n const plugins = [...globalPlugins, ...(definition.plugins ?? [])];\n\n // Bind actions with `this` pointing to the full store (state + getters + actions)\n if (definition.actions) {\n for (const [key, actionFn] of Object.entries(definition.actions)) {\n actionKeys.push(key);\n store[key] = (...args: unknown[]) => {\n for (const plugin of plugins) plugin.onAction?.(store, key, args);\n return (actionFn as Function).apply(store, args);\n };\n }\n }\n\n // $reset\n store.$reset = () => {\n const fresh = definition.state();\n for (const key of stateKeys) {\n stateSignals[key].set(fresh[key as keyof S]);\n }\n };\n\n // $patch — merge partial state or apply via callback (batched)\n store.$patch = (partialOrFn: Partial<S> | ((state: any) => void)) => {\n batch(() => {\n if (typeof partialOrFn === 'function') {\n partialOrFn(stateSignals);\n } else {\n for (const [key, value] of Object.entries(partialOrFn)) {\n if (key in stateSignals) {\n stateSignals[key].set(value);\n }\n }\n }\n });\n };\n\n // $snapshot\n store.$snapshot = (): S => {\n const snapshot: Record<string, unknown> = {};\n for (const key of stateKeys) {\n snapshot[key] = stateSignals[key]();\n }\n return snapshot as S;\n };\n\n // $subscribe — watch all state signals and notify on change\n const subscribers = new Set<(state: S) => void>();\n let subscribeEffect: (() => void) | null = null;\n store.$subscribe = (callback: (state: S) => void): (() => void) => {\n subscribers.add(callback);\n // Start watching if this is the first subscriber\n if (!subscribeEffect) {\n let isInitial = true;\n subscribeEffect = effect(() => {\n // Read all state signals to track them\n for (const key of stateKeys) {\n stateSignals[key]();\n }\n // Skip initial run — only notify on actual changes\n if (isInitial) {\n isInitial = false;\n return;\n }\n const snapshot = store.$snapshot();\n for (const cb of subscribers) {\n cb(snapshot);\n }\n });\n }\n return () => {\n subscribers.delete(callback);\n // Dispose effect when no subscribers remain\n if (subscribers.size === 0 && subscribeEffect) {\n subscribeEffect();\n subscribeEffect = null;\n }\n };\n };\n\n // --- Persistence ---\n if (definition.persist && typeof window !== 'undefined') {\n const configs = normalizePersistConfigs(id, definition.persist);\n for (const cfg of configs) {\n const storage = cfg.storage === 'sessionStorage' ? sessionStorage : localStorage;\n const serialize = cfg.serialize ?? JSON.stringify;\n const deserialize = cfg.deserialize ?? JSON.parse;\n const persistKeys = cfg.pick ?? stateKeys;\n\n // Hydrate: read from storage and merge into state\n try {\n const raw = storage.getItem(cfg.key);\n if (raw) {\n const saved = deserialize(raw) as Record<string, unknown>;\n for (const key of persistKeys as string[]) {\n if (key in saved && key in stateSignals) {\n stateSignals[key].set(saved[key]);\n }\n }\n }\n } catch { /* corrupt storage — ignore */ }\n\n // Write: subscribe to state changes and persist (debounced via microtask)\n // The effect tracks signals to detect changes; the microtask reads\n // fresh values so sequential updates in the same tick are all captured.\n let persistScheduled = false;\n let isInitialPersist = true;\n effect(() => {\n // Track the persisted signals (read them so the effect re-runs on change)\n for (const key of persistKeys as string[]) {\n if (key in stateSignals) stateSignals[key]();\n }\n // Skip the initial run (hydration just happened, don't write stale defaults)\n if (isInitialPersist) { isInitialPersist = false; return; }\n // Schedule a microtask to capture the LATEST values after all sync updates\n if (!persistScheduled) {\n persistScheduled = true;\n queueMicrotask(() => {\n persistScheduled = false;\n // Read fresh values NOW, not when the effect ran\n const snapshot: Record<string, unknown> = {};\n for (const key of persistKeys as string[]) {\n if (key in stateSignals) snapshot[key] = stateSignals[key].peek();\n }\n try { storage.setItem(cfg.key, serialize(snapshot)); } catch { /* quota exceeded */ }\n });\n }\n });\n\n // Cross-tab sync: listen for storage events from other tabs\n if (cfg.storage !== 'sessionStorage') {\n window.addEventListener('storage', (e) => {\n if (e.key !== cfg.key || !e.newValue) return;\n try {\n const updated = deserialize(e.newValue) as Record<string, unknown>;\n for (const key of persistKeys as string[]) {\n if (key in updated && key in stateSignals) {\n stateSignals[key].set(updated[key]);\n }\n }\n } catch { /* ignore parse errors */ }\n });\n }\n }\n }\n\n // --- Sync ---\n if (definition.sync && (definition.sync.enabled !== false)) {\n const syncOpts = definition.sync;\n const syncKeys = syncOpts.pick ?? stateKeys;\n\n const syncState: Record<string, unknown> = {};\n for (const key of syncKeys) {\n syncState[key] = stateSignals[key]?.peek?.() ?? initialState[key as keyof S];\n }\n\n const doc = createSync(syncState as Record<string, unknown>, {\n transport: syncOpts.transport,\n peerId: syncOpts.peerId,\n });\n\n // Wire: local signal changes → sync broadcast\n for (const key of syncKeys) {\n if (!(key in stateSignals) || !(key in doc.state)) continue;\n const localSignal = stateSignals[key];\n const syncSignal = (doc.state as Record<string, any>)[key];\n\n const originalSet = localSignal.set;\n let fromSync = false;\n localSignal.set = (value: unknown) => {\n originalSet.call(localSignal, value);\n if (!fromSync) syncSignal.set(value);\n };\n\n // Listen for remote changes\n effect(() => {\n const remoteVal = syncSignal();\n fromSync = true;\n localSignal.set(remoteVal);\n fromSync = false;\n });\n }\n\n // Expose sync metadata on the store\n (store as any).$sync = {\n peers: doc.peers,\n presence: doc.presence,\n peerPresence: doc.peerPresence,\n peerId: doc.peerId,\n connected: doc.connected,\n connect: doc.connect.bind(doc),\n disconnect: doc.disconnect.bind(doc),\n };\n }\n\n // Initialize plugins\n for (const plugin of plugins) plugin.init?.(store);\n\n return store as Store<S, G, A>;\n}\n\nfunction normalizePersistConfigs<S>(id: string, persist: boolean | PersistOptions<S> | PersistOptions<S>[]): Array<PersistOptions<S> & { key: string }> {\n if (persist === true) {\n return [{ key: `akash-store:${id}` }];\n }\n if (persist === false) return [];\n if (Array.isArray(persist)) {\n return persist.map((p, i) => ({ ...p, key: p.key ?? `akash-store:${id}:${i}` }));\n }\n return [{ ...persist, key: persist.key ?? `akash-store:${id}` }];\n}\n\n/**\n * Clear all store instances (useful for testing).\n */\nexport function clearStores(): void {\n storeInstances.clear();\n}\n\n/** @internal — exposes store registry for devtools */\nexport function __getStoreInstances(): Record<string, Store<any, any, any>> {\n return Object.fromEntries(storeInstances);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/store.ts"],"names":["globalPlugins","configureStores","options","storeInstances","defineStore","id","definition","initialState","store","createStoreInstance","stateSignals","stateKeys","key","signal","getterKeys","actionKeys","getterFn","computed","plugins","actionFn","args","plugin","fresh","partialOrFn","batch","value","snapshot","subscribers","subscribeEffect","callback","isInitial","effect","cb","configs","normalizePersistConfigs","cfg","storage","serialize","deserialize","persistKeys","raw","saved","persistScheduled","isInitialPersist","e","updated","syncOpts","syncKeys","syncState","doc","createSync","localSignal","syncSignal","originalSet","fromSync","remoteVal","persist","p","i","clearStores","__getStoreInstances"],"mappings":"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","file":"chunk-QSPRVXFV.cjs","sourcesContent":["/**\n * Global state management via defineStore().\n *\n * Stores are singleton signal containers that persist across\n * components. They provide shared state, computed getters,\n * and actions — no external library needed.\n *\n * ```ts\n * const useCounterStore = defineStore('counter', {\n * state: () => ({ count: 0, name: 'Counter' }),\n * getters: {\n * doubled: (state) => state.count() * 2,\n * },\n * actions: {\n * increment() { this.count.update(c => c + 1); },\n * reset() { this.count.set(0); },\n * },\n * });\n *\n * // In any component:\n * const store = useCounterStore();\n * store.count(); // 0\n * store.doubled(); // 0\n * store.increment();\n * store.count(); // 1\n * ```\n */\n\nimport { signal, computed, effect } from './signals.js';\nimport { batch } from './scheduler.js';\nimport { createSync } from './sync.js';\nimport type { SyncDoc } from './sync.js';\nimport type { Signal, ReadonlySignal } from './signals.js';\n\n// --- Types ---\n\ntype StateFactory<S> = () => S;\n\ntype Getters<S, G> = {\n [K in keyof G]: (state: SignalifiedState<S>) => G[K];\n};\n\ntype Actions<A> = {\n [K in keyof A]: A[K] extends (...args: infer P) => infer R\n ? (...args: P) => R\n : never;\n};\n\n/** Maps plain state values to signals */\ntype SignalifiedState<S> = {\n [K in keyof S]: Signal<S[K]>;\n};\n\n/** The store instance returned to consumers */\nexport type Store<S, G, A> = SignalifiedState<S> & {\n [K in keyof G]: ReadonlySignal<G[K]>;\n} & {\n [K in keyof A]: A[K] extends (...args: infer P) => infer R\n ? (...args: P) => R\n : never;\n} & {\n /** Reset all state to initial values */\n $reset(): void;\n /** Merge partial state into the store, or apply changes via callback */\n $patch(partialOrFn: Partial<S> | ((state: SignalifiedState<S>) => void)): void;\n /** Subscribe to all state changes */\n $subscribe(callback: (state: S) => void): () => void;\n /** Get a plain snapshot of current state */\n $snapshot(): S;\n /** Store ID */\n $id: string;\n};\n\nexport interface PersistOptions<S> {\n /** Only persist these state keys (default: all) */\n pick?: (keyof S)[];\n /** Storage backend (default: 'localStorage') */\n storage?: 'localStorage' | 'sessionStorage';\n /** Custom storage key (default: 'akash-store:{storeId}') */\n key?: string;\n /** Custom serializer (default: JSON.stringify) */\n serialize?: (value: unknown) => string;\n /** Custom deserializer (default: JSON.parse) */\n deserialize?: (value: string) => unknown;\n}\n\nexport interface StoreSyncOptions {\n /** Sync transport (WebSocket, local, etc.) */\n transport?: import('./sync.js').SyncTransport;\n /** Enable sync — uses provided or default transport */\n enabled?: boolean;\n /** Sync room/channel name (default: store ID) */\n room?: string;\n /** Unique peer ID */\n peerId?: string;\n /** Enable presence tracking */\n presence?: boolean;\n /** Only sync these state keys (default: all) */\n pick?: string[];\n}\n\nexport interface StoreDefinition<S, G, A> {\n state: StateFactory<S>;\n getters?: Getters<S, G>;\n actions?: A & ThisType<\n SignalifiedState<S> &\n { [K in keyof G]: ReadonlySignal<G[K]> } &\n A\n >;\n plugins?: StorePlugin[];\n /** Auto-persist state to storage. true = persist all to localStorage. */\n persist?: boolean | PersistOptions<S> | PersistOptions<S>[];\n /** Sync state across peers via CRDT. Adds real-time collaboration to any store. */\n sync?: StoreSyncOptions;\n}\n\n// --- Plugin system ---\n\nexport interface StorePlugin {\n init?(store: Store<any, any, any>): void;\n onAction?(store: Store<any, any, any>, actionName: string, args: unknown[]): void;\n}\n\nconst globalPlugins: StorePlugin[] = [];\n\n/** Register global plugins that apply to all stores */\nexport function configureStores(options: { plugins: StorePlugin[] }): void {\n globalPlugins.push(...options.plugins);\n}\n\n// --- Store registry (singleton) ---\n\nconst storeInstances = new Map<string, Store<any, any, any>>();\n\n// --- defineStore ---\n\n/**\n * Define a global store. Returns a composable function that\n * always returns the same store instance (singleton).\n */\nexport function defineStore<\n S extends Record<string, unknown>,\n G extends Record<string, unknown> = {},\n A extends Record<string, (...args: any[]) => any> = {},\n>(\n id: string,\n definition: StoreDefinition<S, G, A>,\n): () => Store<S, G, A> {\n return () => {\n // Return existing instance if already created\n if (storeInstances.has(id)) {\n return storeInstances.get(id) as Store<S, G, A>;\n }\n\n const initialState = definition.state();\n const store = createStoreInstance(id, initialState, definition);\n storeInstances.set(id, store);\n return store;\n };\n}\n\nfunction createStoreInstance<\n S extends Record<string, unknown>,\n G extends Record<string, unknown>,\n A extends Record<string, (...args: any[]) => any>,\n>(\n id: string,\n initialState: S,\n definition: StoreDefinition<S, G, A>,\n): Store<S, G, A> {\n // Create signals for each state property\n const stateSignals: Record<string, Signal<unknown>> = {};\n const stateKeys = Object.keys(initialState);\n\n for (const key of stateKeys) {\n stateSignals[key] = signal(initialState[key]);\n }\n\n // Build the store object first so getters can reference other getters via `this`\n const store: any = { $id: id };\n\n // Add state signals\n for (const key of stateKeys) {\n store[key] = stateSignals[key];\n }\n\n // Metadata for devtools — avoids calling functions to classify them\n const getterKeys: string[] = [];\n const actionKeys: string[] = [];\n store.$__meta = { stateKeys, getterKeys, actionKeys };\n\n // Create computed getters — bound to store so `this.otherGetter()` works\n if (definition.getters) {\n for (const [key, getterFn] of Object.entries(definition.getters)) {\n getterKeys.push(key);\n store[key] = computed(() =>\n (getterFn as Function).call(store, stateSignals),\n );\n }\n }\n\n // Collect all plugins (global + per-store)\n const plugins = [...globalPlugins, ...(definition.plugins ?? [])];\n\n // Bind actions with `this` pointing to the full store (state + getters + actions)\n if (definition.actions) {\n for (const [key, actionFn] of Object.entries(definition.actions)) {\n actionKeys.push(key);\n store[key] = (...args: unknown[]) => {\n for (const plugin of plugins) plugin.onAction?.(store, key, args);\n return (actionFn as Function).apply(store, args);\n };\n }\n }\n\n // $reset\n store.$reset = () => {\n const fresh = definition.state();\n for (const key of stateKeys) {\n stateSignals[key].set(fresh[key as keyof S]);\n }\n };\n\n // $patch — merge partial state or apply via callback (batched)\n store.$patch = (partialOrFn: Partial<S> | ((state: any) => void)) => {\n batch(() => {\n if (typeof partialOrFn === 'function') {\n partialOrFn(stateSignals);\n } else {\n for (const [key, value] of Object.entries(partialOrFn)) {\n if (key in stateSignals) {\n stateSignals[key].set(value);\n }\n }\n }\n });\n };\n\n // $snapshot\n store.$snapshot = (): S => {\n const snapshot: Record<string, unknown> = {};\n for (const key of stateKeys) {\n snapshot[key] = stateSignals[key]();\n }\n return snapshot as S;\n };\n\n // $subscribe — watch all state signals and notify on change\n const subscribers = new Set<(state: S) => void>();\n let subscribeEffect: (() => void) | null = null;\n store.$subscribe = (callback: (state: S) => void): (() => void) => {\n subscribers.add(callback);\n // Start watching if this is the first subscriber\n if (!subscribeEffect) {\n let isInitial = true;\n subscribeEffect = effect(() => {\n // Read all state signals to track them\n for (const key of stateKeys) {\n stateSignals[key]();\n }\n // Skip initial run — only notify on actual changes\n if (isInitial) {\n isInitial = false;\n return;\n }\n const snapshot = store.$snapshot();\n for (const cb of subscribers) {\n cb(snapshot);\n }\n });\n }\n return () => {\n subscribers.delete(callback);\n // Dispose effect when no subscribers remain\n if (subscribers.size === 0 && subscribeEffect) {\n subscribeEffect();\n subscribeEffect = null;\n }\n };\n };\n\n // --- Persistence ---\n if (definition.persist && typeof window !== 'undefined') {\n const configs = normalizePersistConfigs(id, definition.persist);\n for (const cfg of configs) {\n const storage = cfg.storage === 'sessionStorage' ? sessionStorage : localStorage;\n const serialize = cfg.serialize ?? JSON.stringify;\n const deserialize = cfg.deserialize ?? JSON.parse;\n const persistKeys = cfg.pick ?? stateKeys;\n\n // Hydrate: read from storage and merge into state\n try {\n const raw = storage.getItem(cfg.key);\n if (raw) {\n const saved = deserialize(raw) as Record<string, unknown>;\n for (const key of persistKeys as string[]) {\n if (key in saved && key in stateSignals) {\n stateSignals[key].set(saved[key]);\n }\n }\n }\n } catch { /* corrupt storage — ignore */ }\n\n // Write: subscribe to state changes and persist (debounced via microtask)\n // The effect tracks signals to detect changes; the microtask reads\n // fresh values so sequential updates in the same tick are all captured.\n let persistScheduled = false;\n let isInitialPersist = true;\n effect(() => {\n // Track the persisted signals (read them so the effect re-runs on change)\n for (const key of persistKeys as string[]) {\n if (key in stateSignals) stateSignals[key]();\n }\n // Skip the initial run (hydration just happened, don't write stale defaults)\n if (isInitialPersist) { isInitialPersist = false; return; }\n // Schedule a microtask to capture the LATEST values after all sync updates\n if (!persistScheduled) {\n persistScheduled = true;\n queueMicrotask(() => {\n persistScheduled = false;\n // Read fresh values NOW, not when the effect ran\n const snapshot: Record<string, unknown> = {};\n for (const key of persistKeys as string[]) {\n if (key in stateSignals) snapshot[key] = stateSignals[key].peek();\n }\n try { storage.setItem(cfg.key, serialize(snapshot)); } catch { /* quota exceeded */ }\n });\n }\n });\n\n // Cross-tab sync: listen for storage events from other tabs\n if (cfg.storage !== 'sessionStorage') {\n window.addEventListener('storage', (e) => {\n if (e.key !== cfg.key || !e.newValue) return;\n try {\n const updated = deserialize(e.newValue) as Record<string, unknown>;\n for (const key of persistKeys as string[]) {\n if (key in updated && key in stateSignals) {\n stateSignals[key].set(updated[key]);\n }\n }\n } catch { /* ignore parse errors */ }\n });\n }\n }\n }\n\n // --- Sync ---\n if (definition.sync && (definition.sync.enabled !== false)) {\n const syncOpts = definition.sync;\n const syncKeys = syncOpts.pick ?? stateKeys;\n\n const syncState: Record<string, unknown> = {};\n for (const key of syncKeys) {\n syncState[key] = stateSignals[key]?.peek?.() ?? initialState[key as keyof S];\n }\n\n const doc = createSync(syncState as Record<string, unknown>, {\n transport: syncOpts.transport,\n peerId: syncOpts.peerId,\n });\n\n // Wire: local signal changes → sync broadcast\n for (const key of syncKeys) {\n if (!(key in stateSignals) || !(key in doc.state)) continue;\n const localSignal = stateSignals[key];\n const syncSignal = (doc.state as Record<string, any>)[key];\n\n const originalSet = localSignal.set;\n let fromSync = false;\n localSignal.set = (value: unknown) => {\n originalSet.call(localSignal, value);\n if (!fromSync) syncSignal.set(value);\n };\n\n // Listen for remote changes\n effect(() => {\n const remoteVal = syncSignal();\n fromSync = true;\n localSignal.set(remoteVal);\n fromSync = false;\n });\n }\n\n // Expose sync metadata on the store\n (store as any).$sync = {\n peers: doc.peers,\n presence: doc.presence,\n peerPresence: doc.peerPresence,\n peerId: doc.peerId,\n connected: doc.connected,\n connect: doc.connect.bind(doc),\n disconnect: doc.disconnect.bind(doc),\n };\n }\n\n // Initialize plugins\n for (const plugin of plugins) plugin.init?.(store);\n\n return store as Store<S, G, A>;\n}\n\nfunction normalizePersistConfigs<S>(id: string, persist: boolean | PersistOptions<S> | PersistOptions<S>[]): Array<PersistOptions<S> & { key: string }> {\n if (persist === true) {\n return [{ key: `akash-store:${id}` }];\n }\n if (persist === false) return [];\n if (Array.isArray(persist)) {\n return persist.map((p, i) => ({ ...p, key: p.key ?? `akash-store:${id}:${i}` }));\n }\n return [{ ...persist, key: persist.key ?? `akash-store:${id}` }];\n}\n\n/**\n * Clear all store instances (useful for testing).\n */\nexport function clearStores(): void {\n storeInstances.clear();\n}\n\n/** @internal — exposes store registry for devtools */\nexport function __getStoreInstances(): Record<string, Store<any, any, any>> {\n return Object.fromEntries(storeInstances);\n}\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
'use strict';var o=false,c=new Map,a=0;function f(){o=true;}function u(){o=false,c.clear();}function l(){return o}function d(t){if(!o)return -1;let e=++a;return c.set(e,{id:e,createdAt:Date.now(),stackTrace:i(),componentName:t??null,disposed:false}),e}function p(t){if(!o||t===-1)return;let e=c.get(t);e&&(e.disposed=true,c.delete(t));}function k(){return Array.from(c.values())}function s(t=3e4){if(!o)return [];let e=Date.now(),n=[];for(let r of c.values())!r.disposed&&e-r.createdAt>t&&n.push({effectId:r.id,age:e-r.createdAt,componentName:r.componentName,stackTrace:r.stackTrace});return n}function m(t=3e4){let e=s(t);if(e.length!==0){console.warn(`[AkashJS] ${e.length} potential effect leak(s) detected:`);for(let n of e){let r=n.componentName?` in ${n.componentName}`:"";console.warn(` Effect #${n.effectId}${r} \u2014 active for ${(n.age/1e3).toFixed(1)}s`),n.stackTrace&&console.warn(` Created at:
|
|
2
|
+
${n.stackTrace}`);}}}function g(){return {enabled:o,activeCount:c.size,totalTracked:a}}function i(){try{let e=new Error().stack;return e?e.split(`
|
|
3
|
+
`).slice(3,8).join(`
|
|
4
|
+
`):null}catch{return null}}exports.a=f;exports.b=u;exports.c=l;exports.d=d;exports.e=p;exports.f=k;exports.g=s;exports.h=m;exports.i=g;//# sourceMappingURL=chunk-QTQ6RUX4.cjs.map
|
|
5
|
+
//# sourceMappingURL=chunk-QTQ6RUX4.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/leak-detector.ts"],"names":["tracking","activeEffects","effectIdCounter","enableLeakDetection","disableLeakDetection","isLeakDetectionEnabled","trackEffect","componentName","id","captureStack","untrackEffect","record","getActiveEffects","checkForLeaks","thresholdMs","now","warnings","reportLeaks","leaks","leak","component","getLeakDetectionStats","stack"],"mappings":"aAYA,IAAIA,CAAAA,CAAW,MACTC,CAAAA,CAAgB,IAAI,IACtBC,CAAAA,CAAkB,CAAA,CAqBf,SAASC,CAAAA,EAA4B,CAC1CH,CAAAA,CAAW,KACb,CAKO,SAASI,GAA6B,CAC3CJ,CAAAA,CAAW,MACXC,CAAAA,CAAc,KAAA,GAChB,CAKO,SAASI,CAAAA,EAAkC,CAChD,OAAOL,CACT,CAMO,SAASM,CAAAA,CAAYC,EAAgC,CAC1D,GAAI,CAACP,CAAAA,CAAU,OAAO,GAAA,CAEtB,IAAMQ,CAAAA,CAAK,EAAEN,EACb,OAAAD,CAAAA,CAAc,IAAIO,CAAAA,CAAI,CACpB,EAAA,CAAAA,CAAAA,CACA,SAAA,CAAW,IAAA,CAAK,KAAI,CACpB,UAAA,CAAYC,GAAa,CACzB,aAAA,CAAeF,GAAiB,IAAA,CAChC,QAAA,CAAU,KACZ,CAAC,CAAA,CAEMC,CACT,CAKO,SAASE,CAAAA,CAAcF,EAAkB,CAC9C,GAAI,CAACR,CAAAA,EAAYQ,CAAAA,GAAO,EAAA,CAAI,OAE5B,IAAMG,CAAAA,CAASV,EAAc,GAAA,CAAIO,CAAE,EAC/BG,CAAAA,GACFA,CAAAA,CAAO,SAAW,IAAA,CAClBV,CAAAA,CAAc,MAAA,CAAOO,CAAE,CAAA,EAE3B,CAKO,SAASI,CAAAA,EAAmC,CACjD,OAAO,KAAA,CAAM,IAAA,CAAKX,EAAc,MAAA,EAAQ,CAC1C,CAOO,SAASY,CAAAA,CAAcC,EAAc,GAAA,CAAsB,CAChE,GAAI,CAACd,CAAAA,CAAU,OAAO,EAAC,CAEvB,IAAMe,CAAAA,CAAM,IAAA,CAAK,GAAA,GACXC,CAAAA,CAA0B,GAEhC,IAAA,IAAWL,CAAAA,IAAUV,EAAc,MAAA,EAAO,CACpC,CAACU,CAAAA,CAAO,QAAA,EAAYI,CAAAA,CAAMJ,EAAO,SAAA,CAAYG,CAAAA,EAC/CE,EAAS,IAAA,CAAK,CACZ,SAAUL,CAAAA,CAAO,EAAA,CACjB,GAAA,CAAKI,CAAAA,CAAMJ,CAAAA,CAAO,SAAA,CAClB,cAAeA,CAAAA,CAAO,aAAA,CACtB,WAAYA,CAAAA,CAAO,UACrB,CAAC,CAAA,CAIL,OAAOK,CACT,CAKO,SAASC,CAAAA,CAAYH,EAAc,GAAA,CAAa,CACrD,IAAMI,CAAAA,CAAQL,CAAAA,CAAcC,CAAW,CAAA,CACvC,GAAII,CAAAA,CAAM,MAAA,GAAW,CAAA,CAErB,CAAA,OAAA,CAAQ,KACN,CAAA,UAAA,EAAaA,CAAAA,CAAM,MAAM,CAAA,mCAAA,CAC3B,CAAA,CACA,QAAWC,CAAAA,IAAQD,CAAAA,CAAO,CACxB,IAAME,CAAAA,CAAYD,CAAAA,CAAK,cAAgB,CAAA,IAAA,EAAOA,CAAAA,CAAK,aAAa,CAAA,CAAA,CAAK,EAAA,CACrE,QAAQ,IAAA,CACN,CAAA,UAAA,EAAaA,CAAAA,CAAK,QAAQ,CAAA,EAAGC,CAAS,uBAAkBD,CAAAA,CAAK,GAAA,CAAM,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,GACrF,CAAA,CACIA,CAAAA,CAAK,UAAA,EACP,OAAA,CAAQ,IAAA,CAAK,CAAA;AAAA,EAAoBA,CAAAA,CAAK,UAAU,CAAA,CAAE,EAEtD,EACF,CAKO,SAASE,CAAAA,EAId,CACA,OAAO,CACL,OAAA,CAASrB,CAAAA,CACT,WAAA,CAAaC,EAAc,IAAA,CAC3B,YAAA,CAAcC,CAChB,CACF,CAaA,SAASO,CAAAA,EAA8B,CACrC,GAAI,CAEF,IAAMa,CAAAA,CADM,IAAI,OAAM,CACJ,KAAA,CAClB,OAAKA,CAAAA,CAESA,EAAM,KAAA,CAAM;AAAA,CAAI,CAAA,CACjB,KAAA,CAAM,CAAA,CAAG,CAAC,EAAE,IAAA,CAAK;AAAA,CAAI,EAHf,IAIrB,CAAA,KAAQ,CACN,OAAO,IACT,CACF","file":"chunk-QTQ6RUX4.cjs","sourcesContent":["/**\n * Effect disposal and leak detection (dev mode).\n *\n * In development, tracks all created effects and verifies they\n * get properly cleaned up when components unmount. Logs warnings\n * for leaked effects that were never disposed.\n */\n\nimport type { ScheduledEffect } from './scheduler.js';\n\n// --- Tracking state ---\n\nlet tracking = false;\nconst activeEffects = new Map<number, EffectRecord>();\nlet effectIdCounter = 0;\n\ninterface EffectRecord {\n id: number;\n createdAt: number;\n stackTrace: string | null;\n componentName: string | null;\n disposed: boolean;\n}\n\n// --- Public API ---\n\n/**\n * Enable leak detection. Call once at app startup in dev mode.\n *\n * ```ts\n * if (import.meta.env.DEV) {\n * enableLeakDetection();\n * }\n * ```\n */\nexport function enableLeakDetection(): void {\n tracking = true;\n}\n\n/**\n * Disable leak detection.\n */\nexport function disableLeakDetection(): void {\n tracking = false;\n activeEffects.clear();\n}\n\n/**\n * Check if leak detection is enabled.\n */\nexport function isLeakDetectionEnabled(): boolean {\n return tracking;\n}\n\n/**\n * Register an effect for tracking. Called internally by effect().\n * Returns an ID for later disposal tracking.\n */\nexport function trackEffect(componentName?: string): number {\n if (!tracking) return -1;\n\n const id = ++effectIdCounter;\n activeEffects.set(id, {\n id,\n createdAt: Date.now(),\n stackTrace: captureStack(),\n componentName: componentName ?? null,\n disposed: false,\n });\n\n return id;\n}\n\n/**\n * Mark an effect as disposed. Called internally by effect dispose function.\n */\nexport function untrackEffect(id: number): void {\n if (!tracking || id === -1) return;\n\n const record = activeEffects.get(id);\n if (record) {\n record.disposed = true;\n activeEffects.delete(id);\n }\n}\n\n/**\n * Get all currently active (undisposed) effects.\n */\nexport function getActiveEffects(): EffectRecord[] {\n return Array.from(activeEffects.values());\n}\n\n/**\n * Check for leaked effects and return warnings.\n * An effect is considered leaked if it's been active for longer\n * than the given threshold without being disposed.\n */\nexport function checkForLeaks(thresholdMs = 30000): LeakWarning[] {\n if (!tracking) return [];\n\n const now = Date.now();\n const warnings: LeakWarning[] = [];\n\n for (const record of activeEffects.values()) {\n if (!record.disposed && now - record.createdAt > thresholdMs) {\n warnings.push({\n effectId: record.id,\n age: now - record.createdAt,\n componentName: record.componentName,\n stackTrace: record.stackTrace,\n });\n }\n }\n\n return warnings;\n}\n\n/**\n * Log leak warnings to the console.\n */\nexport function reportLeaks(thresholdMs = 30000): void {\n const leaks = checkForLeaks(thresholdMs);\n if (leaks.length === 0) return;\n\n console.warn(\n `[AkashJS] ${leaks.length} potential effect leak(s) detected:`,\n );\n for (const leak of leaks) {\n const component = leak.componentName ? ` in ${leak.componentName}` : '';\n console.warn(\n ` Effect #${leak.effectId}${component} — active for ${(leak.age / 1000).toFixed(1)}s`,\n );\n if (leak.stackTrace) {\n console.warn(` Created at:\\n${leak.stackTrace}`);\n }\n }\n}\n\n/**\n * Get a summary of effect tracking state.\n */\nexport function getLeakDetectionStats(): {\n enabled: boolean;\n activeCount: number;\n totalTracked: number;\n} {\n return {\n enabled: tracking,\n activeCount: activeEffects.size,\n totalTracked: effectIdCounter,\n };\n}\n\n// --- Types ---\n\nexport interface LeakWarning {\n effectId: number;\n age: number;\n componentName: string | null;\n stackTrace: string | null;\n}\n\n// --- Internal ---\n\nfunction captureStack(): string | null {\n try {\n const err = new Error();\n const stack = err.stack;\n if (!stack) return null;\n // Remove first 3 lines (Error, captureStack, trackEffect)\n const lines = stack.split('\\n');\n return lines.slice(3, 8).join('\\n');\n } catch {\n return null;\n }\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var chunkWOZWFMOK_cjs=require('./chunk-WOZWFMOK.cjs');function v(n){if(typeof window>"u")return(()=>false);let o=window.matchMedia(n),t=chunkWOZWFMOK_cjs.c(o.matches),i=r=>t.set(r.matches);return o.addEventListener("change",i),(()=>t())}var y={sm:640,md:768,lg:1024,xl:1280,"2xl":1536};function S(n=y){let o=Object.entries(n).sort((e,a)=>e[1]-a[1]),t=chunkWOZWFMOK_cjs.c(typeof window<"u"?window.innerWidth:1024);if(typeof window<"u"){let e=()=>t.set(window.innerWidth);window.addEventListener("resize",e,{passive:true});}function i(){let e=t(),a="";for(let[g,f]of o)e>=f&&(a=g);return a||o[0]?.[0]||""}function r(e){let a=n[e];return a!==void 0&&t()>=a}function s(e){let a=n[e];return a!==void 0&&t()<a}return {current:i,gte:r,lt:s,width:(()=>t())}}function b(n,o,t="local"){let i=typeof window<"u"?t==="local"?localStorage:sessionStorage:null,r=o;if(i)try{let e=i.getItem(n);e!==null&&(r=JSON.parse(e));}catch{}let s=chunkWOZWFMOK_cjs.c(r);return i&&(chunkWOZWFMOK_cjs.e(()=>{let e=s();try{i.setItem(n,JSON.stringify(e));}catch{}}),typeof window<"u"&&window.addEventListener("storage",e=>{if(e.key===n&&e.newValue!==null)try{s.set(JSON.parse(e.newValue));}catch{}})),s}function h(n){let o=chunkWOZWFMOK_cjs.c(""),t=chunkWOZWFMOK_cjs.c(false),i=n?.timeout??2e3,r=null;async function s(e){typeof navigator>"u"||!navigator.clipboard||(await navigator.clipboard.writeText(e),o.set(e),t.set(true),r&&clearTimeout(r),r=setTimeout(()=>t.set(false),i));}return {text:(()=>o()),copied:(()=>t()),copy:s}}function E(){if(typeof window>"u")return(()=>true);let n=chunkWOZWFMOK_cjs.c(navigator.onLine);return window.addEventListener("online",()=>n.set(true)),window.addEventListener("offline",()=>n.set(false)),(()=>n())}function T(n){let o=chunkWOZWFMOK_cjs.c({latitude:null,longitude:null,accuracy:null,error:null,loading:true});return typeof navigator<"u"&&navigator.geolocation?navigator.geolocation.watchPosition(t=>{o.set({latitude:t.coords.latitude,longitude:t.coords.longitude,accuracy:t.coords.accuracy,error:null,loading:false});},t=>{o.set({latitude:null,longitude:null,accuracy:null,error:t,loading:false});},n):o.set({...o(),loading:false}),(()=>o())}function L(){let n=chunkWOZWFMOK_cjs.c(typeof window<"u"?window.innerWidth:0),o=chunkWOZWFMOK_cjs.c(typeof window<"u"?window.innerHeight:0);return typeof window<"u"&&window.addEventListener("resize",()=>{n.set(window.innerWidth),o.set(window.innerHeight);},{passive:true}),{width:(()=>n()),height:(()=>o())}}function R(n,o,t={}){if(typeof document>"u")return ()=>{};let{events:i=["pointerdown"],ignore:r=[],active:s=true}=t,e=s;function a(){return typeof n=="function"?n():n}function g(u){let d=u.target;if(!d)return false;for(let c of r)if(typeof c=="string"){if(d.closest(c))return true}else if(c===d||c.contains(d))return true;return false}function f(u){if(!e)return;let d=a();if(!d)return;let c=u.target;d===c||d.contains(c)||g(u)||o(u);}for(let u of i)document.addEventListener(u,f,{passive:true,capture:true});let w=()=>{for(let u of i)document.removeEventListener(u,f,{capture:true});};return w.enable=()=>{e=true;},w.disable=()=>{e=false;},w}exports.a=v;exports.b=S;exports.c=b;exports.d=h;exports.e=E;exports.f=T;exports.g=L;exports.h=R;//# sourceMappingURL=chunk-R65RPMQX.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-R65RPMQX.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/browser.ts"],"names":["useMediaQuery","query","mql","matches","signal","handler","e","DEFAULT_BREAKPOINTS","useBreakpoint","breakpoints","sorted","a","b","width","current","w","result","name","min","gte","bp","lt","useStorage","key","initialValue","storage","store","startValue","raw","state","effect","value","useClipboard","options","text","copied","timeout","timer","copy","useOnline","online","useGeolocation","pos","err","useWindowSize","height","useClickOutside","target","events","ignore","active","isActive","getTarget","shouldIgnore","event","eventTarget","pattern","listener","el","eventName","dispose"],"mappings":"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","file":"chunk-R65RPMQX.cjs","sourcesContent":["/**\n * Browser API composables.\n *\n * Signal-based wrappers for common browser APIs.\n * All composables are SSR-safe — they return fallback values\n * when `window` is not available.\n */\n\nimport { signal, effect } from './signals.js';\nimport type { Signal, ReadonlySignal } from './signals.js';\n\n// --- useMediaQuery ---\n\n/**\n * Reactive media query matcher.\n *\n * ```ts\n * const isMobile = useMediaQuery('(max-width: 768px)');\n * isMobile(); // true/false, updates on resize\n * ```\n */\nexport function useMediaQuery(query: string): ReadonlySignal<boolean> {\n if (typeof window === 'undefined') {\n return (() => false) as ReadonlySignal<boolean>;\n }\n\n const mql = window.matchMedia(query);\n const matches = signal(mql.matches);\n\n const handler = (e: MediaQueryListEvent) => matches.set(e.matches);\n mql.addEventListener('change', handler);\n\n return (() => matches()) as ReadonlySignal<boolean>;\n}\n\n// --- useBreakpoint ---\n\nexport interface Breakpoints {\n [name: string]: number;\n}\n\nconst DEFAULT_BREAKPOINTS: Breakpoints = {\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1280,\n '2xl': 1536,\n};\n\n/**\n * Reactive breakpoint tracker (Tailwind-style).\n *\n * ```ts\n * const bp = useBreakpoint();\n * bp.current(); // 'md'\n * bp.gte('lg'); // false\n * bp.lt('sm'); // false\n * ```\n */\nexport function useBreakpoint(breakpoints: Breakpoints = DEFAULT_BREAKPOINTS) {\n const sorted = Object.entries(breakpoints).sort((a, b) => a[1] - b[1]);\n const width = signal(typeof window !== 'undefined' ? window.innerWidth : 1024);\n\n if (typeof window !== 'undefined') {\n const handler = () => width.set(window.innerWidth);\n window.addEventListener('resize', handler, { passive: true });\n }\n\n function current(): string {\n const w = width();\n let result = '';\n for (const [name, min] of sorted) {\n if (w >= min) result = name;\n }\n return result || sorted[0]?.[0] || '';\n }\n\n function gte(name: string): boolean {\n const bp = breakpoints[name];\n return bp !== undefined && width() >= bp;\n }\n\n function lt(name: string): boolean {\n const bp = breakpoints[name];\n return bp !== undefined && width() < bp;\n }\n\n return { current, gte, lt, width: (() => width()) as ReadonlySignal<number> };\n}\n\n// --- useStorage ---\n\n/**\n * Signal backed by localStorage or sessionStorage.\n * Persists across page refreshes.\n *\n * ```ts\n * const name = useStorage('user-name', 'Guest');\n * name(); // reads from localStorage or 'Guest'\n * name.set('Alice'); // writes to localStorage\n * ```\n */\nexport function useStorage<T>(\n key: string,\n initialValue: T,\n storage: 'local' | 'session' = 'local',\n): Signal<T> {\n const store = typeof window !== 'undefined'\n ? (storage === 'local' ? localStorage : sessionStorage)\n : null;\n\n // Read existing value\n let startValue = initialValue;\n if (store) {\n try {\n const raw = store.getItem(key);\n if (raw !== null) startValue = JSON.parse(raw);\n } catch { /* use initial */ }\n }\n\n const state = signal<T>(startValue);\n\n // Sync writes to storage\n if (store) {\n effect(() => {\n const value = state();\n try {\n store.setItem(key, JSON.stringify(value));\n } catch { /* storage full */ }\n });\n\n // Listen for changes from other tabs\n if (typeof window !== 'undefined') {\n window.addEventListener('storage', (e) => {\n if (e.key === key && e.newValue !== null) {\n try {\n state.set(JSON.parse(e.newValue));\n } catch { /* ignore */ }\n }\n });\n }\n }\n\n return state;\n}\n\n// --- useClipboard ---\n\n/**\n * Reactive clipboard access.\n *\n * ```ts\n * const { text, copy, copied } = useClipboard();\n * await copy('Hello');\n * copied(); // true for 2 seconds\n * ```\n */\nexport function useClipboard(options?: { timeout?: number }) {\n const text = signal('');\n const copied = signal(false);\n const timeout = options?.timeout ?? 2000;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n async function copy(value: string): Promise<void> {\n if (typeof navigator === 'undefined' || !navigator.clipboard) return;\n await navigator.clipboard.writeText(value);\n text.set(value);\n copied.set(true);\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => copied.set(false), timeout);\n }\n\n return {\n text: (() => text()) as ReadonlySignal<string>,\n copied: (() => copied()) as ReadonlySignal<boolean>,\n copy,\n };\n}\n\n// --- useOnline ---\n\n/**\n * Reactive online/offline status.\n *\n * ```ts\n * const online = useOnline();\n * online(); // true/false\n * ```\n */\nexport function useOnline(): ReadonlySignal<boolean> {\n if (typeof window === 'undefined') {\n return (() => true) as ReadonlySignal<boolean>;\n }\n\n const online = signal(navigator.onLine);\n window.addEventListener('online', () => online.set(true));\n window.addEventListener('offline', () => online.set(false));\n\n return (() => online()) as ReadonlySignal<boolean>;\n}\n\n// --- useGeolocation ---\n\nexport interface GeolocationState {\n latitude: number | null;\n longitude: number | null;\n accuracy: number | null;\n error: GeolocationPositionError | null;\n loading: boolean;\n}\n\n/**\n * Reactive geolocation.\n *\n * ```ts\n * const geo = useGeolocation();\n * geo().latitude; // number | null\n * geo().loading; // boolean\n * ```\n */\nexport function useGeolocation(\n options?: PositionOptions,\n): ReadonlySignal<GeolocationState> {\n const state = signal<GeolocationState>({\n latitude: null,\n longitude: null,\n accuracy: null,\n error: null,\n loading: true,\n });\n\n if (typeof navigator !== 'undefined' && navigator.geolocation) {\n navigator.geolocation.watchPosition(\n (pos) => {\n state.set({\n latitude: pos.coords.latitude,\n longitude: pos.coords.longitude,\n accuracy: pos.coords.accuracy,\n error: null,\n loading: false,\n });\n },\n (err) => {\n state.set({\n latitude: null,\n longitude: null,\n accuracy: null,\n error: err,\n loading: false,\n });\n },\n options,\n );\n } else {\n state.set({ ...state(), loading: false });\n }\n\n return (() => state()) as ReadonlySignal<GeolocationState>;\n}\n\n// --- useWindowSize ---\n\n/**\n * Reactive window dimensions.\n */\nexport function useWindowSize() {\n const width = signal(typeof window !== 'undefined' ? window.innerWidth : 0);\n const height = signal(typeof window !== 'undefined' ? window.innerHeight : 0);\n\n if (typeof window !== 'undefined') {\n window.addEventListener('resize', () => {\n width.set(window.innerWidth);\n height.set(window.innerHeight);\n }, { passive: true });\n }\n\n return {\n width: (() => width()) as ReadonlySignal<number>,\n height: (() => height()) as ReadonlySignal<number>,\n };\n}\n\n// --- useClickOutside ---\n\n/**\n * Detect clicks outside an element. Essential for closing\n * dropdowns, modals, popovers, and context menus.\n *\n * ```ts\n * const dropdown = document.querySelector('.dropdown')!;\n * const dispose = useClickOutside(dropdown, () => {\n * closeDropdown();\n * });\n *\n * // With options:\n * useClickOutside(dropdown, onClose, {\n * events: ['mousedown', 'touchstart'],\n * ignore: ['.trigger-button'],\n * });\n * ```\n */\nexport function useClickOutside(\n target: HTMLElement | (() => HTMLElement | null),\n handler: (event: Event) => void,\n options: {\n /** Events to listen for (default: ['pointerdown']) */\n events?: string[];\n /** Selectors or elements to ignore (clicks on these won't trigger) */\n ignore?: (string | HTMLElement)[];\n /** Whether the listener is active (default: true) */\n active?: boolean;\n } = {},\n): () => void {\n if (typeof document === 'undefined') return () => {};\n\n const {\n events = ['pointerdown'],\n ignore = [],\n active = true,\n } = options;\n\n let isActive = active;\n\n function getTarget(): HTMLElement | null {\n return typeof target === 'function' ? target() : target;\n }\n\n function shouldIgnore(event: Event): boolean {\n const eventTarget = event.target as HTMLElement;\n if (!eventTarget) return false;\n\n for (const pattern of ignore) {\n if (typeof pattern === 'string') {\n if (eventTarget.closest(pattern)) return true;\n } else {\n if (pattern === eventTarget || pattern.contains(eventTarget)) return true;\n }\n }\n return false;\n }\n\n function listener(event: Event): void {\n if (!isActive) return;\n const el = getTarget();\n if (!el) return;\n\n const eventTarget = event.target as Node;\n if (el === eventTarget || el.contains(eventTarget)) return;\n if (shouldIgnore(event)) return;\n\n handler(event);\n }\n\n for (const eventName of events) {\n document.addEventListener(eventName, listener, { passive: true, capture: true });\n }\n\n const dispose = () => {\n for (const eventName of events) {\n document.removeEventListener(eventName, listener, { capture: true } as EventListenerOptions);\n }\n };\n\n // Attach enable/disable to dispose function\n (dispose as any).enable = () => { isActive = true; };\n (dispose as any).disable = () => { isActive = false; };\n\n return dispose;\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {c,d}from'./chunk-YXKQTEPR.js';function M(t){let n=c(t.initial),a=c(t.context??{}),d$1=c([t.initial]),g=d(()=>t.states[n()]?.type==="final"),y=d(()=>{let e=t.states[n()];return e?.on?Object.keys(e.on):[]}),S=t.states[t.initial];S?.entry&&S.entry({data:a(),event:""});function E(e,i){if(g())return;let s=n(),o=t.states[s];if(!o?.on)return;let x=o.on[e];if(!x)return;let r,l,f;if(typeof x=="string")r=x;else {let T=x;r=T.target,l=T.guard,f=T.action;}let c={data:a(),event:e,payload:i};if(l&&!l(c))return;o.exit&&o.exit(c),f&&f(c,i),a.set(c.data),n.set(r),d$1.update(T=>[...T,r]);let v=t.states[r];v?.entry&&v.entry({data:a(),event:e});}function h(e){let i=t.states[n()];if(!i?.on)return false;let s=i.on[e];if(!s)return false;if(typeof s!="string"){let o=s;if(o.guard)return o.guard({data:a(),event:e})}return true}return {state:()=>n(),context:()=>a(),send:E,matches:e=>n()===e,done:g,reset(){n.set(t.initial),a.set(t.context??{}),d$1.set([t.initial]);},history:()=>d$1(),can:h,nextEvents:y}}export{M as a};//# sourceMappingURL=chunk-R7NUVVHP.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-R7NUVVHP.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/machine.ts"],"names":["createMachine","config","currentState","signal","contextData","stateHistory","done","computed","nextEvents","stateCfg","initialStateCfg","send","event","payload","state","transition","target","guard","action","t","ctx","h","targetCfg","can"],"mappings":"sCAkGO,SAASA,CAAAA,CAIdC,CAAAA,CAAoF,CACpF,IAAMC,EAAeC,CAAAA,CAAeF,CAAAA,CAAO,OAAO,CAAA,CAC5CG,EAAcD,CAAAA,CAAkBF,CAAAA,CAAO,OAAA,EAAW,EAAe,CAAA,CACjEI,
|
|
1
|
+
{"version":3,"sources":["../src/machine.ts"],"names":["createMachine","config","currentState","signal","contextData","stateHistory","done","computed","nextEvents","stateCfg","initialStateCfg","send","event","payload","state","transition","target","guard","action","t","ctx","h","targetCfg","can"],"mappings":"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","file":"chunk-R7NUVVHP.js","sourcesContent":["/**\n * State machines for complex UI flows.\n *\n * Finite state machines with typed states, events, guards,\n * actions, and reactive current state signal.\n *\n * ```ts\n * const checkout = createMachine({\n * initial: 'cart',\n * states: {\n * cart: { on: { CHECKOUT: 'shipping' } },\n * shipping: { on: { NEXT: 'payment', BACK: 'cart' } },\n * payment: { on: { PAY: 'processing', BACK: 'shipping' } },\n * processing: { on: { SUCCESS: 'complete', FAIL: 'payment' } },\n * complete: { type: 'final' },\n * },\n * });\n *\n * checkout.state(); // 'cart'\n * checkout.send('CHECKOUT');\n * checkout.state(); // 'shipping'\n * checkout.matches('shipping'); // true\n * ```\n */\n\nimport { signal, computed } from './signals.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport interface MachineConfig<TState extends string, TEvent extends string, TContext = unknown> {\n /** Initial state */\n initial: TState;\n /** Initial context data */\n context?: TContext;\n /** State definitions */\n states: Record<TState, StateConfig<TState, TEvent, TContext>>;\n}\n\nexport interface StateConfig<TState extends string, TEvent extends string, TContext = unknown> {\n /** Transitions: event → target state */\n on?: Partial<Record<TEvent, TState | TransitionConfig<TState, TEvent, TContext>>>;\n /** Entry action — runs when entering this state */\n entry?: (ctx: MachineContext<TContext>) => void;\n /** Exit action — runs when leaving this state */\n exit?: (ctx: MachineContext<TContext>) => void;\n /** Final state — machine stops accepting events */\n type?: 'final';\n}\n\nexport interface TransitionConfig<TState extends string, TEvent extends string, TContext = unknown> {\n /** Target state */\n target: TState;\n /** Guard — transition only if this returns true */\n guard?: (ctx: MachineContext<TContext>) => boolean;\n /** Action — runs during the transition */\n action?: (ctx: MachineContext<TContext>) => void;\n}\n\nexport interface MachineContext<TContext> {\n /** The context data (mutable) */\n data: TContext;\n /** The current event that triggered the transition */\n event: string;\n /** Optional payload passed with the event via send(event, payload) */\n payload?: unknown;\n}\n\nexport interface Machine<TState extends string, TEvent extends string, TContext = unknown> {\n /** Current state (reactive signal) */\n state: ReadonlySignal<TState>;\n /** Context data (reactive signal) */\n context: ReadonlySignal<TContext>;\n /** Send an event to the machine */\n send(event: TEvent, payload?: Record<string, unknown>): void;\n /** Check if currently in a specific state */\n matches(state: TState): boolean;\n /** Whether the machine is in a final state */\n done: ReadonlySignal<boolean>;\n /** Reset to initial state */\n reset(): void;\n /** State history */\n history: ReadonlySignal<TState[]>;\n /** Can a specific event be sent in the current state? */\n can(event: TEvent): boolean;\n /** Get all possible events from current state */\n nextEvents: ReadonlySignal<TEvent[]>;\n}\n\n// =========================================================================\n// createMachine\n// =========================================================================\n\n/**\n * Create a finite state machine.\n */\nexport function createMachine<\n TState extends string,\n TEvent extends string,\n TContext = unknown,\n>(config: MachineConfig<TState, TEvent, TContext>): Machine<TState, TEvent, TContext> {\n const currentState = signal<TState>(config.initial);\n const contextData = signal<TContext>((config.context ?? {}) as TContext);\n const stateHistory = signal<TState[]>([config.initial]);\n\n const done = computed(() => {\n const stateCfg = config.states[currentState()];\n return stateCfg?.type === 'final';\n });\n\n const nextEvents = computed((): TEvent[] => {\n const stateCfg = config.states[currentState()];\n if (!stateCfg?.on) return [];\n return Object.keys(stateCfg.on) as TEvent[];\n });\n\n // Run entry action for initial state\n const initialStateCfg = config.states[config.initial];\n if (initialStateCfg?.entry) {\n initialStateCfg.entry({ data: contextData() as TContext, event: '' });\n }\n\n function send(event: TEvent, payload?: unknown): void {\n if (done()) return; // Final state — no more transitions\n\n const state = currentState();\n const stateCfg = config.states[state];\n if (!stateCfg?.on) return;\n\n const transition = stateCfg.on[event];\n if (!transition) return;\n\n let target: TState;\n let guard: ((ctx: MachineContext<TContext>) => boolean) | undefined;\n let action: ((ctx: MachineContext<TContext>) => void) | undefined;\n\n if (typeof transition === 'string') {\n target = transition as TState;\n } else {\n const t = transition as TransitionConfig<TState, TEvent, TContext>;\n target = t.target;\n guard = t.guard;\n action = t.action;\n }\n\n const ctx: MachineContext<TContext> = {\n data: contextData() as TContext,\n event,\n payload,\n };\n\n // Check guard\n if (guard && !guard(ctx)) return;\n\n // Exit action\n if (stateCfg.exit) {\n stateCfg.exit(ctx);\n }\n\n // Transition action — pass payload as second argument for convenience\n if (action) {\n (action as Function)(ctx, payload);\n }\n\n // Update context if modified\n contextData.set(ctx.data);\n\n // Enter new state\n currentState.set(target);\n stateHistory.update((h) => [...h, target]);\n\n // Entry action for new state\n const targetCfg = config.states[target];\n if (targetCfg?.entry) {\n targetCfg.entry({ data: contextData() as TContext, event });\n }\n }\n\n function can(event: TEvent): boolean {\n const stateCfg = config.states[currentState()];\n if (!stateCfg?.on) return false;\n const transition = stateCfg.on[event];\n if (!transition) return false;\n\n if (typeof transition !== 'string') {\n const t = transition as TransitionConfig<TState, TEvent, TContext>;\n if (t.guard) {\n return t.guard({ data: contextData() as TContext, event });\n }\n }\n return true;\n }\n\n return {\n state: () => currentState(),\n context: () => contextData(),\n send,\n matches: (state: TState) => currentState() === state,\n done,\n reset() {\n currentState.set(config.initial);\n contextData.set((config.context ?? {}) as TContext);\n stateHistory.set([config.initial]);\n },\n history: () => stateHistory(),\n can,\n nextEvents,\n };\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {s,l}from'./chunk-KE7BJTCD.js';import {c}from'./chunk-YXKQTEPR.js';function w(i){let P=typeof i=="function"?{loader:i}:i,{loader:C,loading:c$1,error:f,timeout:s$1,delay:y=200}=P,l$1=null,t=null,o=null;function A(){return t||(t=C().then(e=>{l$1=e.default;}).catch(e=>{o=e instanceof Error?e:new Error(String(e));}),t)}return s(e=>{let n=c("loading"),m=c(false);A().then(()=>{o?n.set("error"):n.set("ready");});let a=null;y>0?a=setTimeout(()=>m.set(true),y):m.set(true);let u=null;return s$1&&(u=setTimeout(()=>{n()==="loading"&&(o=new Error(`Async component timed out after ${s$1}ms`),n.set("error"));},s$1)),()=>{let r=n();return r!=="loading"&&(a&&clearTimeout(a),u&&clearTimeout(u)),r==="ready"&&l$1?l$1(e.props):r==="error"&&f&&o?l(f(o)):r==="loading"&&m()&&c$1?l(c$1()):document.createComment("async-loading")}})}export{w as a};//# sourceMappingURL=chunk-SXYPAP4B.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-SXYPAP4B.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/async-component.ts"],"names":["defineAsyncComponent","loaderOrOptions","options","loader","loadingFn","errorFn","timeout","delay","resolvedComp","loadPromise","loadError","startLoad","mod","err","defineComponent","ctx","state","signal","showLoading","delayTimer","timeoutTimer","s","nodeToDOM"],"mappings":"0EAiDO,SAASA,EACdC,CAAAA,CACc,CACd,IAAMC,CAAAA,CACJ,OAAOD,GAAoB,UAAA,CACvB,CAAE,OAAQA,CAAgB,CAAA,CAC1BA,EAEA,CACJ,MAAA,CAAAE,EACA,OAAA,CAASC,GAAAA,CACT,MAAOC,CAAAA,CACP,OAAA,CAAAC,IACA,KAAA,CAAAC,CAAAA,CAAQ,GACV,CAAA,CAAIL,CAAAA,CAGAM,IAAoC,IAAA,CACpCC,CAAAA,CAAoC,KACpCC,CAAAA,CAA0B,IAAA,CAE9B,SAASC,CAAAA,EAA2B,CAClC,OAAIF,CAAAA,GAEJA,CAAAA,CAAcN,GAAO,CAClB,IAAA,CAAMS,GAAQ,CACbJ,GAAAA,CAAeI,EAAI,QACrB,CAAC,EACA,KAAA,CAAOC,CAAAA,EAAQ,CACdH,CAAAA,CAAYG,CAAAA,YAAe,MAAQA,CAAAA,CAAM,IAAI,MAAM,MAAA,CAAOA,CAAG,CAAC,EAChE,CAAC,EAEIJ,CAAAA,CACT,CAEA,OAAOK,CAAAA,CAAoBC,CAAAA,EAAQ,CACjC,IAAMC,CAAAA,CAAQC,EAAsC,SAAS,CAAA,CACvDC,EAAcD,CAAAA,CAAO,KAAK,EAGhCN,CAAAA,EAAU,CAAE,KAAK,IAAM,CACjBD,EACFM,CAAAA,CAAM,GAAA,CAAI,OAAO,CAAA,CAEjBA,CAAAA,CAAM,IAAI,OAAO,EAErB,CAAC,CAAA,CAGD,IAAIG,EAAmD,IAAA,CACnDZ,CAAAA,CAAQ,EACVY,CAAAA,CAAa,UAAA,CAAW,IAAMD,CAAAA,CAAY,GAAA,CAAI,IAAI,CAAA,CAAGX,CAAK,EAE1DW,CAAAA,CAAY,GAAA,CAAI,IAAI,CAAA,CAItB,IAAIE,EAAqD,IAAA,CACzD,OAAId,MACFc,CAAAA,CAAe,UAAA,CAAW,IAAM,CAC1BJ,CAAAA,KAAY,SAAA,GACdN,CAAAA,CAAY,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmCJ,GAAO,CAAA,EAAA,CAAI,CAAA,CACpEU,EAAM,GAAA,CAAI,OAAO,GAErB,CAAA,CAAGV,GAAO,GAGL,IAAM,CACX,IAAMe,CAAAA,CAAIL,CAAAA,GAQV,OALIK,CAAAA,GAAM,YACJF,CAAAA,EAAY,YAAA,CAAaA,CAAU,CAAA,CACnCC,CAAAA,EAAc,aAAaA,CAAY,CAAA,CAAA,CAGzCC,IAAM,OAAA,EAAWb,GAAAA,CACZA,IAAaO,CAAAA,CAAI,KAAY,EAGlCM,CAAAA,GAAM,OAAA,EAAWhB,GAAWK,CAAAA,CACvBY,CAAAA,CAAUjB,EAAQK,CAAS,CAAC,EAGjCW,CAAAA,GAAM,SAAA,EAAaH,GAAY,EAAKd,GAAAA,CAC/BkB,EAAUlB,GAAAA,EAAW,EAIvB,QAAA,CAAS,aAAA,CAAc,eAAe,CAC/C,CACF,CAAC,CACH","file":"chunk-SXYPAP4B.js","sourcesContent":["/**\n * defineAsyncComponent — lazy component loading.\n *\n * Wraps a dynamic import() into a component that shows a loading\n * state while the chunk downloads, an error state if it fails,\n * and the real component once resolved.\n *\n * ```ts\n * const LazyChart = defineAsyncComponent(() => import('./Chart.akash'));\n *\n * // With loading/error:\n * const LazyChart = defineAsyncComponent({\n * loader: () => import('./Chart.akash'),\n * loading: () => <Spinner />,\n * error: (err) => <p>Failed: {err.message}</p>,\n * timeout: 10000,\n * });\n * ```\n */\n\nimport { defineComponent } from './component.js';\nimport { signal } from './signals.js';\nimport { nodeToDOM } from './dom.js';\nimport type { Component } from './component.js';\nimport type { AkashNode } from './types.js';\n\n// --- Types ---\n\nexport type AsyncComponentLoader<P extends Record<string, unknown> = any> =\n () => Promise<{ default: Component<P> }>;\n\nexport interface AsyncComponentOptions<P extends Record<string, unknown> = any> {\n /** The async loader function (dynamic import) */\n loader: AsyncComponentLoader<P>;\n /** Component to show while loading */\n loading?: () => AkashNode;\n /** Component to show on error */\n error?: (error: Error) => AkashNode;\n /** Timeout in ms — show error after this (default: none) */\n timeout?: number;\n /** Delay in ms before showing loading state (default: 200) */\n delay?: number;\n}\n\n// --- defineAsyncComponent ---\n\n/**\n * Define a component that loads asynchronously via dynamic import.\n */\nexport function defineAsyncComponent<P extends Record<string, unknown> = any>(\n loaderOrOptions: AsyncComponentLoader<P> | AsyncComponentOptions<P>,\n): Component<P> {\n const options: AsyncComponentOptions<P> =\n typeof loaderOrOptions === 'function'\n ? { loader: loaderOrOptions }\n : loaderOrOptions;\n\n const {\n loader,\n loading: loadingFn,\n error: errorFn,\n timeout,\n delay = 200,\n } = options;\n\n // Cache the loaded component\n let resolvedComp: Component<P> | null = null;\n let loadPromise: Promise<void> | null = null;\n let loadError: Error | null = null;\n\n function startLoad(): Promise<void> {\n if (loadPromise) return loadPromise;\n\n loadPromise = loader()\n .then((mod) => {\n resolvedComp = mod.default;\n })\n .catch((err) => {\n loadError = err instanceof Error ? err : new Error(String(err));\n });\n\n return loadPromise;\n }\n\n return defineComponent<P>((ctx) => {\n const state = signal<'loading' | 'ready' | 'error'>('loading');\n const showLoading = signal(false);\n\n // Start loading\n startLoad().then(() => {\n if (loadError) {\n state.set('error');\n } else {\n state.set('ready');\n }\n });\n\n // Delay before showing loading indicator\n let delayTimer: ReturnType<typeof setTimeout> | null = null;\n if (delay > 0) {\n delayTimer = setTimeout(() => showLoading.set(true), delay);\n } else {\n showLoading.set(true);\n }\n\n // Timeout\n let timeoutTimer: ReturnType<typeof setTimeout> | null = null;\n if (timeout) {\n timeoutTimer = setTimeout(() => {\n if (state() === 'loading') {\n loadError = new Error(`Async component timed out after ${timeout}ms`);\n state.set('error');\n }\n }, timeout);\n }\n\n return () => {\n const s = state();\n\n // Clear timers once resolved\n if (s !== 'loading') {\n if (delayTimer) clearTimeout(delayTimer);\n if (timeoutTimer) clearTimeout(timeoutTimer);\n }\n\n if (s === 'ready' && resolvedComp) {\n return resolvedComp(ctx.props as any);\n }\n\n if (s === 'error' && errorFn && loadError) {\n return nodeToDOM(errorFn(loadError));\n }\n\n if (s === 'loading' && showLoading() && loadingFn) {\n return nodeToDOM(loadingFn());\n }\n\n // Nothing to show yet\n return document.createComment('async-loading');\n };\n });\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {c}from'./chunk-YXKQTEPR.js';var p=typeof requestAnimationFrame=="function"?requestAnimationFrame:e=>setTimeout(()=>e(Date.now()),16),g=typeof cancelAnimationFrame=="function"?cancelAnimationFrame:e=>clearTimeout(e),S={linear:e=>e,cubicIn:e=>e*e*e,cubicOut:e=>1-Math.pow(1-e,3),cubicInOut:e=>e<.5?4*e*e*e:1-Math.pow(-2*e+2,3)/2,quadIn:e=>e*e,quadOut:e=>1-(1-e)*(1-e),quintOut:e=>1-Math.pow(1-e,5),bounceOut:e=>e<1/2.75?7.5625*e*e:e<2/2.75?7.5625*(e-=1.5/2.75)*e+.75:e<2.5/2.75?7.5625*(e-=2.25/2.75)*e+.9375:7.5625*(e-=2.625/2.75)*e+.984375,elasticOut:e=>e===0||e===1?e:Math.pow(2,-10*e)*Math.sin((e-.1)*5*Math.PI)+1};function A(e,r,o){return typeof e=="number"&&typeof r=="number"?e+(r-e)*o:o<.5?e:r}function k(e,r={}){let{duration:o=400,easing:w=S.cubicOut,interpolate:y=A,delay:O=0}=r,a=c(e),m=c(e),i=0,n=false,u=(()=>a());return u.set=(t,s)=>{let f=s?.duration??o,I=s?.easing??w,h=s?.interpolate??y,M=s?.delay??O,P=a();return m.set(t),f===0?(a.set(t),Promise.resolve()):(n&&(g(i),n=false),new Promise(l=>{let x=performance.now()+M;n=true;function c(F){if(!n){l();return}let d=F-x;if(d<0){i=p(c);return}let b=Math.min(d/f,1),q=I(b);a.set(h(P,t,q)),b<1?i=p(c):(n=false,l());}i=p(c);}))},u.setImmediate=t=>{n&&(g(i),n=false),a.set(t),m.set(t);},u.target=()=>m(),u}export{S as a,k as b};//# sourceMappingURL=chunk-T2RVAQEU.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-T2RVAQEU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tweened.ts"],"names":["raf","fn","caf","id","easings","t","defaultInterpolate","from","to","tweened","initialValue","options","duration","easing","interpolate","delay","current","signal","targetValue","rafId","running","read","value","overrides","dur","ease","interp","del","resolve","start","tick","now","elapsed","easedT"],"mappings":"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","file":"chunk-T2RVAQEU.js","sourcesContent":["/**\n * Tweened values — smooth interpolation between states.\n *\n * Unlike signals that update instantly, tweened values animate\n * smoothly from old to new over a duration.\n *\n * ```ts\n * const progress = tweened(0, { duration: 400 });\n * progress.set(100); // smoothly animates 0 → 100 over 400ms\n * progress(); // intermediate values during animation\n *\n * const color = tweened('#ff0000', { duration: 300, interpolate: lerpColor });\n * ```\n */\n\n// Fallback for non-browser environments (Node.js, SSR)\nconst raf = typeof requestAnimationFrame === 'function'\n ? requestAnimationFrame\n : (fn: (t: number) => void) => setTimeout(() => fn(Date.now()), 16) as unknown as number;\nconst caf = typeof cancelAnimationFrame === 'function'\n ? cancelAnimationFrame\n : (id: number) => clearTimeout(id);\n\nimport { signal } from './signals.js';\nimport type { Signal, ReadonlySignal } from './signals.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport type Interpolator<T> = (from: T, to: T, t: number) => T;\n\nexport type EasingFn = (t: number) => number;\n\nexport interface TweenedOptions<T> {\n /** Duration in ms (default: 400) */\n duration?: number;\n /** Easing function (default: cubicOut) */\n easing?: EasingFn;\n /** Custom interpolation function */\n interpolate?: Interpolator<T>;\n /** Delay before animation starts */\n delay?: number;\n}\n\nexport interface TweenedSignal<T> {\n /** Read current (animated) value */\n (): T;\n /** Set new target — animates from current to new */\n set(value: T, opts?: Partial<TweenedOptions<T>>): Promise<void>;\n /** Set immediately without animation */\n setImmediate(value: T): void;\n /** Current target value */\n target: () => T;\n}\n\n// =========================================================================\n// Built-in easing functions\n// =========================================================================\n\nexport const easings = {\n linear: (t: number) => t,\n cubicIn: (t: number) => t * t * t,\n cubicOut: (t: number) => 1 - Math.pow(1 - t, 3),\n cubicInOut: (t: number) => t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2,\n quadIn: (t: number) => t * t,\n quadOut: (t: number) => 1 - (1 - t) * (1 - t),\n quintOut: (t: number) => 1 - Math.pow(1 - t, 5),\n bounceOut: (t: number) => {\n if (t < 1 / 2.75) return 7.5625 * t * t;\n if (t < 2 / 2.75) return 7.5625 * (t -= 1.5 / 2.75) * t + 0.75;\n if (t < 2.5 / 2.75) return 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375;\n return 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375;\n },\n elasticOut: (t: number) => {\n if (t === 0 || t === 1) return t;\n return Math.pow(2, -10 * t) * Math.sin((t - 0.1) * 5 * Math.PI) + 1;\n },\n} as const;\n\n// =========================================================================\n// Default interpolators\n// =========================================================================\n\nfunction defaultInterpolate<T>(from: T, to: T, t: number): T {\n if (typeof from === 'number' && typeof to === 'number') {\n return (from + (to - from) * t) as T;\n }\n // For non-numbers, snap at halfway\n return t < 0.5 ? from : to;\n}\n\n// =========================================================================\n// tweened()\n// =========================================================================\n\n/**\n * Create a tweened signal that animates between values.\n *\n * ```ts\n * const count = tweened(0, { duration: 300, easing: easings.cubicOut });\n * count.set(100); // smoothly goes 0 → 100\n * count(); // current interpolated value\n * ```\n */\nexport function tweened<T>(\n initialValue: T,\n options: TweenedOptions<T> = {},\n): TweenedSignal<T> {\n const {\n duration = 400,\n easing = easings.cubicOut,\n interpolate = defaultInterpolate,\n delay = 0,\n } = options;\n\n const current = signal<T>(initialValue);\n const targetValue = signal<T>(initialValue);\n let rafId = 0;\n let running = false;\n\n const read = (() => current()) as TweenedSignal<T>;\n\n read.set = (value: T, overrides?: Partial<TweenedOptions<T>>): Promise<void> => {\n const dur = overrides?.duration ?? duration;\n const ease = overrides?.easing ?? easing;\n const interp = overrides?.interpolate ?? interpolate;\n const del = overrides?.delay ?? delay;\n\n const from = current();\n targetValue.set(value);\n\n if (dur === 0) {\n current.set(value);\n return Promise.resolve();\n }\n\n // Cancel any running animation\n if (running) {\n caf(rafId);\n running = false;\n }\n\n return new Promise<void>((resolve) => {\n const start = performance.now() + del;\n running = true;\n\n function tick(now: number): void {\n if (!running) { resolve(); return; }\n\n const elapsed = now - start;\n if (elapsed < 0) {\n rafId = raf(tick);\n return;\n }\n\n const t = Math.min(elapsed / dur, 1);\n const easedT = ease(t);\n current.set(interp(from, value, easedT));\n\n if (t < 1) {\n rafId = raf(tick);\n } else {\n running = false;\n resolve();\n }\n }\n\n rafId = raf(tick);\n });\n };\n\n read.setImmediate = (value: T): void => {\n if (running) { caf(rafId); running = false; }\n current.set(value);\n targetValue.set(value);\n };\n\n read.target = () => targetValue();\n\n return read;\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var I=0;function g(e){return {_type:"provider",factory:e.factory,providedIn:e.providedIn,multi:e.multi,_id:Symbol(`provider-${++I}`)}}var i=new Map;function y(e=[],r){let s=new Map,u=new Map,a=new Map;for(let t of e)a.set(t.provide._id,t);let d={get(t){let n=t._id;if(t.multi){if(u.has(n))return u.get(n);let o=[],c=a.get(n);if(c?.useFactory?o.push(c.useFactory()):c?.useValue!==void 0&&o.push(c.useValue),r?.has(t)){let v=r.get(t);Array.isArray(v)&&o.push(...v);}return u.set(n,o),o}if(s.has(n))return s.get(n);if(t.providedIn==="root"&&i.has(n))return i.get(n);let T=a.get(n);if(T){let o=p(T,d);return s.set(n,o),o}if(r)return r.get(t);let l=t.factory();return t.providedIn==="root"?i.set(n,l):s.set(n,l),l},has(t){return s.has(t._id)||a.has(t._id)||t.providedIn==="root"&&i.has(t._id)?true:r?r.has(t):false},createChild(t){return y(t??[],d)},dispose(){s.clear(),u.clear();}};return d}function p(e,r){return e.useValue!==void 0?e.useValue:e.useFactory?e.useFactory():e.useExisting?r.get(e.useExisting):e.provide.factory()}var f=null;function P(e){let r=f;return f=e,r}function m(e){if(!f){if(e.providedIn==="root"){if(i.has(e._id))return i.get(e._id);let r=e.factory();return i.set(e._id,r),r}return e.factory()}return f.get(e)}function h(){i.clear();}exports.a=g;exports.b=y;exports.c=P;exports.d=m;exports.e=h;//# sourceMappingURL=chunk-T7A5YOEG.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-T7A5YOEG.cjs.map
|