@akashjs/runtime 0.2.6 → 0.2.8
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-2GGCZC4O.js +2 -0
- package/dist/chunk-2GGCZC4O.js.map +1 -0
- package/dist/chunk-2UATNCKC.js +2 -0
- package/dist/chunk-2UATNCKC.js.map +1 -0
- package/dist/chunk-2XFW6MT7.js +2 -0
- package/dist/chunk-2XFW6MT7.js.map +1 -0
- package/dist/chunk-34PQECMN.cjs +2 -0
- package/dist/chunk-34PQECMN.cjs.map +1 -0
- package/dist/chunk-3CD6A5YV.js +2 -0
- package/dist/chunk-3CD6A5YV.js.map +1 -0
- package/dist/chunk-3PCZFKBH.js +2 -0
- package/dist/chunk-3PCZFKBH.js.map +1 -0
- package/dist/chunk-3PGU24B5.cjs +3 -0
- package/dist/chunk-3PGU24B5.cjs.map +1 -0
- package/dist/chunk-3PLQPLVA.js +2 -0
- package/dist/chunk-3PLQPLVA.js.map +1 -0
- package/dist/chunk-3RDEFZMT.js +2 -0
- package/dist/chunk-3RDEFZMT.js.map +1 -0
- package/dist/chunk-3VYMJMAU.js +2 -0
- package/dist/chunk-3VYMJMAU.js.map +1 -0
- package/dist/chunk-3Y663FYJ.js +2 -0
- package/dist/chunk-3Y663FYJ.js.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-4VLBY2BW.cjs +2 -0
- package/dist/chunk-4VLBY2BW.cjs.map +1 -0
- package/dist/chunk-5GDMAABU.js +2 -0
- package/dist/chunk-5GDMAABU.js.map +1 -0
- package/dist/chunk-5JKXREA2.cjs +2 -0
- package/dist/chunk-5JKXREA2.cjs.map +1 -0
- package/dist/chunk-5QCWH6QA.cjs +4 -0
- package/dist/chunk-5QCWH6QA.cjs.map +1 -0
- package/dist/chunk-637ENG3A.cjs +2 -0
- package/dist/chunk-637ENG3A.cjs.map +1 -0
- package/dist/chunk-66PLXQS3.js +2 -0
- package/dist/chunk-66PLXQS3.js.map +1 -0
- package/dist/chunk-6GY6HC75.cjs +2 -0
- package/dist/chunk-6GY6HC75.cjs.map +1 -0
- package/dist/chunk-6I5PPQ34.cjs +17 -0
- package/dist/chunk-6I5PPQ34.cjs.map +1 -0
- package/dist/chunk-6ZCFPR4O.js +2 -0
- package/dist/chunk-6ZCFPR4O.js.map +1 -0
- package/dist/chunk-7T4HMWUC.js +2 -0
- package/dist/{chunk-5A7KDBDU.js.map → chunk-7T4HMWUC.js.map} +1 -1
- 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-BHP3UTTQ.cjs +3 -0
- package/dist/chunk-BHP3UTTQ.cjs.map +1 -0
- package/dist/chunk-BLT7XOSX.cjs +2 -0
- package/dist/chunk-BLT7XOSX.cjs.map +1 -0
- package/dist/chunk-CDZR6GWB.js +2 -0
- package/dist/chunk-CDZR6GWB.js.map +1 -0
- package/dist/chunk-DFYXFKCH.cjs +2 -0
- package/dist/chunk-DFYXFKCH.cjs.map +1 -0
- package/dist/chunk-DP7G45QM.cjs +13 -0
- package/dist/chunk-DP7G45QM.cjs.map +1 -0
- package/dist/chunk-DWSIR5SL.cjs +2 -0
- package/dist/chunk-DWSIR5SL.cjs.map +1 -0
- package/dist/chunk-E6RB7PRO.js +2 -0
- package/dist/chunk-E6RB7PRO.js.map +1 -0
- package/dist/chunk-E7BPGVIS.js +2 -0
- package/dist/chunk-E7BPGVIS.js.map +1 -0
- package/dist/chunk-E7GAIKQT.cjs +2 -0
- package/dist/chunk-E7GAIKQT.cjs.map +1 -0
- package/dist/chunk-EEQZFKEG.js +2 -0
- package/dist/{chunk-TKFJGLUO.js.map → chunk-EEQZFKEG.js.map} +1 -1
- package/dist/chunk-EXKQPZ5N.cjs +2 -0
- package/dist/chunk-EXKQPZ5N.cjs.map +1 -0
- package/dist/{chunk-ZYVQQ5VR.cjs → chunk-F2F5OXCK.cjs} +3 -3
- package/dist/{chunk-ZYVQQ5VR.cjs.map → chunk-F2F5OXCK.cjs.map} +1 -1
- package/dist/chunk-F4FXIPR3.js +2 -0
- package/dist/chunk-F4FXIPR3.js.map +1 -0
- package/dist/chunk-GAAO2KXN.js +2 -0
- package/dist/chunk-GAAO2KXN.js.map +1 -0
- package/dist/chunk-GB7IUC6E.js +2 -0
- package/dist/chunk-GB7IUC6E.js.map +1 -0
- package/dist/chunk-GHSJ4B55.js +11 -0
- package/dist/chunk-GHSJ4B55.js.map +1 -0
- package/dist/{chunk-U53YRJNV.js → chunk-GRXHWCFR.js} +3 -3
- package/dist/{chunk-U53YRJNV.js.map → chunk-GRXHWCFR.js.map} +1 -1
- package/dist/chunk-HHPRQMGX.cjs +2 -0
- package/dist/chunk-HHPRQMGX.cjs.map +1 -0
- package/dist/chunk-HL2VGVJT.cjs +2 -0
- package/dist/chunk-HL2VGVJT.cjs.map +1 -0
- package/dist/chunk-IDTJWCYW.js +2 -0
- package/dist/chunk-IDTJWCYW.js.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-IQGSDFBI.cjs +2 -0
- package/dist/chunk-IQGSDFBI.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-JMY6E7VR.cjs +2 -0
- package/dist/chunk-JMY6E7VR.cjs.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-KFMCMKSC.cjs +2 -0
- package/dist/chunk-KFMCMKSC.cjs.map +1 -0
- package/dist/chunk-KGV5MKBC.cjs +11 -0
- package/dist/chunk-KGV5MKBC.cjs.map +1 -0
- package/dist/chunk-KMEGUPH2.js +3 -0
- package/dist/chunk-KMEGUPH2.js.map +1 -0
- package/dist/chunk-KQAYFPJI.cjs +2 -0
- package/dist/chunk-KQAYFPJI.cjs.map +1 -0
- package/dist/chunk-LSD7DEMV.cjs +2 -0
- package/dist/chunk-LSD7DEMV.cjs.map +1 -0
- package/dist/{chunk-2U643GJZ.cjs → chunk-LTMDSGQ6.cjs} +2 -2
- package/dist/{chunk-2U643GJZ.cjs.map → chunk-LTMDSGQ6.cjs.map} +1 -1
- package/dist/chunk-LWQPLKL6.cjs +20 -0
- package/dist/chunk-LWQPLKL6.cjs.map +1 -0
- package/dist/{chunk-2Q6SYE5O.cjs → chunk-M2OWSNOM.cjs} +2 -2
- package/dist/{chunk-2Q6SYE5O.cjs.map → chunk-M2OWSNOM.cjs.map} +1 -1
- 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-MGFRVOM5.js +2 -0
- package/dist/chunk-MGFRVOM5.js.map +1 -0
- package/dist/chunk-MNUOIAXS.js +2 -0
- package/dist/chunk-MNUOIAXS.js.map +1 -0
- package/dist/chunk-ND2HZRMR.cjs +2 -0
- package/dist/chunk-ND2HZRMR.cjs.map +1 -0
- package/dist/chunk-NGU2W4PD.cjs +2 -0
- package/dist/chunk-NGU2W4PD.cjs.map +1 -0
- package/dist/chunk-NQEY7DR5.cjs +2 -0
- package/dist/chunk-NQEY7DR5.cjs.map +1 -0
- package/dist/chunk-O5OTZP5M.cjs +2 -0
- package/dist/chunk-O5OTZP5M.cjs.map +1 -0
- package/dist/chunk-OQV3NYDH.js +3 -0
- package/dist/chunk-OQV3NYDH.js.map +1 -0
- package/dist/chunk-P4USGNUK.cjs +2 -0
- package/dist/chunk-P4USGNUK.cjs.map +1 -0
- package/dist/chunk-P55EWYAD.js +2 -0
- package/dist/chunk-P55EWYAD.js.map +1 -0
- package/dist/chunk-PPNEAFKE.cjs +5 -0
- package/dist/chunk-PPNEAFKE.cjs.map +1 -0
- package/dist/chunk-PVIYD25D.js +2 -0
- package/dist/chunk-PVIYD25D.js.map +1 -0
- package/dist/chunk-PWJMCURK.cjs +2 -0
- package/dist/chunk-PWJMCURK.cjs.map +1 -0
- package/dist/chunk-QQTZQ6UX.cjs +2 -0
- package/dist/chunk-QQTZQ6UX.cjs.map +1 -0
- package/dist/chunk-QTQ6RUX4.cjs +5 -0
- package/dist/chunk-QTQ6RUX4.cjs.map +1 -0
- package/dist/chunk-SBDFBADL.cjs +2 -0
- package/dist/chunk-SBDFBADL.cjs.map +1 -0
- package/dist/chunk-SPS3LM47.cjs +2 -0
- package/dist/chunk-SPS3LM47.cjs.map +1 -0
- package/dist/chunk-SVNS64LE.js +5 -0
- package/dist/chunk-SVNS64LE.js.map +1 -0
- package/dist/chunk-SZDKDXRV.js +17 -0
- package/dist/chunk-SZDKDXRV.js.map +1 -0
- package/dist/chunk-T7A5YOEG.cjs +2 -0
- package/dist/chunk-T7A5YOEG.cjs.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-UXHQ5OFW.js +2 -0
- package/dist/chunk-UXHQ5OFW.js.map +1 -0
- package/dist/chunk-UYJ4BAPL.cjs +2 -0
- package/dist/chunk-UYJ4BAPL.cjs.map +1 -0
- package/dist/chunk-VDHUPQDK.cjs +2 -0
- package/dist/chunk-VDHUPQDK.cjs.map +1 -0
- package/dist/chunk-VTD3TI3M.js +2 -0
- package/dist/chunk-VTD3TI3M.js.map +1 -0
- package/dist/chunk-VUMMC2P5.js +2 -0
- package/dist/chunk-VUMMC2P5.js.map +1 -0
- package/dist/chunk-VX7PSSOU.js +5 -0
- package/dist/chunk-VX7PSSOU.js.map +1 -0
- package/dist/chunk-WB7QDCEA.js +2 -0
- package/dist/{chunk-5NHDEY2C.js.map → chunk-WB7QDCEA.js.map} +1 -1
- package/dist/chunk-WLSXJU2N.js +13 -0
- package/dist/chunk-WLSXJU2N.js.map +1 -0
- package/dist/chunk-XAGYLTHV.js +2 -0
- package/dist/chunk-XAGYLTHV.js.map +1 -0
- package/dist/{chunk-AVVJKYT3.cjs → chunk-XE7JC7Y3.cjs} +2 -2
- package/dist/{chunk-AVVJKYT3.cjs.map → chunk-XE7JC7Y3.cjs.map} +1 -1
- package/dist/chunk-XMNDNTHK.cjs +5 -0
- package/dist/chunk-XMNDNTHK.cjs.map +1 -0
- package/dist/chunk-XOPRWJCX.cjs +2 -0
- package/dist/chunk-XOPRWJCX.cjs.map +1 -0
- package/dist/chunk-XPLIEN2G.cjs +13 -0
- package/dist/chunk-XPLIEN2G.cjs.map +1 -0
- package/dist/chunk-XRWOZO67.js +2 -0
- package/dist/chunk-XRWOZO67.js.map +1 -0
- package/dist/chunk-XZOP3IWH.cjs +2 -0
- package/dist/chunk-XZOP3IWH.cjs.map +1 -0
- package/dist/chunk-YG76TVFL.js +2 -0
- package/dist/chunk-YG76TVFL.js.map +1 -0
- package/dist/chunk-YQQDRDJ7.cjs +2 -0
- package/dist/chunk-YQQDRDJ7.cjs.map +1 -0
- package/dist/chunk-ZGE46DPV.cjs +2 -0
- package/dist/chunk-ZGE46DPV.cjs.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-3PHULVP4.js} +3 -3
- package/dist/{devtools-overlay-CJWKBTP4.js.map → devtools-overlay-3PHULVP4.js.map} +1 -1
- package/dist/{devtools-overlay-EQ3G755P.cjs → devtools-overlay-SJV7WNNS.cjs} +4 -4
- package/dist/{devtools-overlay-EQ3G755P.cjs.map → devtools-overlay-SJV7WNNS.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/web-component.ts"],"names":["defineCustomElement","tagName","component","options","props","shadow","styles","AkashElement","prop","attr","parseAttributeValue","name","_oldValue","newValue","styleEl","node","newProps","toCustomElement","_old","val","s","value"],"mappings":"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","file":"chunk-F4FXIPR3.js","sourcesContent":["/**\n * Web Components output.\n *\n * Compile AkashJS components to native Custom Elements that can\n * be used in any framework or plain HTML.\n *\n * ```ts\n * import { defineCustomElement } from '@akashjs/runtime';\n * import Counter from './Counter.akash';\n *\n * defineCustomElement('my-counter', Counter, {\n * props: ['initial'],\n * shadow: true,\n * });\n *\n * // Now usable as: <my-counter initial=\"5\"></my-counter>\n * ```\n */\n\nimport type { Component } from './component.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport interface CustomElementOptions {\n /** Props to observe as attributes */\n props?: string[];\n /** Use Shadow DOM (default: true) */\n shadow?: boolean;\n /** CSS styles to inject (for shadow DOM) */\n styles?: string;\n /** Extend an existing element */\n extends?: string;\n}\n\n// =========================================================================\n// defineCustomElement\n// =========================================================================\n\n/**\n * Register an AkashJS component as a Custom Element.\n *\n * ```ts\n * defineCustomElement('my-counter', Counter, {\n * props: ['initial', 'step'],\n * shadow: true,\n * styles: ':host { display: block; }',\n * });\n * ```\n */\nexport function defineCustomElement<P extends Record<string, unknown>>(\n tagName: string,\n component: Component<P>,\n options: CustomElementOptions = {},\n): typeof HTMLElement {\n const { props = [], shadow = true, styles } = options;\n\n class AkashElement extends HTMLElement {\n static get observedAttributes(): string[] {\n return props;\n }\n\n private _root: ShadowRoot | HTMLElement;\n private _mounted = false;\n private _props: Record<string, unknown> = {};\n\n constructor() {\n super();\n this._root = shadow ? this.attachShadow({ mode: 'open' }) : this;\n }\n\n connectedCallback(): void {\n // Read initial attribute values\n for (const prop of props) {\n const attr = this.getAttribute(prop);\n if (attr !== null) {\n this._props[prop] = parseAttributeValue(attr);\n }\n }\n\n this._render();\n this._mounted = true;\n }\n\n disconnectedCallback(): void {\n // Clear rendered content\n while (this._root.firstChild) {\n this._root.removeChild(this._root.firstChild);\n }\n this._mounted = false;\n }\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\n this._props[name] = newValue !== null ? parseAttributeValue(newValue) : undefined;\n if (this._mounted) {\n this._render();\n }\n }\n\n private _render(): void {\n // Clear previous\n while (this._root.firstChild) {\n this._root.removeChild(this._root.firstChild);\n }\n\n // Inject styles if shadow DOM\n if (shadow && styles) {\n const styleEl = document.createElement('style');\n styleEl.textContent = styles;\n this._root.appendChild(styleEl);\n }\n\n // Render component\n const node = component(this._props as any);\n this._root.appendChild(node);\n }\n\n // Allow programmatic prop setting\n setProps(newProps: Partial<P>): void {\n Object.assign(this._props, newProps);\n if (this._mounted) this._render();\n }\n }\n\n // Register the custom element\n if (typeof customElements !== 'undefined' && !customElements.get(tagName)) {\n if (options.extends) {\n customElements.define(tagName, AkashElement, { extends: options.extends });\n } else {\n customElements.define(tagName, AkashElement);\n }\n }\n\n return AkashElement;\n}\n\n/**\n * Convert an AkashJS component to a Custom Element class without registering.\n * Useful for testing or when you want to register later.\n */\nexport function toCustomElement<P extends Record<string, unknown>>(\n component: Component<P>,\n options: CustomElementOptions = {},\n): typeof HTMLElement {\n // Same implementation but without auto-registration\n const { props = [], shadow = true, styles } = options;\n\n return class extends HTMLElement {\n static get observedAttributes() { return props; }\n\n private _root: ShadowRoot | HTMLElement;\n private _mounted = false;\n private _props: Record<string, unknown> = {};\n\n constructor() {\n super();\n this._root = shadow ? this.attachShadow({ mode: 'open' }) : this;\n }\n\n connectedCallback() {\n for (const prop of props) {\n const attr = this.getAttribute(prop);\n if (attr !== null) this._props[prop] = parseAttributeValue(attr);\n }\n this._render();\n this._mounted = true;\n }\n\n disconnectedCallback() {\n while (this._root.firstChild) this._root.removeChild(this._root.firstChild);\n this._mounted = false;\n }\n\n attributeChangedCallback(name: string, _old: string | null, val: string | null) {\n this._props[name] = val !== null ? parseAttributeValue(val) : undefined;\n if (this._mounted) this._render();\n }\n\n private _render() {\n while (this._root.firstChild) this._root.removeChild(this._root.firstChild);\n if (shadow && styles) {\n const s = document.createElement('style');\n s.textContent = styles;\n this._root.appendChild(s);\n }\n this._root.appendChild(component(this._props as any));\n }\n } as any;\n}\n\n// =========================================================================\n// Helpers\n// =========================================================================\n\nfunction parseAttributeValue(value: string): unknown {\n // Try to parse as JSON (numbers, booleans, objects)\n try {\n return JSON.parse(value);\n } catch {\n return value; // Keep as string\n }\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {e,c}from'./chunk-2UATNCKC.js';function v(i){return i}function E(...i){let d={},e$1=[];for(let n of i)typeof n=="function"?e$1.push(n):typeof n=="object"&&n!==null&&(d=n);let{label:l="inspect",level:m="log",logger:c,when:u}=d,s={dispose:null,get values(){return e$1.map(n=>n())},get value(){return e$1.length===1?e$1[0]():e$1.map(n=>n())},label:l,sources:e$1.length};return s.dispose=e(()=>{if(u&&!u())return;let n=e$1.map(r=>r());c?c(l,...n):console[m](`[${l}]`,...n);}),s}function b(i,d={}){let{method:e="POST",headers:l={},onSuccess:m,onError:c$1,fetch:u=globalThis.fetch.bind(globalThis)}=d,s=c(false),n=c(null),r=c(null);async function f(a){s.set(true),r.set(null);try{let o=await u(i,{method:e,headers:{"Content-Type":"application/json",...l},body:JSON.stringify(a)});if(!o.ok)throw new Error(`Form action failed: ${o.status}`);let t=await o.json();return n.set(t),s.set(!1),m?.(t),t}catch(o){let t=o instanceof Error?o:new Error(String(o));throw r.set(t),s.set(false),c$1?.(t),t}}return {url:i,method:e,submitting:()=>s(),result:()=>n(),error:()=>r(),handle(a){return o=>{o.preventDefault();let t=o.target,p=new FormData(t),h={...a};p.forEach((T,y)=>{h[y]=T;}),f(h);}},submit:f}}function k(i={}){if(typeof window>"u")return ()=>{};let{keyPrefix:d="akash-snapshot",capture:e=["scroll","forms"]}=i;function l(){let n={scrollX:window.scrollX,scrollY:window.scrollY,forms:{},timestamp:Date.now()};return e.includes("forms")&&document.querySelectorAll("form[id]").forEach(r=>{let f=r,a={};new FormData(f).forEach((o,t)=>{a[t]=String(o);}),n.forms[f.id]=a;}),n}function m(n){if(e.includes("scroll")&&requestAnimationFrame(()=>{window.scrollTo(n.scrollX,n.scrollY);}),e.includes("forms"))for(let[r,f]of Object.entries(n.forms)){let a=document.getElementById(r);if(a)for(let[o,t]of Object.entries(f)){let p=a.elements.namedItem(o);p&&(p.value=t);}}}let c=()=>`${d}-${window.location.pathname}`;function u(){try{let n=l();sessionStorage.setItem(c(),JSON.stringify(n));}catch{}}function s(){try{let n=sessionStorage.getItem(c());if(n){let r=JSON.parse(n);Date.now()-r.timestamp<1800*1e3&&m(r);}}catch{}}return window.addEventListener("beforeunload",u),window.addEventListener("popstate",()=>{requestAnimationFrame(s);}),performance.getEntriesByType("navigation")[0]?.type==="back_forward"&&requestAnimationFrame(s),()=>{window.removeEventListener("beforeunload",u);}}export{v as a,E as b,b as c,k as d};//# sourceMappingURL=chunk-GAAO2KXN.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-GAAO2KXN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/snippets.ts"],"names":["defineSnippet","render","inspect","args","options","sources","arg","label","level","logger","when","result","s","effect","values","defineFormAction","url","method","headers","onSuccess","onError","customFetch","submitting","signal","error","submit","data","response","res","err","e","extraData","form","formData","value","key","enableSnapshots","config","keyPrefix","capture","captureSnapshot","snapshot","formEl","restoreSnapshot","formId","input","saveKey","save","restore","raw"],"mappings":"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","file":"chunk-GAAO2KXN.js","sourcesContent":["/**\n * Snippets, $inspect, form actions, and navigation snapshots.\n */\n\nimport { signal, effect } from './signals.js';\nimport type { AkashNode } from './types.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// =========================================================================\n// Snippets — reusable template fragments\n// =========================================================================\n\nexport type Snippet<TArgs extends unknown[] = []> = (...args: TArgs) => AkashNode;\n\n/**\n * Define a reusable template snippet.\n *\n * ```ts\n * const UserBadge = defineSnippet((name: string, role: string) => {\n * const el = document.createElement('span');\n * el.textContent = `${name} (${role})`;\n * el.className = 'badge';\n * return el;\n * });\n *\n * // Reuse anywhere:\n * container.appendChild(nodeToDOM(UserBadge('Alice', 'admin')));\n * container.appendChild(nodeToDOM(UserBadge('Bob', 'user')));\n * ```\n */\nexport function defineSnippet<TArgs extends unknown[]>(\n render: (...args: TArgs) => AkashNode,\n): Snippet<TArgs> {\n return render;\n}\n\n// =========================================================================\n// $inspect — debug reactive values\n// =========================================================================\n\nexport interface InspectOptions {\n /** Label prefix for console output */\n label?: string;\n /** Log level (default: 'log') */\n level?: 'log' | 'warn' | 'debug' | 'trace';\n /** Custom logger */\n logger?: (label: string, ...values: unknown[]) => void;\n /** Only log when a condition is true */\n when?: () => boolean;\n}\n\n/**\n * Debug helper — logs when reactive values change.\n *\n * ```ts\n * const count = signal(0);\n * const name = signal('Alice');\n *\n * inspect(count, name); // logs: [inspect] 0, 'Alice'\n * count.set(1); // logs: [inspect] 1, 'Alice'\n *\n * // With label:\n * inspect(count, { label: 'counter' });\n * // logs: [counter] 1\n * ```\n */\nexport function inspect(\n ...args: Array<(() => unknown) | InspectOptions>\n): () => void {\n let options: InspectOptions = {};\n const sources: Array<() => unknown> = [];\n\n for (const arg of args) {\n if (typeof arg === 'function') {\n sources.push(arg);\n } else if (typeof arg === 'object' && arg !== null) {\n options = arg as InspectOptions;\n }\n }\n\n const {\n label = 'inspect',\n level = 'log',\n logger,\n when,\n } = options;\n\n const result = {\n dispose: null as unknown as () => void,\n get values() { return sources.map(s => s()); },\n get value() { return sources.length === 1 ? sources[0]() : sources.map(s => s()); },\n label,\n sources: sources.length,\n };\n\n result.dispose = effect(() => {\n if (when && !when()) return;\n\n const values = sources.map((s) => s());\n\n if (logger) {\n logger(label, ...values);\n } else {\n (console as any)[level](`[${label}]`, ...values);\n }\n });\n\n return result as any;\n}\n\n// =========================================================================\n// Form actions — server-side form handling\n// =========================================================================\n\nexport interface FormAction<T = unknown> {\n /** The action URL */\n url: string;\n /** Submit method */\n method: 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n /** Whether a submission is in progress */\n submitting: ReadonlySignal<boolean>;\n /** The last result */\n result: ReadonlySignal<T | null>;\n /** The last error */\n error: ReadonlySignal<Error | null>;\n /** Create an onSubmit handler for a <form> */\n handle(formData?: Record<string, unknown>): (e: Event) => void;\n /** Submit programmatically */\n submit(data: Record<string, unknown>): Promise<T>;\n}\n\n/**\n * Define a server-side form action with progressive enhancement.\n *\n * ```ts\n * const createPost = defineFormAction<Post>('/api/posts', {\n * method: 'POST',\n * onSuccess: (post) => navigate(`/posts/${post.id}`),\n * onError: (err) => toast.error(err.message),\n * });\n *\n * // In template:\n * <form onSubmit={createPost.handle()}>\n * <input name=\"title\" />\n * <button disabled={createPost.submitting()}>Create</button>\n * </form>\n * ```\n */\nexport function defineFormAction<T = unknown>(\n url: string,\n options: {\n method?: 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n headers?: Record<string, string>;\n onSuccess?: (result: T) => void;\n onError?: (error: Error) => void;\n fetch?: typeof globalThis.fetch;\n } = {},\n): FormAction<T> {\n const {\n method = 'POST',\n headers = {},\n onSuccess,\n onError,\n fetch: customFetch = globalThis.fetch.bind(globalThis),\n } = options;\n\n const submitting = signal(false);\n const result = signal<T | null>(null);\n const error = signal<Error | null>(null);\n\n async function submit(data: Record<string, unknown>): Promise<T> {\n submitting.set(true);\n error.set(null);\n\n try {\n const response = await customFetch(url, {\n method,\n headers: { 'Content-Type': 'application/json', ...headers },\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n throw new Error(`Form action failed: ${response.status}`);\n }\n\n const res = await response.json() as T;\n result.set(res);\n submitting.set(false);\n onSuccess?.(res);\n return res;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n error.set(e);\n submitting.set(false);\n onError?.(e);\n throw e;\n }\n }\n\n return {\n url,\n method,\n submitting: () => submitting(),\n result: () => result(),\n error: () => error(),\n handle(extraData?: Record<string, unknown>) {\n return (e: Event) => {\n e.preventDefault();\n const form = e.target as HTMLFormElement;\n const formData = new FormData(form);\n const data: Record<string, unknown> = { ...extraData };\n formData.forEach((value, key) => { data[key] = value; });\n submit(data);\n };\n },\n submit,\n };\n}\n\n// =========================================================================\n// Navigation snapshots — preserve scroll & form state\n// =========================================================================\n\nexport interface SnapshotConfig {\n /** Storage key prefix (default: 'akash-snapshot') */\n keyPrefix?: string;\n /** What to capture */\n capture?: ('scroll' | 'forms')[];\n}\n\ninterface PageSnapshot {\n scrollX: number;\n scrollY: number;\n forms: Record<string, Record<string, string>>;\n timestamp: number;\n}\n\n/**\n * Enable navigation snapshots — preserves scroll position and form\n * state when navigating with back/forward.\n *\n * ```ts\n * enableSnapshots();\n * // Now back/forward restores scroll position and form inputs\n * ```\n */\nexport function enableSnapshots(config: SnapshotConfig = {}): () => void {\n if (typeof window === 'undefined') return () => {};\n\n const { keyPrefix = 'akash-snapshot', capture = ['scroll', 'forms'] } = config;\n\n function captureSnapshot(): PageSnapshot {\n const snapshot: PageSnapshot = {\n scrollX: window.scrollX,\n scrollY: window.scrollY,\n forms: {},\n timestamp: Date.now(),\n };\n\n if (capture.includes('forms')) {\n document.querySelectorAll('form[id]').forEach((form) => {\n const formEl = form as HTMLFormElement;\n const data: Record<string, string> = {};\n new FormData(formEl).forEach((value, key) => {\n data[key] = String(value);\n });\n snapshot.forms[formEl.id] = data;\n });\n }\n\n return snapshot;\n }\n\n function restoreSnapshot(snapshot: PageSnapshot): void {\n if (capture.includes('scroll')) {\n requestAnimationFrame(() => {\n window.scrollTo(snapshot.scrollX, snapshot.scrollY);\n });\n }\n\n if (capture.includes('forms')) {\n for (const [formId, data] of Object.entries(snapshot.forms)) {\n const form = document.getElementById(formId) as HTMLFormElement | null;\n if (!form) continue;\n for (const [key, value] of Object.entries(data)) {\n const input = form.elements.namedItem(key) as HTMLInputElement | null;\n if (input) input.value = value;\n }\n }\n }\n }\n\n // Save snapshot before navigation\n const saveKey = () => `${keyPrefix}-${window.location.pathname}`;\n\n function save(): void {\n try {\n const snapshot = captureSnapshot();\n sessionStorage.setItem(saveKey(), JSON.stringify(snapshot));\n } catch { /* storage full */ }\n }\n\n function restore(): void {\n try {\n const raw = sessionStorage.getItem(saveKey());\n if (raw) {\n const snapshot = JSON.parse(raw) as PageSnapshot;\n // Only restore if recent (within 30 minutes)\n if (Date.now() - snapshot.timestamp < 30 * 60 * 1000) {\n restoreSnapshot(snapshot);\n }\n }\n } catch { /* */ }\n }\n\n // Listen for navigation\n window.addEventListener('beforeunload', save);\n window.addEventListener('popstate', () => {\n requestAnimationFrame(restore);\n });\n\n // Restore on initial load if coming from back/forward\n if ((performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming | undefined)?.type === 'back_forward') {\n requestAnimationFrame(restore);\n }\n\n return () => {\n window.removeEventListener('beforeunload', save);\n };\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {c,a}from'./chunk-2UATNCKC.js';function Q(e){return Array.isArray(e)?e.join(","):typeof e=="boolean"?e?"true":"false":String(e)}function b(e,t){return typeof t=="number"?Number(e):typeof t=="boolean"?e==="true"||e==="1":Array.isArray(t)?e?e.split(","):[]:e}function u(){return typeof window>"u"?new URLSearchParams:new URLSearchParams(window.location.search)}function x(e,t){if(typeof window>"u")return;let n=e.toString(),r=n?`${window.location.pathname}?${n}${window.location.hash}`:`${window.location.pathname}${window.location.hash}`;t==="push"?window.history.pushState(null,"",r):window.history.replaceState(null,"",r);}var s=new Map,h=false;function R(){h||typeof window>"u"||(h=true,window.addEventListener("popstate",()=>{let e=u();a(()=>{for(let[t,n]of s){let r=e.get(t),a=r!==null?n.deserialize(r):n.defaultValue;n.signal.set(a);}});}));}function v(e,t,n={}){let{serialize:r=i=>Q(i),deserialize:a=i=>b(i,t),history:w="replace",debounce:d=0,removeDefault:m=true}=n,p=u().get(e),S=p!==null?a(p):t,o=c(S);s.set(e,{signal:o,deserialize:a,defaultValue:t}),R();let l=null,T=false,z=o.set;o.set=i=>{if(z(i),T);let y=()=>{let c=u();m&&i===t?c.delete(e):c.set(e,r(i)),x(c,w);};d>0?(l&&clearTimeout(l),l=setTimeout(y,d)):y();};o.update;return o.update=i=>{o.set(i(o()));},o}function j(e,t){let n={};for(let[r,a]of Object.entries(e))n[r]=v(r,a.default,{serialize:a.serialize,deserialize:a.deserialize,history:t?.history});return n}function D(){if(typeof window>"u")return;let e=`${window.location.pathname}${window.location.hash}`;window.history.replaceState(null,"",e),a(()=>{for(let[,t]of s)t.signal.set(t.defaultValue);});}function M(){let e=u(),t={};return e.forEach((n,r)=>{t[r]=n;}),t}function O(e){s.delete(e);}function k(){s.clear();}export{v as a,j as b,D as c,M as d,O as e,k as f};//# sourceMappingURL=chunk-GB7IUC6E.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-GB7IUC6E.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/query-state.ts"],"names":["defaultSerialize","value","defaultDeserialize","raw","defaultValue","getSearchParams","updateURL","params","mode","search","url","activeStates","popstateListening","ensurePopstateListener","batch","key","state","useQueryState","options","serialize","v","deserialize","historyMode","debounceMs","removeDefault","initialValue","signal","debounceTimer","isInternalUpdate","originalSet","doUpdate","currentParams","fn","useQueryStates","schema","result","config","clearQueryState","getQueryParams","removeQueryState","resetQueryState"],"mappings":"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","file":"chunk-GB7IUC6E.js","sourcesContent":["/**\n * URL-synced reactive state.\n *\n * Automatically sync signal values to URL query parameters.\n * Users can share links, use browser back/forward, and state\n * persists across page reloads — all with zero boilerplate.\n *\n * ```ts\n * const search = useQueryState('q', '');\n * const page = useQueryState('page', 1);\n * const tags = useQueryState('tags', ['js']);\n *\n * search.set('akashjs'); // URL → ?q=akashjs&page=1&tags=js\n * // User hits back → signals update automatically\n * ```\n */\n\nimport { signal, effect } from './signals.js';\nimport { batch } from './scheduler.js';\nimport type { Signal } from './signals.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport interface QueryStateOptions<T> {\n /** Custom serializer (default: auto-detect from type) */\n serialize?: (value: T) => string;\n /** Custom deserializer (default: auto-detect from type) */\n deserialize?: (raw: string) => T;\n /** Whether to push or replace history entry (default: 'replace') */\n history?: 'push' | 'replace';\n /** Debounce URL updates in ms (default: 0) */\n debounce?: number;\n /** Remove param from URL when value equals default */\n removeDefault?: boolean;\n}\n\n// =========================================================================\n// Serializers\n// =========================================================================\n\nfunction defaultSerialize(value: unknown): string {\n if (Array.isArray(value)) return value.join(',');\n if (typeof value === 'boolean') return value ? 'true' : 'false';\n return String(value);\n}\n\nfunction defaultDeserialize<T>(raw: string, defaultValue: T): T {\n if (typeof defaultValue === 'number') return Number(raw) as T;\n if (typeof defaultValue === 'boolean') return (raw === 'true' || raw === '1') as T;\n if (Array.isArray(defaultValue)) {\n return (raw ? raw.split(',') : []) as T;\n }\n return raw as T;\n}\n\n// =========================================================================\n// URL helpers\n// =========================================================================\n\nfunction getSearchParams(): URLSearchParams {\n if (typeof window === 'undefined') return new URLSearchParams();\n return new URLSearchParams(window.location.search);\n}\n\nfunction updateURL(params: URLSearchParams, mode: 'push' | 'replace'): void {\n if (typeof window === 'undefined') return;\n\n const search = params.toString();\n const url = search ? `${window.location.pathname}?${search}${window.location.hash}` : `${window.location.pathname}${window.location.hash}`;\n\n if (mode === 'push') {\n window.history.pushState(null, '', url);\n } else {\n window.history.replaceState(null, '', url);\n }\n}\n\n// =========================================================================\n// useQueryState — single value\n// =========================================================================\n\n/** Track active query state signals for popstate sync */\nconst activeStates = new Map<string, { signal: Signal<any>; deserialize: (raw: string) => any; defaultValue: any }>();\nlet popstateListening = false;\n\nfunction ensurePopstateListener(): void {\n if (popstateListening || typeof window === 'undefined') return;\n popstateListening = true;\n\n window.addEventListener('popstate', () => {\n const params = getSearchParams();\n batch(() => {\n for (const [key, state] of activeStates) {\n const raw = params.get(key);\n const value = raw !== null\n ? state.deserialize(raw)\n : state.defaultValue;\n state.signal.set(value);\n }\n });\n });\n}\n\n/**\n * Create a signal synced to a URL query parameter.\n *\n * ```ts\n * const search = useQueryState('q', '');\n * search(); // reads from URL or default\n * search.set('hello'); // updates URL to ?q=hello\n * ```\n */\nexport function useQueryState<T>(\n key: string,\n defaultValue: T,\n options: QueryStateOptions<T> = {},\n): Signal<T> {\n const {\n serialize = (v: T) => defaultSerialize(v),\n deserialize = (raw: string) => defaultDeserialize(raw, defaultValue),\n history: historyMode = 'replace',\n debounce: debounceMs = 0,\n removeDefault = true,\n } = options;\n\n // Read initial value from URL\n const params = getSearchParams();\n const raw = params.get(key);\n const initialValue = raw !== null ? deserialize(raw) : defaultValue;\n\n const state = signal<T>(initialValue);\n\n // Register for popstate sync\n activeStates.set(key, { signal: state, deserialize, defaultValue });\n ensurePopstateListener();\n\n // Sync signal → URL\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n let isInternalUpdate = false;\n\n const originalSet = state.set;\n state.set = (value: T) => {\n originalSet(value);\n\n if (isInternalUpdate) return;\n\n const doUpdate = () => {\n const currentParams = getSearchParams();\n\n if (removeDefault && value === defaultValue) {\n currentParams.delete(key);\n } else {\n currentParams.set(key, serialize(value));\n }\n\n updateURL(currentParams, historyMode);\n };\n\n if (debounceMs > 0) {\n if (debounceTimer) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(doUpdate, debounceMs);\n } else {\n doUpdate();\n }\n };\n\n const originalUpdate = state.update;\n state.update = (fn: (prev: T) => T) => {\n state.set(fn(state()));\n };\n\n return state;\n}\n\n// =========================================================================\n// useQueryStates — multiple values at once\n// =========================================================================\n\ntype QueryStateSchema = Record<string, {\n default: unknown;\n serialize?: (value: any) => string;\n deserialize?: (raw: string) => any;\n}>;\n\ntype QueryStates<T extends QueryStateSchema> = {\n [K in keyof T]: Signal<T[K]['default']>;\n};\n\n/**\n * Create multiple URL-synced signals at once.\n * All updates within a batch result in a single URL change.\n *\n * ```ts\n * const { q, page, sort } = useQueryStates({\n * q: { default: '' },\n * page: { default: 1 },\n * sort: { default: 'name' },\n * });\n * ```\n */\nexport function useQueryStates<T extends QueryStateSchema>(\n schema: T,\n options?: { history?: 'push' | 'replace' },\n): QueryStates<T> {\n const result = {} as any;\n for (const [key, config] of Object.entries(schema)) {\n result[key] = useQueryState(key, config.default, {\n serialize: config.serialize,\n deserialize: config.deserialize,\n history: options?.history,\n });\n }\n return result;\n}\n\n// =========================================================================\n// Utilities\n// =========================================================================\n\n/**\n * Remove all query state params from the URL.\n */\nexport function clearQueryState(): void {\n if (typeof window === 'undefined') return;\n const url = `${window.location.pathname}${window.location.hash}`;\n window.history.replaceState(null, '', url);\n\n batch(() => {\n for (const [, state] of activeStates) {\n state.signal.set(state.defaultValue);\n }\n });\n}\n\n/**\n * Get all current query params as a plain object.\n */\nexport function getQueryParams(): Record<string, string> {\n const params = getSearchParams();\n const result: Record<string, string> = {};\n params.forEach((value, key) => { result[key] = value; });\n return result;\n}\n\n/**\n * Cleanup: remove a specific query state binding.\n */\nexport function removeQueryState(key: string): void {\n activeStates.delete(key);\n}\n\n/**\n * Cleanup all query state bindings (useful for testing).\n */\nexport function resetQueryState(): void {\n activeStates.clear();\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import {c as c$1}from'./chunk-SVNS64LE.js';function o(t){let r=Array.isArray(t)?t:[t];for(let e of r){let n={"@context":"https://schema.org",...e};c$1({script:[{type:"application/ld+json",innerHTML:JSON.stringify(n)}]});}}function s(t){let r=[{property:"og:title",content:t.title}];t.description&&r.push({property:"og:description",content:t.description}),t.image&&r.push({property:"og:image",content:t.image}),t.url&&r.push({property:"og:url",content:t.url}),t.type&&r.push({property:"og:type",content:t.type}),t.siteName&&r.push({property:"og:site_name",content:t.siteName}),t.locale&&r.push({property:"og:locale",content:t.locale}),c$1({meta:r});}function p(t){let r=[{name:"twitter:title",content:t.title}];t.card&&r.push({name:"twitter:card",content:t.card}),t.description&&r.push({name:"twitter:description",content:t.description}),t.image&&r.push({name:"twitter:image",content:t.image}),t.site&&r.push({name:"twitter:site",content:t.site}),t.creator&&r.push({name:"twitter:creator",content:t.creator}),c$1({meta:r});}function c(t){let r=[];t.description&&r.push({name:"description",content:t.description}),t.robots&&r.push({name:"robots",content:t.robots});let e=[];t.canonical&&e.push({rel:"canonical",href:t.canonical}),c$1({title:t.title,meta:r,link:e}),t.openGraph&&s(t.openGraph),t.twitter&&p(t.twitter),t.structuredData&&o(t.structuredData);}function u(t,r){let e=`<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
`;e+=`<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
|
3
|
+
`;for(let n of r)e+=` <url>
|
|
4
|
+
`,e+=` <loc>${t}${n.url}</loc>
|
|
5
|
+
`,n.lastmod&&(e+=` <lastmod>${n.lastmod}</lastmod>
|
|
6
|
+
`),n.changefreq&&(e+=` <changefreq>${n.changefreq}</changefreq>
|
|
7
|
+
`),n.priority!=null&&(e+=` <priority>${n.priority}</priority>
|
|
8
|
+
`),e+=` </url>
|
|
9
|
+
`;return e+=`</urlset>
|
|
10
|
+
`,e}export{o as a,s as b,p as c,c as d,u as e};//# sourceMappingURL=chunk-GHSJ4B55.js.map
|
|
11
|
+
//# sourceMappingURL=chunk-GHSJ4B55.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/seo.ts"],"names":["useStructuredData","data","items","item","ld","useHead","useOpenGraph","meta","useTwitterCard","useSEO","config","link","generateSitemap","baseUrl","entries","xml","entry"],"mappings":"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","file":"chunk-GHSJ4B55.js","sourcesContent":["/**\n * SEO utilities.\n *\n * Structured data (JSON-LD), Open Graph helpers, and canonical URL management.\n * Works with useHead() for SSR-compatible head tag management.\n *\n * ```ts\n * useStructuredData({\n * '@type': 'Article',\n * headline: 'My Post',\n * author: { '@type': 'Person', name: 'Alice' },\n * });\n * ```\n */\n\nimport { useHead } from './head.js';\n\n// --- Types ---\n\nexport interface StructuredData {\n '@context'?: string;\n '@type': string;\n [key: string]: unknown;\n}\n\nexport interface OpenGraphData {\n title: string;\n description?: string;\n image?: string;\n url?: string;\n type?: string;\n siteName?: string;\n locale?: string;\n}\n\nexport interface TwitterCardData {\n card?: 'summary' | 'summary_large_image' | 'player' | 'app';\n title: string;\n description?: string;\n image?: string;\n site?: string;\n creator?: string;\n}\n\nexport interface SEOConfig {\n title: string;\n description?: string;\n canonical?: string;\n robots?: string;\n openGraph?: OpenGraphData;\n twitter?: TwitterCardData;\n structuredData?: StructuredData | StructuredData[];\n}\n\n// --- useStructuredData ---\n\n/**\n * Inject JSON-LD structured data into the document head.\n * Data is automatically wrapped with @context.\n *\n * ```ts\n * useStructuredData({\n * '@type': 'WebSite',\n * name: 'AkashJS',\n * url: 'https://akashjs.dev',\n * });\n * ```\n */\nexport function useStructuredData(data: StructuredData | StructuredData[]): void {\n const items = Array.isArray(data) ? data : [data];\n\n for (const item of items) {\n const ld = { '@context': 'https://schema.org', ...item };\n useHead({\n script: [\n { type: 'application/ld+json', innerHTML: JSON.stringify(ld) },\n ],\n });\n }\n}\n\n// --- useOpenGraph ---\n\n/**\n * Set Open Graph meta tags.\n *\n * ```ts\n * useOpenGraph({\n * title: 'My Page',\n * description: 'Page description',\n * image: '/og-image.jpg',\n * type: 'article',\n * });\n * ```\n */\nexport function useOpenGraph(data: OpenGraphData): void {\n const meta: Array<{ property: string; content: string }> = [\n { property: 'og:title', content: data.title },\n ];\n\n if (data.description) meta.push({ property: 'og:description', content: data.description });\n if (data.image) meta.push({ property: 'og:image', content: data.image });\n if (data.url) meta.push({ property: 'og:url', content: data.url });\n if (data.type) meta.push({ property: 'og:type', content: data.type });\n if (data.siteName) meta.push({ property: 'og:site_name', content: data.siteName });\n if (data.locale) meta.push({ property: 'og:locale', content: data.locale });\n\n useHead({ meta });\n}\n\n// --- useTwitterCard ---\n\n/**\n * Set Twitter Card meta tags.\n *\n * ```ts\n * useTwitterCard({\n * card: 'summary_large_image',\n * title: 'My Page',\n * image: '/twitter-card.jpg',\n * });\n * ```\n */\nexport function useTwitterCard(data: TwitterCardData): void {\n const meta: Array<{ name: string; content: string }> = [\n { name: 'twitter:title', content: data.title },\n ];\n\n if (data.card) meta.push({ name: 'twitter:card', content: data.card });\n if (data.description) meta.push({ name: 'twitter:description', content: data.description });\n if (data.image) meta.push({ name: 'twitter:image', content: data.image });\n if (data.site) meta.push({ name: 'twitter:site', content: data.site });\n if (data.creator) meta.push({ name: 'twitter:creator', content: data.creator });\n\n useHead({ meta });\n}\n\n// --- useSEO (all-in-one) ---\n\n/**\n * Set all SEO-related head tags at once.\n *\n * ```ts\n * useSEO({\n * title: 'My Page | MySite',\n * description: 'Page description',\n * canonical: 'https://mysite.com/page',\n * openGraph: { title: 'My Page', image: '/og.jpg' },\n * twitter: { card: 'summary_large_image', title: 'My Page' },\n * structuredData: { '@type': 'WebPage', name: 'My Page' },\n * });\n * ```\n */\nexport function useSEO(config: SEOConfig): void {\n const meta: Array<{ name?: string; property?: string; content: string }> = [];\n\n if (config.description) {\n meta.push({ name: 'description', content: config.description });\n }\n if (config.robots) {\n meta.push({ name: 'robots', content: config.robots });\n }\n\n const link: Array<{ rel: string; href: string }> = [];\n if (config.canonical) {\n link.push({ rel: 'canonical', href: config.canonical });\n }\n\n useHead({ title: config.title, meta, link });\n\n if (config.openGraph) useOpenGraph(config.openGraph);\n if (config.twitter) useTwitterCard(config.twitter);\n if (config.structuredData) useStructuredData(config.structuredData);\n}\n\n// --- Sitemap generation (for CLI/build) ---\n\nexport interface SitemapEntry {\n url: string;\n lastmod?: string;\n changefreq?: 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never';\n priority?: number;\n}\n\n/**\n * Generate a sitemap.xml string from route entries.\n *\n * ```ts\n * const xml = generateSitemap('https://mysite.com', [\n * { url: '/', priority: 1.0 },\n * { url: '/about', changefreq: 'monthly' },\n * { url: '/blog/hello', lastmod: '2026-03-29' },\n * ]);\n * ```\n */\nexport function generateSitemap(baseUrl: string, entries: SitemapEntry[]): string {\n let xml = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n';\n xml += '<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\\n';\n\n for (const entry of entries) {\n xml += ' <url>\\n';\n xml += ` <loc>${baseUrl}${entry.url}</loc>\\n`;\n if (entry.lastmod) xml += ` <lastmod>${entry.lastmod}</lastmod>\\n`;\n if (entry.changefreq) xml += ` <changefreq>${entry.changefreq}</changefreq>\\n`;\n if (entry.priority != null) xml += ` <priority>${entry.priority}</priority>\\n`;\n xml += ' </url>\\n';\n }\n\n xml += '</urlset>\\n';\n return xml;\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {c}from'./chunk-2UATNCKC.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-GRXHWCFR.js.map
|
|
36
|
+
//# sourceMappingURL=chunk-GRXHWCFR.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-GRXHWCFR.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
|
+
'use strict';var chunkXE7JC7Y3_cjs=require('./chunk-XE7JC7Y3.cjs');var p=new Map,d=new Map,m=0,b=0;function y(e,n,t){p.set(e||`signal_${m++}`,{name:e,read:n,get subscriberCount(){return t()}});}function k(e,n){let t=e||`effect_${b++}`,o={name:t,runCount:0,isRender:n.isRender,sourceCount:0};return d.set(t,o),()=>{o.runCount++,o.sourceCount=n.getSourceCount();}}function c(e){let t=chunkXE7JC7Y3_cjs.d()[e];if(!t)return null;let o=t.$snapshot(),s=t.$__meta,a={},l=[];if(s){for(let r of s.getterKeys)try{a[r]=t[r]();}catch{a[r]="<error>";}l.push(...s.actionKeys);}else for(let[r,f]of Object.entries(t))r.startsWith("$")||r in o||typeof f=="function"&&l.push(r);return {$id:e,state:o,getters:a,actions:l,subscriberCount:0}}var u=new Map,g=new Map;function S(){return {stores(){return Object.keys(chunkXE7JC7Y3_cjs.d())},store(e){return c(e)},storeSnapshots(){let e={};for(let n of Object.keys(chunkXE7JC7Y3_cjs.d())){let t=c(n);t&&(e[n]=t);}return e},signals(){return [...p.values()].map(e=>({name:e.name,value:e.read(),subscribers:e.subscriberCount}))},effects(){return [...d.values()].map(e=>({name:e.name,runs:e.runCount,isRender:e.isRender,sources:e.sourceCount}))},version(){return {runtime:"0.2.8"}},log(e){if(e){let n=c(e);n?(console.group(`\u{1F50D} Store: ${e}`),console.log("State:",n.state),console.log("Getters:",n.getters),console.log("Actions:",n.actions),console.groupEnd()):console.warn(`Store "${e}" not found. Available:`,Object.keys(chunkXE7JC7Y3_cjs.d()));}else {let n=Object.keys(chunkXE7JC7Y3_cjs.d());console.group("\u{1F50D} AkashJS Stores");for(let t of n){let o=c(t);o&&(console.group(t),console.log("State:",o.state),console.log("Getters:",o.getters),console.groupEnd());}console.groupEnd();}},startRecording(e){let n=chunkXE7JC7Y3_cjs.d()[e];if(!n){console.warn(`Store "${e}" not found.`);return}let t=[];t.push({timestamp:Date.now(),state:n.$snapshot()});let o=n.$subscribe(s=>{t.push({timestamp:Date.now(),state:{...s}});});u.set(e,t),g.set(e,o),console.log(`\u23FA Recording store "${e}". Call __AKASH_DEVTOOLS__.stopRecording("${e}") to view history.`);},stopRecording(e){let n=g.get(e);n&&n(),g.delete(e);let t=u.get(e)??[];return u.delete(e),console.log(`\u23F9 Stopped recording "${e}". ${t.length} snapshots captured.`),console.table(t.map((o,s)=>({"#":s,time:new Date(o.timestamp).toISOString().slice(11,23),state:JSON.stringify(o.state)}))),t}}}function h(e){let n=S();typeof globalThis<"u"&&(globalThis.__AKASH_DEVTOOLS__=n,console.log("%c\u{1F527} AkashJS DevTools installed. Access via __AKASH_DEVTOOLS__ in console.","color: #7c3aed; font-weight: bold;"),console.log(" .stores() \u2014 list stores"),console.log(' .store("id") \u2014 inspect store'),console.log(" .log() \u2014 pretty-print all stores"),console.log(' .log("id") \u2014 pretty-print one store'),console.log(' .startRecording("id") \u2014 record state changes'),console.log(' .stopRecording("id") \u2014 view recorded history'),console.log(" .signals() \u2014 list tracked signals"),console.log(" .effects() \u2014 list tracked effects")),e?.overlay&&import('./devtools-overlay-SJV7WNNS.cjs').then(t=>t.mountDevtoolsOverlay());}exports.a=y;exports.b=k;exports.c=h;//# sourceMappingURL=chunk-HHPRQMGX.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-HHPRQMGX.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/devtools.ts"],"names":["trackedSignals","trackedEffects","signalCounter","effectCounter","__trackSignal","name","read","getSubscriberCount","__trackEffect","meta","id","entry","inspectStore","store","__getStoreInstances","snapshot","getters","actions","key","value","recordings","recordingDisposers","createDevToolsAPI","result","snap","s","storeId","stores","history","unsubscribe","state","disposer","h","i","installDevtools","options","api","m"],"mappings":"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","file":"chunk-HHPRQMGX.cjs","sourcesContent":["/**\n * AkashJS DevTools — Console-based debugging utilities.\n *\n * Call `installDevtools()` in development to expose `__AKASH_DEVTOOLS__`\n * on the global object. Access it from the browser console:\n *\n * ```js\n * __AKASH_DEVTOOLS__.stores() // list all stores\n * __AKASH_DEVTOOLS__.store('cart') // inspect a store\n * __AKASH_DEVTOOLS__.signals() // list tracked signals\n * __AKASH_DEVTOOLS__.effects() // list active effects\n * ```\n */\n\nimport { __getStoreInstances } from './store.js';\n\ndeclare const __RUNTIME_VERSION__: string;\nimport type { Store } from './store.js';\n\n// --- Signal/Effect tracking ---\n\ninterface TrackedSignal {\n name: string;\n read: () => unknown;\n subscriberCount: number;\n}\n\ninterface TrackedEffect {\n name: string;\n runCount: number;\n isRender: boolean;\n sourceCount: number;\n}\n\nconst trackedSignals = new Map<string, TrackedSignal>();\nconst trackedEffects = new Map<string, TrackedEffect>();\nlet signalCounter = 0;\nlet effectCounter = 0;\n\n/** Register a signal for devtools tracking (call in dev mode) */\nexport function __trackSignal(name: string, read: () => unknown, getSubscriberCount: () => number): void {\n trackedSignals.set(name || `signal_${signalCounter++}`, {\n name,\n read,\n get subscriberCount() { return getSubscriberCount(); },\n } as TrackedSignal);\n}\n\n/** Register an effect for devtools tracking */\nexport function __trackEffect(name: string, meta: { isRender: boolean; getSourceCount: () => number }): () => void {\n const id = name || `effect_${effectCounter++}`;\n const entry: TrackedEffect = {\n name: id,\n runCount: 0,\n isRender: meta.isRender,\n sourceCount: 0,\n };\n trackedEffects.set(id, entry);\n\n // Return a function to increment run count (called each time effect runs)\n return () => {\n entry.runCount++;\n entry.sourceCount = meta.getSourceCount();\n };\n}\n\n// --- Store inspection ---\n\ninterface StoreSnapshot {\n $id: string;\n state: Record<string, unknown>;\n getters: Record<string, unknown>;\n actions: string[];\n subscriberCount: number;\n}\n\nfunction inspectStore(id: string): StoreSnapshot | null {\n const instances = __getStoreInstances();\n const store = instances[id];\n if (!store) return null;\n\n const snapshot = store.$snapshot();\n const meta = (store as any).$__meta as { stateKeys: string[]; getterKeys: string[]; actionKeys: string[] } | undefined;\n const getters: Record<string, unknown> = {};\n const actions: string[] = [];\n\n if (meta) {\n // Use metadata from store creation — no function calling needed\n for (const key of meta.getterKeys) {\n try { getters[key] = (store as any)[key](); } catch { getters[key] = '<error>'; }\n }\n actions.push(...meta.actionKeys);\n } else {\n // Fallback for stores without metadata\n for (const [key, value] of Object.entries(store)) {\n if (key.startsWith('$') || key in snapshot) continue;\n if (typeof value === 'function') actions.push(key);\n }\n }\n\n return {\n $id: id,\n state: snapshot,\n getters,\n actions,\n subscriberCount: 0,\n };\n}\n\n// --- DevTools API ---\n\nexport interface DevToolsAPI {\n /** List all registered stores */\n stores(): string[];\n /** Inspect a specific store by ID */\n store(id: string): StoreSnapshot | null;\n /** Get all store snapshots */\n storeSnapshots(): Record<string, StoreSnapshot>;\n /** List tracked signals with current values */\n signals(): Array<{ name: string; value: unknown; subscribers: number }>;\n /** List tracked effects with run counts */\n effects(): Array<{ name: string; runs: number; isRender: boolean; sources: number }>;\n /** Get framework version info */\n version(): { runtime: string };\n /** Pretty-print store state to console */\n log(storeId?: string): void;\n /** Record store state history for time-travel */\n startRecording(storeId: string): void;\n /** Stop recording and return history */\n stopRecording(storeId: string): Array<{ timestamp: number; state: Record<string, unknown>; action?: string }>;\n}\n\nconst recordings = new Map<string, Array<{ timestamp: number; state: Record<string, unknown>; action?: string }>>();\nconst recordingDisposers = new Map<string, () => void>();\n\nfunction createDevToolsAPI(): DevToolsAPI {\n return {\n stores() {\n return Object.keys(__getStoreInstances());\n },\n\n store(id: string) {\n return inspectStore(id);\n },\n\n storeSnapshots() {\n const result: Record<string, StoreSnapshot> = {};\n for (const id of Object.keys(__getStoreInstances())) {\n const snap = inspectStore(id);\n if (snap) result[id] = snap;\n }\n return result;\n },\n\n signals() {\n return [...trackedSignals.values()].map(s => ({\n name: s.name,\n value: s.read(),\n subscribers: s.subscriberCount,\n }));\n },\n\n effects() {\n return [...trackedEffects.values()].map(e => ({\n name: e.name,\n runs: e.runCount,\n isRender: e.isRender,\n sources: e.sourceCount,\n }));\n },\n\n version() {\n return { runtime: __RUNTIME_VERSION__ };\n },\n\n log(storeId?: string) {\n if (storeId) {\n const snap = inspectStore(storeId);\n if (snap) {\n console.group(`🔍 Store: ${storeId}`);\n console.log('State:', snap.state);\n console.log('Getters:', snap.getters);\n console.log('Actions:', snap.actions);\n console.groupEnd();\n } else {\n console.warn(`Store \"${storeId}\" not found. Available:`, Object.keys(__getStoreInstances()));\n }\n } else {\n const stores = Object.keys(__getStoreInstances());\n console.group('🔍 AkashJS Stores');\n for (const id of stores) {\n const snap = inspectStore(id);\n if (snap) {\n console.group(id);\n console.log('State:', snap.state);\n console.log('Getters:', snap.getters);\n console.groupEnd();\n }\n }\n console.groupEnd();\n }\n },\n\n startRecording(storeId: string) {\n const store = __getStoreInstances()[storeId];\n if (!store) {\n console.warn(`Store \"${storeId}\" not found.`);\n return;\n }\n\n const history: Array<{ timestamp: number; state: Record<string, unknown>; action?: string }> = [];\n // Record initial state\n history.push({ timestamp: Date.now(), state: store.$snapshot() });\n\n const unsubscribe = store.$subscribe((state) => {\n history.push({ timestamp: Date.now(), state: { ...state } });\n });\n\n recordings.set(storeId, history);\n recordingDisposers.set(storeId, unsubscribe);\n console.log(`⏺ Recording store \"${storeId}\". Call __AKASH_DEVTOOLS__.stopRecording(\"${storeId}\") to view history.`);\n },\n\n stopRecording(storeId: string) {\n const disposer = recordingDisposers.get(storeId);\n if (disposer) disposer();\n recordingDisposers.delete(storeId);\n\n const history = recordings.get(storeId) ?? [];\n recordings.delete(storeId);\n\n console.log(`⏹ Stopped recording \"${storeId}\". ${history.length} snapshots captured.`);\n console.table(history.map((h, i) => ({\n '#': i,\n time: new Date(h.timestamp).toISOString().slice(11, 23),\n state: JSON.stringify(h.state),\n })));\n\n return history;\n },\n };\n}\n\n/**\n * Install AkashJS DevTools on the global object.\n * Call this in your app's entry point during development:\n *\n * ```ts\n * import { installDevtools } from '@akashjs/runtime';\n * if (import.meta.env.DEV) installDevtools();\n * ```\n */\nexport interface DevToolsOptions {\n /** Enable the visual overlay panel (toggle with Ctrl+Shift+D) */\n overlay?: boolean;\n}\n\nexport function installDevtools(options?: DevToolsOptions): void {\n const api = createDevToolsAPI();\n\n if (typeof globalThis !== 'undefined') {\n (globalThis as any).__AKASH_DEVTOOLS__ = api;\n console.log(\n '%c🔧 AkashJS DevTools installed. Access via __AKASH_DEVTOOLS__ in console.',\n 'color: #7c3aed; font-weight: bold;'\n );\n console.log(' .stores() — list stores');\n console.log(' .store(\"id\") — inspect store');\n console.log(' .log() — pretty-print all stores');\n console.log(' .log(\"id\") — pretty-print one store');\n console.log(' .startRecording(\"id\") — record state changes');\n console.log(' .stopRecording(\"id\") — view recorded history');\n console.log(' .signals() — list tracked signals');\n console.log(' .effects() — list tracked effects');\n }\n\n // Mount visual overlay if requested\n if (options?.overlay) {\n import('./devtools-overlay.js').then(m => m.mountDevtoolsOverlay());\n }\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var chunkXPLIEN2G_cjs=require('./chunk-XPLIEN2G.cjs');var c=new Set,a=new Set,b=false,f=0,T=false,D=3,q=100;function h(){if(b)return;b=true;let e=new Map,n=false,t=0;for(;(c.size>0||a.size>0)&&t<q;){if(t++,c.size>0){let s=[...c].sort(V);c.clear();for(let r of s){let i=(e.get(r)??0)+1;if(e.set(r,i),i>D){n=true;continue}r.run();}}if(a.size>0){let s=[...a].sort(V);a.clear();for(let r of s){let i=(e.get(r)??0)+1;if(e.set(r,i),i>D){n=true;continue}r.run();}}if(n&&c.size===0&&a.size===0)break}(n||t>=q)&&(c.clear(),a.clear(),console.error("[AkashJS] Circular dependency detected between effects. Two or more effects are writing to each other's dependencies. The cycle has been broken after "+t+" iterations.")),b=false,T&&(T=false,(c.size>0||a.size>0)&&h());}function m(e){e.isRender?c.add(e):a.add(e),f===0&&!b?h():b&&(T=true);}function X(e){f++;try{return e()}finally{f--,f===0&&h();}}function g(){f++;}function w(){f--,f===0&&h();}function V(e,n){return (e.depth??0)-(n.depth??0)}function H(){h();}var _=typeof process>"u"||process.env?.NODE_ENV!=="production";var u=null;function k(e,n){return e===null?n:Array.isArray(e)?(e.indexOf(n)===-1&&e.push(n),e):e===n?e:[e,n]}function x(e,n){if(e===null||e===n)return null;if(Array.isArray(e)){let t=e.indexOf(n);if(t!==-1){if(e.length===2)return e[1-t];e.splice(t,1);}return e}return e}function R(e,n){if(e!==null)if(Array.isArray(e)){let t=e.slice();for(let s=0;s<t.length;s++)n(t[s]);}else n(e);}var N=class{_value;_subscribers;_equals;_version;constructor(n,t){this._value=n,this._subscribers=null,this._equals=t??Object.is,this._version=0;}};function J(e){this.set(e(this._node._value));}function K(){return this._node._value}function Q(e,n){let t=new N(e,n?.equals),s=()=>(I(t),t._value);return s.set=r=>{_&&u&&u._tag==="computed"&&console.warn("[AkashJS] Writing to a signal inside computed() is not allowed. The write will be lost on the next evaluation."),!t._equals(t._value,r)&&(t._value=r,t._version++,_&&chunkXPLIEN2G_cjs.c()&&chunkXPLIEN2G_cjs.d("signal-update","signal.set",0),g(),v(t),w());},s._node=t,s.update=J.bind(s),s.peek=K.bind(s),s}var p=class{_tag="computed";_fn;_value;_state;_subscribers;_sources;_equals;_version;_depVersions;constructor(n,t){this._fn=n,this._value=void 0,this._state=1,this._subscribers=null,this._sources=null,this._equals=t??Object.is,this._version=0,this._depVersions=null;}};function Y(e,n){let t=new p(e,n?.equals);return ()=>(u&&(t._subscribers=k(t._subscribers,u),"_sources"in u&&z(u,t)),t._state!==0&&(U(t)?A(t):t._state=0),t._value)}function U(e){if(e._depVersions===null||e._sources===null)return true;let n=e._sources,t=e._depVersions;if(n.length!==t.length)return true;for(let s=0;s<n.length;s++){let r=n[s];if(r instanceof p&&r._state===1&&A(r),r._version!==t[s])return true}return false}function P(e){if(e._sources===null||e._sources.length===0){e._depVersions=null;return}let n=e._sources,t=e._depVersions=new Array(n.length);for(let s=0;s<n.length;s++)t[s]=n[s]._version;}function z(e,n){e._sources===null?e._sources=[n]:e._sources.indexOf(n)===-1&&e._sources.push(n);}var C=new Set;function A(e,n=false){if(C.has(e))throw new Error("[AkashJS] Circular dependency detected between computed values.");if(C.add(e),g(),e._sources!==null){for(let r=0;r<e._sources.length;r++)e._sources[r]._subscribers=x(e._sources[r]._subscribers,e);e._sources=null;}let t=u;u=e;let s=_&&chunkXPLIEN2G_cjs.c()?performance.now():0;try{let r=e._fn(),i=e._value===void 0&&e._state===1,o=i||!e._equals(e._value,r);e._value=r,e._state=0,o&&e._version++,P(e),o&&!i&&(n?R(e._subscribers,l=>{l._tag==="computed"&&(l._state=1,R(l._subscribers,d=>{d._tag==="computed"&&(d._state=1);}));}):v(e));}finally{_&&s&&chunkXPLIEN2G_cjs.d("computed","computed",performance.now()-s),C.delete(e),u=t,w();}}var E=class{_tag="effect";_fn;_cleanup;_sources;_disposed;isRender;_lastSeen;constructor(n,t){this._fn=n,this._cleanup=null,this._sources=null,this._disposed=false,this.isRender=t,this._lastSeen=null;}run(){O(this);}};function Z(e,n){let t=new E(e,n?.render??false);return O(t),()=>{if(t._disposed=true,M(t),t._sources!==null){for(let s=0;s<t._sources.length;s++)t._sources[s]._subscribers=x(t._sources[s]._subscribers,t);t._sources=null;}}}function O(e){if(e._disposed)return;if(e._sources!==null&&e._sources.length>0){let r=false;for(let i=0;i<e._sources.length;i++){let o=e._sources[i];if(o instanceof p)if(o._state===1&&A(o,true),e._lastSeen!==null&&e._lastSeen.has(o)){let l=e._lastSeen.get(o);o._equals(l,o._value)||(r=true);}else r=true;else r=true;}if(!r)return}M(e);let n=e._sources!==null?e._sources.slice():null;if(e._sources!==null){for(let r=0;r<e._sources.length;r++)e._sources[r]._subscribers=x(e._sources[r]._subscribers,e);e._sources=null;}let t=u;u=e;let s=_&&chunkXPLIEN2G_cjs.c()?performance.now():0;try{let r=e._fn();typeof r=="function"&&(e._cleanup=r);}catch(r){if(n!==null){e._sources=n;for(let i=0;i<n.length;i++)n[i]._subscribers=k(n[i]._subscribers,e);}console.error("[AkashJS] Error in effect (will retry on next signal change):",r);}finally{if(_&&s&&chunkXPLIEN2G_cjs.d("effect","effect",performance.now()-s),u=t,e._sources!==null){let r=null;for(let i=0;i<e._sources.length;i++){let o=e._sources[i];o instanceof p&&(r===null&&(r=new Map),r.set(o,o._value));}e._lastSeen=r;}else e._lastSeen=null;}}function M(e){if(e._cleanup){try{e._cleanup();}catch(n){console.error("[AkashJS] Error in effect cleanup (ignored):",n);}e._cleanup=null;}}function j(e){let n=u;u=null;try{return e()}finally{u=n;}}function $(e,n,t){let s=Array.isArray(e),r=s?e:[e],i,o=true;return ()=>{let l=r.map(B=>B());if(o&&(o=false,i=l.slice(),t?.defer!==false))return;let d=i;return i=l.slice(),j(()=>n(s?l:l[0],d?s?d:d[0]:void 0))}}function I(e){u&&(e._subscribers=k(e._subscribers,u),"_sources"in u&&z(u,e));}function v(e){let n=e._subscribers;if(n!==null)if(Array.isArray(n))for(let t=0;t<n.length;t++){let s=n[t];s._tag==="computed"?(s._state=1,v(s)):m(s);}else n._tag==="computed"?(n._state=1,v(n)):m(n);}exports.a=X;exports.b=H;exports.c=Q;exports.d=Y;exports.e=Z;exports.f=j;exports.g=$;//# sourceMappingURL=chunk-HL2VGVJT.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-HL2VGVJT.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/scheduler.ts","../src/signals.ts"],"names":["pendingRender","pendingUser","flushing","batchDepth","reflushNeeded","MAX_EFFECT_RUNS","MAX_FLUSH_ITERATIONS","flush","runCounts","circularDetected","iterations","queue","byDepth","fx","count","scheduleEffect","batch","fn","enterBatch","exitBatch","a","b","flushSync","__DEV__","currentSubscriber","addSubscriber","slot","sub","removeSubscriber","idx","forEachSubscriber","copy","i","SignalNode","value","equals","signalUpdate","signalPeek","signal","initialValue","options","node","read","trackSubscriber","isProfiling","recordPerfEntry","notifySubscribers","ComputedNode","computed","addSource","isDirtyByVersion","recompute","deps","versions","dep","snapshotVersions","source","computingSet","skipEffectNotify","prevSubscriber","_t0","newValue","isFirst","changed","sub2","EffectNode","isRender","runEffect","effect","cleanupEffect","anyChanged","lastSeen","prevSources","result","err","untrack","prev","on","isArray","depArray","prevValues","values","d"],"mappings":"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","file":"chunk-HL2VGVJT.cjs","sourcesContent":["/**\n * Microtask-based effect scheduler with priority levels and deduplication.\n *\n * Render effects (DOM bindings) run before user effects to ensure\n * DOM is consistent before user-side effects execute.\n */\n\nexport interface ScheduledEffect {\n run(): void;\n isRender: boolean;\n /** Depth in the dependency graph (0 = root). Lower depth runs first. */\n depth?: number;\n}\n\nconst pendingRender = new Set<ScheduledEffect>();\nconst pendingUser = new Set<ScheduledEffect>();\nlet flushing = false;\nlet batchDepth = 0;\nlet flushScheduled = false;\nlet reflushNeeded = false;\n\nconst MAX_EFFECT_RUNS = 3;\nconst MAX_FLUSH_ITERATIONS = 100;\n\nfunction flush(): void {\n if (flushing) return;\n flushing = true;\n flushScheduled = false;\n\n // Fresh per-effect run counter for THIS flush — reset every time\n const runCounts = new Map<ScheduledEffect, number>();\n let circularDetected = false;\n\n // Process render effects first, then user effects.\n // Effects may enqueue more effects during flush, so loop until empty.\n let iterations = 0;\n while ((pendingRender.size > 0 || pendingUser.size > 0) && iterations < MAX_FLUSH_ITERATIONS) {\n iterations++;\n\n // Drain render effects (sorted by depth — parents before children)\n if (pendingRender.size > 0) {\n const queue = [...pendingRender].sort(byDepth);\n pendingRender.clear();\n for (const fx of queue) {\n const count = (runCounts.get(fx) ?? 0) + 1;\n runCounts.set(fx, count);\n if (count > MAX_EFFECT_RUNS) {\n circularDetected = true;\n continue; // skip this effect — it's in a cycle\n }\n fx.run();\n }\n }\n\n // Drain user effects (sorted by depth)\n if (pendingUser.size > 0) {\n const queue = [...pendingUser].sort(byDepth);\n pendingUser.clear();\n for (const fx of queue) {\n const count = (runCounts.get(fx) ?? 0) + 1;\n runCounts.set(fx, count);\n if (count > MAX_EFFECT_RUNS) {\n circularDetected = true;\n continue; // skip this effect — it's in a cycle\n }\n fx.run();\n }\n }\n\n // If all remaining effects were skipped due to cycle detection, break\n if (circularDetected && pendingRender.size === 0 && pendingUser.size === 0) {\n break;\n }\n }\n\n if (circularDetected || iterations >= MAX_FLUSH_ITERATIONS) {\n pendingRender.clear();\n pendingUser.clear();\n console.error(\n '[AkashJS] Circular dependency detected between effects. ' +\n 'Two or more effects are writing to each other\\'s dependencies. ' +\n 'The cycle has been broken after ' + iterations + ' iterations.'\n );\n }\n\n flushing = false;\n\n // If effects were scheduled during the tail end of this flush (after the\n // while loop's condition was last checked), re-flush them now.\n if (reflushNeeded) {\n reflushNeeded = false;\n if (pendingRender.size > 0 || pendingUser.size > 0) {\n flush();\n }\n }\n}\n\nexport function scheduleEffect(fx: ScheduledEffect): void {\n if (fx.isRender) {\n pendingRender.add(fx);\n } else {\n pendingUser.add(fx);\n }\n\n if (batchDepth === 0 && !flushing) {\n flush();\n } else if (flushing) {\n // Effects were added during a flush. The while loop may still pick them\n // up, but if it has already checked the queues and found them empty,\n // we need a re-flush after the current one completes.\n reflushNeeded = true;\n }\n}\n\n/**\n * Batch multiple signal writes — subscribers are notified only once\n * at the end of the batch.\n */\nexport function batch<T>(fn: () => T): T {\n batchDepth++;\n try {\n return fn();\n } finally {\n batchDepth--;\n if (batchDepth === 0) {\n flush();\n }\n }\n}\n\n/** Enter/exit batch depth — used by computed recompute to prevent mid-evaluation flush */\nexport function enterBatch(): void { batchDepth++; }\nexport function exitBatch(): void {\n batchDepth--;\n if (batchDepth === 0) flush();\n}\n\n/** Sort effects by depth (lower depth first = parents before children) */\nfunction byDepth(a: ScheduledEffect, b: ScheduledEffect): number {\n return (a.depth ?? 0) - (b.depth ?? 0);\n}\n\n/** Synchronously flush all pending effects. Useful for testing. */\nexport function flushSync(): void {\n flush();\n}\n","/**\n * Fine-grained reactivity system.\n *\n * Inspired by SolidJS/Preact Signals. Provides signal(), computed(),\n * effect(), and untrack() primitives with automatic dependency tracking\n * and glitch-free diamond dependency resolution.\n *\n * Optimized for minimal memory footprint:\n * - Class-based nodes for V8 hidden class sharing\n * - Lazy subscriber collections (null → single → array)\n * - Shared method functions (no per-instance closures for update/peek)\n * - Version-based dirty checking for computed\n * - Dev-only code stripped in production builds\n */\n\nimport { scheduleEffect, enterBatch, exitBatch, type ScheduledEffect } from './scheduler.js';\n\nimport { recordPerfEntry, isProfiling } from './perf.js';\n\nconst __DEV__ = typeof process === 'undefined' || process.env?.NODE_ENV !== 'production';\n\n/** Depth counter to defer effect scheduling until all notifications complete (glitch-free) */\nlet notifyDepth = 0;\n\n// --- Tracking scope ---\n\ntype Subscriber = EffectNode | ComputedNode<any>;\ntype SubscriberSlot = Subscriber | Subscriber[] | null;\n\nlet currentSubscriber: Subscriber | null = null;\n\n// --- Subscriber collection helpers (lazy: null → single → array) ---\n\nfunction addSubscriber(slot: SubscriberSlot, sub: Subscriber): SubscriberSlot {\n if (slot === null) return sub;\n if (Array.isArray(slot)) {\n if (slot.indexOf(sub) === -1) slot.push(sub);\n return slot;\n }\n // slot is a single subscriber\n if (slot === sub) return slot;\n return [slot, sub];\n}\n\nfunction removeSubscriber(slot: SubscriberSlot, sub: Subscriber): SubscriberSlot {\n if (slot === null) return null;\n if (slot === sub) return null;\n if (Array.isArray(slot)) {\n const idx = slot.indexOf(sub);\n if (idx !== -1) {\n if (slot.length === 2) return slot[1 - idx];\n slot.splice(idx, 1);\n }\n return slot;\n }\n return slot;\n}\n\nfunction forEachSubscriber(slot: SubscriberSlot, fn: (sub: Subscriber) => void): void {\n if (slot === null) return;\n if (Array.isArray(slot)) {\n // Snapshot to avoid mutation during iteration\n const copy = slot.slice();\n for (let i = 0; i < copy.length; i++) fn(copy[i]);\n } else {\n fn(slot);\n }\n}\n\nfunction hasSubscribers(slot: SubscriberSlot): boolean {\n return slot !== null;\n}\n\n// --- Signal ---\n\nexport interface Signal<T> {\n /** Read the current value (tracks dependency if inside a reactive scope) */\n (): T;\n /** Set a new value */\n set(value: T): void;\n /** Update the value using the previous value */\n update(fn: (prev: T) => T): void;\n /** Read without tracking (no dependency registered) */\n peek(): T;\n}\n\nexport type ReadonlySignal<T> = () => T;\n\n// Strategy 1: Class-based node for V8 hidden class optimization\nclass SignalNode<T> {\n _value: T;\n _subscribers: SubscriberSlot;\n _equals: (a: T, b: T) => boolean;\n _version: number; // Strategy 5: cheap dirty checking\n\n constructor(value: T, equals?: (a: T, b: T) => boolean) {\n this._value = value;\n this._subscribers = null; // Strategy 2: lazy (not new Set())\n this._equals = equals ?? Object.is;\n this._version = 0;\n }\n}\n\n// Strategy 3: Shared method functions (not per-instance closures)\nfunction signalUpdate<T>(this: Signal<T> & { _node: SignalNode<T> }, fn: (prev: T) => T): void {\n this.set(fn(this._node._value));\n}\n\nfunction signalPeek<T>(this: { _node: SignalNode<T> }): T {\n return this._node._value;\n}\n\nexport function signal<T>(\n initialValue: T,\n options?: { equals?: (a: T, b: T) => boolean },\n): Signal<T> {\n const node = new SignalNode(initialValue, options?.equals);\n\n const read = (): T => {\n trackSubscriber(node);\n return node._value;\n };\n\n read.set = (value: T): void => {\n if (__DEV__ && currentSubscriber && (currentSubscriber as any)._tag === 'computed') {\n console.warn('[AkashJS] Writing to a signal inside computed() is not allowed. The write will be lost on the next evaluation.');\n }\n if (node._equals(node._value, value)) return;\n node._value = value;\n node._version++;\n if (__DEV__ && isProfiling()) recordPerfEntry('signal-update', 'signal.set', 0);\n // Inline batch to avoid closure allocation on every set() call\n enterBatch();\n notifySubscribers(node);\n exitBatch();\n };\n\n // Strategy 3: bind shared functions instead of creating per-instance closures\n (read as any)._node = node;\n read.update = signalUpdate.bind(read as any);\n read.peek = signalPeek.bind(read as any);\n\n return read as Signal<T>;\n}\n\n// --- Computed ---\n\nconst enum ComputedState {\n Clean = 0,\n Dirty = 1,\n}\n\n// Strategy 1: Class-based computed node\nclass ComputedNode<T> {\n _tag: 'computed' = 'computed';\n _fn: () => T;\n _value: T | undefined;\n _state: ComputedState;\n _subscribers: SubscriberSlot;\n _sources: (SignalNode<any> | ComputedNode<any>)[] | null;\n _equals: (a: T, b: T) => boolean;\n _version: number; // Strategy 5\n\n // Strategy 5: version snapshots of dependencies at last evaluation\n _depVersions: number[] | null;\n\n constructor(fn: () => T, equals?: (a: T, b: T) => boolean) {\n this._fn = fn;\n this._value = undefined;\n this._state = ComputedState.Dirty;\n this._subscribers = null; // lazy\n this._sources = null; // lazy\n this._equals = equals ?? Object.is;\n this._version = 0;\n this._depVersions = null;\n }\n}\n\nexport function computed<T>(\n fn: () => T,\n options?: { equals?: (a: T, b: T) => boolean },\n): ReadonlySignal<T> {\n const node = new ComputedNode<T>(fn, options?.equals);\n\n const read = (): T => {\n // Track this computed as a dependency of the current subscriber\n if (currentSubscriber) {\n node._subscribers = addSubscriber(node._subscribers, currentSubscriber);\n if ('_sources' in currentSubscriber) {\n addSource(currentSubscriber, node);\n }\n }\n\n if (node._state !== ComputedState.Clean) {\n // Strategy 5: check if deps actually changed via version\n if (!isDirtyByVersion(node)) {\n node._state = ComputedState.Clean;\n } else {\n recompute(node);\n }\n }\n\n return node._value as T;\n };\n\n return read;\n}\n\n// Strategy 5: version-based dirty check\nfunction isDirtyByVersion(node: ComputedNode<any>): boolean {\n if (node._depVersions === null || node._sources === null) return true;\n const deps = node._sources;\n const versions = node._depVersions;\n if (deps.length !== versions.length) return true;\n for (let i = 0; i < deps.length; i++) {\n const dep = deps[i];\n // If a dep is a dirty computed, recompute it first to get the real version\n if (dep instanceof ComputedNode && dep._state === ComputedState.Dirty) {\n recompute(dep);\n }\n if (dep._version !== versions[i]) return true;\n }\n return false;\n}\n\n// Snapshot dependency versions after evaluation\nfunction snapshotVersions(node: ComputedNode<any>): void {\n if (node._sources === null || node._sources.length === 0) {\n node._depVersions = null;\n return;\n }\n const deps = node._sources;\n const versions = node._depVersions = new Array(deps.length);\n for (let i = 0; i < deps.length; i++) {\n versions[i] = deps[i]._version;\n }\n}\n\n// Helper: add source to node's sources array\nfunction addSource(sub: { _sources: (SignalNode<any> | ComputedNode<any>)[] | null }, source: SignalNode<any> | ComputedNode<any>): void {\n if (sub._sources === null) {\n sub._sources = [source];\n } else if (sub._sources.indexOf(source) === -1) {\n sub._sources.push(source);\n }\n}\n\nconst computingSet = new Set<ComputedNode<unknown>>();\n\n/**\n * @param skipEffectNotify - When true, don't schedule effects in notifySubscribers.\n * Used when recompute is called from runEffect's dirty check — the effect is\n * already being processed, re-scheduling it would trigger the circular run limit.\n */\nfunction recompute<T>(node: ComputedNode<T>, skipEffectNotify = false): void {\n // Detect circular computed dependencies — only if THIS node is already being computed\n if (computingSet.has(node as ComputedNode<unknown>)) {\n throw new Error('[AkashJS] Circular dependency detected between computed values.');\n }\n computingSet.add(node as ComputedNode<unknown>);\n\n // Prevent effects from flushing while computed is evaluating.\n enterBatch();\n\n // Clean up old source subscriptions\n if (node._sources !== null) {\n for (let i = 0; i < node._sources.length; i++) {\n node._sources[i]._subscribers = removeSubscriber(node._sources[i]._subscribers, node);\n }\n node._sources = null;\n }\n\n const prevSubscriber = currentSubscriber;\n currentSubscriber = node;\n\n const _t0 = __DEV__ && isProfiling() ? performance.now() : 0;\n try {\n const newValue = node._fn();\n const isFirst = node._value === undefined && node._state === ComputedState.Dirty;\n const changed = isFirst || !node._equals(node._value as T, newValue);\n node._value = newValue;\n node._state = ComputedState.Clean;\n if (changed) node._version++;\n\n // Snapshot dep versions for next dirty check\n snapshotVersions(node);\n\n // Only propagate if value actually changed (skip first computation —\n // the effect that triggered the read is already running).\n if (changed && !isFirst) {\n if (skipEffectNotify) {\n // Only mark downstream computeds as dirty — don't schedule effects.\n forEachSubscriber(node._subscribers, (sub) => {\n if (sub._tag === 'computed') {\n (sub as ComputedNode<any>)._state = ComputedState.Dirty;\n forEachSubscriber((sub as ComputedNode<any>)._subscribers, (sub2) => {\n if (sub2._tag === 'computed') (sub2 as ComputedNode<any>)._state = ComputedState.Dirty;\n });\n }\n });\n } else {\n notifySubscribers(node);\n }\n }\n } finally {\n if (__DEV__ && _t0) recordPerfEntry('computed', 'computed', performance.now() - _t0);\n computingSet.delete(node as ComputedNode<unknown>);\n currentSubscriber = prevSubscriber;\n exitBatch();\n }\n}\n\n// --- Effect ---\n\n// Strategy 1: Class-based effect node\nclass EffectNode implements ScheduledEffect {\n _tag: 'effect' = 'effect';\n _fn: () => void | (() => void);\n _cleanup: (() => void) | null;\n _sources: (SignalNode<any> | ComputedNode<any>)[] | null;\n _disposed: boolean;\n isRender: boolean;\n _lastSeen: Map<unknown, unknown> | null;\n\n constructor(fn: () => void | (() => void), isRender: boolean) {\n this._fn = fn;\n this._cleanup = null;\n this._sources = null; // lazy\n this._disposed = false;\n this.isRender = isRender;\n this._lastSeen = null;\n }\n\n run(): void {\n runEffect(this);\n }\n}\n\nexport function effect(\n fn: () => void | (() => void),\n options?: { render?: boolean },\n): () => void {\n const node = new EffectNode(fn, options?.render ?? false);\n\n // Run immediately to establish dependencies\n runEffect(node);\n\n // Return dispose function\n return () => {\n node._disposed = true;\n cleanupEffect(node);\n if (node._sources !== null) {\n for (let i = 0; i < node._sources.length; i++) {\n node._sources[i]._subscribers = removeSubscriber(node._sources[i]._subscribers, node);\n }\n node._sources = null;\n }\n };\n}\n\nfunction runEffect(node: EffectNode): void {\n if (node._disposed) return;\n\n // Before re-running, check if any dirty computed source actually changed.\n if (node._sources !== null && node._sources.length > 0) {\n let anyChanged = false;\n for (let i = 0; i < node._sources.length; i++) {\n const source = node._sources[i];\n if (source instanceof ComputedNode) {\n if (source._state === ComputedState.Dirty) {\n recompute(source, true);\n }\n if (node._lastSeen !== null && node._lastSeen.has(source)) {\n const lastSeen = node._lastSeen.get(source);\n if (!source._equals(lastSeen as never, source._value as never)) {\n anyChanged = true;\n }\n } else {\n anyChanged = true;\n }\n } else {\n anyChanged = true;\n }\n }\n if (!anyChanged) return;\n }\n\n // Clean up previous run\n cleanupEffect(node);\n\n // Save old sources in case the effect throws\n const prevSources = node._sources !== null ? node._sources.slice() : null;\n\n // Clean up old source subscriptions\n if (node._sources !== null) {\n for (let i = 0; i < node._sources.length; i++) {\n node._sources[i]._subscribers = removeSubscriber(node._sources[i]._subscribers, node);\n }\n node._sources = null;\n }\n\n const prevSubscriber = currentSubscriber;\n currentSubscriber = node;\n const _t0 = __DEV__ && isProfiling() ? performance.now() : 0;\n\n try {\n const result = node._fn();\n if (typeof result === 'function') {\n node._cleanup = result;\n }\n } catch (err) {\n // Re-subscribe to previous sources so the effect can recover on next change\n if (prevSources !== null) {\n node._sources = prevSources;\n for (let i = 0; i < prevSources.length; i++) {\n prevSources[i]._subscribers = addSubscriber(prevSources[i]._subscribers, node);\n }\n }\n console.error('[AkashJS] Error in effect (will retry on next signal change):', err);\n } finally {\n if (__DEV__ && _t0) recordPerfEntry('effect', 'effect', performance.now() - _t0);\n currentSubscriber = prevSubscriber;\n\n // Cache computed values for next dirty check\n if (node._sources !== null) {\n let lastSeen: Map<unknown, unknown> | null = null;\n for (let i = 0; i < node._sources.length; i++) {\n const source = node._sources[i];\n if (source instanceof ComputedNode) {\n if (lastSeen === null) lastSeen = new Map();\n lastSeen.set(source, source._value);\n }\n }\n node._lastSeen = lastSeen;\n } else {\n node._lastSeen = null;\n }\n }\n}\n\nfunction cleanupEffect(node: EffectNode): void {\n if (node._cleanup) {\n try {\n node._cleanup();\n } catch (err) {\n console.error('[AkashJS] Error in effect cleanup (ignored):', err);\n }\n node._cleanup = null;\n }\n}\n\n// --- Untrack ---\n\n/** Execute a function without tracking any signal reads */\nexport function untrack<T>(fn: () => T): T {\n const prev = currentSubscriber;\n currentSubscriber = null;\n try {\n return fn();\n } finally {\n currentSubscriber = prev;\n }\n}\n\n// --- on() helper ---\n\n/**\n * Create an effect callback that only tracks specific signals.\n * All other signal reads inside the callback are untracked.\n *\n * ```ts\n * effect(on(url, (currentUrl, prevUrl) => {\n * fetch(currentUrl, options()); // options() not tracked\n * }));\n *\n * effect(on([url, page], ([u, p], prev) => {\n * fetch(`${u}?page=${p}`);\n * }));\n * ```\n */\nexport function on<T>(\n dep: () => T,\n fn: (value: T, prev: T | undefined) => void | (() => void),\n options?: { defer?: boolean },\n): () => void | (() => void);\nexport function on<T extends readonly (() => unknown)[]>(\n deps: [...T],\n fn: (values: { [K in keyof T]: ReturnType<T[K]> }, prev: { [K in keyof T]: ReturnType<T[K]> } | undefined) => void | (() => void),\n options?: { defer?: boolean },\n): () => void | (() => void);\nexport function on(\n deps: (() => any) | (() => any)[],\n fn: (values: any, prev: any) => void | (() => void),\n options?: { defer?: boolean },\n): () => void | (() => void) {\n const isArray = Array.isArray(deps);\n const depArray = isArray ? deps : [deps];\n let prevValues: unknown[] | undefined;\n let isFirst = true;\n\n return () => {\n // Track only the specified deps\n const values = depArray.map(d => d());\n\n if (isFirst) {\n isFirst = false;\n prevValues = values.slice();\n if (options?.defer !== false) return;\n }\n\n const prev = prevValues;\n prevValues = values.slice();\n\n return untrack(() => fn(\n isArray ? values : values[0],\n prev ? (isArray ? prev : prev[0]) : undefined,\n ));\n };\n}\n\n// --- Internal helpers ---\n\nfunction trackSubscriber(\n node: SignalNode<any> | ComputedNode<any>,\n): void {\n if (currentSubscriber) {\n node._subscribers = addSubscriber(node._subscribers, currentSubscriber);\n\n if ('_sources' in currentSubscriber) {\n addSource(currentSubscriber as any, node);\n }\n }\n}\n\nfunction notifySubscribers(\n node: SignalNode<any> | ComputedNode<any>,\n): void {\n // Inlined iteration — avoids closure + array copy overhead.\n // Safe because notifySubscribers is always called inside a batch,\n // so effects are only scheduled (not flushed) during iteration.\n const slot = node._subscribers;\n if (slot === null) return;\n if (Array.isArray(slot)) {\n for (let i = 0; i < slot.length; i++) {\n const sub = slot[i];\n if (sub._tag === 'computed') {\n (sub as ComputedNode<any>)._state = ComputedState.Dirty;\n notifySubscribers(sub as ComputedNode<any>);\n } else {\n scheduleEffect(sub as unknown as ScheduledEffect);\n }\n }\n } else {\n if (slot._tag === 'computed') {\n (slot as ComputedNode<any>)._state = ComputedState.Dirty;\n notifySubscribers(slot as ComputedNode<any>);\n } else {\n scheduleEffect(slot as unknown as ScheduledEffect);\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {c,e}from'./chunk-2UATNCKC.js';function m(o,t){let e=c(0),n=c(t?.immediate!==false),u=null;function a(){l(),u=setInterval(()=>e.update(r=>r+1),o);}function l(){u&&(clearInterval(u),u=null);}return n()&&a(),{count:(()=>e()),isActive:(()=>n()),pause(){n.set(false),l();},resume(){n.set(true),a();},reset(){e.set(0);},dispose(){l();}}}function f(o){let t=c(false),e=null;function n(){u(),t.set(false),e=setTimeout(()=>t.set(true),o);}function u(){e&&(clearTimeout(e),e=null);}return n(),{ready:(()=>t()),restart(){n();},dispose(){u();}}}function d(o,t){let e$1=c(o()),n=null;return e(()=>{let u=o();return n&&clearTimeout(n),n=setTimeout(()=>e$1.set(u),t),()=>{n&&clearTimeout(n);}}),(()=>e$1())}function T(o,t){let e$1=c(o()),n=0,u=null;return e(()=>{let a=o(),l=Date.now(),r=l-n;return r>=t?(e$1.set(a),n=l):(u&&clearTimeout(u),u=setTimeout(()=>{e$1.set(a),n=Date.now();},t-r)),()=>{u&&clearTimeout(u);}}),(()=>e$1())}function p(o=0,t){let e=t?.min??-1/0,n=t?.max??1/0,u=l=>Math.min(n,Math.max(e,l)),a=c(u(o));return {count:(()=>a()),inc(l=1){a.update(r=>u(r+l));},dec(l=1){a.update(r=>u(r-l));},set(l){a.set(u(l));},reset(){a.set(u(o));}}}function y(o=false){let t=c(o);return {value:(()=>t()),toggle(){t.update(e=>!e);},setTrue(){t.set(true);},setFalse(){t.set(false);}}}function g(o){let t,e$1=c(void 0);return e(()=>{let n=o();e$1.set(t),t=n;}),(()=>e$1())}export{m as a,f as b,d as c,T as d,p as e,y as f,g};//# sourceMappingURL=chunk-IDTJWCYW.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-IDTJWCYW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/composables.ts"],"names":["useInterval","ms","options","count","signal","isActive","timer","start","stop","c","useTimeout","ready","useDebounce","source","delay","debounced","effect","value","useThrottle","interval","throttled","lastUpdate","now","elapsed","useCounter","initial","min","max","clamp","v","delta","useToggle","usePrevious","lastValue","tracked","current"],"mappings":"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","file":"chunk-IDTJWCYW.js","sourcesContent":["/**\n * Reactive composables — signal-based utility functions.\n *\n * Timers, debounce, throttle, and other commonly needed\n * reactive primitives that every app uses.\n */\n\nimport { signal, effect } from './signals.js';\nimport type { Signal, ReadonlySignal } from './signals.js';\n\n// --- useInterval ---\n\n/**\n * Create a reactive interval that ticks at a given rate.\n *\n * ```ts\n * const { count, pause, resume, reset } = useInterval(1000);\n * count(); // increments every second\n * ```\n */\nexport function useInterval(ms: number, options?: { immediate?: boolean }) {\n const count = signal(0);\n const isActive = signal(options?.immediate !== false);\n let timer: ReturnType<typeof setInterval> | null = null;\n\n function start() {\n stop();\n timer = setInterval(() => count.update((c) => c + 1), ms);\n }\n\n function stop() {\n if (timer) { clearInterval(timer); timer = null; }\n }\n\n if (isActive()) start();\n\n return {\n count: (() => count()) as ReadonlySignal<number>,\n isActive: (() => isActive()) as ReadonlySignal<boolean>,\n pause() { isActive.set(false); stop(); },\n resume() { isActive.set(true); start(); },\n reset() { count.set(0); },\n dispose() { stop(); },\n };\n}\n\n// --- useTimeout ---\n\n/**\n * Reactive timeout that exposes ready state.\n *\n * ```ts\n * const { ready, restart } = useTimeout(3000);\n * ready(); // false, then true after 3s\n * ```\n */\nexport function useTimeout(ms: number) {\n const ready = signal(false);\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n function start() {\n stop();\n ready.set(false);\n timer = setTimeout(() => ready.set(true), ms);\n }\n\n function stop() {\n if (timer) { clearTimeout(timer); timer = null; }\n }\n\n start();\n\n return {\n ready: (() => ready()) as ReadonlySignal<boolean>,\n restart() { start(); },\n dispose() { stop(); },\n };\n}\n\n// --- useDebounce ---\n\n/**\n * Debounce a signal value. The output updates only after the input\n * stops changing for the given delay.\n *\n * ```ts\n * const search = signal('');\n * const debouncedSearch = useDebounce(search, 300);\n * // debouncedSearch() updates 300ms after last search.set()\n * ```\n */\nexport function useDebounce<T>(source: () => T, delay: number): ReadonlySignal<T> {\n const debounced = signal<T>(source());\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n effect(() => {\n const value = source();\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => debounced.set(value), delay);\n return () => { if (timer) clearTimeout(timer); };\n });\n\n return (() => debounced()) as ReadonlySignal<T>;\n}\n\n// --- useThrottle ---\n\n/**\n * Throttle a signal value. The output updates at most once per interval.\n *\n * ```ts\n * const scrollY = signal(0);\n * const throttled = useThrottle(scrollY, 100);\n * ```\n */\nexport function useThrottle<T>(source: () => T, interval: number): ReadonlySignal<T> {\n const throttled = signal<T>(source());\n let lastUpdate = 0;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n effect(() => {\n const value = source();\n const now = Date.now();\n const elapsed = now - lastUpdate;\n\n if (elapsed >= interval) {\n throttled.set(value);\n lastUpdate = now;\n } else {\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n throttled.set(value);\n lastUpdate = Date.now();\n }, interval - elapsed);\n }\n return () => { if (timer) clearTimeout(timer); };\n });\n\n return (() => throttled()) as ReadonlySignal<T>;\n}\n\n// --- useCounter ---\n\n/**\n * Simple reactive counter with inc/dec/set/reset.\n *\n * ```ts\n * const { count, inc, dec, set, reset } = useCounter(0);\n * ```\n */\nexport function useCounter(initial = 0, options?: { min?: number; max?: number }) {\n const min = options?.min ?? -Infinity;\n const max = options?.max ?? Infinity;\n const clamp = (v: number) => Math.min(max, Math.max(min, v));\n const count = signal(clamp(initial));\n return {\n count: (() => count()) as ReadonlySignal<number>,\n inc(delta = 1) { count.update((c) => clamp(c + delta)); },\n dec(delta = 1) { count.update((c) => clamp(c - delta)); },\n set(value: number) { count.set(clamp(value)); },\n reset() { count.set(clamp(initial)); },\n };\n}\n\n// --- useToggle ---\n\n/**\n * Reactive boolean toggle.\n *\n * ```ts\n * const { value, toggle, setTrue, setFalse } = useToggle(false);\n * ```\n */\nexport function useToggle(initial = false) {\n const value = signal(initial);\n return {\n value: (() => value()) as ReadonlySignal<boolean>,\n toggle() { value.update((v) => !v); },\n setTrue() { value.set(true); },\n setFalse() { value.set(false); },\n };\n}\n\n// --- usePrevious ---\n\n/**\n * Track the previous value of a signal.\n *\n * ```ts\n * const count = signal(0);\n * const prev = usePrevious(count);\n * count.set(1);\n * prev(); // 0\n * ```\n */\nexport function usePrevious<T>(source: () => T): ReadonlySignal<T | undefined> {\n let lastValue: T | undefined;\n const tracked = signal<T | undefined>(undefined);\n\n effect(() => {\n const current = source();\n tracked.set(lastValue);\n lastValue = current;\n });\n\n return (() => tracked()) as ReadonlySignal<T | undefined>;\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {f}from'./chunk-VUMMC2P5.js';function v(t){return t}function h(t,g){let p=[],i=[],s=[],l={},e=null,r=null,f$1={provide(n,o){f(n,o);},onError(n){i.push(n);},onBeforeMount(n){s.push(n);},config:l},u={use(n){return p.push(n),u},config(n,o){return l[n]=o,u},mount(n){if(r=typeof n=="string"?document.querySelector(n):n,!r)throw new Error(`[AkashJS] Mount target not found: ${n}`);for(let o of p)o.setup(f$1);for(let o of s)o();try{e=t(g??{}),r.appendChild(e);}catch(o){let c=o instanceof Error?o:new Error(String(o));if(i.length>0)for(let a of i)a(c);else throw c}},unmount(){e&&r&&(r.removeChild(e),e=null);}};return u}export{v as a,h as b};//# sourceMappingURL=chunk-IHEW6F2H.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-IHEW6F2H.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/plugin.ts"],"names":["definePlugin","plugin","createApp","rootComponent","rootProps","plugins","errorHandlers","beforeMountHooks","appConfig","mountedNode","containerEl","pluginCtx","key","value","provide","handler","hook","app","selector","err","e"],"mappings":"oCA+DO,SAASA,EAAaC,CAAAA,CAAwB,CACnD,OAAOA,CACT,CAcO,SAASC,CAAAA,CACdC,CAAAA,CACAC,CAAAA,CACa,CACb,IAAMC,CAAAA,CAAoB,EAAC,CACrBC,CAAAA,CAA+C,EAAC,CAChDC,CAAAA,CAAsC,EAAC,CACvCC,EAAqC,EAAC,CACxCC,EAA2B,IAAA,CAC3BC,CAAAA,CAAkC,KAEhCC,GAAAA,CAA2B,CAC/B,OAAA,CAAWC,CAAAA,CAAsBC,EAAU,CAEzCC,CAAAA,CAAQF,EAAKC,CAAK,EACpB,EACA,OAAA,CAAQE,CAAAA,CAAiC,CACvCT,CAAAA,CAAc,KAAKS,CAAO,EAC5B,CAAA,CACA,aAAA,CAAcC,EAAkB,CAC9BT,CAAAA,CAAiB,IAAA,CAAKS,CAAI,EAC5B,CAAA,CACA,MAAA,CAAQR,CACV,CAAA,CAEMS,CAAAA,CAAmB,CACvB,GAAA,CAAIhB,CAAAA,CAAgB,CAClB,OAAAI,EAAQ,IAAA,CAAKJ,CAAM,EACZgB,CACT,CAAA,CAEA,OAAOL,CAAAA,CAAaC,CAAAA,CAAgB,CAClC,OAAAL,EAAUI,CAAG,CAAA,CAAIC,EACVI,CACT,CAAA,CAEA,MAAMC,CAAAA,CAAgC,CAMpC,GALAR,CAAAA,CACE,OAAOQ,CAAAA,EAAa,QAAA,CAChB,QAAA,CAAS,aAAA,CAA2BA,CAAQ,CAAA,CAC5CA,CAAAA,CAEF,CAACR,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,qCAAqCQ,CAAQ,CAAA,CAC/C,EAIF,IAAA,IAAWjB,CAAAA,IAAUI,CAAAA,CACnBJ,CAAAA,CAAO,MAAMU,GAAS,CAAA,CAIxB,QAAWK,CAAAA,IAAQT,CAAAA,CACjBS,GAAK,CAIP,GAAI,CACFP,CAAAA,CAAcN,EAAeC,CAAAA,EAAa,EAAU,CAAA,CACpDM,CAAAA,CAAY,YAAYD,CAAW,EACrC,CAAA,MAASU,CAAAA,CAAK,CACZ,IAAMC,CAAAA,CAAID,CAAAA,YAAe,KAAA,CAAQA,EAAM,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAG,CAAC,CAAA,CAC5D,GAAIb,EAAc,MAAA,CAAS,CAAA,CACzB,QAAWS,CAAAA,IAAWT,CAAAA,CACpBS,CAAAA,CAAQK,CAAC,OAGX,MAAMA,CAEV,CACF,CAAA,CAEA,OAAA,EAAU,CACJX,CAAAA,EAAeC,CAAAA,GACjBA,CAAAA,CAAY,WAAA,CAAYD,CAAW,CAAA,CACnCA,CAAAA,CAAc,MAElB,CACF,CAAA,CAEA,OAAOQ,CACT","file":"chunk-IHEW6F2H.js","sourcesContent":["/**\n * Plugin system.\n *\n * Allows third-party extensions to hook into the AkashJS lifecycle.\n * Plugins can provide context values, add global error handlers,\n * register stores, and run setup code.\n *\n * ```ts\n * const authPlugin = definePlugin({\n * name: 'auth',\n * setup(app) {\n * const store = defineStore('auth', { ... })();\n * app.provide(AuthContext, store);\n * app.onError((err) => { if (err.status === 401) logout(); });\n * },\n * });\n *\n * const app = createApp(App);\n * app.use(authPlugin);\n * app.mount('#app');\n * ```\n */\n\nimport { provide } from './context.js';\nimport type { InjectionKey } from './context.js';\nimport type { Component } from './component.js';\n\n// --- Types ---\n\nexport interface PluginContext {\n /** Provide a value to all components */\n provide<T>(key: InjectionKey<T>, value: T): void;\n /** Register a global error handler */\n onError(handler: (error: Error) => void): void;\n /** Register a hook that runs before each component mount */\n onBeforeMount(hook: () => void): void;\n /** Access the app config */\n config: Record<string, unknown>;\n}\n\nexport interface Plugin {\n /** Plugin name (for debugging) */\n name: string;\n /** Setup function called when the plugin is installed */\n setup: (ctx: PluginContext) => void | Promise<void>;\n}\n\nexport interface AppInstance {\n /** Install a plugin */\n use(plugin: Plugin): AppInstance;\n /** Set a config value */\n config(key: string, value: unknown): AppInstance;\n /** Mount the app to a DOM element */\n mount(selector: string | HTMLElement): void;\n /** Unmount the app */\n unmount(): void;\n}\n\n// --- definePlugin ---\n\n/**\n * Define a framework plugin.\n */\nexport function definePlugin(plugin: Plugin): Plugin {\n return plugin;\n}\n\n// --- createApp ---\n\n/**\n * Create an application instance with plugin support.\n *\n * ```ts\n * const app = createApp(App);\n * app.use(authPlugin);\n * app.use(i18nPlugin);\n * app.mount('#app');\n * ```\n */\nexport function createApp<P extends Record<string, unknown>>(\n rootComponent: Component<P>,\n rootProps?: P,\n): AppInstance {\n const plugins: Plugin[] = [];\n const errorHandlers: Array<(error: Error) => void> = [];\n const beforeMountHooks: Array<() => void> = [];\n const appConfig: Record<string, unknown> = {};\n let mountedNode: Node | null = null;\n let containerEl: HTMLElement | null = null;\n\n const pluginCtx: PluginContext = {\n provide<T>(key: InjectionKey<T>, value: T) {\n // Will be called during setup — context scope is active\n provide(key, value);\n },\n onError(handler: (error: Error) => void) {\n errorHandlers.push(handler);\n },\n onBeforeMount(hook: () => void) {\n beforeMountHooks.push(hook);\n },\n config: appConfig,\n };\n\n const app: AppInstance = {\n use(plugin: Plugin) {\n plugins.push(plugin);\n return app;\n },\n\n config(key: string, value: unknown) {\n appConfig[key] = value;\n return app;\n },\n\n mount(selector: string | HTMLElement) {\n containerEl =\n typeof selector === 'string'\n ? document.querySelector<HTMLElement>(selector)\n : selector;\n\n if (!containerEl) {\n throw new Error(\n `[AkashJS] Mount target not found: ${selector}`,\n );\n }\n\n // Run plugin setup\n for (const plugin of plugins) {\n plugin.setup(pluginCtx);\n }\n\n // Run before-mount hooks\n for (const hook of beforeMountHooks) {\n hook();\n }\n\n // Render root component\n try {\n mountedNode = rootComponent((rootProps ?? {}) as any);\n containerEl.appendChild(mountedNode);\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n if (errorHandlers.length > 0) {\n for (const handler of errorHandlers) {\n handler(e);\n }\n } else {\n throw e;\n }\n }\n },\n\n unmount() {\n if (mountedNode && containerEl) {\n containerEl.removeChild(mountedNode);\n mountedNode = null;\n }\n },\n };\n\n return app;\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function a(){let t=new Map;function r(e){let n=t.get(e);return n||(n=new Set,t.set(e,n)),n}return {on(e,n){return r(e).add(n),()=>r(e).delete(n)},once(e,n){let s=o=>{r(e).delete(s),n(o);};return r(e).add(s),()=>r(e).delete(s)},emit(e,n){let s=t.get(e);if(s)for(let o of Array.from(s))o(n);},off(e,n){r(e).delete(n);},clear(e){e?t.delete(e):t.clear();},listenerCount(e){return t.get(e)?.size??0},hasListeners(e){return (t.get(e)?.size??0)>0}}}var d=null;function i(){return d||(d=a()),d}export{a,i as b};//# sourceMappingURL=chunk-IJS2EMSE.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-IJS2EMSE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/event-bus.ts"],"names":["createEventBus","listeners","getSet","event","set","handler","wrapper","data","globalBus","globalEventBus"],"mappings":"AA8DO,SAASA,GAA4E,CAC1F,IAAMC,CAAAA,CAAY,IAAI,IAEtB,SAASC,CAAAA,CAAOC,CAAAA,CAAkC,CAChD,IAAIC,CAAAA,CAAMH,CAAAA,CAAU,GAAA,CAAIE,CAAK,EAC7B,OAAKC,CAAAA,GACHA,CAAAA,CAAM,IAAI,IACVH,CAAAA,CAAU,GAAA,CAAIE,CAAAA,CAAOC,CAAG,GAEnBA,CACT,CAEA,OAAO,CACL,GAA+BD,CAAAA,CAAUE,CAAAA,CAAyC,CAChF,OAAAH,CAAAA,CAAOC,CAAK,CAAA,CAAE,GAAA,CAAIE,CAAuB,CAAA,CAClC,IAAMH,CAAAA,CAAOC,CAAK,CAAA,CAAE,MAAA,CAAOE,CAAuB,CAC3D,CAAA,CAEA,IAAA,CAAiCF,CAAAA,CAAUE,EAAyC,CAClF,IAAMC,EAA+BC,CAAAA,EAAS,CAC5CL,EAAOC,CAAK,CAAA,CAAE,MAAA,CAAOG,CAAuB,EAC5CD,CAAAA,CAAQE,CAAI,EACd,CAAA,CACA,OAAAL,CAAAA,CAAOC,CAAK,CAAA,CAAE,GAAA,CAAIG,CAAuB,CAAA,CAClC,IAAMJ,EAAOC,CAAK,CAAA,CAAE,OAAOG,CAAuB,CAC3D,CAAA,CAEA,IAAA,CAAiCH,EAAUI,CAAAA,CAAkB,CAC3D,IAAMH,CAAAA,CAAMH,EAAU,GAAA,CAAIE,CAAK,CAAA,CAC/B,GAAIC,EACF,IAAA,IAAWC,CAAAA,IAAW,MAAM,IAAA,CAAKD,CAAG,EAClCC,CAAAA,CAAQE,CAAI,EAGlB,CAAA,CAEA,IAAgCJ,CAAAA,CAAUE,CAAAA,CAAmC,CAC3EH,CAAAA,CAAOC,CAAK,CAAA,CAAE,MAAA,CAAOE,CAAuB,EAC9C,EAEA,KAAA,CAAMF,CAAAA,CAAgC,CAChCA,CAAAA,CACFF,CAAAA,CAAU,OAAOE,CAAK,CAAA,CAEtBF,CAAAA,CAAU,KAAA,GAEd,CAAA,CAEA,aAAA,CAAcE,CAAAA,CAAiC,CAC7C,OAAOF,CAAAA,CAAU,GAAA,CAAIE,CAAK,CAAA,EAAG,MAAQ,CACvC,CAAA,CAEA,aAAaA,CAAAA,CAAkC,CAC7C,QAAQF,CAAAA,CAAU,GAAA,CAAIE,CAAK,CAAA,EAAG,MAAQ,CAAA,EAAK,CAC7C,CACF,CACF,CAMA,IAAIK,CAAAA,CAAkC,IAAA,CAe/B,SAASC,GAA4E,CAC1F,OAAKD,IACHA,CAAAA,CAAYR,CAAAA,IAEPQ,CACT","file":"chunk-IJS2EMSE.js","sourcesContent":["/**\n * Event bus — typed pub/sub for cross-component communication.\n *\n * Fire-and-forget events between unrelated components without\n * prop drilling or context coupling.\n *\n * ```ts\n * const bus = createEventBus<{\n * 'user:login': { userId: string };\n * 'cart:updated': { itemCount: number };\n * 'notification': string;\n * }>();\n *\n * // Subscribe\n * bus.on('user:login', ({ userId }) => fetchProfile(userId));\n *\n * // Emit from anywhere\n * bus.emit('user:login', { userId: '123' });\n *\n * // One-time listener\n * bus.once('cart:updated', ({ itemCount }) => showBadge(itemCount));\n * ```\n */\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport type EventMap = Record<string, unknown>;\nexport type EventHandler<T = unknown> = (data: T) => void;\n\nexport interface EventBus<T extends EventMap> {\n /** Subscribe to an event */\n on<K extends keyof T & string>(event: K, handler: EventHandler<T[K]>): () => void;\n /** Subscribe once — auto-removes after first call */\n once<K extends keyof T & string>(event: K, handler: EventHandler<T[K]>): () => void;\n /** Emit an event to all listeners */\n emit<K extends keyof T & string>(event: K, data: T[K]): void;\n /** Remove a specific handler */\n off<K extends keyof T & string>(event: K, handler: EventHandler<T[K]>): void;\n /** Remove all handlers for an event (or all events) */\n clear(event?: keyof T & string): void;\n /** Get listener count for an event */\n listenerCount(event: keyof T & string): number;\n /** Check if an event has listeners */\n hasListeners(event: keyof T & string): boolean;\n}\n\n// =========================================================================\n// createEventBus\n// =========================================================================\n\n/**\n * Create a typed event bus.\n *\n * ```ts\n * const bus = createEventBus<{\n * 'theme:change': 'light' | 'dark';\n * 'toast': { message: string; type: string };\n * }>();\n * ```\n */\nexport function createEventBus<T extends EventMap = Record<string, unknown>>(): EventBus<T> {\n const listeners = new Map<string, Set<EventHandler>>();\n\n function getSet(event: string): Set<EventHandler> {\n let set = listeners.get(event);\n if (!set) {\n set = new Set();\n listeners.set(event, set);\n }\n return set;\n }\n\n return {\n on<K extends keyof T & string>(event: K, handler: EventHandler<T[K]>): () => void {\n getSet(event).add(handler as EventHandler);\n return () => getSet(event).delete(handler as EventHandler);\n },\n\n once<K extends keyof T & string>(event: K, handler: EventHandler<T[K]>): () => void {\n const wrapper: EventHandler<T[K]> = (data) => {\n getSet(event).delete(wrapper as EventHandler);\n handler(data);\n };\n getSet(event).add(wrapper as EventHandler);\n return () => getSet(event).delete(wrapper as EventHandler);\n },\n\n emit<K extends keyof T & string>(event: K, data: T[K]): void {\n const set = listeners.get(event);\n if (set) {\n for (const handler of Array.from(set)) {\n handler(data);\n }\n }\n },\n\n off<K extends keyof T & string>(event: K, handler: EventHandler<T[K]>): void {\n getSet(event).delete(handler as EventHandler);\n },\n\n clear(event?: keyof T & string): void {\n if (event) {\n listeners.delete(event);\n } else {\n listeners.clear();\n }\n },\n\n listenerCount(event: keyof T & string): number {\n return listeners.get(event)?.size ?? 0;\n },\n\n hasListeners(event: keyof T & string): boolean {\n return (listeners.get(event)?.size ?? 0) > 0;\n },\n };\n}\n\n// =========================================================================\n// Global bus singleton\n// =========================================================================\n\nlet globalBus: EventBus<any> | null = null;\n\n/**\n * Get the global event bus (created on first call).\n *\n * ```ts\n * import { globalEventBus } from '@akashjs/runtime';\n *\n * // In component A:\n * globalEventBus().emit('notification', 'Hello!');\n *\n * // In component B:\n * globalEventBus().on('notification', (msg) => show(msg));\n * ```\n */\nexport function globalEventBus<T extends EventMap = Record<string, unknown>>(): EventBus<T> {\n if (!globalBus) {\n globalBus = createEventBus<T>();\n }\n return globalBus as EventBus<T>;\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var chunkPPNEAFKE_cjs=require('./chunk-PPNEAFKE.cjs');var c=Symbol("akash.context"),t=null;function i(e=t){let n={values:new Map,parent:e};return t=n,n}function p(e){t=e.parent;}function l(){return t}function a(e,n){let o=t;t=e;try{return n()}finally{t=o;}}function T(e){return {[c]:true,_type:void 0,defaultValue:e,id:Symbol("context")}}function f(e,n){if(!t)throw chunkPPNEAFKE_cjs.b("AK0010");t.values.set(e.id,n);}function d(e,n){if(!t)throw chunkPPNEAFKE_cjs.b("AK0012");let o=t;for(;o;){if(o.values.has(e.id))return o.values.get(e.id);o=o.parent;}if(n!==void 0)return n;if(e.defaultValue!==void 0)return e.defaultValue;throw chunkPPNEAFKE_cjs.b("AK0013")}exports.a=i;exports.b=p;exports.c=l;exports.d=a;exports.e=T;exports.f=f;exports.g=d;//# sourceMappingURL=chunk-IQGSDFBI.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-IQGSDFBI.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/context.ts"],"names":["CONTEXT_BRAND","currentScope","pushScope","parent","scope","popScope","getCurrentScope","runInScope","fn","prev","createContext","defaultValue","provide","key","value","akashError","inject","fallback"],"mappings":"mEAWA,IAAMA,CAAAA,CAAgB,MAAA,CAAO,eAAe,CAAA,CAgBxCC,EAAoC,IAAA,CAGjC,SAASC,CAAAA,CAAUC,CAAAA,CAA8BF,EAA4B,CAClF,IAAMG,CAAAA,CAAsB,CAAE,OAAQ,IAAI,GAAA,CAAO,MAAA,CAAAD,CAAO,CAAA,CACxD,OAAAF,CAAAA,CAAeG,CAAAA,CACRA,CACT,CAGO,SAASC,CAAAA,CAASD,CAAAA,CAA2B,CAClDH,CAAAA,CAAeG,CAAAA,CAAM,OACvB,CAGO,SAASE,CAAAA,EAAuC,CACrD,OAAOL,CACT,CAOO,SAASM,CAAAA,CAAcH,CAAAA,CAAqBI,EAAgB,CACjE,IAAMC,CAAAA,CAAOR,CAAAA,CACbA,EAAeG,CAAAA,CACf,GAAI,CACF,OAAOI,GACT,CAAA,OAAE,CACAP,CAAAA,CAAeQ,EACjB,CACF,CAWO,SAASC,CAAAA,CAAiBC,EAAmC,CAClE,OAAO,CACL,CAACX,CAAa,EAAG,IAAA,CACjB,KAAA,CAAO,MAAA,CACP,aAAAW,CAAAA,CACA,EAAA,CAAI,MAAA,CAAO,SAAS,CACtB,CACF,CAQO,SAASC,EAAWC,CAAAA,CAAsBC,CAAAA,CAAgB,CAC/D,GAAI,CAACb,CAAAA,CACH,MAAMc,mBAAAA,CAAW,QAAQ,EAE3Bd,CAAAA,CAAa,MAAA,CAAO,GAAA,CAAIY,CAAAA,CAAI,GAAIC,CAAK,EACvC,CASO,SAASE,EAAUH,CAAAA,CAAsBI,CAAAA,CAAiB,CAC/D,GAAI,CAAChB,CAAAA,CACH,MAAMc,mBAAAA,CAAW,QAAQ,EAI3B,IAAIX,CAAAA,CAA6BH,CAAAA,CACjC,KAAOG,CAAAA,EAAO,CACZ,GAAIA,CAAAA,CAAM,OAAO,GAAA,CAAIS,CAAAA,CAAI,EAAE,CAAA,CACzB,OAAOT,CAAAA,CAAM,MAAA,CAAO,GAAA,CAAIS,CAAAA,CAAI,EAAE,CAAA,CAEhCT,CAAAA,CAAQA,CAAAA,CAAM,OAChB,CAGA,GAAIa,CAAAA,GAAa,MAAA,CAAW,OAAOA,EACnC,GAAIJ,CAAAA,CAAI,YAAA,GAAiB,MAAA,CAAW,OAAOA,CAAAA,CAAI,YAAA,CAE/C,MAAME,mBAAAA,CAAW,QAAQ,CAC3B","file":"chunk-IQGSDFBI.cjs","sourcesContent":["/**\n * Lightweight dependency injection via provide/inject.\n *\n * Context is scoped to the component tree — no injector hierarchy,\n * no decorators, no classes. Just createContext(), provide(), inject().\n */\n\n// --- Types ---\n\nimport { akashError } from './errors.js';\n\nconst CONTEXT_BRAND = Symbol('akash.context');\n\nexport interface InjectionKey<T> {\n readonly [CONTEXT_BRAND]: true;\n readonly _type: T; // phantom type — never used at runtime\n readonly defaultValue: T | undefined;\n readonly id: symbol;\n}\n\n// --- Context stack (managed by component system) ---\n\ninterface ContextScope {\n values: Map<symbol, unknown>;\n parent: ContextScope | null;\n}\n\nlet currentScope: ContextScope | null = null;\n\n/** @internal — called by defineComponent to push/pop context scopes */\nexport function pushScope(parent: ContextScope | null = currentScope): ContextScope {\n const scope: ContextScope = { values: new Map(), parent };\n currentScope = scope;\n return scope;\n}\n\n/** @internal */\nexport function popScope(scope: ContextScope): void {\n currentScope = scope.parent;\n}\n\n/** @internal */\nexport function getCurrentScope(): ContextScope | null {\n return currentScope;\n}\n\n/**\n * Run a function within a given scope so that provide/inject\n * work correctly for components created asynchronously\n * (e.g., lazy-loaded route components).\n */\nexport function runInScope<T>(scope: ContextScope, fn: () => T): T {\n const prev = currentScope;\n currentScope = scope;\n try {\n return fn();\n } finally {\n currentScope = prev;\n }\n}\n\n// --- Public API ---\n\n/**\n * Create a typed context key with an optional default value.\n *\n * ```ts\n * const ThemeContext = createContext<'light' | 'dark'>('light');\n * ```\n */\nexport function createContext<T>(defaultValue?: T): InjectionKey<T> {\n return {\n [CONTEXT_BRAND]: true,\n _type: undefined as T,\n defaultValue,\n id: Symbol('context'),\n };\n}\n\n/**\n * Provide a value for a context key in the current component scope.\n * All descendant components can inject() this value.\n *\n * Must be called inside defineComponent() setup.\n */\nexport function provide<T>(key: InjectionKey<T>, value: T): void {\n if (!currentScope) {\n throw akashError('AK0010');\n }\n currentScope.values.set(key.id, value);\n}\n\n/**\n * Inject a value from the nearest ancestor that provided it.\n *\n * Must be called inside defineComponent() setup.\n */\nexport function inject<T>(key: InjectionKey<T>): T;\nexport function inject<T>(key: InjectionKey<T>, fallback: T): T;\nexport function inject<T>(key: InjectionKey<T>, fallback?: T): T {\n if (!currentScope) {\n throw akashError('AK0012');\n }\n\n // Walk up the scope chain\n let scope: ContextScope | null = currentScope;\n while (scope) {\n if (scope.values.has(key.id)) {\n return scope.values.get(key.id) as T;\n }\n scope = scope.parent;\n }\n\n // Check fallback, then default\n if (fallback !== undefined) return fallback;\n if (key.defaultValue !== undefined) return key.defaultValue;\n\n throw akashError('AK0013');\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var r=false,t=null;function m(){return r}function c(e){let{container:n,component:o,props:i={}}=e;r=true,t=document.createTreeWalker(n,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT);try{o(i);}finally{r=false,t=null;}return ()=>{}}function y(e){if(!r||!t)return null;let n=t.nextNode();for(;n;){if(n instanceof HTMLElement&&n.tagName.toLowerCase()===e.toLowerCase())return n;n=t.nextNode();}return null}function H(){if(!r||!t)return null;let e=t.nextNode();for(;e;){if(e instanceof Text)return e;e=t.nextNode();}return null}function T(e){let{target:n,component:o,props:i,rootMargin:p="200px"}=e;if(typeof IntersectionObserver>"u")return c({container:n,component:o,props:i});let s=false,l=new IntersectionObserver(d=>{for(let u of d)u.isIntersecting&&!s&&(l.disconnect(),c({container:n,component:o,props:i}));},{rootMargin:p});return l.observe(n),()=>{s=true,l.disconnect();}}var f="data-akash-hydrate";function x(e=document.body){return Array.from(e.querySelectorAll(`[${f}]`))}export{m as a,c as b,y as c,H as d,T as e,f,x as g};//# sourceMappingURL=chunk-JEYTB4AG.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-JEYTB4AG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hydration.ts"],"names":["isHydrating","hydrateWalker","isHydrationActive","hydrate","options","container","component","props","claimElement","tag","node","claimText","progressiveHydrate","target","rootMargin","disposed","observer","entries","entry","HYDRATE_ATTR","findHydrationBoundaries","root"],"mappings":"AAiBA,IAAIA,CAAAA,CAAc,KAAA,CAEdC,CAAAA,CAAmC,KAGhC,SAASC,CAAAA,EAA6B,CAC3C,OAAOF,CACT,CA8BO,SAASG,CAAAA,CAAQC,CAAAA,CAAqC,CAC3D,GAAM,CAAE,SAAA,CAAAC,CAAAA,CAAW,SAAA,CAAAC,CAAAA,CAAW,KAAA,CAAAC,CAAAA,CAAQ,EAAG,CAAA,CAAIH,EAE7CJ,CAAAA,CAAc,IAAA,CAIdC,CAAAA,CAAgB,QAAA,CAAS,iBACvBI,CAAAA,CACA,UAAA,CAAW,YAAA,CAAe,UAAA,CAAW,SACvC,CAAA,CAEA,GAAI,CAGFC,CAAAA,CAAUC,CAAY,EACxB,CAAA,OAAE,CACAP,CAAAA,CAAc,KAAA,CAEdC,CAAAA,CAAgB,KAClB,CAEA,OAAO,IAAM,CAEb,CACF,CAMO,SAASO,CAAAA,CAAaC,CAAAA,CAAiC,CAC5D,GAAI,CAACT,CAAAA,EAAe,CAACC,CAAAA,CAAe,OAAO,KAE3C,IAAIS,CAAAA,CAAOT,CAAAA,CAAc,QAAA,EAAS,CAClC,KAAOS,CAAAA,EAAM,CACX,GACEA,CAAAA,YAAgB,WAAA,EAChBA,CAAAA,CAAK,OAAA,CAAQ,WAAA,KAAkBD,CAAAA,CAAI,WAAA,EAAY,CAE/C,OAAOC,CAAAA,CAETA,CAAAA,CAAOT,EAAc,QAAA,GACvB,CAEA,OAAO,IACT,CAKO,SAASU,CAAAA,EAAyB,CACvC,GAAI,CAACX,CAAAA,EAAe,CAACC,CAAAA,CAAe,OAAO,IAAA,CAE3C,IAAIS,CAAAA,CAAOT,CAAAA,CAAc,QAAA,EAAS,CAClC,KAAOS,CAAAA,EAAM,CACX,GAAIA,CAAAA,YAAgB,IAAA,CAClB,OAAOA,EAETA,CAAAA,CAAOT,CAAAA,CAAc,QAAA,GACvB,CAEA,OAAO,IACT,CA6BO,SAASW,CAAAA,CAAmBR,CAAAA,CAAgD,CACjF,GAAM,CAAE,MAAA,CAAAS,CAAAA,CAAQ,SAAA,CAAAP,CAAAA,CAAW,KAAA,CAAAC,CAAAA,CAAO,UAAA,CAAAO,EAAa,OAAQ,CAAA,CAAIV,CAAAA,CAE3D,GAAI,OAAO,oBAAA,CAAyB,IAElC,OAAOD,CAAAA,CAAQ,CAAE,SAAA,CAAWU,CAAAA,CAAQ,SAAA,CAAAP,EAAW,KAAA,CAAAC,CAAM,CAAC,CAAA,CAGxD,IAAIQ,CAAAA,CAAW,KAAA,CAETC,CAAAA,CAAW,IAAI,oBAAA,CAClBC,CAAAA,EAAY,CACX,IAAA,IAAWC,CAAAA,IAASD,EACdC,CAAAA,CAAM,cAAA,EAAkB,CAACH,CAAAA,GAC3BC,CAAAA,CAAS,UAAA,GACTb,CAAAA,CAAQ,CAAE,SAAA,CAAWU,CAAAA,CAAQ,SAAA,CAAAP,CAAAA,CAAW,MAAAC,CAAM,CAAC,CAAA,EAGrD,CAAA,CACA,CAAE,UAAA,CAAAO,CAAW,CACf,CAAA,CAEA,OAAAE,CAAAA,CAAS,OAAA,CAAQH,CAAM,CAAA,CAEhB,IAAM,CACXE,CAAAA,CAAW,IAAA,CACXC,CAAAA,CAAS,UAAA,GACX,CACF,CAKO,IAAMG,CAAAA,CAAe,qBAKrB,SAASC,CAAAA,CACdC,EAAoB,QAAA,CAAS,IAAA,CACd,CACf,OAAO,KAAA,CAAM,IAAA,CAAKA,CAAAA,CAAK,gBAAA,CAA8B,CAAA,CAAA,EAAIF,CAAY,CAAA,CAAA,CAAG,CAAC,CAC3E","file":"chunk-JEYTB4AG.js","sourcesContent":["/**\n * Client-side hydration.\n *\n * After SSR delivers HTML, the client needs to \"hydrate\" —\n * walk the existing DOM, attach signal effects, and make it interactive.\n * No new DOM nodes are created during hydration.\n *\n * Supports progressive hydration via IntersectionObserver:\n * components hydrate lazily when they enter the viewport.\n */\n\nimport { signal, effect } from './signals.js';\nimport type { Component } from './component.js';\nimport type { AkashNode } from './types.js';\n\n// --- Hydration state ---\n\nlet isHydrating = false;\nlet hydrateRoot: Node | null = null;\nlet hydrateWalker: TreeWalker | null = null;\n\n/** Check if we're currently hydrating (vs. fresh rendering) */\nexport function isHydrationActive(): boolean {\n return isHydrating;\n}\n\n// --- Hydration context ---\n\nexport interface HydrateOptions {\n /** The root DOM element (rendered by SSR) */\n container: HTMLElement;\n /** The root component to hydrate */\n component: Component<any>;\n /** Props to pass to the root component */\n props?: Record<string, unknown>;\n}\n\n/**\n * Hydrate a server-rendered DOM tree.\n *\n * Walks the existing DOM instead of creating new nodes,\n * attaching signal effects to existing elements.\n *\n * ```ts\n * import { hydrate } from '@akashjs/runtime';\n * import App from './App.akash';\n *\n * hydrate({\n * container: document.getElementById('app')!,\n * component: App,\n * props: { title: 'Home' },\n * });\n * ```\n */\nexport function hydrate(options: HydrateOptions): () => void {\n const { container, component, props = {} } = options;\n\n isHydrating = true;\n hydrateRoot = container;\n\n // Create a tree walker to traverse the existing DOM\n hydrateWalker = document.createTreeWalker(\n container,\n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT,\n );\n\n try {\n // Run the component — during hydration, DOM creation helpers\n // will claim existing nodes instead of creating new ones\n component(props as any);\n } finally {\n isHydrating = false;\n hydrateRoot = null;\n hydrateWalker = null;\n }\n\n return () => {\n // Cleanup — dispose all hydration effects\n };\n}\n\n/**\n * Claim the next DOM node during hydration.\n * Instead of creating a new element, returns the existing one.\n */\nexport function claimElement(tag: string): HTMLElement | null {\n if (!isHydrating || !hydrateWalker) return null;\n\n let node = hydrateWalker.nextNode();\n while (node) {\n if (\n node instanceof HTMLElement &&\n node.tagName.toLowerCase() === tag.toLowerCase()\n ) {\n return node;\n }\n node = hydrateWalker.nextNode();\n }\n\n return null;\n}\n\n/**\n * Claim the next text node during hydration.\n */\nexport function claimText(): Text | null {\n if (!isHydrating || !hydrateWalker) return null;\n\n let node = hydrateWalker.nextNode();\n while (node) {\n if (node instanceof Text) {\n return node;\n }\n node = hydrateWalker.nextNode();\n }\n\n return null;\n}\n\n// --- Progressive hydration ---\n\nexport interface ProgressiveHydrateOptions {\n /** CSS selector or element to observe */\n target: HTMLElement;\n /** Component to hydrate when visible */\n component: Component<any>;\n /** Props */\n props?: Record<string, unknown>;\n /** IntersectionObserver root margin (default: '200px') */\n rootMargin?: string;\n}\n\n/**\n * Hydrate a component lazily when it enters the viewport.\n *\n * Uses IntersectionObserver to detect when the SSR placeholder\n * becomes visible, then runs full hydration.\n *\n * ```ts\n * progressiveHydrate({\n * target: document.querySelector('[data-hydrate=\"comments\"]')!,\n * component: Comments,\n * props: { postId: 123 },\n * });\n * ```\n */\nexport function progressiveHydrate(options: ProgressiveHydrateOptions): () => void {\n const { target, component, props, rootMargin = '200px' } = options;\n\n if (typeof IntersectionObserver === 'undefined') {\n // Fallback: hydrate immediately if IO is not available\n return hydrate({ container: target, component, props });\n }\n\n let disposed = false;\n\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting && !disposed) {\n observer.disconnect();\n hydrate({ container: target, component, props });\n }\n }\n },\n { rootMargin },\n );\n\n observer.observe(target);\n\n return () => {\n disposed = true;\n observer.disconnect();\n };\n}\n\n// --- Hydrate boundary marker ---\n\n/** Data attribute used to mark hydration boundaries in SSR HTML */\nexport const HYDRATE_ATTR = 'data-akash-hydrate';\n\n/**\n * Find all hydration boundaries in the document.\n */\nexport function findHydrationBoundaries(\n root: HTMLElement = document.body,\n): HTMLElement[] {\n return Array.from(root.querySelectorAll<HTMLElement>(`[${HYDRATE_ATTR}]`));\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
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)}export{E as a,F as b};//# sourceMappingURL=chunk-JFLZJPVN.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-JFLZJPVN.js.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-JFLZJPVN.js","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"]}
|