@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 @@
|
|
|
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":"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","file":"chunk-MDHWM3C2.js","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"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import {p}from'./chunk-KE7BJTCD.js';import {e}from'./chunk-YXKQTEPR.js';var f=[];function m(){let i=f;return f=[],i}function g(i){if(!i||i.length===0)return "";let r="",s=i.reduce((o,t)=>t.title??o,""),c=i.reduce((o,t)=>t.titleTemplate??o,"");if(s){let o=c?c.replace("%s",s):s;r+=`<title>${o}</title>
|
|
2
|
+
`;}for(let o of i)for(let t of o.meta??[])r+=" <meta",t.name&&(r+=` name="${t.name}"`),t.property&&(r+=` property="${t.property}"`),t.httpEquiv&&(r+=` http-equiv="${t.httpEquiv}"`),r+=` content="${t.content}"`,r+=` />
|
|
3
|
+
`;for(let o of i)for(let t of o.link??[])r+=` <link rel="${t.rel}" href="${t.href}"`,t.type&&(r+=` type="${t.type}"`),r+=` />
|
|
4
|
+
`;return r}var a="data-akash-head";function h(i){let r=typeof i=="function"?i:()=>i;if(typeof document>"u")return f.push(r()),()=>{};let s=[],c=e(()=>{let t=r();for(let e of s)e.remove();if(s.length=0,t.title){let e=t.titleTemplate?t.titleTemplate.replace("%s",t.title):t.title;document.title=e;}for(let e of t.meta??[]){let n=document.createElement("meta");n.setAttribute(a,""),e.name&&n.setAttribute("name",e.name),e.property&&n.setAttribute("property",e.property),e.httpEquiv&&n.setAttribute("http-equiv",e.httpEquiv),n.setAttribute("content",e.content),document.head.appendChild(n),s.push(n);}for(let e of t.link??[]){let n=document.createElement("link");n.setAttribute(a,""),n.setAttribute("rel",e.rel),n.setAttribute("href",e.href),e.type&&n.setAttribute("type",e.type),document.head.appendChild(n),s.push(n);}for(let e of t.script??[]){let n=document.createElement("script");n.setAttribute(a,""),e.src&&n.setAttribute("src",e.src),e.type&&n.setAttribute("type",e.type),e.async&&n.setAttribute("async",""),e.defer&&n.setAttribute("defer",""),e.innerHTML&&(n.textContent=e.innerHTML),document.head.appendChild(n),s.push(n);}if(t.htmlAttrs)for(let[e,n]of Object.entries(t.htmlAttrs))document.documentElement.setAttribute(e,n);if(t.bodyAttrs)for(let[e,n]of Object.entries(t.bodyAttrs))document.body.setAttribute(e,n);}),o=()=>{c();for(let t of s)t.remove();s.length=0;};try{p(o);}catch{}return o}export{m as a,g as b,h as c};//# sourceMappingURL=chunk-N3ITIHHM.js.map
|
|
5
|
+
//# sourceMappingURL=chunk-N3ITIHHM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/head.ts"],"names":["ssrHeadTags","collectSSRHead","tags","renderHeadToString","configs","html","title","t","c","titleTemplate","finalTitle","config","meta","link","MANAGED_ATTR","useHead","getConfig","managedElements","dispose","effect","cfg","el","script","key","value","cleanup","onUnmount"],"mappings":"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","file":"chunk-N3ITIHHM.js","sourcesContent":["/**\n * Document head management.\n *\n * Provides Title, Meta, and Head components for managing\n * <head> content declaratively. SSR-compatible — on the server,\n * collects tags; on the client, directly mutates the DOM.\n *\n * ```ts\n * // In any component:\n * useHead({\n * title: 'My Page',\n * meta: [\n * { name: 'description', content: 'Page description' },\n * { property: 'og:title', content: 'My Page' },\n * ],\n * link: [\n * { rel: 'canonical', href: 'https://example.com/page' },\n * ],\n * });\n * ```\n */\n\nimport { effect } from './signals.js';\nimport { onUnmount } from './component.js';\n\n// --- Types ---\n\nexport interface HeadConfig {\n /** Document title */\n title?: string;\n /** Title template — use %s as placeholder */\n titleTemplate?: string;\n /** Meta tags */\n meta?: MetaTag[];\n /** Link tags */\n link?: LinkTag[];\n /** Script tags */\n script?: ScriptTag[];\n /** HTML attributes */\n htmlAttrs?: Record<string, string>;\n /** Body attributes */\n bodyAttrs?: Record<string, string>;\n}\n\nexport interface MetaTag {\n name?: string;\n property?: string;\n httpEquiv?: string;\n content: string;\n}\n\nexport interface LinkTag {\n rel: string;\n href: string;\n type?: string;\n crossorigin?: string;\n}\n\nexport interface ScriptTag {\n src?: string;\n type?: string;\n async?: boolean;\n defer?: boolean;\n innerHTML?: string;\n}\n\n// --- SSR head collection ---\n\nlet ssrHeadTags: HeadConfig[] = [];\n\n/** @internal — collect head tags during SSR */\nexport function collectSSRHead(): HeadConfig[] {\n const tags = ssrHeadTags;\n ssrHeadTags = [];\n return tags;\n}\n\n/** Render collected head tags to HTML string (for SSR) */\nexport function renderHeadToString(configs?: HeadConfig[] | null): string {\n if (!configs || configs.length === 0) return '';\n let html = '';\n\n // Last title wins\n const title = configs.reduce((t, c) => c.title ?? t, '');\n const titleTemplate = configs.reduce((t, c) => c.titleTemplate ?? t, '');\n\n if (title) {\n const finalTitle = titleTemplate\n ? titleTemplate.replace('%s', title)\n : title;\n html += `<title>${finalTitle}</title>\\n`;\n }\n\n // Merge all meta tags\n for (const config of configs) {\n for (const meta of config.meta ?? []) {\n html += ' <meta';\n if (meta.name) html += ` name=\"${meta.name}\"`;\n if (meta.property) html += ` property=\"${meta.property}\"`;\n if (meta.httpEquiv) html += ` http-equiv=\"${meta.httpEquiv}\"`;\n html += ` content=\"${meta.content}\"`;\n html += ' />\\n';\n }\n }\n\n // Merge all link tags\n for (const config of configs) {\n for (const link of config.link ?? []) {\n html += ` <link rel=\"${link.rel}\" href=\"${link.href}\"`;\n if (link.type) html += ` type=\"${link.type}\"`;\n html += ' />\\n';\n }\n }\n\n return html;\n}\n\n// --- Client-side head management ---\n\nconst MANAGED_ATTR = 'data-akash-head';\n\n/**\n * Declaratively manage document head tags.\n * Call inside defineComponent() setup.\n *\n * Tags are automatically cleaned up when the component unmounts.\n * Reactive values (signals) in the config trigger updates.\n */\nexport function useHead(config: HeadConfig | (() => HeadConfig)): () => void {\n const getConfig = typeof config === 'function' ? config : () => config;\n\n // SSR: just collect\n if (typeof document === 'undefined') {\n ssrHeadTags.push(getConfig());\n return () => {};\n }\n\n const managedElements: Element[] = [];\n\n const dispose = effect(() => {\n const cfg = getConfig();\n\n // Clean up previously managed elements\n for (const el of managedElements) {\n el.remove();\n }\n managedElements.length = 0;\n\n // Title\n if (cfg.title) {\n const title = cfg.titleTemplate\n ? cfg.titleTemplate.replace('%s', cfg.title)\n : cfg.title;\n document.title = title;\n }\n\n // Meta tags\n for (const meta of cfg.meta ?? []) {\n const el = document.createElement('meta');\n el.setAttribute(MANAGED_ATTR, '');\n if (meta.name) el.setAttribute('name', meta.name);\n if (meta.property) el.setAttribute('property', meta.property);\n if (meta.httpEquiv) el.setAttribute('http-equiv', meta.httpEquiv);\n el.setAttribute('content', meta.content);\n document.head.appendChild(el);\n managedElements.push(el);\n }\n\n // Link tags\n for (const link of cfg.link ?? []) {\n const el = document.createElement('link');\n el.setAttribute(MANAGED_ATTR, '');\n el.setAttribute('rel', link.rel);\n el.setAttribute('href', link.href);\n if (link.type) el.setAttribute('type', link.type);\n document.head.appendChild(el);\n managedElements.push(el);\n }\n\n // Script tags\n for (const script of cfg.script ?? []) {\n const el = document.createElement('script');\n el.setAttribute(MANAGED_ATTR, '');\n if (script.src) el.setAttribute('src', script.src);\n if (script.type) el.setAttribute('type', script.type);\n if (script.async) el.setAttribute('async', '');\n if (script.defer) el.setAttribute('defer', '');\n if (script.innerHTML) el.textContent = script.innerHTML;\n document.head.appendChild(el);\n managedElements.push(el);\n }\n\n // HTML attributes\n if (cfg.htmlAttrs) {\n for (const [key, value] of Object.entries(cfg.htmlAttrs)) {\n document.documentElement.setAttribute(key, value);\n }\n }\n\n // Body attributes\n if (cfg.bodyAttrs) {\n for (const [key, value] of Object.entries(cfg.bodyAttrs)) {\n document.body.setAttribute(key, value);\n }\n }\n });\n\n const cleanup = () => {\n dispose();\n for (const el of managedElements) {\n el.remove();\n }\n managedElements.length = 0;\n };\n\n // Cleanup on unmount\n try {\n onUnmount(cleanup);\n } catch {\n // onUnmount may throw if called outside component — that's fine,\n // caller can use the returned dispose function manually\n }\n\n return cleanup;\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {e}from'./chunk-YXKQTEPR.js';function w(e$1,t,u={}){let{immediate:x=false,once:O=false,debounce:i,deep:l=false}=u,T=Array.isArray(e$1),s=T?e$1:[e$1],o=s.map(()=>{}),h=true,c=null,f=false,y=null,b=()=>{f=true,c&&clearTimeout(c),y?.();};y=e(()=>{let n=s.map(r=>r());if(h){h=false,o=l?n.map(k):[...n],x&&m(n,s.map(()=>{}));return}if(!(l?n.some((r,p)=>!S(r,o[p])):n.some((r,p)=>!Object.is(r,o[p]))))return;let a=[...o];o=l?n.map(k):[...n],m(n,a);});function m(n,d){if(f)return;let a=()=>{O&&(f=true,queueMicrotask(b)),T?t(n,d):t(n[0],d[0]);};i&&i>0?(c&&clearTimeout(c),c=setTimeout(a,i)):a();}return b}function v(e,t){return w(e,t,{once:true})}function g(e,t,u){return w(e,t,{debounce:u})}function k(e){if(e===null||typeof e!="object")return e;try{return JSON.parse(JSON.stringify(e))}catch{return e}}function S(e,t){if(Object.is(e,t))return true;if(e===null||t===null||typeof e!="object"||typeof t!="object")return false;try{return JSON.stringify(e)===JSON.stringify(t)}catch{return false}}export{w as a,v as b,g as c};//# sourceMappingURL=chunk-N5APNCPB.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-N5APNCPB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/watch.ts"],"names":["watch","source","callback","options","immediate","once","debounceMs","deep","isMulti","sources","oldValues","isFirst","debounceTimer","disposed","disposeEffect","dispose","effect","newValues","s","deepClone","fireCallback","v","i","deepEqual","prevValues","newVals","oldVals","doCall","watchOnce","watchDebounced","ms","value","a","b"],"mappings":"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","file":"chunk-N5APNCPB.js","sourcesContent":["/**\n * watch() — react to signal changes with old/new values.\n *\n * Unlike effect() which just re-runs, watch() gives you the previous\n * and current value so you can react to *what changed*.\n *\n * ```ts\n * const count = signal(0);\n * watch(count, (newVal, oldVal) => {\n * console.log(`Changed from ${oldVal} to ${newVal}`);\n * });\n *\n * // With options:\n * watch(count, callback, { immediate: true, once: true });\n *\n * // Multiple sources:\n * watch([count, name], ([newCount, newName], [oldCount, oldName]) => { ... });\n * ```\n */\n\nimport { effect } from './signals.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport interface WatchOptions {\n /** Run callback immediately with current value (default: false) */\n immediate?: boolean;\n /** Only fire once, then auto-dispose (default: false) */\n once?: boolean;\n /** Debounce callback in ms */\n debounce?: number;\n /** Deep comparison for objects (default: false) */\n deep?: boolean;\n}\n\nexport type WatchSource<T> = () => T;\nexport type WatchCallback<T> = (newValue: T, oldValue: T | undefined) => void;\nexport type WatchArrayCallback<T extends unknown[]> = (newValues: T, oldValues: (T[number] | undefined)[]) => void;\n\n// =========================================================================\n// watch() — single source\n// =========================================================================\n\n/**\n * Watch a reactive source and call back with old + new values.\n *\n * ```ts\n * const dispose = watch(count, (newVal, oldVal) => {\n * analytics.track('count_changed', { from: oldVal, to: newVal });\n * });\n * ```\n */\nexport function watch<T>(\n source: WatchSource<T>,\n callback: WatchCallback<T>,\n options?: WatchOptions,\n): () => void;\n\n/**\n * Watch multiple sources.\n */\nexport function watch<T extends unknown[]>(\n sources: { [K in keyof T]: WatchSource<T[K]> },\n callback: WatchArrayCallback<T>,\n options?: WatchOptions,\n): () => void;\n\nexport function watch(\n source: WatchSource<any> | WatchSource<any>[],\n callback: any,\n options: WatchOptions = {},\n): () => void {\n const { immediate = false, once = false, debounce: debounceMs, deep = false } = options;\n\n const isMulti = Array.isArray(source);\n const sources = isMulti ? source : [source];\n\n let oldValues: any[] = sources.map(() => undefined);\n let isFirst = true;\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n let disposed = false;\n let disposeEffect: (() => void) | null = null;\n\n const dispose = () => {\n disposed = true;\n if (debounceTimer) clearTimeout(debounceTimer);\n disposeEffect?.();\n };\n\n disposeEffect = effect(() => {\n // Read all sources to establish tracking\n const newValues = sources.map((s) => s());\n\n if (isFirst) {\n isFirst = false;\n oldValues = deep ? newValues.map(deepClone) : [...newValues];\n\n if (immediate) {\n fireCallback(newValues, sources.map(() => undefined));\n }\n return;\n }\n\n // Check if anything actually changed\n const changed = deep\n ? newValues.some((v, i) => !deepEqual(v, oldValues[i]))\n : newValues.some((v, i) => !Object.is(v, oldValues[i]));\n\n if (!changed) return;\n\n const prevValues = [...oldValues];\n oldValues = deep ? newValues.map(deepClone) : [...newValues];\n\n fireCallback(newValues, prevValues);\n });\n\n function fireCallback(newVals: any[], oldVals: any[]): void {\n if (disposed) return;\n\n const doCall = () => {\n if (once) {\n // Dispose BEFORE calling callback so any signal writes in the\n // callback don't re-trigger this watcher\n disposed = true;\n queueMicrotask(dispose);\n }\n\n if (isMulti) {\n callback(newVals, oldVals);\n } else {\n callback(newVals[0], oldVals[0]);\n }\n };\n\n if (debounceMs && debounceMs > 0) {\n if (debounceTimer) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(doCall, debounceMs);\n } else {\n doCall();\n }\n }\n\n return dispose;\n}\n\n// =========================================================================\n// watchOnce — convenience\n// =========================================================================\n\n/**\n * Watch a source once, then auto-dispose.\n *\n * ```ts\n * watchOnce(isReady, (ready) => {\n * if (ready) initApp();\n * });\n * ```\n */\nexport function watchOnce<T>(\n source: WatchSource<T>,\n callback: WatchCallback<T>,\n): () => void {\n return watch(source, callback, { once: true });\n}\n\n// =========================================================================\n// watchDebounced — convenience\n// =========================================================================\n\n/**\n * Watch with built-in debounce.\n *\n * ```ts\n * watchDebounced(searchInput, (query) => {\n * fetchResults(query);\n * }, 300);\n * ```\n */\nexport function watchDebounced<T>(\n source: WatchSource<T>,\n callback: WatchCallback<T>,\n ms: number,\n): () => void {\n return watch(source, callback, { debounce: ms });\n}\n\n// =========================================================================\n// Helpers\n// =========================================================================\n\nfunction deepClone<T>(value: T): T {\n if (value === null || typeof value !== 'object') return value;\n try {\n return JSON.parse(JSON.stringify(value));\n } catch {\n return value;\n }\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (a === null || b === null || typeof a !== 'object' || typeof b !== 'object') return false;\n try {\n return JSON.stringify(a) === JSON.stringify(b);\n } catch {\n return false;\n }\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {c}from'./chunk-YXKQTEPR.js';function v(e,t={}){let s=c(false),i=c(false),n=c(!navigator.onLine),r=null;window.addEventListener("online",()=>n.set(false)),window.addEventListener("offline",()=>n.set(true));let c$1=new Promise((u,o)=>{if(!("serviceWorker"in navigator)){o(new Error("Service workers not supported"));return}navigator.serviceWorker.register(e,{scope:t.scope}).then(a=>{r=a,s.set(true),t.onReady?.(a),u(a),a.addEventListener("updatefound",()=>{let l=a.installing;l&&l.addEventListener("statechange",()=>{l.state==="installed"&&navigator.serviceWorker.controller&&(i.set(true),t.onUpdate?.(a),t.autoReload&&(l.postMessage({type:"SKIP_WAITING"}),window.location.reload()));});});}).catch(a=>{t.onError?.(a),o(a);});});return {registered:()=>s(),updateAvailable:()=>i(),offline:()=>n(),ready:c$1,async update(){r&&await r.update();},skipWaiting(){r?.waiting&&(r.waiting.postMessage({type:"SKIP_WAITING"}),window.location.reload());},async unregister(){return r?r.unregister():false}}}function f(e){let t=Array.isArray(e)?e:e.runtimeCache??[],s=Array.isArray(e)?[]:e.precache??[],i=Array.isArray(e)?"akash-cache-v1":e.cacheName??"akash-cache-v1",n=`// Auto-generated service worker by AkashJS
|
|
2
2
|
const CACHE_NAME = '${i}';
|
|
3
3
|
const PRECACHE_URLS = ${JSON.stringify(s)};
|
|
4
4
|
|
|
@@ -32,5 +32,5 @@ self.addEventListener('fetch', (event) => {
|
|
|
32
32
|
fetch(event.request).catch(() => caches.match(event.request))
|
|
33
33
|
);
|
|
34
34
|
});
|
|
35
|
-
`,n}function p(e,t){switch(e){case "cache-first":return `caches.match(event.request).then(cached => cached || fetch(event.request).then(response => { const clone = response.clone(); caches.open('${t}').then(cache => cache.put(event.request, clone)); return response; }))`;case "network-first":return `fetch(event.request).then(response => { const clone = response.clone(); caches.open('${t}').then(cache => cache.put(event.request, clone)); return response; }).catch(() => caches.match(event.request))`;case "stale-while-revalidate":return `caches.match(event.request).then(cached => { const fetchPromise = fetch(event.request).then(response => { caches.open('${t}').then(cache => cache.put(event.request, response.clone())); return response; }); return cached || fetchPromise; })`;case "network-only":return "fetch(event.request)";case "cache-only":return "caches.match(event.request)"}}async function y(e,t){return await Notification.requestPermission()!=="granted"?null:await e.pushManager.subscribe({userVisibleOnly:true,applicationServerKey:d(t)})}function d(e){let t="=".repeat((4-e.length%4)%4),s=(e+t).replace(/-/g,"+").replace(/_/g,"/"),i=atob(s);return Uint8Array.from(i,n=>n.charCodeAt(0))}export{v as a,f as b,y as c};//# sourceMappingURL=chunk-
|
|
36
|
-
//# sourceMappingURL=chunk-
|
|
35
|
+
`,n}function p(e,t){switch(e){case "cache-first":return `caches.match(event.request).then(cached => cached || fetch(event.request).then(response => { const clone = response.clone(); caches.open('${t}').then(cache => cache.put(event.request, clone)); return response; }))`;case "network-first":return `fetch(event.request).then(response => { const clone = response.clone(); caches.open('${t}').then(cache => cache.put(event.request, clone)); return response; }).catch(() => caches.match(event.request))`;case "stale-while-revalidate":return `caches.match(event.request).then(cached => { const fetchPromise = fetch(event.request).then(response => { caches.open('${t}').then(cache => cache.put(event.request, response.clone())); return response; }); return cached || fetchPromise; })`;case "network-only":return "fetch(event.request)";case "cache-only":return "caches.match(event.request)"}}async function y(e,t){return await Notification.requestPermission()!=="granted"?null:await e.pushManager.subscribe({userVisibleOnly:true,applicationServerKey:d(t)})}function d(e){let t="=".repeat((4-e.length%4)%4),s=(e+t).replace(/-/g,"+").replace(/_/g,"/"),i=atob(s);return Uint8Array.from(i,n=>n.charCodeAt(0))}export{v as a,f as b,y as c};//# sourceMappingURL=chunk-NBYFHJWB.js.map
|
|
36
|
+
//# sourceMappingURL=chunk-NBYFHJWB.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/pwa.ts"],"names":["registerServiceWorker","swUrl","options","registered","signal","updateAvailable","offline","registration","ready","resolve","reject","reg","newWorker","err","generateSWScript","routesOrConfig","routes","precache","globalCacheName","script","route","matchValue","pattern","cacheName","generateStrategyCode","strategy","subscribePush","vapidPublicKey","urlBase64ToUint8Array","base64String","padding","base64","rawData","char"],"mappings":"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","file":"chunk-U53YRJNV.js","sourcesContent":["/**\n * PWA / Service Worker support.\n *\n * Register service workers, configure caching strategies,\n * handle updates, and manage push notifications.\n *\n * ```ts\n * const sw = registerServiceWorker('/sw.js', {\n * onUpdate: () => toast.info('New version available!'),\n * });\n * sw.ready; // Promise<ServiceWorkerRegistration>\n * sw.update(); // check for updates\n * ```\n */\n\nimport { signal } from './signals.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport interface SWOptions {\n /** Callback when a new version is available */\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n /** Callback when the SW is ready */\n onReady?: (registration: ServiceWorkerRegistration) => void;\n /** Callback on registration error */\n onError?: (error: Error) => void;\n /** Auto-reload on update (default: false) */\n autoReload?: boolean;\n /** Scope of the service worker */\n scope?: string;\n}\n\nexport interface SWRegistration {\n /** Whether the SW is registered */\n registered: ReadonlySignal<boolean>;\n /** Whether an update is available */\n updateAvailable: ReadonlySignal<boolean>;\n /** Whether the app is running offline */\n offline: ReadonlySignal<boolean>;\n /** The raw SW registration (available after ready) */\n ready: Promise<ServiceWorkerRegistration>;\n /** Check for updates */\n update(): Promise<void>;\n /** Skip waiting and activate new SW */\n skipWaiting(): void;\n /** Unregister the service worker */\n unregister(): Promise<boolean>;\n}\n\n// =========================================================================\n// Service Worker registration\n// =========================================================================\n\n/**\n * Register a service worker with update detection.\n */\nexport function registerServiceWorker(\n swUrl: string,\n options: SWOptions = {},\n): SWRegistration {\n const registered = signal(false);\n const updateAvailable = signal(false);\n const offline = signal(!navigator.onLine);\n\n let registration: ServiceWorkerRegistration | null = null;\n\n // Track online/offline\n window.addEventListener('online', () => offline.set(false));\n window.addEventListener('offline', () => offline.set(true));\n\n const ready = new Promise<ServiceWorkerRegistration>((resolve, reject) => {\n if (!('serviceWorker' in navigator)) {\n reject(new Error('Service workers not supported'));\n return;\n }\n\n navigator.serviceWorker\n .register(swUrl, { scope: options.scope })\n .then((reg) => {\n registration = reg;\n registered.set(true);\n options.onReady?.(reg);\n resolve(reg);\n\n // Listen for updates\n reg.addEventListener('updatefound', () => {\n const newWorker = reg.installing;\n if (!newWorker) return;\n\n newWorker.addEventListener('statechange', () => {\n if (newWorker.state === 'installed' && navigator.serviceWorker.controller) {\n updateAvailable.set(true);\n options.onUpdate?.(reg);\n\n if (options.autoReload) {\n newWorker.postMessage({ type: 'SKIP_WAITING' });\n window.location.reload();\n }\n }\n });\n });\n })\n .catch((err) => {\n options.onError?.(err);\n reject(err);\n });\n });\n\n return {\n registered: () => registered(),\n updateAvailable: () => updateAvailable(),\n offline: () => offline(),\n ready,\n async update() {\n if (registration) {\n await registration.update();\n }\n },\n skipWaiting() {\n if (registration?.waiting) {\n registration.waiting.postMessage({ type: 'SKIP_WAITING' });\n window.location.reload();\n }\n },\n async unregister() {\n if (registration) {\n return registration.unregister();\n }\n return false;\n },\n };\n}\n\n// =========================================================================\n// Caching strategies (for SW scripts)\n// =========================================================================\n\nexport type CacheStrategy = 'cache-first' | 'network-first' | 'stale-while-revalidate' | 'network-only' | 'cache-only';\n\nexport interface CacheRoute {\n /** URL pattern to match (string or regex) */\n match: string | RegExp;\n /** Caching strategy */\n strategy: CacheStrategy;\n /** Cache name */\n cacheName?: string;\n /** Max entries in cache */\n maxEntries?: number;\n /** Max age in seconds */\n maxAgeSeconds?: number;\n}\n\n/**\n * Generate a service worker script from cache route configs.\n *\n * ```ts\n * const swScript = generateSWScript([\n * { match: /\\.(?:js|css)$/, strategy: 'cache-first', cacheName: 'assets' },\n * { match: '/api/', strategy: 'network-first', maxAgeSeconds: 300 },\n * { match: /\\.(?:png|jpg|svg)$/, strategy: 'cache-first', cacheName: 'images' },\n * ]);\n * ```\n */\nexport function generateSWScript(routesOrConfig: CacheRoute[] | { cacheName?: string; precache?: string[]; runtimeCache?: CacheRoute[] }): string {\n // Accept both array of routes and config object\n const routes: CacheRoute[] = Array.isArray(routesOrConfig)\n ? routesOrConfig\n : routesOrConfig.runtimeCache ?? [];\n const precache = Array.isArray(routesOrConfig) ? [] : routesOrConfig.precache ?? [];\n const globalCacheName = Array.isArray(routesOrConfig) ? 'akash-cache-v1' : routesOrConfig.cacheName ?? 'akash-cache-v1';\n let script = `// Auto-generated service worker by AkashJS\nconst CACHE_NAME = '${globalCacheName}';\nconst PRECACHE_URLS = ${JSON.stringify(precache)};\n\nself.addEventListener('install', (event) => {\n ${precache.length > 0 ? `event.waitUntil(\n caches.open(CACHE_NAME).then(cache => cache.addAll(PRECACHE_URLS))\n );` : ''}\n self.skipWaiting();\n});\n\nself.addEventListener('activate', (event) => {\n event.waitUntil(clients.claim());\n});\n\nself.addEventListener('message', (event) => {\n if (event.data?.type === 'SKIP_WAITING') {\n self.skipWaiting();\n }\n});\n\nself.addEventListener('fetch', (event) => {\n const url = new URL(event.request.url);\n`;\n\n for (const route of routes) {\n // Support both 'match' and 'urlPattern' property names\n const matchValue = route.match ?? (route as any).urlPattern;\n if (!matchValue) continue;\n\n const pattern = matchValue instanceof RegExp\n ? matchValue.toString()\n : `new RegExp(${JSON.stringify(matchValue.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))})`;\n\n const cacheName = route.cacheName ?? globalCacheName;\n\n script += `\n if (${pattern}.test(url.pathname)) {\n event.respondWith(${generateStrategyCode(route.strategy, cacheName)});\n return;\n }\n`;\n }\n\n script += `\n // Default: network-first\n event.respondWith(\n fetch(event.request).catch(() => caches.match(event.request))\n );\n});\n`;\n\n return script;\n}\n\nfunction generateStrategyCode(strategy: CacheStrategy, cacheName: string): string {\n switch (strategy) {\n case 'cache-first':\n return `caches.match(event.request).then(cached => cached || fetch(event.request).then(response => { const clone = response.clone(); caches.open('${cacheName}').then(cache => cache.put(event.request, clone)); return response; }))`;\n case 'network-first':\n return `fetch(event.request).then(response => { const clone = response.clone(); caches.open('${cacheName}').then(cache => cache.put(event.request, clone)); return response; }).catch(() => caches.match(event.request))`;\n case 'stale-while-revalidate':\n return `caches.match(event.request).then(cached => { const fetchPromise = fetch(event.request).then(response => { caches.open('${cacheName}').then(cache => cache.put(event.request, response.clone())); return response; }); return cached || fetchPromise; })`;\n case 'network-only':\n return `fetch(event.request)`;\n case 'cache-only':\n return `caches.match(event.request)`;\n }\n}\n\n// =========================================================================\n// Push notifications\n// =========================================================================\n\n/**\n * Request push notification permission and subscribe.\n */\nexport async function subscribePush(\n registration: ServiceWorkerRegistration,\n vapidPublicKey: string,\n): Promise<PushSubscription | null> {\n const permission = await Notification.requestPermission();\n if (permission !== 'granted') return null;\n\n const subscription = await registration.pushManager.subscribe({\n userVisibleOnly: true,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n applicationServerKey: urlBase64ToUint8Array(vapidPublicKey) as any,\n });\n\n return subscription;\n}\n\nfunction urlBase64ToUint8Array(base64String: string): Uint8Array {\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\n const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');\n const rawData = atob(base64);\n return Uint8Array.from(rawData, (char) => char.charCodeAt(0));\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/pwa.ts"],"names":["registerServiceWorker","swUrl","options","registered","signal","updateAvailable","offline","registration","ready","resolve","reject","reg","newWorker","err","generateSWScript","routesOrConfig","routes","precache","globalCacheName","script","route","matchValue","pattern","cacheName","generateStrategyCode","strategy","subscribePush","vapidPublicKey","urlBase64ToUint8Array","base64String","padding","base64","rawData","char"],"mappings":"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","file":"chunk-NBYFHJWB.js","sourcesContent":["/**\n * PWA / Service Worker support.\n *\n * Register service workers, configure caching strategies,\n * handle updates, and manage push notifications.\n *\n * ```ts\n * const sw = registerServiceWorker('/sw.js', {\n * onUpdate: () => toast.info('New version available!'),\n * });\n * sw.ready; // Promise<ServiceWorkerRegistration>\n * sw.update(); // check for updates\n * ```\n */\n\nimport { signal } from './signals.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport interface SWOptions {\n /** Callback when a new version is available */\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n /** Callback when the SW is ready */\n onReady?: (registration: ServiceWorkerRegistration) => void;\n /** Callback on registration error */\n onError?: (error: Error) => void;\n /** Auto-reload on update (default: false) */\n autoReload?: boolean;\n /** Scope of the service worker */\n scope?: string;\n}\n\nexport interface SWRegistration {\n /** Whether the SW is registered */\n registered: ReadonlySignal<boolean>;\n /** Whether an update is available */\n updateAvailable: ReadonlySignal<boolean>;\n /** Whether the app is running offline */\n offline: ReadonlySignal<boolean>;\n /** The raw SW registration (available after ready) */\n ready: Promise<ServiceWorkerRegistration>;\n /** Check for updates */\n update(): Promise<void>;\n /** Skip waiting and activate new SW */\n skipWaiting(): void;\n /** Unregister the service worker */\n unregister(): Promise<boolean>;\n}\n\n// =========================================================================\n// Service Worker registration\n// =========================================================================\n\n/**\n * Register a service worker with update detection.\n */\nexport function registerServiceWorker(\n swUrl: string,\n options: SWOptions = {},\n): SWRegistration {\n const registered = signal(false);\n const updateAvailable = signal(false);\n const offline = signal(!navigator.onLine);\n\n let registration: ServiceWorkerRegistration | null = null;\n\n // Track online/offline\n window.addEventListener('online', () => offline.set(false));\n window.addEventListener('offline', () => offline.set(true));\n\n const ready = new Promise<ServiceWorkerRegistration>((resolve, reject) => {\n if (!('serviceWorker' in navigator)) {\n reject(new Error('Service workers not supported'));\n return;\n }\n\n navigator.serviceWorker\n .register(swUrl, { scope: options.scope })\n .then((reg) => {\n registration = reg;\n registered.set(true);\n options.onReady?.(reg);\n resolve(reg);\n\n // Listen for updates\n reg.addEventListener('updatefound', () => {\n const newWorker = reg.installing;\n if (!newWorker) return;\n\n newWorker.addEventListener('statechange', () => {\n if (newWorker.state === 'installed' && navigator.serviceWorker.controller) {\n updateAvailable.set(true);\n options.onUpdate?.(reg);\n\n if (options.autoReload) {\n newWorker.postMessage({ type: 'SKIP_WAITING' });\n window.location.reload();\n }\n }\n });\n });\n })\n .catch((err) => {\n options.onError?.(err);\n reject(err);\n });\n });\n\n return {\n registered: () => registered(),\n updateAvailable: () => updateAvailable(),\n offline: () => offline(),\n ready,\n async update() {\n if (registration) {\n await registration.update();\n }\n },\n skipWaiting() {\n if (registration?.waiting) {\n registration.waiting.postMessage({ type: 'SKIP_WAITING' });\n window.location.reload();\n }\n },\n async unregister() {\n if (registration) {\n return registration.unregister();\n }\n return false;\n },\n };\n}\n\n// =========================================================================\n// Caching strategies (for SW scripts)\n// =========================================================================\n\nexport type CacheStrategy = 'cache-first' | 'network-first' | 'stale-while-revalidate' | 'network-only' | 'cache-only';\n\nexport interface CacheRoute {\n /** URL pattern to match (string or regex) */\n match: string | RegExp;\n /** Caching strategy */\n strategy: CacheStrategy;\n /** Cache name */\n cacheName?: string;\n /** Max entries in cache */\n maxEntries?: number;\n /** Max age in seconds */\n maxAgeSeconds?: number;\n}\n\n/**\n * Generate a service worker script from cache route configs.\n *\n * ```ts\n * const swScript = generateSWScript([\n * { match: /\\.(?:js|css)$/, strategy: 'cache-first', cacheName: 'assets' },\n * { match: '/api/', strategy: 'network-first', maxAgeSeconds: 300 },\n * { match: /\\.(?:png|jpg|svg)$/, strategy: 'cache-first', cacheName: 'images' },\n * ]);\n * ```\n */\nexport function generateSWScript(routesOrConfig: CacheRoute[] | { cacheName?: string; precache?: string[]; runtimeCache?: CacheRoute[] }): string {\n // Accept both array of routes and config object\n const routes: CacheRoute[] = Array.isArray(routesOrConfig)\n ? routesOrConfig\n : routesOrConfig.runtimeCache ?? [];\n const precache = Array.isArray(routesOrConfig) ? [] : routesOrConfig.precache ?? [];\n const globalCacheName = Array.isArray(routesOrConfig) ? 'akash-cache-v1' : routesOrConfig.cacheName ?? 'akash-cache-v1';\n let script = `// Auto-generated service worker by AkashJS\nconst CACHE_NAME = '${globalCacheName}';\nconst PRECACHE_URLS = ${JSON.stringify(precache)};\n\nself.addEventListener('install', (event) => {\n ${precache.length > 0 ? `event.waitUntil(\n caches.open(CACHE_NAME).then(cache => cache.addAll(PRECACHE_URLS))\n );` : ''}\n self.skipWaiting();\n});\n\nself.addEventListener('activate', (event) => {\n event.waitUntil(clients.claim());\n});\n\nself.addEventListener('message', (event) => {\n if (event.data?.type === 'SKIP_WAITING') {\n self.skipWaiting();\n }\n});\n\nself.addEventListener('fetch', (event) => {\n const url = new URL(event.request.url);\n`;\n\n for (const route of routes) {\n // Support both 'match' and 'urlPattern' property names\n const matchValue = route.match ?? (route as any).urlPattern;\n if (!matchValue) continue;\n\n const pattern = matchValue instanceof RegExp\n ? matchValue.toString()\n : `new RegExp(${JSON.stringify(matchValue.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))})`;\n\n const cacheName = route.cacheName ?? globalCacheName;\n\n script += `\n if (${pattern}.test(url.pathname)) {\n event.respondWith(${generateStrategyCode(route.strategy, cacheName)});\n return;\n }\n`;\n }\n\n script += `\n // Default: network-first\n event.respondWith(\n fetch(event.request).catch(() => caches.match(event.request))\n );\n});\n`;\n\n return script;\n}\n\nfunction generateStrategyCode(strategy: CacheStrategy, cacheName: string): string {\n switch (strategy) {\n case 'cache-first':\n return `caches.match(event.request).then(cached => cached || fetch(event.request).then(response => { const clone = response.clone(); caches.open('${cacheName}').then(cache => cache.put(event.request, clone)); return response; }))`;\n case 'network-first':\n return `fetch(event.request).then(response => { const clone = response.clone(); caches.open('${cacheName}').then(cache => cache.put(event.request, clone)); return response; }).catch(() => caches.match(event.request))`;\n case 'stale-while-revalidate':\n return `caches.match(event.request).then(cached => { const fetchPromise = fetch(event.request).then(response => { caches.open('${cacheName}').then(cache => cache.put(event.request, response.clone())); return response; }); return cached || fetchPromise; })`;\n case 'network-only':\n return `fetch(event.request)`;\n case 'cache-only':\n return `caches.match(event.request)`;\n }\n}\n\n// =========================================================================\n// Push notifications\n// =========================================================================\n\n/**\n * Request push notification permission and subscribe.\n */\nexport async function subscribePush(\n registration: ServiceWorkerRegistration,\n vapidPublicKey: string,\n): Promise<PushSubscription | null> {\n const permission = await Notification.requestPermission();\n if (permission !== 'granted') return null;\n\n const subscription = await registration.pushManager.subscribe({\n userVisibleOnly: true,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n applicationServerKey: urlBase64ToUint8Array(vapidPublicKey) as any,\n });\n\n return subscription;\n}\n\nfunction urlBase64ToUint8Array(base64String: string): Uint8Array {\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\n const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');\n const rawData = atob(base64);\n return Uint8Array.from(rawData, (char) => char.charCodeAt(0));\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {s,q,l}from'./chunk-KE7BJTCD.js';import {c}from'./chunk-YXKQTEPR.js';var f=s(n=>{let o=c(null);q(r=>{o.set(r);});function l$1(){o.set(null);}return ()=>{let r=o();return r?l(n.props.fallback(r,l$1)):l(n.children())}});export{f as a};//# sourceMappingURL=chunk-NCXMNJUN.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-NCXMNJUN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/error-boundary.ts"],"names":["ErrorBoundary","defineComponent","ctx","error","signal","onError","err","retry","currentError","nodeToDOM"],"mappings":"4EA8BO,IAAMA,CAAAA,CAAgBC,EAAqCC,CAAAA,EAAQ,CACxE,IAAMC,CAAAA,CAAQC,CAAAA,CAAqB,IAAI,CAAA,CAEvCC,CAAAA,CAASC,CAAAA,EAAQ,CACfH,CAAAA,CAAM,GAAA,CAAIG,CAAG,EACf,CAAC,EAED,SAASC,GAAAA,EAAQ,CACfJ,CAAAA,CAAM,GAAA,CAAI,IAAI,EAChB,CAEA,OAAO,IAAM,CACX,IAAMK,EAAeL,CAAAA,EAAM,CAE3B,OAAIK,CAAAA,CACKC,CAAAA,CAAUP,CAAAA,CAAI,MAAM,QAAA,CAASM,CAAAA,CAAcD,GAAK,CAAC,CAAA,CAGnDE,CAAAA,CAAUP,EAAI,QAAA,EAAU,CACjC,CACF,CAAC","file":"chunk-NCXMNJUN.js","sourcesContent":["/**\n * ErrorBoundary component.\n *\n * Declarative error handling — catches errors from child components\n * and renders a fallback UI.\n *\n * ```html\n * <ErrorBoundary fallback={(err) => <p>Error: {err.message}</p>}>\n * <RiskyComponent />\n * </ErrorBoundary>\n * ```\n */\n\nimport { defineComponent, onError } from './component.js';\nimport { signal } from './signals.js';\nimport { nodeToDOM } from './dom.js';\nimport type { AkashNode } from './types.js';\n\nexport interface ErrorBoundaryProps {\n /** Render function called when an error is caught */\n fallback: (error: Error, retry: () => void) => AkashNode;\n}\n\n/**\n * ErrorBoundary component.\n *\n * Catches errors from descendant components and renders a fallback.\n * The fallback receives the error and a `retry` function that re-renders\n * the children.\n */\nexport const ErrorBoundary = defineComponent<ErrorBoundaryProps>((ctx) => {\n const error = signal<Error | null>(null);\n\n onError((err) => {\n error.set(err);\n });\n\n function retry() {\n error.set(null);\n }\n\n return () => {\n const currentError = error();\n\n if (currentError) {\n return nodeToDOM(ctx.props.fallback(currentError, retry));\n }\n\n return nodeToDOM(ctx.children());\n };\n});\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var chunkWOZWFMOK_cjs=require('./chunk-WOZWFMOK.cjs');var h=class{entry;constructor(s,c){this.entry={value:s,timestamp:Date.now(),peerId:c};}get value(){return this.entry.value}get timestamp(){return this.entry.timestamp}set(s,c){let r=Date.now();return this.entry={value:s,timestamp:Math.max(r,this.entry.timestamp+1),peerId:c},true}merge(s){return s.timestamp>this.entry.timestamp||s.timestamp===this.entry.timestamp&&(!s.peerId||!this.entry.peerId||s.peerId>=this.entry.peerId)?(this.entry=s,true):false}toEntry(){return {...this.entry}}};function L(i){let s=null,c=[],r=[];return {send(n){s?.send(JSON.stringify({...n,type:"op",room:i.room}));},onReceive(n){c.push(n);let t=false;return ()=>{if(t)return;t=true;let o=c.indexOf(n);o!==-1&&c.splice(o,1);}},onPresence(n){return r.push(n),()=>{let t=r.indexOf(n);t!==-1&&r.splice(t,1);}},sendPresence(n){s?.send(JSON.stringify({type:"presence",room:i.room,data:n}));},connect(){s=new WebSocket(i.url,i.protocols),s.onmessage=n=>{try{let t=JSON.parse(n.data);if(t.type==="op")for(let o of c)o(t);else if(t.type==="presence")for(let o of r)o(t.peerId,t.data);}catch{}},s.onopen=()=>{s?.send(JSON.stringify({type:"join",room:i.room}));};},disconnect(){s?.close(),s=null;}}}function W(){let i=[],s=[];return {send(c){for(let r of i)r(c);},onReceive(c){i.push(c);let r=false;return ()=>{if(r)return;r=true;let n=i.indexOf(c);n!==-1&&i.splice(n,1);}},sendPresence(c,r){for(let n of s)n(r??"unknown",c);},onPresence(c){s.push(c);let r=false;return ()=>{if(r)return;r=true;let n=s.indexOf(c);n!==-1&&s.splice(n,1);}},connect(){},disconnect(){}}}var D=0;function _(i,s,c){let r,n;typeof i=="string"?(r=s,n=c??{}):(r=i,n=s??{});let t=n.peerId??`peer-${++D}-${Date.now()}`,o=n.transport??W(),l=new Map,u={};for(let[e,a]of Object.entries(r))l.set(e,new h(a,t)),u[e]=chunkWOZWFMOK_cjs.c(a);let y={};for(let e of Object.keys(r)){let a=u[e],d=l.get(e),p=(()=>a());p.set=k=>{d.set(k,t),a.set(k),o.send({type:"set",key:e,value:k,timestamp:d.timestamp,peerId:t});},p.update=k=>{p.set(k(a()));},p.peek=()=>a.peek(),y[e]=p;}let m=chunkWOZWFMOK_cjs.c([]),g=chunkWOZWFMOK_cjs.c(false),v=chunkWOZWFMOK_cjs.c(n.presence??{}),x=chunkWOZWFMOK_cjs.c(new Map),T=chunkWOZWFMOK_cjs.c([]);function O(e,a){if(e in u){u[e].set(a);let d=l.get(e);d&&d.set(a,t),o.send({type:"set",key:e,value:a,timestamp:Date.now(),peerId:t});}T.update(d=>d.filter(p=>p.key!==e));}let R=o.onReceive(e=>{if(e.peerId!==t&&e.type==="set"&&l.has(e.key)){let a=l.get(e.key),d=a.value,p=a.timestamp;if(n.onConflict&&p>0&&Math.abs(e.timestamp-p)<1e3&&e.peerId!==t){let w={key:e.key,localValue:d,remoteValue:e.value,localTimestamp:p,remoteTimestamp:e.timestamp,remotePeerId:e.peerId},S;try{S=n.onConflict(w);}catch(b){console.warn("[AkashJS Sync] onConflict handler threw, falling back to LWW:",b),a.merge({value:e.value,timestamp:e.timestamp,peerId:e.peerId})&&u[e.key].set(e.value),S="__fallback__";}S==="__fallback__"||(S!==void 0?(a.set(S,t),u[e.key].set(S),o.send({type:"set",key:e.key,value:S,timestamp:Date.now(),peerId:t})):T.update(b=>[...b,w]));}else a.merge({value:e.value,timestamp:e.timestamp,peerId:e.peerId})&&u[e.key].set(e.value);}}),P=v.set;v.set=e=>{P.call(v,e),o.sendPresence?.(e,t);};let C=o.onPresence?.((e,a)=>{e!==t&&x.update(d=>{let p=new Map(d);return a===null?p.delete(e):p.set(e,a),p});});return {state:y,peers:()=>m(),presence:v,peerPresence:()=>x(),conflicts:()=>T(),resolveConflict:O,peerId:t,connected:()=>g(),connect(){o.connect(),g.set(true);let e=v();Object.keys(e).length>0&&o.sendPresence?.(e,t);},disconnect(){o.sendPresence?.(null,t),o.disconnect(),g.set(false);},dispose(){o.sendPresence?.(null,t),R(),C?.(),o.disconnect();}}}function j(i,s){let c=s?.throttle??50,r=s?.target??(typeof document<"u"?document:null),n=chunkWOZWFMOK_cjs.c(0),t=chunkWOZWFMOK_cjs.c(0),o=0,l=null;function u(y){n.set(y.clientX),t.set(y.clientY);let m=Date.now();m-o>=c?(o=m,i.presence.set({...i.presence.peek?.()??{},cursor:{x:y.clientX,y:y.clientY}})):l||(l=setTimeout(()=>{l=null,o=Date.now(),i.presence.set({...i.presence.peek?.()??{},cursor:{x:n.peek(),y:t.peek()}});},c-(m-o)));}return r?.addEventListener?.("mousemove",u),{x:()=>n(),y:()=>t(),dispose(){r?.removeEventListener?.("mousemove",u),l&&clearTimeout(l);}}}function A(i,s){let c=s?.timeout??2e3,r=chunkWOZWFMOK_cjs.c(false),n=null;function t(){r.set(true),i.presence.set({...i.presence.peek?.()??{},typing:true}),n&&clearTimeout(n),n=setTimeout(o,c);}function o(){r.set(false),i.presence.set({...i.presence.peek?.()??{},typing:false}),n&&(clearTimeout(n),n=null);}let l=chunkWOZWFMOK_cjs.d(()=>{let u=i.peerPresence(),y=[];if(u instanceof Map)for(let[m,g]of u)g&&typeof g=="object"&&g.typing&&y.push(m);return y});return {isTyping:()=>r(),othersTyping:l,start:t,stop:o}}exports.a=h;exports.b=L;exports.c=W;exports.d=_;exports.e=j;exports.f=A;//# sourceMappingURL=chunk-NEQ5TENE.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-NEQ5TENE.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/sync.ts"],"names":["LWWRegister","initialValue","peerId","value","ts","remote","createWebSocketTransport","options","ws","opHandlers","presenceHandlers","op","handler","removed","i","data","e","msg","h","createLocalTransport","senderPeerId","peerIdCounter","createSync","roomIdOrState","stateOrOptions","maybeOptions","initialState","transport","registers","stateSignals","key","signal","state","original","register","proxy","fn","peers","connected","presence","peerPresenceMap","conflictsSignal","resolveConflict","list","c","unsubOps","localValue","localTimestamp","conflict","resolved","err","originalPresenceSet","unsubPresence","remotePeerId","map","next","p","useCursor","doc","throttleMs","target","x","y","lastSend","pending","onMove","now","useTypingIndicator","timeout","isTyping","timer","start","stop","othersTyping","computed","typing","id"],"mappings":"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","file":"chunk-NEQ5TENE.cjs","sourcesContent":["/**\n * Collaborative signals with CRDT.\n *\n * Make any signal multiplayer with one line. Multiple users can\n * edit the same state simultaneously with automatic conflict\n * resolution via Last-Writer-Wins Register and Operation-based CRDTs.\n *\n * ```ts\n * const doc = createSync('doc-123', {\n * title: '',\n * blocks: [],\n * cursor: { x: 0, y: 0 },\n * });\n *\n * doc.state.title.set('Hello'); // syncs to all peers\n * doc.peers(); // list of connected users\n * doc.presence.set({ cursor: { x: 10, y: 20 } });\n * ```\n */\n\nimport { signal, computed } from './signals.js';\nimport type { Signal, ReadonlySignal } from './signals.js';\n\n// =========================================================================\n// CRDT — Last-Writer-Wins Register\n// =========================================================================\n\nexport interface LWWEntry<T> {\n value: T;\n timestamp: number;\n peerId: string;\n}\n\n/**\n * Last-Writer-Wins Register — simplest CRDT for single values.\n * The write with the highest timestamp wins on conflict.\n */\nexport class LWWRegister<T> {\n private entry: LWWEntry<T>;\n\n constructor(initialValue: T, peerId: string) {\n this.entry = { value: initialValue, timestamp: Date.now(), peerId };\n }\n\n get value(): T {\n return this.entry.value;\n }\n\n get timestamp(): number {\n return this.entry.timestamp;\n }\n\n set(value: T, peerId: string): boolean {\n const ts = Date.now();\n // Local writes always succeed unconditionally — the register always\n // advances for intentional writes. Conflict resolution only applies\n // in merge() for remote ops.\n this.entry = { value, timestamp: Math.max(ts, this.entry.timestamp + 1), peerId };\n return true;\n }\n\n merge(remote: LWWEntry<T>): boolean {\n if (\n remote.timestamp > this.entry.timestamp ||\n (remote.timestamp === this.entry.timestamp && (\n !remote.peerId || !this.entry.peerId || remote.peerId >= this.entry.peerId\n ))\n ) {\n this.entry = remote;\n return true;\n }\n return false;\n }\n\n toEntry(): LWWEntry<T> {\n return { ...this.entry };\n }\n}\n\n// =========================================================================\n// Operation log for list CRDTs\n// =========================================================================\n\nexport type SyncOp =\n | { type: 'set'; key: string; value: unknown; timestamp: number; peerId: string }\n | { type: 'insert'; key: string; index: number; value: unknown; timestamp: number; peerId: string }\n | { type: 'delete'; key: string; index: number; timestamp: number; peerId: string };\n\n// =========================================================================\n// Sync transport interface\n// =========================================================================\n\nexport interface SyncTransport {\n /** Send an operation to peers */\n send(op: SyncOp): void;\n /** Listen for operations from peers */\n onReceive(handler: (op: SyncOp) => void): () => void;\n /** Listen for peer presence updates */\n onPresence?(handler: (peerId: string, data: unknown) => void): () => void;\n /** Send presence data (peerId passed by createSync internals) */\n sendPresence?(data: unknown, peerId?: string): void;\n /** Connect to the sync channel */\n connect(): void;\n /** Disconnect */\n disconnect(): void;\n}\n\n// =========================================================================\n// WebSocket transport\n// =========================================================================\n\nexport interface WebSocketTransportOptions {\n url: string;\n room: string;\n protocols?: string | string[];\n}\n\nexport function createWebSocketTransport(options: WebSocketTransportOptions): SyncTransport {\n let ws: WebSocket | null = null;\n const opHandlers: Array<(op: SyncOp) => void> = [];\n const presenceHandlers: Array<(peerId: string, data: unknown) => void> = [];\n\n return {\n send(op: SyncOp) {\n ws?.send(JSON.stringify({ ...op, type: 'op', room: options.room }));\n },\n onReceive(handler) {\n opHandlers.push(handler);\n let removed = false;\n return () => {\n if (removed) return;\n removed = true;\n const i = opHandlers.indexOf(handler);\n if (i !== -1) opHandlers.splice(i, 1);\n };\n },\n onPresence(handler) {\n presenceHandlers.push(handler);\n return () => {\n const i = presenceHandlers.indexOf(handler);\n if (i !== -1) presenceHandlers.splice(i, 1);\n };\n },\n sendPresence(data) {\n ws?.send(JSON.stringify({ type: 'presence', room: options.room, data }));\n },\n connect() {\n ws = new WebSocket(options.url, options.protocols);\n ws.onmessage = (e) => {\n try {\n const msg = JSON.parse(e.data);\n if (msg.type === 'op') {\n for (const h of opHandlers) h(msg);\n } else if (msg.type === 'presence') {\n for (const h of presenceHandlers) h(msg.peerId, msg.data);\n }\n } catch { /* ignore parse errors */ }\n };\n ws.onopen = () => {\n ws?.send(JSON.stringify({ type: 'join', room: options.room }));\n };\n },\n disconnect() {\n ws?.close();\n ws = null;\n },\n };\n}\n\n// =========================================================================\n// In-memory transport (for testing / single-tab)\n// =========================================================================\n\nexport function createLocalTransport(): SyncTransport {\n const opHandlers: Array<(op: SyncOp) => void> = [];\n const presenceHandlers: Array<(peerId: string, data: unknown) => void> = [];\n return {\n send(op) {\n for (const h of opHandlers) h(op);\n },\n onReceive(handler) {\n opHandlers.push(handler);\n let removed = false;\n return () => {\n if (removed) return;\n removed = true;\n const i = opHandlers.indexOf(handler);\n if (i !== -1) opHandlers.splice(i, 1);\n };\n },\n sendPresence(data, senderPeerId?: string) {\n for (const h of presenceHandlers) h(senderPeerId ?? 'unknown', data);\n },\n onPresence(handler) {\n presenceHandlers.push(handler);\n let removed = false;\n return () => {\n if (removed) return;\n removed = true;\n const i = presenceHandlers.indexOf(handler);\n if (i !== -1) presenceHandlers.splice(i, 1);\n };\n },\n connect() {},\n disconnect() {},\n };\n}\n\n// =========================================================================\n// createSync — the main API\n// =========================================================================\n\nexport interface SyncConflict {\n key: string;\n localValue: unknown;\n remoteValue: unknown;\n localTimestamp: number;\n remoteTimestamp: number;\n remotePeerId: string;\n}\n\nexport interface SyncOptions {\n /** Transport for sending/receiving operations */\n transport?: SyncTransport;\n /** Unique peer ID (default: random) */\n peerId?: string;\n /** Initial presence data — broadcast on connect */\n presence?: Record<string, unknown>;\n /** Custom conflict resolver. Return the winning value, or undefined to queue for manual resolution. */\n onConflict?: (conflict: SyncConflict) => unknown | undefined;\n}\n\nexport interface SyncDoc<T extends Record<string, unknown>> {\n /** Reactive synced state — each key is a Signal */\n state: { [K in keyof T]: Signal<T[K]> };\n /** Connected peers (reactive) */\n peers: ReadonlySignal<PeerInfo[]>;\n /** Local presence data */\n presence: Signal<Record<string, unknown>>;\n /** Peer presence map (reactive) */\n peerPresence: ReadonlySignal<Map<string, unknown>>;\n /** Unresolved conflicts (reactive) */\n conflicts: ReadonlySignal<SyncConflict[]>;\n /** Resolve a conflict by choosing a value for a key */\n resolveConflict: (key: string, value: unknown) => void;\n /** This peer's ID */\n peerId: string;\n /** Whether connected */\n connected: ReadonlySignal<boolean>;\n /** Connect to the sync channel */\n connect(): void;\n /** Disconnect */\n disconnect(): void;\n /** Dispose the sync doc */\n dispose(): void;\n}\n\nexport interface PeerInfo {\n id: string;\n joinedAt: number;\n}\n\nlet peerIdCounter = 0;\n\n/**\n * Create a collaborative synced document.\n *\n * ```ts\n * const doc = createSync('room-1', { title: '', count: 0 }, {\n * transport: createWebSocketTransport({ url: 'wss://sync.example.com', room: 'room-1' }),\n * });\n *\n * doc.state.title.set('Hello'); // auto-syncs to all peers\n * doc.peers(); // connected users\n * ```\n */\nexport function createSync<T extends Record<string, unknown>>(\n initialState: T,\n options?: SyncOptions,\n): SyncDoc<T>;\nexport function createSync<T extends Record<string, unknown>>(\n roomIdOrState: string | T,\n stateOrOptions?: T | SyncOptions,\n maybeOptions?: SyncOptions,\n): SyncDoc<T> {\n // Support both old (roomId, state, options) and new (state, options) signatures\n let initialState: T;\n let options: SyncOptions;\n if (typeof roomIdOrState === 'string') {\n initialState = stateOrOptions as T;\n options = maybeOptions ?? {};\n } else {\n initialState = roomIdOrState;\n options = (stateOrOptions as SyncOptions) ?? {};\n }\n const peerId = options.peerId ?? `peer-${++peerIdCounter}-${Date.now()}`;\n const transport = options.transport ?? createLocalTransport();\n\n // Create CRDT registers and signals for each state key\n const registers = new Map<string, LWWRegister<unknown>>();\n const stateSignals: Record<string, Signal<unknown>> = {};\n\n for (const [key, value] of Object.entries(initialState)) {\n registers.set(key, new LWWRegister(value, peerId));\n stateSignals[key] = signal(value);\n }\n\n // Intercept signal.set to broadcast operations\n const state = {} as { [K in keyof T]: Signal<T[K]> };\n for (const key of Object.keys(initialState)) {\n const original = stateSignals[key];\n const register = registers.get(key)!;\n\n const proxy: Signal<any> = (() => original()) as any;\n proxy.set = (value: any) => {\n register.set(value, peerId);\n original.set(value);\n transport.send({\n type: 'set',\n key,\n value,\n timestamp: register.timestamp,\n peerId,\n });\n };\n proxy.update = (fn: (prev: any) => any) => {\n proxy.set(fn(original()));\n };\n proxy.peek = () => original.peek();\n\n (state as any)[key] = proxy;\n }\n\n // Peers\n const peers = signal<PeerInfo[]>([]);\n const connected = signal(false);\n const presence = signal<Record<string, unknown>>(options.presence ?? {});\n const peerPresenceMap = signal(new Map<string, unknown>());\n\n // Conflict tracking\n const conflictsSignal = signal<SyncConflict[]>([]);\n\n function resolveConflict(key: string, value: unknown): void {\n // Apply the resolved value\n if (key in stateSignals) {\n stateSignals[key].set(value);\n const register = registers.get(key);\n if (register) register.set(value, peerId);\n // Broadcast the resolution\n transport.send({ type: 'set', key, value, timestamp: Date.now(), peerId });\n }\n // Remove from conflicts list\n conflictsSignal.update(list => list.filter(c => c.key !== key));\n }\n\n // Listen for remote operations (skip self-originated ops)\n const unsubOps = transport.onReceive((op) => {\n if (op.peerId === peerId) return;\n if (op.type === 'set' && registers.has(op.key)) {\n const register = registers.get(op.key)!;\n const localValue = register.value;\n const localTimestamp = register.timestamp;\n\n // Check for conflict: remote write to a key we also recently wrote\n const isConflict = options.onConflict && localTimestamp > 0 &&\n Math.abs(op.timestamp - localTimestamp) < 1000 && // within 1s window\n op.peerId !== peerId;\n\n if (isConflict) {\n const conflict: SyncConflict = {\n key: op.key,\n localValue,\n remoteValue: op.value,\n localTimestamp,\n remoteTimestamp: op.timestamp,\n remotePeerId: op.peerId,\n };\n let resolved: unknown;\n try {\n resolved = options.onConflict!(conflict);\n } catch (err) {\n console.warn('[AkashJS Sync] onConflict handler threw, falling back to LWW:', err);\n // Fallback to standard LWW merge\n const merged = register.merge({ value: op.value, timestamp: op.timestamp, peerId: op.peerId });\n if (merged) stateSignals[op.key].set(op.value);\n resolved = '__fallback__';\n }\n if (resolved === '__fallback__') {\n // Already handled by LWW fallback above\n } else if (resolved !== undefined) {\n register.set(resolved, peerId);\n stateSignals[op.key].set(resolved);\n transport.send({ type: 'set', key: op.key, value: resolved, timestamp: Date.now(), peerId });\n } else {\n conflictsSignal.update(list => [...list, conflict]);\n }\n } else {\n // No conflict handler or no conflict — standard LWW merge\n const merged = register.merge({\n value: op.value,\n timestamp: op.timestamp,\n peerId: op.peerId,\n });\n if (merged) {\n stateSignals[op.key].set(op.value);\n }\n }\n }\n });\n\n // Intercept presence.set to broadcast with peerId\n const originalPresenceSet = presence.set;\n presence.set = (data: Record<string, unknown>) => {\n originalPresenceSet.call(presence, data);\n transport.sendPresence?.(data, peerId);\n };\n\n // Listen for presence — filter out self\n const unsubPresence = transport.onPresence?.((remotePeerId, data) => {\n if (remotePeerId === peerId) return; // ignore own presence\n peerPresenceMap.update((map) => {\n const next = new Map(map);\n if (data === null) {\n next.delete(remotePeerId); // peer disconnected\n } else {\n next.set(remotePeerId, data);\n }\n return next;\n });\n });\n\n return {\n state,\n peers: () => peers(),\n presence,\n peerPresence: () => peerPresenceMap(),\n conflicts: () => conflictsSignal(),\n resolveConflict,\n peerId,\n connected: () => connected(),\n connect() {\n transport.connect();\n connected.set(true);\n // Broadcast initial presence on connect\n const p = presence();\n if (Object.keys(p).length > 0) {\n transport.sendPresence?.(p, peerId);\n }\n },\n disconnect() {\n // Broadcast null presence to signal departure\n transport.sendPresence?.(null, peerId);\n transport.disconnect();\n connected.set(false);\n },\n dispose() {\n transport.sendPresence?.(null, peerId);\n unsubOps();\n unsubPresence?.();\n transport.disconnect();\n },\n };\n}\n\n// =========================================================================\n// Presence composables\n// =========================================================================\n\n/**\n * Track cursor position and broadcast via sync presence.\n * Throttles updates to avoid flooding the transport.\n *\n * ```ts\n * const cursor = useCursor(doc, { throttle: 50 });\n * // Automatically tracks mousemove and broadcasts { cursor: { x, y } }\n * // Other peers: doc.peerPresence().get(peerId).cursor\n * ```\n */\nexport function useCursor(\n doc: SyncDoc<any>,\n options?: { throttle?: number; target?: HTMLElement },\n): { x: ReadonlySignal<number>; y: ReadonlySignal<number>; dispose: () => void } {\n const throttleMs = options?.throttle ?? 50;\n const target = options?.target ?? (typeof document !== 'undefined' ? document : null);\n const x = signal(0);\n const y = signal(0);\n let lastSend = 0;\n let pending: ReturnType<typeof setTimeout> | null = null;\n\n function onMove(e: MouseEvent): void {\n x.set(e.clientX);\n y.set(e.clientY);\n\n const now = Date.now();\n if (now - lastSend >= throttleMs) {\n lastSend = now;\n doc.presence.set({ ...doc.presence.peek?.() ?? {}, cursor: { x: e.clientX, y: e.clientY } });\n } else if (!pending) {\n pending = setTimeout(() => {\n pending = null;\n lastSend = Date.now();\n doc.presence.set({ ...doc.presence.peek?.() ?? {}, cursor: { x: x.peek(), y: y.peek() } });\n }, throttleMs - (now - lastSend));\n }\n }\n\n target?.addEventListener?.('mousemove', onMove as EventListener);\n\n return {\n x: () => x(),\n y: () => y(),\n dispose() {\n target?.removeEventListener?.('mousemove', onMove as EventListener);\n if (pending) clearTimeout(pending);\n },\n };\n}\n\n/**\n * Typing indicator — broadcasts typing state with auto-timeout.\n *\n * ```ts\n * const typing = useTypingIndicator(doc, { timeout: 2000 });\n * typing.start(); // broadcasts { typing: true }\n * // Auto-stops after 2s of inactivity\n * typing.stop(); // manual stop\n *\n * // Other peers typing:\n * typing.othersTyping(); // string[] of peer IDs currently typing\n * ```\n */\nexport function useTypingIndicator(\n doc: SyncDoc<any>,\n options?: { timeout?: number },\n): {\n isTyping: ReadonlySignal<boolean>;\n othersTyping: ReadonlySignal<string[]>;\n start: () => void;\n stop: () => void;\n} {\n const timeout = options?.timeout ?? 2000;\n const isTyping = signal(false);\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n function start(): void {\n isTyping.set(true);\n doc.presence.set({ ...doc.presence.peek?.() ?? {}, typing: true });\n if (timer) clearTimeout(timer);\n timer = setTimeout(stop, timeout);\n }\n\n function stop(): void {\n isTyping.set(false);\n doc.presence.set({ ...doc.presence.peek?.() ?? {}, typing: false });\n if (timer) { clearTimeout(timer); timer = null; }\n }\n\n const othersTyping = computed(() => {\n const peers = doc.peerPresence();\n const typing: string[] = [];\n if (peers instanceof Map) {\n for (const [id, data] of peers) {\n if (data && typeof data === 'object' && (data as any).typing) {\n typing.push(id);\n }\n }\n }\n return typing;\n });\n\n return {\n isTyping: () => isTyping(),\n othersTyping,\n start,\n stop,\n };\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';function E(a,c={}){let{duration:f=300,easing:u="cubic-bezier(0.2, 0, 0, 1)",delay:P=0,selector:d,keyAttribute:A="data-key",onComplete:p}=c,r=new Map;function h(){return Array.from(d?a.querySelectorAll(d):a.children)}function m(t){return t.getAttribute(A)??t.id??""}function g(){r=new Map;for(let t of h()){let e=m(t);if(e){let i=t.getBoundingClientRect();r.set(e,{left:i.left,top:i.top,width:i.width,height:i.height});}}}function b(){let t=h(),e=[];for(let n of t){let o=m(n),s=r.get(o);if(!s)continue;let l=n.getBoundingClientRect(),y=s.left-l.left,w=s.top-l.top,M=s.width/(l.width||1),v=s.height/(l.height||1);if(Math.abs(y)<.5&&Math.abs(w)<.5&&Math.abs(M-1)<.01&&Math.abs(v-1)<.01)continue;let x=n.animate([{transform:`translate(${y}px, ${w}px) scale(${M}, ${v})`},{transform:"translate(0, 0) scale(1, 1)"}],{duration:f,easing:u,delay:P,fill:"both"});e.push(x);}let i=new Set(t.map(m));for(let[n,o]of r)i.has(n);return r.clear(),new Promise(n=>{if(e.length===0){p?.(),n();return}Promise.all(e.map(o=>o.finished)).then(()=>{for(let o of e)o.cancel();p?.(),n();});})}return {measure:g,animate:b,async flip(t){return g(),t(),await new Promise(e=>requestAnimationFrame(e)),b()}}}async function F(a,c,f){return E(a,f).flip(c)}exports.a=E;exports.b=F;//# sourceMappingURL=chunk-NGU2W4PD.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-NGU2W4PD.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/flip.ts"],"names":["createFlip","container","options","duration","easing","delay","selector","keyAttribute","onComplete","firstPositions","getElements","getKey","el","measure","key","rect","animate","elements","animations","first","last","dx","dy","dw","dh","animation","currentKeys","resolve","a","update","r","flip"],"mappings":"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","file":"chunk-NGU2W4PD.cjs","sourcesContent":["/**\n * FLIP animations for list reordering.\n *\n * First-Last-Invert-Play: measure element positions before and after\n * a DOM change, then animate from old to new positions.\n *\n * ```ts\n * const flip = createFlip(listContainer, {\n * duration: 300,\n * easing: 'cubic-bezier(0.2, 0, 0, 1)',\n * });\n *\n * // Before changing the list:\n * flip.measure();\n * // Change the DOM (reorder, add, remove)\n * items.set(newOrder);\n * // Animate:\n * flip.animate();\n * ```\n */\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport interface FlipOptions {\n /** Animation duration in ms (default: 300) */\n duration?: number;\n /** CSS easing (default: 'cubic-bezier(0.2, 0, 0, 1)') */\n easing?: string;\n /** Delay in ms */\n delay?: number;\n /** Only animate elements matching this selector */\n selector?: string;\n /** Key attribute to track elements across reorders (default: 'data-key') */\n keyAttribute?: string;\n /** Callback when animation completes */\n onComplete?: () => void;\n}\n\nexport interface FlipController {\n /** Measure current positions (call BEFORE DOM change) */\n measure(): void;\n /** Animate from measured positions to current (call AFTER DOM change) */\n animate(): Promise<void>;\n /** Measure and animate in one step using a callback */\n flip(update: () => void): Promise<void>;\n}\n\ninterface Rect {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\n// =========================================================================\n// createFlip\n// =========================================================================\n\n/**\n * Create a FLIP animation controller for a container.\n *\n * ```ts\n * const flip = createFlip(container);\n * flip.flip(() => {\n * // reorder DOM elements here\n * container.appendChild(container.firstChild); // move first to last\n * });\n * ```\n */\nexport function createFlip(\n container: HTMLElement,\n options: FlipOptions = {},\n): FlipController {\n const {\n duration = 300,\n easing = 'cubic-bezier(0.2, 0, 0, 1)',\n delay = 0,\n selector,\n keyAttribute = 'data-key',\n onComplete,\n } = options;\n\n let firstPositions = new Map<string, Rect>();\n\n function getElements(): HTMLElement[] {\n if (selector) {\n return Array.from(container.querySelectorAll<HTMLElement>(selector));\n }\n return Array.from(container.children) as HTMLElement[];\n }\n\n function getKey(el: HTMLElement): string {\n return el.getAttribute(keyAttribute) ?? el.id ?? '';\n }\n\n function measure(): void {\n firstPositions = new Map();\n for (const el of getElements()) {\n const key = getKey(el);\n if (key) {\n const rect = el.getBoundingClientRect();\n firstPositions.set(key, {\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n });\n }\n }\n }\n\n function animate(): Promise<void> {\n const elements = getElements();\n const animations: Animation[] = [];\n\n for (const el of elements) {\n const key = getKey(el);\n const first = firstPositions.get(key);\n if (!first) continue; // New element — could add enter animation\n\n const last = el.getBoundingClientRect();\n\n const dx = first.left - last.left;\n const dy = first.top - last.top;\n const dw = first.width / (last.width || 1);\n const dh = first.height / (last.height || 1);\n\n // Skip if no movement\n if (Math.abs(dx) < 0.5 && Math.abs(dy) < 0.5 && Math.abs(dw - 1) < 0.01 && Math.abs(dh - 1) < 0.01) {\n continue;\n }\n\n const animation = el.animate(\n [\n {\n transform: `translate(${dx}px, ${dy}px) scale(${dw}, ${dh})`,\n },\n {\n transform: 'translate(0, 0) scale(1, 1)',\n },\n ],\n {\n duration,\n easing,\n delay,\n fill: 'both',\n },\n );\n\n animations.push(animation);\n }\n\n // Detect removed elements (in first but not in last)\n const currentKeys = new Set(elements.map(getKey));\n for (const [key, rect] of firstPositions) {\n if (!currentKeys.has(key)) {\n // Element was removed — could add exit animation placeholder\n }\n }\n\n firstPositions.clear();\n\n return new Promise<void>((resolve) => {\n if (animations.length === 0) {\n onComplete?.();\n resolve();\n return;\n }\n\n Promise.all(animations.map((a) => a.finished)).then(() => {\n // Clean up fill\n for (const a of animations) {\n a.cancel();\n }\n onComplete?.();\n resolve();\n });\n });\n }\n\n return {\n measure,\n animate,\n async flip(update: () => void): Promise<void> {\n measure();\n update();\n // Wait one frame for DOM to update\n await new Promise((r) => requestAnimationFrame(r));\n return animate();\n },\n };\n}\n\n/**\n * One-shot FLIP animation helper.\n *\n * ```ts\n * await flip(container, () => {\n * // reorder items\n * }, { duration: 300 });\n * ```\n */\nexport async function flip(\n container: HTMLElement,\n update: () => void,\n options?: FlipOptions,\n): Promise<void> {\n const ctrl = createFlip(container, options);\n return ctrl.flip(update);\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
'use strict';var
|
|
1
|
+
'use strict';var chunkWOZWFMOK_cjs=require('./chunk-WOZWFMOK.cjs');function v(e,t={}){let s=chunkWOZWFMOK_cjs.c(false),i=chunkWOZWFMOK_cjs.c(false),n=chunkWOZWFMOK_cjs.c(!navigator.onLine),r=null;window.addEventListener("online",()=>n.set(false)),window.addEventListener("offline",()=>n.set(true));let c=new Promise((u,o)=>{if(!("serviceWorker"in navigator)){o(new Error("Service workers not supported"));return}navigator.serviceWorker.register(e,{scope:t.scope}).then(a=>{r=a,s.set(true),t.onReady?.(a),u(a),a.addEventListener("updatefound",()=>{let l=a.installing;l&&l.addEventListener("statechange",()=>{l.state==="installed"&&navigator.serviceWorker.controller&&(i.set(true),t.onUpdate?.(a),t.autoReload&&(l.postMessage({type:"SKIP_WAITING"}),window.location.reload()));});});}).catch(a=>{t.onError?.(a),o(a);});});return {registered:()=>s(),updateAvailable:()=>i(),offline:()=>n(),ready:c,async update(){r&&await r.update();},skipWaiting(){r?.waiting&&(r.waiting.postMessage({type:"SKIP_WAITING"}),window.location.reload());},async unregister(){return r?r.unregister():false}}}function f(e){let t=Array.isArray(e)?e:e.runtimeCache??[],s=Array.isArray(e)?[]:e.precache??[],i=Array.isArray(e)?"akash-cache-v1":e.cacheName??"akash-cache-v1",n=`// Auto-generated service worker by AkashJS
|
|
2
2
|
const CACHE_NAME = '${i}';
|
|
3
3
|
const PRECACHE_URLS = ${JSON.stringify(s)};
|
|
4
4
|
|
|
@@ -32,5 +32,5 @@ self.addEventListener('fetch', (event) => {
|
|
|
32
32
|
fetch(event.request).catch(() => caches.match(event.request))
|
|
33
33
|
);
|
|
34
34
|
});
|
|
35
|
-
`,n}function p(e,t){switch(e){case "cache-first":return `caches.match(event.request).then(cached => cached || fetch(event.request).then(response => { const clone = response.clone(); caches.open('${t}').then(cache => cache.put(event.request, clone)); return response; }))`;case "network-first":return `fetch(event.request).then(response => { const clone = response.clone(); caches.open('${t}').then(cache => cache.put(event.request, clone)); return response; }).catch(() => caches.match(event.request))`;case "stale-while-revalidate":return `caches.match(event.request).then(cached => { const fetchPromise = fetch(event.request).then(response => { caches.open('${t}').then(cache => cache.put(event.request, response.clone())); return response; }); return cached || fetchPromise; })`;case "network-only":return "fetch(event.request)";case "cache-only":return "caches.match(event.request)"}}async function y(e,t){return await Notification.requestPermission()!=="granted"?null:await e.pushManager.subscribe({userVisibleOnly:true,applicationServerKey:d(t)})}function d(e){let t="=".repeat((4-e.length%4)%4),s=(e+t).replace(/-/g,"+").replace(/_/g,"/"),i=atob(s);return Uint8Array.from(i,n=>n.charCodeAt(0))}exports.a=v;exports.b=f;exports.c=y;//# sourceMappingURL=chunk-
|
|
36
|
-
//# sourceMappingURL=chunk-
|
|
35
|
+
`,n}function p(e,t){switch(e){case "cache-first":return `caches.match(event.request).then(cached => cached || fetch(event.request).then(response => { const clone = response.clone(); caches.open('${t}').then(cache => cache.put(event.request, clone)); return response; }))`;case "network-first":return `fetch(event.request).then(response => { const clone = response.clone(); caches.open('${t}').then(cache => cache.put(event.request, clone)); return response; }).catch(() => caches.match(event.request))`;case "stale-while-revalidate":return `caches.match(event.request).then(cached => { const fetchPromise = fetch(event.request).then(response => { caches.open('${t}').then(cache => cache.put(event.request, response.clone())); return response; }); return cached || fetchPromise; })`;case "network-only":return "fetch(event.request)";case "cache-only":return "caches.match(event.request)"}}async function y(e,t){return await Notification.requestPermission()!=="granted"?null:await e.pushManager.subscribe({userVisibleOnly:true,applicationServerKey:d(t)})}function d(e){let t="=".repeat((4-e.length%4)%4),s=(e+t).replace(/-/g,"+").replace(/_/g,"/"),i=atob(s);return Uint8Array.from(i,n=>n.charCodeAt(0))}exports.a=v;exports.b=f;exports.c=y;//# sourceMappingURL=chunk-NHDYQTC5.cjs.map
|
|
36
|
+
//# sourceMappingURL=chunk-NHDYQTC5.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/pwa.ts"],"names":["registerServiceWorker","swUrl","options","registered","signal","updateAvailable","offline","registration","ready","resolve","reject","reg","newWorker","err","generateSWScript","routesOrConfig","routes","precache","globalCacheName","script","route","matchValue","pattern","cacheName","generateStrategyCode","strategy","subscribePush","vapidPublicKey","urlBase64ToUint8Array","base64String","padding","base64","rawData","char"],"mappings":"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","file":"chunk-ZYVQQ5VR.cjs","sourcesContent":["/**\n * PWA / Service Worker support.\n *\n * Register service workers, configure caching strategies,\n * handle updates, and manage push notifications.\n *\n * ```ts\n * const sw = registerServiceWorker('/sw.js', {\n * onUpdate: () => toast.info('New version available!'),\n * });\n * sw.ready; // Promise<ServiceWorkerRegistration>\n * sw.update(); // check for updates\n * ```\n */\n\nimport { signal } from './signals.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport interface SWOptions {\n /** Callback when a new version is available */\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n /** Callback when the SW is ready */\n onReady?: (registration: ServiceWorkerRegistration) => void;\n /** Callback on registration error */\n onError?: (error: Error) => void;\n /** Auto-reload on update (default: false) */\n autoReload?: boolean;\n /** Scope of the service worker */\n scope?: string;\n}\n\nexport interface SWRegistration {\n /** Whether the SW is registered */\n registered: ReadonlySignal<boolean>;\n /** Whether an update is available */\n updateAvailable: ReadonlySignal<boolean>;\n /** Whether the app is running offline */\n offline: ReadonlySignal<boolean>;\n /** The raw SW registration (available after ready) */\n ready: Promise<ServiceWorkerRegistration>;\n /** Check for updates */\n update(): Promise<void>;\n /** Skip waiting and activate new SW */\n skipWaiting(): void;\n /** Unregister the service worker */\n unregister(): Promise<boolean>;\n}\n\n// =========================================================================\n// Service Worker registration\n// =========================================================================\n\n/**\n * Register a service worker with update detection.\n */\nexport function registerServiceWorker(\n swUrl: string,\n options: SWOptions = {},\n): SWRegistration {\n const registered = signal(false);\n const updateAvailable = signal(false);\n const offline = signal(!navigator.onLine);\n\n let registration: ServiceWorkerRegistration | null = null;\n\n // Track online/offline\n window.addEventListener('online', () => offline.set(false));\n window.addEventListener('offline', () => offline.set(true));\n\n const ready = new Promise<ServiceWorkerRegistration>((resolve, reject) => {\n if (!('serviceWorker' in navigator)) {\n reject(new Error('Service workers not supported'));\n return;\n }\n\n navigator.serviceWorker\n .register(swUrl, { scope: options.scope })\n .then((reg) => {\n registration = reg;\n registered.set(true);\n options.onReady?.(reg);\n resolve(reg);\n\n // Listen for updates\n reg.addEventListener('updatefound', () => {\n const newWorker = reg.installing;\n if (!newWorker) return;\n\n newWorker.addEventListener('statechange', () => {\n if (newWorker.state === 'installed' && navigator.serviceWorker.controller) {\n updateAvailable.set(true);\n options.onUpdate?.(reg);\n\n if (options.autoReload) {\n newWorker.postMessage({ type: 'SKIP_WAITING' });\n window.location.reload();\n }\n }\n });\n });\n })\n .catch((err) => {\n options.onError?.(err);\n reject(err);\n });\n });\n\n return {\n registered: () => registered(),\n updateAvailable: () => updateAvailable(),\n offline: () => offline(),\n ready,\n async update() {\n if (registration) {\n await registration.update();\n }\n },\n skipWaiting() {\n if (registration?.waiting) {\n registration.waiting.postMessage({ type: 'SKIP_WAITING' });\n window.location.reload();\n }\n },\n async unregister() {\n if (registration) {\n return registration.unregister();\n }\n return false;\n },\n };\n}\n\n// =========================================================================\n// Caching strategies (for SW scripts)\n// =========================================================================\n\nexport type CacheStrategy = 'cache-first' | 'network-first' | 'stale-while-revalidate' | 'network-only' | 'cache-only';\n\nexport interface CacheRoute {\n /** URL pattern to match (string or regex) */\n match: string | RegExp;\n /** Caching strategy */\n strategy: CacheStrategy;\n /** Cache name */\n cacheName?: string;\n /** Max entries in cache */\n maxEntries?: number;\n /** Max age in seconds */\n maxAgeSeconds?: number;\n}\n\n/**\n * Generate a service worker script from cache route configs.\n *\n * ```ts\n * const swScript = generateSWScript([\n * { match: /\\.(?:js|css)$/, strategy: 'cache-first', cacheName: 'assets' },\n * { match: '/api/', strategy: 'network-first', maxAgeSeconds: 300 },\n * { match: /\\.(?:png|jpg|svg)$/, strategy: 'cache-first', cacheName: 'images' },\n * ]);\n * ```\n */\nexport function generateSWScript(routesOrConfig: CacheRoute[] | { cacheName?: string; precache?: string[]; runtimeCache?: CacheRoute[] }): string {\n // Accept both array of routes and config object\n const routes: CacheRoute[] = Array.isArray(routesOrConfig)\n ? routesOrConfig\n : routesOrConfig.runtimeCache ?? [];\n const precache = Array.isArray(routesOrConfig) ? [] : routesOrConfig.precache ?? [];\n const globalCacheName = Array.isArray(routesOrConfig) ? 'akash-cache-v1' : routesOrConfig.cacheName ?? 'akash-cache-v1';\n let script = `// Auto-generated service worker by AkashJS\nconst CACHE_NAME = '${globalCacheName}';\nconst PRECACHE_URLS = ${JSON.stringify(precache)};\n\nself.addEventListener('install', (event) => {\n ${precache.length > 0 ? `event.waitUntil(\n caches.open(CACHE_NAME).then(cache => cache.addAll(PRECACHE_URLS))\n );` : ''}\n self.skipWaiting();\n});\n\nself.addEventListener('activate', (event) => {\n event.waitUntil(clients.claim());\n});\n\nself.addEventListener('message', (event) => {\n if (event.data?.type === 'SKIP_WAITING') {\n self.skipWaiting();\n }\n});\n\nself.addEventListener('fetch', (event) => {\n const url = new URL(event.request.url);\n`;\n\n for (const route of routes) {\n // Support both 'match' and 'urlPattern' property names\n const matchValue = route.match ?? (route as any).urlPattern;\n if (!matchValue) continue;\n\n const pattern = matchValue instanceof RegExp\n ? matchValue.toString()\n : `new RegExp(${JSON.stringify(matchValue.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))})`;\n\n const cacheName = route.cacheName ?? globalCacheName;\n\n script += `\n if (${pattern}.test(url.pathname)) {\n event.respondWith(${generateStrategyCode(route.strategy, cacheName)});\n return;\n }\n`;\n }\n\n script += `\n // Default: network-first\n event.respondWith(\n fetch(event.request).catch(() => caches.match(event.request))\n );\n});\n`;\n\n return script;\n}\n\nfunction generateStrategyCode(strategy: CacheStrategy, cacheName: string): string {\n switch (strategy) {\n case 'cache-first':\n return `caches.match(event.request).then(cached => cached || fetch(event.request).then(response => { const clone = response.clone(); caches.open('${cacheName}').then(cache => cache.put(event.request, clone)); return response; }))`;\n case 'network-first':\n return `fetch(event.request).then(response => { const clone = response.clone(); caches.open('${cacheName}').then(cache => cache.put(event.request, clone)); return response; }).catch(() => caches.match(event.request))`;\n case 'stale-while-revalidate':\n return `caches.match(event.request).then(cached => { const fetchPromise = fetch(event.request).then(response => { caches.open('${cacheName}').then(cache => cache.put(event.request, response.clone())); return response; }); return cached || fetchPromise; })`;\n case 'network-only':\n return `fetch(event.request)`;\n case 'cache-only':\n return `caches.match(event.request)`;\n }\n}\n\n// =========================================================================\n// Push notifications\n// =========================================================================\n\n/**\n * Request push notification permission and subscribe.\n */\nexport async function subscribePush(\n registration: ServiceWorkerRegistration,\n vapidPublicKey: string,\n): Promise<PushSubscription | null> {\n const permission = await Notification.requestPermission();\n if (permission !== 'granted') return null;\n\n const subscription = await registration.pushManager.subscribe({\n userVisibleOnly: true,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n applicationServerKey: urlBase64ToUint8Array(vapidPublicKey) as any,\n });\n\n return subscription;\n}\n\nfunction urlBase64ToUint8Array(base64String: string): Uint8Array {\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\n const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');\n const rawData = atob(base64);\n return Uint8Array.from(rawData, (char) => char.charCodeAt(0));\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/pwa.ts"],"names":["registerServiceWorker","swUrl","options","registered","signal","updateAvailable","offline","registration","ready","resolve","reject","reg","newWorker","err","generateSWScript","routesOrConfig","routes","precache","globalCacheName","script","route","matchValue","pattern","cacheName","generateStrategyCode","strategy","subscribePush","vapidPublicKey","urlBase64ToUint8Array","base64String","padding","base64","rawData","char"],"mappings":"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","file":"chunk-NHDYQTC5.cjs","sourcesContent":["/**\n * PWA / Service Worker support.\n *\n * Register service workers, configure caching strategies,\n * handle updates, and manage push notifications.\n *\n * ```ts\n * const sw = registerServiceWorker('/sw.js', {\n * onUpdate: () => toast.info('New version available!'),\n * });\n * sw.ready; // Promise<ServiceWorkerRegistration>\n * sw.update(); // check for updates\n * ```\n */\n\nimport { signal } from './signals.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport interface SWOptions {\n /** Callback when a new version is available */\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n /** Callback when the SW is ready */\n onReady?: (registration: ServiceWorkerRegistration) => void;\n /** Callback on registration error */\n onError?: (error: Error) => void;\n /** Auto-reload on update (default: false) */\n autoReload?: boolean;\n /** Scope of the service worker */\n scope?: string;\n}\n\nexport interface SWRegistration {\n /** Whether the SW is registered */\n registered: ReadonlySignal<boolean>;\n /** Whether an update is available */\n updateAvailable: ReadonlySignal<boolean>;\n /** Whether the app is running offline */\n offline: ReadonlySignal<boolean>;\n /** The raw SW registration (available after ready) */\n ready: Promise<ServiceWorkerRegistration>;\n /** Check for updates */\n update(): Promise<void>;\n /** Skip waiting and activate new SW */\n skipWaiting(): void;\n /** Unregister the service worker */\n unregister(): Promise<boolean>;\n}\n\n// =========================================================================\n// Service Worker registration\n// =========================================================================\n\n/**\n * Register a service worker with update detection.\n */\nexport function registerServiceWorker(\n swUrl: string,\n options: SWOptions = {},\n): SWRegistration {\n const registered = signal(false);\n const updateAvailable = signal(false);\n const offline = signal(!navigator.onLine);\n\n let registration: ServiceWorkerRegistration | null = null;\n\n // Track online/offline\n window.addEventListener('online', () => offline.set(false));\n window.addEventListener('offline', () => offline.set(true));\n\n const ready = new Promise<ServiceWorkerRegistration>((resolve, reject) => {\n if (!('serviceWorker' in navigator)) {\n reject(new Error('Service workers not supported'));\n return;\n }\n\n navigator.serviceWorker\n .register(swUrl, { scope: options.scope })\n .then((reg) => {\n registration = reg;\n registered.set(true);\n options.onReady?.(reg);\n resolve(reg);\n\n // Listen for updates\n reg.addEventListener('updatefound', () => {\n const newWorker = reg.installing;\n if (!newWorker) return;\n\n newWorker.addEventListener('statechange', () => {\n if (newWorker.state === 'installed' && navigator.serviceWorker.controller) {\n updateAvailable.set(true);\n options.onUpdate?.(reg);\n\n if (options.autoReload) {\n newWorker.postMessage({ type: 'SKIP_WAITING' });\n window.location.reload();\n }\n }\n });\n });\n })\n .catch((err) => {\n options.onError?.(err);\n reject(err);\n });\n });\n\n return {\n registered: () => registered(),\n updateAvailable: () => updateAvailable(),\n offline: () => offline(),\n ready,\n async update() {\n if (registration) {\n await registration.update();\n }\n },\n skipWaiting() {\n if (registration?.waiting) {\n registration.waiting.postMessage({ type: 'SKIP_WAITING' });\n window.location.reload();\n }\n },\n async unregister() {\n if (registration) {\n return registration.unregister();\n }\n return false;\n },\n };\n}\n\n// =========================================================================\n// Caching strategies (for SW scripts)\n// =========================================================================\n\nexport type CacheStrategy = 'cache-first' | 'network-first' | 'stale-while-revalidate' | 'network-only' | 'cache-only';\n\nexport interface CacheRoute {\n /** URL pattern to match (string or regex) */\n match: string | RegExp;\n /** Caching strategy */\n strategy: CacheStrategy;\n /** Cache name */\n cacheName?: string;\n /** Max entries in cache */\n maxEntries?: number;\n /** Max age in seconds */\n maxAgeSeconds?: number;\n}\n\n/**\n * Generate a service worker script from cache route configs.\n *\n * ```ts\n * const swScript = generateSWScript([\n * { match: /\\.(?:js|css)$/, strategy: 'cache-first', cacheName: 'assets' },\n * { match: '/api/', strategy: 'network-first', maxAgeSeconds: 300 },\n * { match: /\\.(?:png|jpg|svg)$/, strategy: 'cache-first', cacheName: 'images' },\n * ]);\n * ```\n */\nexport function generateSWScript(routesOrConfig: CacheRoute[] | { cacheName?: string; precache?: string[]; runtimeCache?: CacheRoute[] }): string {\n // Accept both array of routes and config object\n const routes: CacheRoute[] = Array.isArray(routesOrConfig)\n ? routesOrConfig\n : routesOrConfig.runtimeCache ?? [];\n const precache = Array.isArray(routesOrConfig) ? [] : routesOrConfig.precache ?? [];\n const globalCacheName = Array.isArray(routesOrConfig) ? 'akash-cache-v1' : routesOrConfig.cacheName ?? 'akash-cache-v1';\n let script = `// Auto-generated service worker by AkashJS\nconst CACHE_NAME = '${globalCacheName}';\nconst PRECACHE_URLS = ${JSON.stringify(precache)};\n\nself.addEventListener('install', (event) => {\n ${precache.length > 0 ? `event.waitUntil(\n caches.open(CACHE_NAME).then(cache => cache.addAll(PRECACHE_URLS))\n );` : ''}\n self.skipWaiting();\n});\n\nself.addEventListener('activate', (event) => {\n event.waitUntil(clients.claim());\n});\n\nself.addEventListener('message', (event) => {\n if (event.data?.type === 'SKIP_WAITING') {\n self.skipWaiting();\n }\n});\n\nself.addEventListener('fetch', (event) => {\n const url = new URL(event.request.url);\n`;\n\n for (const route of routes) {\n // Support both 'match' and 'urlPattern' property names\n const matchValue = route.match ?? (route as any).urlPattern;\n if (!matchValue) continue;\n\n const pattern = matchValue instanceof RegExp\n ? matchValue.toString()\n : `new RegExp(${JSON.stringify(matchValue.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))})`;\n\n const cacheName = route.cacheName ?? globalCacheName;\n\n script += `\n if (${pattern}.test(url.pathname)) {\n event.respondWith(${generateStrategyCode(route.strategy, cacheName)});\n return;\n }\n`;\n }\n\n script += `\n // Default: network-first\n event.respondWith(\n fetch(event.request).catch(() => caches.match(event.request))\n );\n});\n`;\n\n return script;\n}\n\nfunction generateStrategyCode(strategy: CacheStrategy, cacheName: string): string {\n switch (strategy) {\n case 'cache-first':\n return `caches.match(event.request).then(cached => cached || fetch(event.request).then(response => { const clone = response.clone(); caches.open('${cacheName}').then(cache => cache.put(event.request, clone)); return response; }))`;\n case 'network-first':\n return `fetch(event.request).then(response => { const clone = response.clone(); caches.open('${cacheName}').then(cache => cache.put(event.request, clone)); return response; }).catch(() => caches.match(event.request))`;\n case 'stale-while-revalidate':\n return `caches.match(event.request).then(cached => { const fetchPromise = fetch(event.request).then(response => { caches.open('${cacheName}').then(cache => cache.put(event.request, response.clone())); return response; }); return cached || fetchPromise; })`;\n case 'network-only':\n return `fetch(event.request)`;\n case 'cache-only':\n return `caches.match(event.request)`;\n }\n}\n\n// =========================================================================\n// Push notifications\n// =========================================================================\n\n/**\n * Request push notification permission and subscribe.\n */\nexport async function subscribePush(\n registration: ServiceWorkerRegistration,\n vapidPublicKey: string,\n): Promise<PushSubscription | null> {\n const permission = await Notification.requestPermission();\n if (permission !== 'granted') return null;\n\n const subscription = await registration.pushManager.subscribe({\n userVisibleOnly: true,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n applicationServerKey: urlBase64ToUint8Array(vapidPublicKey) as any,\n });\n\n return subscription;\n}\n\nfunction urlBase64ToUint8Array(base64String: string): Uint8Array {\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\n const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');\n const rawData = atob(base64);\n return Uint8Array.from(rawData, (char) => char.charCodeAt(0));\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {s,l}from'./chunk-KE7BJTCD.js';import {c as c$1}from'./chunk-YXKQTEPR.js';var c=s(e=>{let s=c$1({status:"pending"}),r=e.props.promise;return e.props.promise.then(t=>{e.props.promise===r&&s.set({status:"resolved",value:t});}).catch(t=>{e.props.promise===r&&s.set({status:"rejected",error:t instanceof Error?t:new Error(String(t))});}),()=>{let t=s();switch(t.status){case "pending":return e.props.pending?l(e.props.pending()):document.createComment("await-pending");case "resolved":return l(e.props.then(t.value));case "rejected":return e.props.catch?l(e.props.catch(t.error)):document.createComment("await-error")}}});function m(e){let s=c$1({status:"pending"});return e.then(r=>s.set({status:"resolved",value:r})).catch(r=>s.set({status:"rejected",error:r instanceof Error?r:new Error(String(r))})),()=>s()}export{c as a,m as b};//# sourceMappingURL=chunk-NJXXC5JB.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-NJXXC5JB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/await-block.ts"],"names":["Await","defineComponent","ctx","state","signal","currentPromise","value","err","s","nodeToDOM","awaitSignal","promise","error"],"mappings":"iFAgDO,IAAMA,EAAQC,CAAAA,CAAkCC,CAAAA,EAAQ,CAC7D,IAAMC,EAAQC,GAAAA,CAA4B,CAAE,MAAA,CAAQ,SAAU,CAAC,CAAA,CAG3DC,CAAAA,CAAiBH,EAAI,KAAA,CAAM,OAAA,CAE/B,OAAAA,CAAAA,CAAI,KAAA,CAAM,OAAA,CACP,IAAA,CAAMI,GAAU,CACXJ,CAAAA,CAAI,MAAM,OAAA,GAAYG,CAAAA,EACxBF,EAAM,GAAA,CAAI,CAAE,MAAA,CAAQ,UAAA,CAAY,MAAAG,CAAM,CAAC,EAE3C,CAAC,CAAA,CACA,MAAOC,CAAAA,EAAQ,CACVL,CAAAA,CAAI,KAAA,CAAM,UAAYG,CAAAA,EACxBF,CAAAA,CAAM,IAAI,CACR,MAAA,CAAQ,WACR,KAAA,CAAOI,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAM,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAG,CAAC,CAC3D,CAAC,EAEL,CAAC,CAAA,CAEI,IAAM,CACX,IAAMC,CAAAA,CAAIL,GAAM,CAEhB,OAAQK,EAAE,MAAA,EACR,KAAK,SAAA,CACH,OAAON,CAAAA,CAAI,KAAA,CAAM,QACbO,CAAAA,CAAUP,CAAAA,CAAI,MAAM,OAAA,EAAS,CAAA,CAC7B,QAAA,CAAS,cAAc,eAAe,CAAA,CAE5C,KAAK,UAAA,CACH,OAAOO,EAAUP,CAAAA,CAAI,KAAA,CAAM,IAAA,CAAKM,CAAAA,CAAE,KAAK,CAAC,CAAA,CAE1C,KAAK,UAAA,CACH,OAAON,EAAI,KAAA,CAAM,KAAA,CACbO,CAAAA,CAAUP,CAAAA,CAAI,MAAM,KAAA,CAAMM,CAAAA,CAAE,KAAK,CAAC,CAAA,CAClC,SAAS,aAAA,CAAc,aAAa,CAC5C,CACF,CACF,CAAC,EAcM,SAASE,CAAAA,CAAeC,CAAAA,CAAqB,CAClD,IAAMR,CAAAA,CAAQC,GAAAA,CAAsB,CAAE,OAAQ,SAAU,CAAC,EAEzD,OAAAO,CAAAA,CACG,KAAML,CAAAA,EAAUH,CAAAA,CAAM,GAAA,CAAI,CAAE,OAAQ,UAAA,CAAY,KAAA,CAAAG,CAAM,CAAC,CAAC,EACxD,KAAA,CAAOM,CAAAA,EAAUT,CAAAA,CAAM,GAAA,CAAI,CAC1B,MAAA,CAAQ,UAAA,CACR,MAAOS,CAAAA,YAAiB,KAAA,CAAQA,EAAQ,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAK,CAAC,CACjE,CAAC,CAAC,CAAA,CAEG,IAAMT,GACf","file":"chunk-NJXXC5JB.js","sourcesContent":["/**\n * Await block — template-level async handling.\n *\n * Renders different content for pending/resolved/rejected states\n * of a promise, similar to Svelte's {#await} blocks.\n *\n * ```ts\n * Await({\n * promise: fetchUser(userId()),\n * pending: () => <Spinner />,\n * then: (user) => <UserCard user={user} />,\n * catch: (err) => <Error message={err.message} />,\n * });\n * ```\n */\n\nimport { defineComponent } from './component.js';\nimport { signal } from './signals.js';\nimport { nodeToDOM } from './dom.js';\nimport type { AkashNode } from './types.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport interface AwaitProps<T> {\n /** The promise to await */\n promise: Promise<T>;\n /** Render while pending */\n pending?: () => AkashNode;\n /** Render when resolved */\n then: (value: T) => AkashNode;\n /** Render when rejected */\n catch?: (error: Error) => AkashNode;\n}\n\ntype AwaitState<T> =\n | { status: 'pending' }\n | { status: 'resolved'; value: T }\n | { status: 'rejected'; error: Error };\n\n// =========================================================================\n// Await component\n// =========================================================================\n\n/**\n * <Await> component — declarative promise handling.\n */\nexport const Await = defineComponent<AwaitProps<any>>((ctx) => {\n const state = signal<AwaitState<unknown>>({ status: 'pending' });\n\n // Track the promise to handle race conditions\n let currentPromise = ctx.props.promise;\n\n ctx.props.promise\n .then((value) => {\n if (ctx.props.promise === currentPromise) {\n state.set({ status: 'resolved', value });\n }\n })\n .catch((err) => {\n if (ctx.props.promise === currentPromise) {\n state.set({\n status: 'rejected',\n error: err instanceof Error ? err : new Error(String(err)),\n });\n }\n });\n\n return () => {\n const s = state();\n\n switch (s.status) {\n case 'pending':\n return ctx.props.pending\n ? nodeToDOM(ctx.props.pending())\n : document.createComment('await-pending');\n\n case 'resolved':\n return nodeToDOM(ctx.props.then(s.value));\n\n case 'rejected':\n return ctx.props.catch\n ? nodeToDOM(ctx.props.catch(s.error))\n : document.createComment('await-error');\n }\n };\n});\n\n// =========================================================================\n// Functional await helper\n// =========================================================================\n\n/**\n * Functional await block — returns a signal that updates as the promise resolves.\n *\n * ```ts\n * const result = awaitSignal(fetchData());\n * result().status; // 'pending' | 'resolved' | 'rejected'\n * ```\n */\nexport function awaitSignal<T>(promise: Promise<T>) {\n const state = signal<AwaitState<T>>({ status: 'pending' });\n\n promise\n .then((value) => state.set({ status: 'resolved', value }))\n .catch((error) => state.set({\n status: 'rejected',\n error: error instanceof Error ? error : new Error(String(error)),\n }));\n\n return () => state();\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';function p(...o){let n=[];for(let e of o)if(e){if(typeof e=="string")n.push(e);else if(Array.isArray(e)){let t=p(...e);t&&n.push(t);}else if(typeof e=="object")for(let[t,r]of Object.entries(e))r&&n.push(t);}return n.join(" ")}function u(o){let n=[];for(let[e,t]of Object.entries(o)){if(t==null)continue;let r=s(e),l=typeof t=="number"&&!i.has(e)?`${t}px`:String(t);n.push(`${r}: ${l}`);}return n.join("; ")}function f(o,n){for(let[e,t]of Object.entries(n))if(t==null)o.style.removeProperty(s(e));else {let r=typeof t=="number"&&!i.has(e)?`${t}px`:String(t);o.style.setProperty(s(e),r);}}function s(o){return o.replace(/[A-Z]/g,n=>`-${n.toLowerCase()}`)}var i=new Set(["animationIterationCount","boxFlex","boxFlexGroup","boxOrdinalGroup","columnCount","fillOpacity","flex","flexGrow","flexPositive","flexShrink","flexNegative","flexOrder","fontWeight","gridColumn","gridRow","lineClamp","lineHeight","opacity","order","orphans","tabSize","widows","zIndex","zoom"]);exports.a=p;exports.b=u;exports.c=f;//# sourceMappingURL=chunk-NQEY7DR5.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-NQEY7DR5.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/css.ts"],"names":["cx","inputs","classes","input","nested","key","value","css","styles","parts","prop","camelToKebab","val","UNITLESS_PROPS","applyStyles","el","str","m"],"mappings":"aAuBO,SAASA,CAAAA,CAAAA,GAAMC,EAA2B,CAC/C,IAAMC,EAAoB,EAAC,CAE3B,IAAA,IAAWC,CAAAA,IAASF,CAAAA,CAClB,GAAKE,GAEL,GAAI,OAAOA,CAAAA,EAAU,QAAA,CACnBD,CAAAA,CAAQ,IAAA,CAAKC,CAAK,CAAA,CAAA,KAAA,GACT,KAAA,CAAM,OAAA,CAAQA,CAAK,CAAA,CAAG,CAC/B,IAAMC,CAAAA,CAASJ,CAAAA,CAAG,GAAGG,CAAK,CAAA,CACtBC,GAAQF,CAAAA,CAAQ,IAAA,CAAKE,CAAM,EACjC,CAAA,KAAA,GAAW,OAAOD,GAAU,QAAA,CAC1B,IAAA,GAAW,CAACE,CAAAA,CAAKC,CAAK,CAAA,GAAK,OAAO,OAAA,CAAQH,CAAK,CAAA,CACzCG,CAAAA,EAAOJ,CAAAA,CAAQ,IAAA,CAAKG,CAAG,EAAA,CAKjC,OAAOH,EAAQ,IAAA,CAAK,GAAG,CACzB,CAgBO,SAASK,CAAAA,CAAIC,CAAAA,CAA+B,CACjD,IAAMC,EAAkB,EAAC,CAEzB,IAAA,GAAW,CAACJ,CAAAA,CAAKC,CAAK,IAAK,MAAA,CAAO,OAAA,CAAQE,CAAM,CAAA,CAAG,CACjD,GAAIF,GAAS,IAAA,CAAM,SAEnB,IAAMI,CAAAA,CAAOC,CAAAA,CAAaN,CAAG,CAAA,CACvBO,CAAAA,CAAM,OAAON,CAAAA,EAAU,QAAA,EAAY,CAACO,EAAe,GAAA,CAAIR,CAAG,CAAA,CAC5D,CAAA,EAAGC,CAAK,CAAA,EAAA,CAAA,CACR,OAAOA,CAAK,CAAA,CAEhBG,CAAAA,CAAM,IAAA,CAAK,CAAA,EAAGC,CAAI,KAAKE,CAAG,CAAA,CAAE,EAC9B,CAEA,OAAOH,EAAM,IAAA,CAAK,IAAI,CACxB,CASO,SAASK,CAAAA,CAAYC,EAAiBP,CAAAA,CAA6B,CACxE,IAAA,GAAW,CAACH,CAAAA,CAAKC,CAAK,IAAK,MAAA,CAAO,OAAA,CAAQE,CAAM,CAAA,CAC9C,GAAIF,CAAAA,EAAS,KACXS,CAAAA,CAAG,KAAA,CAAM,eAAeJ,CAAAA,CAAaN,CAAG,CAAC,CAAA,CAAA,KACpC,CACL,IAAMO,CAAAA,CAAM,OAAON,CAAAA,EAAU,UAAY,CAACO,CAAAA,CAAe,GAAA,CAAIR,CAAG,CAAA,CAC5D,CAAA,EAAGC,CAAK,CAAA,EAAA,CAAA,CACR,MAAA,CAAOA,CAAK,CAAA,CAChBS,CAAAA,CAAG,KAAA,CAAM,YAAYJ,CAAAA,CAAaN,CAAG,EAAGO,CAAG,EAC7C,CAEJ,CAIA,SAASD,CAAAA,CAAaK,CAAAA,CAAqB,CACzC,OAAOA,EAAI,OAAA,CAAQ,QAAA,CAAWC,CAAAA,EAAM,CAAA,CAAA,EAAIA,CAAAA,CAAE,WAAA,EAAa,CAAA,CAAE,CAC3D,CAGA,IAAMJ,CAAAA,CAAiB,IAAI,IAAI,CAC7B,yBAAA,CAA2B,SAAA,CAAW,cAAA,CAAgB,iBAAA,CACtD,aAAA,CAAe,cAAe,MAAA,CAAQ,UAAA,CAAY,cAAA,CAClD,YAAA,CAAc,cAAA,CAAgB,WAAA,CAAa,aAAc,YAAA,CACzD,SAAA,CAAW,WAAA,CAAa,YAAA,CAAc,SAAA,CAAW,OAAA,CAAS,UAC1D,SAAA,CAAW,QAAA,CAAU,QAAA,CAAU,MACjC,CAAC,CAAA","file":"chunk-NQEY7DR5.cjs","sourcesContent":["/**\n * CSS utility functions.\n *\n * cx() for class name merging and css() for dynamic style objects.\n * Tiny but used in every component.\n */\n\n// --- cx() — class name merging ---\n\ntype CxInput = string | boolean | null | undefined | Record<string, boolean> | CxInput[];\n\n/**\n * Merge class names conditionally. Falsy values are filtered out.\n * Object keys are included when their value is truthy.\n *\n * ```ts\n * cx('btn', isActive && 'btn-active', { 'btn-lg': isLarge })\n * // 'btn btn-active btn-lg'\n *\n * cx('card', undefined, false, null, 'card-primary')\n * // 'card card-primary'\n * ```\n */\nexport function cx(...inputs: CxInput[]): string {\n const classes: string[] = [];\n\n for (const input of inputs) {\n if (!input) continue;\n\n if (typeof input === 'string') {\n classes.push(input);\n } else if (Array.isArray(input)) {\n const nested = cx(...input);\n if (nested) classes.push(nested);\n } else if (typeof input === 'object') {\n for (const [key, value] of Object.entries(input)) {\n if (value) classes.push(key);\n }\n }\n }\n\n return classes.join(' ');\n}\n\n// --- css() — dynamic style objects ---\n\ntype CssValue = string | number | null | undefined;\ntype CssProperties = Record<string, CssValue>;\n\n/**\n * Build a CSS style string from an object. Handles camelCase → kebab-case\n * conversion and filters out null/undefined values.\n *\n * ```ts\n * css({ backgroundColor: 'red', fontSize: 14, display: isVisible ? 'block' : 'none' })\n * // 'background-color: red; font-size: 14px; display: block'\n * ```\n */\nexport function css(styles: CssProperties): string {\n const parts: string[] = [];\n\n for (const [key, value] of Object.entries(styles)) {\n if (value == null) continue;\n\n const prop = camelToKebab(key);\n const val = typeof value === 'number' && !UNITLESS_PROPS.has(key)\n ? `${value}px`\n : String(value);\n\n parts.push(`${prop}: ${val}`);\n }\n\n return parts.join('; ');\n}\n\n/**\n * Apply a style object to an element.\n *\n * ```ts\n * applyStyles(el, { color: 'red', marginTop: 10 });\n * ```\n */\nexport function applyStyles(el: HTMLElement, styles: CssProperties): void {\n for (const [key, value] of Object.entries(styles)) {\n if (value == null) {\n el.style.removeProperty(camelToKebab(key));\n } else {\n const val = typeof value === 'number' && !UNITLESS_PROPS.has(key)\n ? `${value}px`\n : String(value);\n el.style.setProperty(camelToKebab(key), val);\n }\n }\n}\n\n// --- Helpers ---\n\nfunction camelToKebab(str: string): string {\n return str.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);\n}\n\n/** CSS properties that don't get automatic px units */\nconst UNITLESS_PROPS = new Set([\n 'animationIterationCount', 'boxFlex', 'boxFlexGroup', 'boxOrdinalGroup',\n 'columnCount', 'fillOpacity', 'flex', 'flexGrow', 'flexPositive',\n 'flexShrink', 'flexNegative', 'flexOrder', 'fontWeight', 'gridColumn',\n 'gridRow', 'lineClamp', 'lineHeight', 'opacity', 'order', 'orphans',\n 'tabSize', 'widows', 'zIndex', 'zoom',\n]);\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
var p=new Set,g=true,l=null;function f(e){g=e;}function I(e){l=e;}function h(){p.clear();}function b(e,n){let t=((...r)=>(u(n),e(...r)));return Object.keys(e).forEach(r=>{t[r]=e[r];}),t.__deprecated=n,t}function y(e,n){return u(n),e}function u(e){if(!g||p.has(e.name))return;p.add(e.name);let n=[`[AkashJS] DEPRECATED: ${e.name}() is deprecated since v${e.since}`];e.removeIn?n[0]+=` and will be removed in v${e.removeIn}.`:n[0]+=".",e.replacement&&n.push(` Migrate to: ${e.replacement}()`),e.message&&n.push(` ${e.message}`),n.push(` See: ${e.link??"https://akash.js.org/migration"}`);let t=n.join(`
|
|
2
|
+
`);l?l(t):typeof console<"u"&&console.warn(t);}var a=new Map;function v(e){a.set(e.name,e);}function d(){return Array.from(a.values())}function x(e){return d().filter(n=>n.stability===e)}function A(e){return a.get(e)?.stability==="deprecated"}function w(e){return a.get(e)?.deprecation??null}function k(e){let n=[],t=[],r=Object.entries(e);if(r.length===0)return {compatible:true,warnings:n,errors:t};let s=r.filter(([o])=>o.startsWith("@akashjs/"));if(s.length>1){let o=new Set(s.map(([,i])=>i.split(".")[0])),m=new Set(s.map(([,i])=>i.split(".").slice(0,2).join(".")));o.size>1?t.push(`Major version mismatch: ${s.map(([i,c])=>`${i}@${c}`).join(", ")}. All @akashjs packages should be on the same major version.`):m.size>1&&n.push(`Minor version mismatch: ${s.map(([i,c])=>`${i}@${c}`).join(", ")}. Consider updating all packages to the same version with \`akash update\`.`);}return {compatible:t.length===0,warnings:n,errors:t}}export{f as a,I as b,h as c,b as d,y as e,v as f,d as g,x as h,A as i,w as j,k};//# sourceMappingURL=chunk-OQV3NYDH.js.map
|
|
3
|
+
//# sourceMappingURL=chunk-OQV3NYDH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/deprecation.ts"],"names":["warned","warningsEnabled","warningHandler","setDeprecationWarnings","enabled","setWarningHandler","handler","resetDeprecationWarnings","deprecated","fn","info","wrapper","args","emitDeprecationWarning","key","deprecatedValue","value","parts","msg","apiRegistry","registerAPI","getRegisteredAPIs","getAPIsByStability","stability","api","isDeprecated","name","getDeprecationInfo","checkCompatibility","packages","warnings","errors","versions","akashPackages","majors","v","minors","n"],"mappings":"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","file":"chunk-OQV3NYDH.js","sourcesContent":["/**\n * Deprecation warnings and API stability markers.\n *\n * Provides runtime warnings when deprecated APIs are used,\n * with migration hints pointing to the replacement.\n *\n * ```ts\n * // Mark an API as deprecated:\n * export const oldName = deprecated(newImplementation, {\n * name: 'oldName',\n * replacement: 'newName',\n * since: '0.2.0',\n * removeIn: '1.0.0',\n * message: 'Use newName() instead for better performance.',\n * });\n *\n * // Users see:\n * // [AkashJS] DEPRECATED: oldName() is deprecated since v0.2.0 and will be removed in v1.0.0.\n * // Use newName() instead for better performance.\n * // See: https://akash.js.org/migration\n * ```\n */\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport type APIStability = 'stable' | 'experimental' | 'deprecated' | 'internal';\n\nexport interface DeprecationInfo {\n /** Name of the deprecated API */\n name: string;\n /** Replacement API name */\n replacement?: string;\n /** Version when deprecated */\n since: string;\n /** Version when it will be removed */\n removeIn?: string;\n /** Custom migration message */\n message?: string;\n /** Documentation link */\n link?: string;\n}\n\nexport interface APIInfo {\n /** API name */\n name: string;\n /** Stability level */\n stability: APIStability;\n /** Version introduced */\n since: string;\n /** Deprecation info (if deprecated) */\n deprecation?: DeprecationInfo;\n}\n\n// =========================================================================\n// Warning state\n// =========================================================================\n\nconst warned = new Set<string>();\nlet warningsEnabled = true;\nlet warningHandler: ((msg: string) => void) | null = null;\n\n/**\n * Enable or disable deprecation warnings globally.\n */\nexport function setDeprecationWarnings(enabled: boolean): void {\n warningsEnabled = enabled;\n}\n\n/**\n * Set a custom warning handler (default: console.warn).\n */\nexport function setWarningHandler(handler: ((msg: string) => void) | null): void {\n warningHandler = handler;\n}\n\n/**\n * Reset warned-about APIs (useful for testing).\n */\nexport function resetDeprecationWarnings(): void {\n warned.clear();\n}\n\n// =========================================================================\n// deprecated() — wrap a function with a deprecation warning\n// =========================================================================\n\n/**\n * Wrap a function so it emits a deprecation warning on first call.\n *\n * ```ts\n * // Old API that still works but warns:\n * export const createStore = deprecated(defineStore, {\n * name: 'createStore',\n * replacement: 'defineStore',\n * since: '0.2.0',\n * removeIn: '1.0.0',\n * });\n * ```\n */\nexport function deprecated<T extends (...args: any[]) => any>(\n fn: T,\n info: DeprecationInfo,\n): T {\n const wrapper = ((...args: any[]) => {\n emitDeprecationWarning(info);\n return fn(...args);\n }) as unknown as T;\n\n // Copy properties from original\n Object.keys(fn).forEach((key) => {\n (wrapper as any)[key] = (fn as any)[key];\n });\n\n // Mark as deprecated\n (wrapper as any).__deprecated = info;\n\n return wrapper;\n}\n\n/**\n * Mark a value (non-function) as deprecated.\n * Returns the value but warns on first access.\n */\nexport function deprecatedValue<T>(value: T, info: DeprecationInfo): T {\n emitDeprecationWarning(info);\n return value;\n}\n\n// =========================================================================\n// Warning emission\n// =========================================================================\n\nfunction emitDeprecationWarning(info: DeprecationInfo): void {\n if (!warningsEnabled) return;\n if (warned.has(info.name)) return; // Only warn once per API\n warned.add(info.name);\n\n const parts: string[] = [\n `[AkashJS] DEPRECATED: ${info.name}() is deprecated since v${info.since}`,\n ];\n\n if (info.removeIn) {\n parts[0] += ` and will be removed in v${info.removeIn}.`;\n } else {\n parts[0] += '.';\n }\n\n if (info.replacement) {\n parts.push(` Migrate to: ${info.replacement}()`);\n }\n\n if (info.message) {\n parts.push(` ${info.message}`);\n }\n\n parts.push(` See: ${info.link ?? 'https://akash.js.org/migration'}`);\n\n const msg = parts.join('\\n');\n\n if (warningHandler) {\n warningHandler(msg);\n } else if (typeof console !== 'undefined') {\n console.warn(msg);\n }\n}\n\n// =========================================================================\n// API Registry — track stability of all APIs\n// =========================================================================\n\nconst apiRegistry = new Map<string, APIInfo>();\n\n/**\n * Register an API with its stability level.\n */\nexport function registerAPI(info: APIInfo): void {\n apiRegistry.set(info.name, info);\n}\n\n/**\n * Get all registered APIs.\n */\nexport function getRegisteredAPIs(): APIInfo[] {\n return Array.from(apiRegistry.values());\n}\n\n/**\n * Get APIs by stability level.\n */\nexport function getAPIsByStability(stability: APIStability): APIInfo[] {\n return getRegisteredAPIs().filter((api) => api.stability === stability);\n}\n\n/**\n * Check if an API is deprecated.\n */\nexport function isDeprecated(name: string): boolean {\n const info = apiRegistry.get(name);\n return info?.stability === 'deprecated';\n}\n\n/**\n * Get deprecation info for an API.\n */\nexport function getDeprecationInfo(name: string): DeprecationInfo | null {\n const info = apiRegistry.get(name);\n return info?.deprecation ?? null;\n}\n\n// =========================================================================\n// Compatibility check\n// =========================================================================\n\nexport interface CompatibilityResult {\n compatible: boolean;\n warnings: string[];\n errors: string[];\n}\n\n/**\n * Check if package versions are compatible.\n *\n * ```ts\n * const result = checkCompatibility({\n * '@akashjs/runtime': '0.2.0',\n * '@akashjs/router': '0.1.0',\n * });\n * if (!result.compatible) {\n * console.error(result.errors);\n * }\n * ```\n */\nexport function checkCompatibility(\n packages: Record<string, string>,\n): CompatibilityResult {\n const warnings: string[] = [];\n const errors: string[] = [];\n\n const versions = Object.entries(packages);\n if (versions.length === 0) return { compatible: true, warnings, errors };\n\n // Check that all @akashjs packages are on compatible versions\n const akashPackages = versions.filter(([name]) => name.startsWith('@akashjs/'));\n\n if (akashPackages.length > 1) {\n const majors = new Set(akashPackages.map(([, v]) => v.split('.')[0]));\n const minors = new Set(akashPackages.map(([, v]) => v.split('.').slice(0, 2).join('.')));\n\n if (majors.size > 1) {\n errors.push(\n `Major version mismatch: ${akashPackages.map(([n, v]) => `${n}@${v}`).join(', ')}. ` +\n 'All @akashjs packages should be on the same major version.',\n );\n } else if (minors.size > 1) {\n warnings.push(\n `Minor version mismatch: ${akashPackages.map(([n, v]) => `${n}@${v}`).join(', ')}. ` +\n 'Consider updating all packages to the same version with `akash update`.',\n );\n }\n }\n\n return {\n compatible: errors.length === 0,\n warnings,\n errors,\n };\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {c,d}from'./chunk-YXKQTEPR.js';function E(r){let{data:n,columns:l,pageSize:s=0,initialSort:x}=r,i=c(x??{column:null,direction:null}),f=c(""),o=c(1),m=c(Object.fromEntries(l.map(e=>[e.key,e.visible!==false]))),C=d(()=>{let e=m();return l.filter(t=>e[t.key])}),T=d(()=>{let e=f().toLowerCase().trim();if(!e)return n();let t=l.filter(a=>a.filterable),d=t.length>0?t:l;return n().filter(a=>d.some(c=>{let p=b(a,c.key);return String(p).toLowerCase().includes(e)}))}),v=d(()=>{let{column:e,direction:t}=i(),d=[...T()];if(!e||!t)return d;let a=l.find(c=>c.key===e);return a?d.sort((c,p)=>{if(a.compare){let R=a.compare(c,p);return t==="desc"?-R:R}let O=b(c,e),j=b(p,e),y=z(O,j);return t==="desc"?-y:y}):d}),w=d(()=>T().length),S=d(()=>s<=0?1:Math.max(1,Math.ceil(w()/s))),h=d(()=>{let e=v();if(s<=0)return e;let t=(o()-1)*s;return e.slice(t,t+s)});function D(e){let t=i();t.column===e?t.direction==="asc"?i.set({column:e,direction:"desc"}):t.direction==="desc"?i.set({column:null,direction:null}):i.set({column:e,direction:"asc"}):i.set({column:e,direction:"asc"}),o.set(1);}function k(e){f.set(e),o.set(1);}function P(e){m.update(t=>({...t,[e]:!t[e]}));}function M(e){m.update(t=>({...t,[e]:true}));}function V(e){m.update(t=>({...t,[e]:false}));}return {rows:h,allRows:v,totalRows:w,visibleColumns:C,sortState:()=>i(),filterText:()=>f(),page:()=>o(),totalPages:S,sort:D,filter:k,toggleColumn:P,showColumn:M,hideColumn:V,nextPage(){o()<S()&&o.update(e=>e+1);},prevPage(){o()>1&&o.update(e=>e-1);},goToPage(e){o.set(Math.max(1,Math.min(e,S())));},reset(){i.set({column:null,direction:null}),f.set(""),o.set(1);}}}function b(r,n){return n.split(".").reduce((l,s)=>l?.[s],r)}function z(r,n){return r==null&&n==null?0:r==null?-1:n==null?1:typeof r=="number"&&typeof n=="number"?r-n:String(r).localeCompare(String(n))}export{E as a};//# sourceMappingURL=chunk-OZ4GNBKA.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-OZ4GNBKA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/data-table.ts"],"names":["createDataTable","options","data","columns","pageSize","initialSort","sortState","signal","filterText","page","columnVisibility","c","visibleColumns","computed","vis","filteredRows","text","filterableCols","colsToSearch","row","col","value","getNestedValue","sortedRows","column","direction","rows","colDef","a","b","result","aVal","bVal","defaultCompare","totalRows","totalPages","paginatedRows","all","start","sort","columnKey","current","filter","toggleColumn","key","showColumn","hideColumn","p","obj","path","o","k"],"mappings":"sCAwGO,SAASA,CAAAA,CACdC,CAAAA,CACc,CACd,GAAM,CAAE,IAAA,CAAAC,CAAAA,CAAM,OAAA,CAAAC,CAAAA,CAAS,QAAA,CAAAC,CAAAA,CAAW,CAAA,CAAG,YAAAC,CAAY,CAAA,CAAIJ,CAAAA,CAE/CK,CAAAA,CAAYC,CAAAA,CAAkBF,CAAAA,EAAe,CAAE,MAAA,CAAQ,IAAA,CAAM,SAAA,CAAW,IAAK,CAAC,CAAA,CAC9EG,CAAAA,CAAaD,CAAAA,CAAO,EAAE,EACtBE,CAAAA,CAAOF,CAAAA,CAAO,CAAC,CAAA,CACfG,CAAAA,CAAmBH,CAAAA,CACvB,MAAA,CAAO,WAAA,CAAYJ,CAAAA,CAAQ,GAAA,CAAKQ,CAAAA,EAAM,CAACA,CAAAA,CAAE,GAAA,CAAKA,CAAAA,CAAE,OAAA,GAAY,KAAK,CAAC,CAAC,CACrE,CAAA,CAGMC,CAAAA,CAAiBC,CAAAA,CAAS,IAAM,CACpC,IAAMC,CAAAA,CAAMJ,CAAAA,EAAiB,CAC7B,OAAOP,CAAAA,CAAQ,MAAA,CAAQQ,CAAAA,EAAMG,EAAIH,CAAAA,CAAE,GAAG,CAAC,CACzC,CAAC,CAAA,CAGKI,CAAAA,CAAeF,CAAAA,CAAS,IAAM,CAClC,IAAMG,CAAAA,CAAOR,CAAAA,EAAW,CAAE,WAAA,EAAY,CAAE,MAAK,CAC7C,GAAI,CAACQ,CAAAA,CAAM,OAAOd,CAAAA,EAAK,CAGvB,IAAMe,CAAAA,CAAiBd,CAAAA,CAAQ,MAAA,CAAQQ,CAAAA,EAAMA,CAAAA,CAAE,UAAU,CAAA,CACnDO,CAAAA,CAAeD,EAAe,MAAA,CAAS,CAAA,CAAIA,CAAAA,CAAiBd,CAAAA,CAElE,OAAOD,CAAAA,EAAK,CAAE,MAAA,CAAQiB,CAAAA,EACbD,CAAAA,CAAa,IAAA,CAAME,CAAAA,EAAQ,CAChC,IAAMC,CAAAA,CAAQC,CAAAA,CAAeH,EAAKC,CAAAA,CAAI,GAAG,CAAA,CACzC,OAAO,MAAA,CAAOC,CAAK,CAAA,CAAE,WAAA,GAAc,QAAA,CAASL,CAAI,CAClD,CAAC,CACF,CACH,CAAC,CAAA,CAGKO,EAAaV,CAAAA,CAAS,IAAM,CAChC,GAAM,CAAE,MAAA,CAAAW,CAAAA,CAAQ,SAAA,CAAAC,CAAU,CAAA,CAAInB,CAAAA,EAAU,CAClCoB,CAAAA,CAAO,CAAC,GAAGX,CAAAA,EAAc,CAAA,CAE/B,GAAI,CAACS,CAAAA,EAAU,CAACC,CAAAA,CAAW,OAAOC,CAAAA,CAElC,IAAMC,CAAAA,CAASxB,CAAAA,CAAQ,IAAA,CAAM,CAAA,EAAM,CAAA,CAAE,GAAA,GAAQqB,CAAM,EACnD,OAAKG,CAAAA,CAEED,CAAAA,CAAK,IAAA,CAAK,CAACE,CAAAA,CAAGC,CAAAA,GAAM,CACzB,GAAIF,CAAAA,CAAO,OAAA,CAAS,CAClB,IAAMG,CAAAA,CAASH,CAAAA,CAAO,OAAA,CAAQC,EAAGC,CAAC,CAAA,CAClC,OAAOJ,CAAAA,GAAc,MAAA,CAAS,CAACK,CAAAA,CAASA,CAC1C,CAEA,IAAMC,CAAAA,CAAOT,CAAAA,CAAeM,CAAAA,CAAGJ,CAAM,CAAA,CAC/BQ,CAAAA,CAAOV,CAAAA,CAAeO,EAAGL,CAAM,CAAA,CAC/BM,CAAAA,CAASG,CAAAA,CAAeF,CAAAA,CAAMC,CAAI,CAAA,CACxC,OAAOP,CAAAA,GAAc,MAAA,CAAS,CAACK,CAAAA,CAASA,CAC1C,CAAC,CAAA,CAZmBJ,CAatB,CAAC,CAAA,CAGKQ,CAAAA,CAAYrB,CAAAA,CAAS,IAAME,CAAAA,EAAa,CAAE,MAAM,CAAA,CAGhDoB,CAAAA,CAAatB,CAAAA,CAAS,IACtBT,CAAAA,EAAY,CAAA,CAAU,CAAA,CACnB,IAAA,CAAK,GAAA,CAAI,EAAG,IAAA,CAAK,IAAA,CAAK8B,CAAAA,EAAU,CAAI9B,CAAQ,CAAC,CACrD,CAAA,CAGKgC,CAAAA,CAAgBvB,CAAAA,CAAS,IAAM,CACnC,IAAMwB,CAAAA,CAAMd,CAAAA,EAAW,CACvB,GAAInB,CAAAA,EAAY,CAAA,CAAG,OAAOiC,CAAAA,CAC1B,IAAMC,CAAAA,CAAAA,CAAS7B,CAAAA,EAAK,CAAI,GAAKL,CAAAA,CAC7B,OAAOiC,CAAAA,CAAI,KAAA,CAAMC,CAAAA,CAAOA,CAAAA,CAAQlC,CAAQ,CAC1C,CAAC,CAAA,CAID,SAASmC,CAAAA,CAAKC,CAAAA,CAAyB,CACrC,IAAMC,CAAAA,CAAUnC,CAAAA,EAAU,CACtBmC,CAAAA,CAAQ,MAAA,GAAWD,CAAAA,CAEjBC,CAAAA,CAAQ,SAAA,GAAc,KAAA,CACxBnC,CAAAA,CAAU,IAAI,CAAE,MAAA,CAAQkC,CAAAA,CAAW,SAAA,CAAW,MAAO,CAAC,CAAA,CAC7CC,CAAAA,CAAQ,SAAA,GAAc,MAAA,CAC/BnC,CAAAA,CAAU,GAAA,CAAI,CAAE,MAAA,CAAQ,IAAA,CAAM,SAAA,CAAW,IAAK,CAAC,CAAA,CAE/CA,CAAAA,CAAU,GAAA,CAAI,CAAE,MAAA,CAAQkC,CAAAA,CAAW,SAAA,CAAW,KAAM,CAAC,CAAA,CAGvDlC,CAAAA,CAAU,GAAA,CAAI,CAAE,MAAA,CAAQkC,CAAAA,CAAW,UAAW,KAAM,CAAC,CAAA,CAEvD/B,CAAAA,CAAK,GAAA,CAAI,CAAC,EACZ,CAEA,SAASiC,CAAAA,CAAO1B,CAAAA,CAAoB,CAClCR,CAAAA,CAAW,GAAA,CAAIQ,CAAI,CAAA,CACnBP,CAAAA,CAAK,IAAI,CAAC,EACZ,CAEA,SAASkC,CAAAA,CAAaC,CAAAA,CAAmB,CACvClC,CAAAA,CAAiB,MAAA,CAAQI,CAAAA,GAAS,CAAE,GAAGA,CAAAA,CAAK,CAAC8B,CAAG,EAAG,CAAC9B,CAAAA,CAAI8B,CAAG,CAAE,CAAA,CAAE,EACjE,CAEA,SAASC,CAAAA,CAAWD,CAAAA,CAAmB,CACrClC,CAAAA,CAAiB,MAAA,CAAQI,CAAAA,GAAS,CAAE,GAAGA,CAAAA,CAAK,CAAC8B,CAAG,EAAG,IAAK,CAAA,CAAE,EAC5D,CAEA,SAASE,CAAAA,CAAWF,CAAAA,CAAmB,CACrClC,CAAAA,CAAiB,MAAA,CAAQI,CAAAA,GAAS,CAAE,GAAGA,CAAAA,CAAK,CAAC8B,CAAG,EAAG,KAAM,CAAA,CAAE,EAC7D,CAEA,OAAO,CACL,KAAMR,CAAAA,CACN,OAAA,CAASb,CAAAA,CACT,SAAA,CAAAW,CAAAA,CACA,cAAA,CAAAtB,CAAAA,CACA,SAAA,CAAW,IAAMN,CAAAA,EAAU,CAC3B,UAAA,CAAY,IAAME,CAAAA,EAAW,CAC7B,IAAA,CAAM,IAAMC,CAAAA,EAAK,CACjB,UAAA,CAAA0B,CAAAA,CACA,IAAA,CAAAI,CAAAA,CACA,MAAA,CAAAG,CAAAA,CACA,aAAAC,CAAAA,CACA,UAAA,CAAAE,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,QAAA,EAAW,CAAMrC,CAAAA,EAAK,CAAI0B,CAAAA,EAAW,EAAG1B,CAAAA,CAAK,MAAA,CAAQsC,CAAAA,EAAMA,CAAAA,CAAI,CAAC,EAAG,CAAA,CACnE,QAAA,EAAW,CAAMtC,CAAAA,EAAK,CAAI,CAAA,EAAGA,CAAAA,CAAK,MAAA,CAAQsC,CAAAA,EAAMA,CAAAA,CAAI,CAAC,EAAG,CAAA,CACxD,QAAA,CAASA,CAAAA,CAAW,CAAEtC,EAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAG,IAAA,CAAK,GAAA,CAAIsC,CAAAA,CAAGZ,CAAAA,EAAY,CAAC,CAAC,EAAG,CAAA,CACxE,KAAA,EAAQ,CACN7B,CAAAA,CAAU,GAAA,CAAI,CAAE,MAAA,CAAQ,IAAA,CAAM,SAAA,CAAW,IAAK,CAAC,CAAA,CAC/CE,CAAAA,CAAW,GAAA,CAAI,EAAE,CAAA,CACjBC,CAAAA,CAAK,GAAA,CAAI,CAAC,EACZ,CACF,CACF,CAIA,SAASa,CAAAA,CAAe0B,CAAAA,CAA8BC,CAAAA,CAAuB,CAC3E,OAAOA,CAAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,CAACC,CAAAA,CAAQC,CAAAA,GAAMD,CAAAA,GAAIC,CAAC,EAAGH,CAAG,CAC1D,CAEA,SAASf,CAAAA,CAAeL,CAAAA,CAAYC,CAAAA,CAAoB,CACtD,OAAID,CAAAA,EAAK,IAAA,EAAQC,CAAAA,EAAK,IAAA,CAAa,CAAA,CAC/BD,CAAAA,EAAK,IAAA,CAAa,GAClBC,CAAAA,EAAK,IAAA,CAAa,CAAA,CAClB,OAAOD,CAAAA,EAAM,QAAA,EAAY,OAAOC,CAAAA,EAAM,SAAiBD,CAAAA,CAAIC,CAAAA,CACxD,MAAA,CAAOD,CAAC,CAAA,CAAE,aAAA,CAAc,MAAA,CAAOC,CAAC,CAAC,CAC1C","file":"chunk-OZ4GNBKA.js","sourcesContent":["/**\n * Headless data table.\n *\n * Signal-based table state management with sorting, filtering,\n * column visibility, and pagination integration. No DOM — just logic.\n *\n * ```ts\n * const table = createDataTable({\n * data: () => users(),\n * columns: [\n * { key: 'name', header: 'Name', sortable: true },\n * { key: 'email', header: 'Email', sortable: true, filterable: true },\n * { key: 'age', header: 'Age', sortable: true },\n * ],\n * pageSize: 20,\n * });\n *\n * table.rows(); // current page of sorted/filtered data\n * table.sort('name'); // toggle sort by column\n * table.filter('search term');\n * table.toggleColumn('age');\n * table.nextPage();\n * ```\n */\n\nimport { signal, computed } from './signals.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// --- Types ---\n\nexport interface ColumnDef<T> {\n /** Key to access the data (dot notation supported) */\n key: string;\n /** Display header */\n header: string;\n /** Whether this column is sortable (default: false) */\n sortable?: boolean;\n /** Whether this column is searchable by the global filter (default: false) */\n filterable?: boolean;\n /** Custom sort comparator */\n compare?: (a: T, b: T) => number;\n /** Custom cell value accessor */\n accessor?: (row: T) => unknown;\n /** Whether column is visible by default (default: true) */\n visible?: boolean;\n}\n\nexport type SortDirection = 'asc' | 'desc' | null;\n\nexport interface SortState {\n column: string | null;\n direction: SortDirection;\n}\n\nexport interface DataTableOptions<T> {\n /** Reactive data source */\n data: () => T[];\n /** Column definitions */\n columns: ColumnDef<T>[];\n /** Page size (0 = no pagination) */\n pageSize?: number;\n /** Initial sort */\n initialSort?: SortState;\n}\n\nexport interface DataTable<T> {\n /** Current page of processed (sorted + filtered) rows */\n rows: ReadonlySignal<T[]>;\n /** All processed rows (before pagination) */\n allRows: ReadonlySignal<T[]>;\n /** Total row count after filtering */\n totalRows: ReadonlySignal<number>;\n /** Visible columns */\n visibleColumns: ReadonlySignal<ColumnDef<T>[]>;\n /** Current sort state */\n sortState: ReadonlySignal<SortState>;\n /** Current filter text */\n filterText: ReadonlySignal<string>;\n /** Current page (1-based) */\n page: ReadonlySignal<number>;\n /** Total pages */\n totalPages: ReadonlySignal<number>;\n /** Toggle or set sort on a column */\n sort(columnKey: string): void;\n /** Set the global filter text */\n filter(text: string): void;\n /** Toggle column visibility */\n toggleColumn(columnKey: string): void;\n /** Show a column */\n showColumn(columnKey: string): void;\n /** Hide a column */\n hideColumn(columnKey: string): void;\n /** Go to next page */\n nextPage(): void;\n /** Go to previous page */\n prevPage(): void;\n /** Go to specific page */\n goToPage(page: number): void;\n /** Reset all state (sort, filter, page) */\n reset(): void;\n}\n\n// --- Implementation ---\n\nexport function createDataTable<T extends Record<string, unknown>>(\n options: DataTableOptions<T>,\n): DataTable<T> {\n const { data, columns, pageSize = 0, initialSort } = options;\n\n const sortState = signal<SortState>(initialSort ?? { column: null, direction: null });\n const filterText = signal('');\n const page = signal(1);\n const columnVisibility = signal<Record<string, boolean>>(\n Object.fromEntries(columns.map((c) => [c.key, c.visible !== false])),\n );\n\n // Visible columns\n const visibleColumns = computed(() => {\n const vis = columnVisibility();\n return columns.filter((c) => vis[c.key]);\n });\n\n // Filtered rows\n const filteredRows = computed(() => {\n const text = filterText().toLowerCase().trim();\n if (!text) return data();\n\n // If no columns explicitly marked filterable, filter all columns\n const filterableCols = columns.filter((c) => c.filterable);\n const colsToSearch = filterableCols.length > 0 ? filterableCols : columns;\n\n return data().filter((row) => {\n return colsToSearch.some((col) => {\n const value = getNestedValue(row, col.key);\n return String(value).toLowerCase().includes(text);\n });\n });\n });\n\n // Sorted rows\n const sortedRows = computed(() => {\n const { column, direction } = sortState();\n const rows = [...filteredRows()];\n\n if (!column || !direction) return rows;\n\n const colDef = columns.find((c) => c.key === column);\n if (!colDef) return rows;\n\n return rows.sort((a, b) => {\n if (colDef.compare) {\n const result = colDef.compare(a, b);\n return direction === 'desc' ? -result : result;\n }\n\n const aVal = getNestedValue(a, column);\n const bVal = getNestedValue(b, column);\n const result = defaultCompare(aVal, bVal);\n return direction === 'desc' ? -result : result;\n });\n });\n\n // Total rows after filtering\n const totalRows = computed(() => filteredRows().length);\n\n // Total pages\n const totalPages = computed(() => {\n if (pageSize <= 0) return 1;\n return Math.max(1, Math.ceil(totalRows() / pageSize));\n });\n\n // Paginated rows\n const paginatedRows = computed(() => {\n const all = sortedRows();\n if (pageSize <= 0) return all;\n const start = (page() - 1) * pageSize;\n return all.slice(start, start + pageSize);\n });\n\n // --- Actions ---\n\n function sort(columnKey: string): void {\n const current = sortState();\n if (current.column === columnKey) {\n // Cycle: asc → desc → none\n if (current.direction === 'asc') {\n sortState.set({ column: columnKey, direction: 'desc' });\n } else if (current.direction === 'desc') {\n sortState.set({ column: null, direction: null });\n } else {\n sortState.set({ column: columnKey, direction: 'asc' });\n }\n } else {\n sortState.set({ column: columnKey, direction: 'asc' });\n }\n page.set(1);\n }\n\n function filter(text: string): void {\n filterText.set(text);\n page.set(1);\n }\n\n function toggleColumn(key: string): void {\n columnVisibility.update((vis) => ({ ...vis, [key]: !vis[key] }));\n }\n\n function showColumn(key: string): void {\n columnVisibility.update((vis) => ({ ...vis, [key]: true }));\n }\n\n function hideColumn(key: string): void {\n columnVisibility.update((vis) => ({ ...vis, [key]: false }));\n }\n\n return {\n rows: paginatedRows,\n allRows: sortedRows,\n totalRows,\n visibleColumns,\n sortState: () => sortState(),\n filterText: () => filterText(),\n page: () => page(),\n totalPages,\n sort,\n filter,\n toggleColumn,\n showColumn,\n hideColumn,\n nextPage() { if (page() < totalPages()) page.update((p) => p + 1); },\n prevPage() { if (page() > 1) page.update((p) => p - 1); },\n goToPage(p: number) { page.set(Math.max(1, Math.min(p, totalPages()))); },\n reset() {\n sortState.set({ column: null, direction: null });\n filterText.set('');\n page.set(1);\n },\n };\n}\n\n// --- Helpers ---\n\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n return path.split('.').reduce((o: any, k) => o?.[k], obj);\n}\n\nfunction defaultCompare(a: unknown, b: unknown): number {\n if (a == null && b == null) return 0;\n if (a == null) return -1;\n if (b == null) return 1;\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n return String(a).localeCompare(String(b));\n}\n"]}
|