@akashjs/runtime 0.2.2 → 0.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/a11y.cjs +2 -0
- package/dist/a11y.cjs.map +1 -0
- package/dist/a11y.d.cts +99 -0
- package/dist/a11y.d.ts +99 -0
- package/dist/a11y.js +2 -0
- package/dist/a11y.js.map +1 -0
- package/dist/async-component.cjs +2 -0
- package/dist/async-component.cjs.map +1 -0
- package/dist/async-component.d.cts +44 -0
- package/dist/async-component.d.ts +44 -0
- package/dist/async-component.js +2 -0
- package/dist/async-component.js.map +1 -0
- package/dist/await-block.cjs +2 -0
- package/dist/await-block.cjs.map +1 -0
- package/dist/await-block.d.cts +37 -0
- package/dist/await-block.d.ts +37 -0
- package/dist/await-block.js +2 -0
- package/dist/await-block.js.map +1 -0
- package/dist/browser.cjs +2 -0
- package/dist/browser.cjs.map +1 -0
- package/dist/browser.d.cts +125 -0
- package/dist/browser.d.ts +125 -0
- package/dist/browser.js +2 -0
- package/dist/browser.js.map +1 -0
- package/dist/chunk-2HLDEWRT.cjs +2 -0
- package/dist/chunk-2HLDEWRT.cjs.map +1 -0
- package/dist/chunk-2LKFIID7.cjs +2 -0
- package/dist/chunk-2LKFIID7.cjs.map +1 -0
- package/dist/chunk-34PQECMN.cjs +2 -0
- package/dist/chunk-34PQECMN.cjs.map +1 -0
- package/dist/chunk-36VM3RJW.cjs +2 -0
- package/dist/chunk-36VM3RJW.cjs.map +1 -0
- package/dist/chunk-3PGU24B5.cjs +3 -0
- package/dist/chunk-3PGU24B5.cjs.map +1 -0
- package/dist/chunk-3XREYIJH.cjs +2 -0
- package/dist/chunk-3XREYIJH.cjs.map +1 -0
- package/dist/chunk-45DPEU7T.cjs +2 -0
- package/dist/chunk-45DPEU7T.cjs.map +1 -0
- package/dist/chunk-4J3QBQVW.js +4 -0
- package/dist/chunk-4J3QBQVW.js.map +1 -0
- package/dist/{chunk-NVZLEJXB.cjs → chunk-4NQEIKH5.cjs} +2 -2
- package/dist/{chunk-NVZLEJXB.cjs.map → chunk-4NQEIKH5.cjs.map} +1 -1
- package/dist/chunk-5QCWH6QA.cjs +4 -0
- package/dist/chunk-5QCWH6QA.cjs.map +1 -0
- package/dist/chunk-6O46EMQS.cjs +2 -0
- package/dist/chunk-6O46EMQS.cjs.map +1 -0
- package/dist/chunk-7IJUJUXE.cjs +2 -0
- package/dist/chunk-7IJUJUXE.cjs.map +1 -0
- package/dist/chunk-7UX5CSGZ.cjs +2 -0
- package/dist/chunk-7UX5CSGZ.cjs.map +1 -0
- package/dist/chunk-7VBH4F3P.js +2 -0
- package/dist/chunk-7VBH4F3P.js.map +1 -0
- package/dist/chunk-7ZPSYZHD.cjs +2 -0
- package/dist/chunk-7ZPSYZHD.cjs.map +1 -0
- package/dist/chunk-AOFLE33X.js +5 -0
- package/dist/chunk-AOFLE33X.js.map +1 -0
- package/dist/chunk-AQQQVDBQ.cjs +2 -0
- package/dist/chunk-AQQQVDBQ.cjs.map +1 -0
- package/dist/chunk-AXB5GHGO.js +2 -0
- package/dist/chunk-AXB5GHGO.js.map +1 -0
- package/dist/chunk-AZCELE44.cjs +2 -0
- package/dist/chunk-AZCELE44.cjs.map +1 -0
- package/dist/chunk-BB7P6HTR.js +2 -0
- package/dist/chunk-BB7P6HTR.js.map +1 -0
- package/dist/chunk-BGSF77LF.js +2 -0
- package/dist/chunk-BGSF77LF.js.map +1 -0
- package/dist/chunk-BHP3UTTQ.cjs +3 -0
- package/dist/chunk-BHP3UTTQ.cjs.map +1 -0
- package/dist/chunk-CP6SK2B4.js +2 -0
- package/dist/chunk-CP6SK2B4.js.map +1 -0
- package/dist/chunk-DFYXFKCH.cjs +2 -0
- package/dist/chunk-DFYXFKCH.cjs.map +1 -0
- package/dist/chunk-DHFVVFZF.cjs +2 -0
- package/dist/chunk-DHFVVFZF.cjs.map +1 -0
- package/dist/chunk-DP7G45QM.cjs +13 -0
- package/dist/chunk-DP7G45QM.cjs.map +1 -0
- package/dist/chunk-E6RB7PRO.js +2 -0
- package/dist/chunk-E6RB7PRO.js.map +1 -0
- package/dist/chunk-F4FXIPR3.js +2 -0
- package/dist/chunk-F4FXIPR3.js.map +1 -0
- package/dist/chunk-F6VSSM2P.js +2 -0
- package/dist/chunk-F6VSSM2P.js.map +1 -0
- package/dist/chunk-FUVSCPU4.cjs +2 -0
- package/dist/chunk-FUVSCPU4.cjs.map +1 -0
- package/dist/chunk-FVF3T4JJ.js +2 -0
- package/dist/chunk-FVF3T4JJ.js.map +1 -0
- package/dist/chunk-FVWHMFX6.cjs +5 -0
- package/dist/chunk-FVWHMFX6.cjs.map +1 -0
- package/dist/chunk-IHEW6F2H.js +2 -0
- package/dist/chunk-IHEW6F2H.js.map +1 -0
- package/dist/chunk-IJS2EMSE.js +2 -0
- package/dist/chunk-IJS2EMSE.js.map +1 -0
- package/dist/chunk-IKVHLORY.cjs +11 -0
- package/dist/chunk-IKVHLORY.cjs.map +1 -0
- package/dist/chunk-IQGSDFBI.cjs +2 -0
- package/dist/chunk-IQGSDFBI.cjs.map +1 -0
- package/dist/chunk-J6KDUWX6.cjs +2 -0
- package/dist/chunk-J6KDUWX6.cjs.map +1 -0
- package/dist/chunk-JD3LDHUI.cjs +2 -0
- package/dist/chunk-JD3LDHUI.cjs.map +1 -0
- package/dist/chunk-JEYTB4AG.js +2 -0
- package/dist/chunk-JEYTB4AG.js.map +1 -0
- package/dist/chunk-JFLZJPVN.js +2 -0
- package/dist/chunk-JFLZJPVN.js.map +1 -0
- package/dist/chunk-JLPJ22CE.js +2 -0
- package/dist/chunk-JLPJ22CE.js.map +1 -0
- package/dist/chunk-JQCN42XX.js +2 -0
- package/dist/chunk-JQCN42XX.js.map +1 -0
- package/dist/chunk-K2HB5VFA.cjs +2 -0
- package/dist/chunk-K2HB5VFA.cjs.map +1 -0
- package/dist/chunk-K7TMUF3F.cjs +2 -0
- package/dist/chunk-K7TMUF3F.cjs.map +1 -0
- package/dist/chunk-KE7BJTCD.js +2 -0
- package/dist/chunk-KE7BJTCD.js.map +1 -0
- package/dist/chunk-KMEGUPH2.js +3 -0
- package/dist/chunk-KMEGUPH2.js.map +1 -0
- package/dist/chunk-KUPL3ZVD.js +2 -0
- package/dist/chunk-KUPL3ZVD.js.map +1 -0
- package/dist/chunk-L3ZZX36S.js +2 -0
- package/dist/chunk-L3ZZX36S.js.map +1 -0
- package/dist/chunk-LD4C62JY.cjs +2 -0
- package/dist/chunk-LD4C62JY.cjs.map +1 -0
- package/dist/chunk-LWQPLKL6.cjs +20 -0
- package/dist/chunk-LWQPLKL6.cjs.map +1 -0
- package/dist/chunk-M5IACTFC.cjs +17 -0
- package/dist/chunk-M5IACTFC.cjs.map +1 -0
- package/dist/chunk-MADMPRT2.js +20 -0
- package/dist/chunk-MADMPRT2.js.map +1 -0
- package/dist/chunk-MDHWM3C2.js +2 -0
- package/dist/chunk-MDHWM3C2.js.map +1 -0
- package/dist/chunk-N3ITIHHM.js +5 -0
- package/dist/chunk-N3ITIHHM.js.map +1 -0
- package/dist/chunk-N5APNCPB.js +2 -0
- package/dist/chunk-N5APNCPB.js.map +1 -0
- package/dist/chunk-NBYFHJWB.js +36 -0
- package/dist/chunk-NBYFHJWB.js.map +1 -0
- package/dist/chunk-NCXMNJUN.js +2 -0
- package/dist/chunk-NCXMNJUN.js.map +1 -0
- package/dist/chunk-NEQ5TENE.cjs +2 -0
- package/dist/chunk-NEQ5TENE.cjs.map +1 -0
- package/dist/chunk-NGU2W4PD.cjs +2 -0
- package/dist/chunk-NGU2W4PD.cjs.map +1 -0
- package/dist/chunk-NHDYQTC5.cjs +36 -0
- package/dist/chunk-NHDYQTC5.cjs.map +1 -0
- package/dist/chunk-NJXXC5JB.js +2 -0
- package/dist/chunk-NJXXC5JB.js.map +1 -0
- package/dist/chunk-NQEY7DR5.cjs +2 -0
- package/dist/chunk-NQEY7DR5.cjs.map +1 -0
- package/dist/chunk-OQV3NYDH.js +3 -0
- package/dist/chunk-OQV3NYDH.js.map +1 -0
- package/dist/chunk-OZ4GNBKA.js +2 -0
- package/dist/chunk-OZ4GNBKA.js.map +1 -0
- package/dist/chunk-PPNEAFKE.cjs +5 -0
- package/dist/chunk-PPNEAFKE.cjs.map +1 -0
- package/dist/chunk-PYASLKWF.js +2 -0
- package/dist/chunk-PYASLKWF.js.map +1 -0
- package/dist/chunk-Q6S7SUOM.js +2 -0
- package/dist/chunk-Q6S7SUOM.js.map +1 -0
- package/dist/chunk-QE2TJ6P5.cjs +2 -0
- package/dist/chunk-QE2TJ6P5.cjs.map +1 -0
- package/dist/chunk-QNVMBXVH.js +2 -0
- package/dist/chunk-QNVMBXVH.js.map +1 -0
- package/dist/chunk-QQ725EZL.js +2 -0
- package/dist/chunk-QQ725EZL.js.map +1 -0
- package/dist/chunk-QQTZQ6UX.cjs +2 -0
- package/dist/chunk-QQTZQ6UX.cjs.map +1 -0
- package/dist/chunk-QSPRVXFV.cjs +2 -0
- package/dist/chunk-QSPRVXFV.cjs.map +1 -0
- package/dist/chunk-QTQ6RUX4.cjs +5 -0
- package/dist/chunk-QTQ6RUX4.cjs.map +1 -0
- package/dist/chunk-R65RPMQX.cjs +2 -0
- package/dist/chunk-R65RPMQX.cjs.map +1 -0
- package/dist/chunk-R7NUVVHP.js +2 -0
- package/dist/{chunk-Z5LQV5ND.js.map → chunk-R7NUVVHP.js.map} +1 -1
- package/dist/chunk-SXYPAP4B.js +2 -0
- package/dist/chunk-SXYPAP4B.js.map +1 -0
- package/dist/chunk-T2RVAQEU.js +2 -0
- package/dist/chunk-T2RVAQEU.js.map +1 -0
- package/dist/chunk-T7A5YOEG.cjs +2 -0
- package/dist/chunk-T7A5YOEG.cjs.map +1 -0
- package/dist/chunk-TDKDZ3QJ.cjs +2 -0
- package/dist/chunk-TDKDZ3QJ.cjs.map +1 -0
- package/dist/chunk-TFEHO7SF.cjs +2 -0
- package/dist/chunk-TFEHO7SF.cjs.map +1 -0
- package/dist/chunk-TSFY5HKB.js +17 -0
- package/dist/chunk-TSFY5HKB.js.map +1 -0
- package/dist/chunk-TYTEJYUQ.cjs +2 -0
- package/dist/chunk-TYTEJYUQ.cjs.map +1 -0
- package/dist/chunk-TZHEZW6R.js +11 -0
- package/dist/chunk-TZHEZW6R.js.map +1 -0
- package/dist/chunk-U65WRXZC.js +13 -0
- package/dist/chunk-U65WRXZC.js.map +1 -0
- package/dist/chunk-UT4MWGJ3.js +2 -0
- package/dist/chunk-UT4MWGJ3.js.map +1 -0
- package/dist/chunk-V2JDKH3W.cjs +2 -0
- package/dist/chunk-V2JDKH3W.cjs.map +1 -0
- package/dist/chunk-VNDSKBXQ.cjs +2 -0
- package/dist/chunk-VNDSKBXQ.cjs.map +1 -0
- package/dist/chunk-VO4FCKHM.js +2 -0
- package/dist/chunk-VO4FCKHM.js.map +1 -0
- package/dist/chunk-VUMMC2P5.js +2 -0
- package/dist/chunk-VUMMC2P5.js.map +1 -0
- package/dist/chunk-VUSNUBNI.js +2 -0
- package/dist/chunk-VUSNUBNI.js.map +1 -0
- package/dist/chunk-VWTULWXF.js +2 -0
- package/dist/chunk-VWTULWXF.js.map +1 -0
- package/dist/chunk-VX7PSSOU.js +5 -0
- package/dist/chunk-VX7PSSOU.js.map +1 -0
- package/dist/chunk-WLSXJU2N.js +13 -0
- package/dist/chunk-WLSXJU2N.js.map +1 -0
- package/dist/chunk-WOZWFMOK.cjs +2 -0
- package/dist/chunk-WOZWFMOK.cjs.map +1 -0
- package/dist/chunk-WTDTVWCQ.cjs +2 -0
- package/dist/chunk-WTDTVWCQ.cjs.map +1 -0
- package/dist/chunk-WZ5ULION.js +2 -0
- package/dist/chunk-WZ5ULION.js.map +1 -0
- package/dist/chunk-XPLIEN2G.cjs +13 -0
- package/dist/chunk-XPLIEN2G.cjs.map +1 -0
- package/dist/chunk-XWVNLE2W.cjs +2 -0
- package/dist/chunk-XWVNLE2W.cjs.map +1 -0
- package/dist/chunk-XZR3J626.cjs +2 -0
- package/dist/chunk-XZR3J626.cjs.map +1 -0
- package/dist/chunk-YDO5KARN.js +2 -0
- package/dist/chunk-YDO5KARN.js.map +1 -0
- package/dist/chunk-YURIYBTN.cjs +2 -0
- package/dist/chunk-YURIYBTN.cjs.map +1 -0
- package/dist/chunk-YXKQTEPR.js +2 -0
- package/dist/chunk-YXKQTEPR.js.map +1 -0
- package/dist/chunk-Z6K4FYG6.js +2 -0
- package/dist/chunk-Z6K4FYG6.js.map +1 -0
- package/dist/chunk-ZJULEDLY.js +2 -0
- package/dist/chunk-ZJULEDLY.js.map +1 -0
- package/dist/{component-C1WnFcRp.d.ts → component-CPVtkASo.d.ts} +2 -3
- package/dist/{component-C1WnFcRp.d.cts → component-CxlupKuc.d.cts} +2 -3
- package/dist/composables.cjs +2 -0
- package/dist/composables.cjs.map +1 -0
- package/dist/composables.d.cts +103 -0
- package/dist/composables.d.ts +103 -0
- package/dist/composables.js +2 -0
- package/dist/composables.js.map +1 -0
- package/dist/{context-2uQ6fuxu.d.ts → context-Cwt7QCpk.d.cts} +1 -9
- package/dist/{context-2uQ6fuxu.d.cts → 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-3WRM6GKM.js +57 -0
- package/dist/devtools-overlay-3WRM6GKM.js.map +1 -0
- package/dist/devtools-overlay-WJGSIB4N.cjs +57 -0
- package/dist/devtools-overlay-WJGSIB4N.cjs.map +1 -0
- 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 +51 -3152
- package/dist/index.d.ts +51 -3152
- 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 +3 -1
- package/dist/offline.d.ts +3 -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 +6 -2
- package/dist/pwa.d.ts +6 -2
- 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 +33 -30
- package/dist/store.d.ts +33 -30
- 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 +60 -5
- package/dist/sync.d.ts +60 -5
- package/dist/sync.js +1 -1
- package/dist/test.cjs +4 -4
- package/dist/test.cjs.map +1 -1
- package/dist/test.d.cts +74 -5
- package/dist/test.d.ts +74 -5
- package/dist/test.js +4 -4
- 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-3AL2DVPZ.cjs +0 -13
- package/dist/chunk-3AL2DVPZ.cjs.map +0 -1
- package/dist/chunk-6NX6JRSV.cjs +0 -32
- package/dist/chunk-6NX6JRSV.cjs.map +0 -1
- package/dist/chunk-BT6HNBE7.js +0 -5
- package/dist/chunk-BT6HNBE7.js.map +0 -1
- package/dist/chunk-D6QQYZIC.js +0 -2
- package/dist/chunk-D6QQYZIC.js.map +0 -1
- package/dist/chunk-H4SAK7A5.cjs +0 -2
- package/dist/chunk-H4SAK7A5.cjs.map +0 -1
- package/dist/chunk-IKZMC3T6.js +0 -2
- package/dist/chunk-IKZMC3T6.js.map +0 -1
- package/dist/chunk-IM2VW4TK.js +0 -32
- package/dist/chunk-IM2VW4TK.js.map +0 -1
- package/dist/chunk-NQVWTQ2I.cjs +0 -5
- package/dist/chunk-NQVWTQ2I.cjs.map +0 -1
- package/dist/chunk-ODDXU5DO.js +0 -2
- package/dist/chunk-ODDXU5DO.js.map +0 -1
- package/dist/chunk-POLTPHUA.js +0 -13
- package/dist/chunk-POLTPHUA.js.map +0 -1
- package/dist/chunk-YIB4EKVI.cjs +0 -2
- package/dist/chunk-YIB4EKVI.cjs.map +0 -1
- package/dist/chunk-YJQLXUTN.cjs +0 -2
- package/dist/chunk-YJQLXUTN.cjs.map +0 -1
- package/dist/chunk-Z5LQV5ND.js +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/dom.ts","../src/component.ts"],"names":["createElement","tag","attrs","el","key","value","setProperty","createText","cloneTemplate","html","template","event","bindText","node","fn","effect","bindProperty","bindVisible","createAnchor","label","renderConditional","parent","anchor","condition","trueBranch","falseBranch","current","scope","getCurrentScope","dispose","branch","liveParent","fragment","runInScope","nodes","renderList","items","keyFn","renderItem","currentItems","newData","newItems","oldMap","item","i","data","existing","firstNode","realParent","Show","props","container","getWhen","whenValue","nodeToDOM","For","getEach","index","child","insert","domNode","__getter","currentHooks","onMount","akashError","onUnmount","onError","ref","initialValue","defineComponent","setup","component","rawProps","childrenProp","restProps","ctx","hooks","prevHooks","parentScope","pushScope","renderFn","untrack","rendered","err","popScope","handler","mountFn","cleanup"],"mappings":"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","file":"chunk-KE7BJTCD.js","sourcesContent":["/**\n * Direct DOM rendering runtime.\n *\n * No virtual DOM. The compiler generates calls to these helpers.\n * Signal reads inside templates become fine-grained effects that\n * update only the specific DOM node that changed.\n */\n\nimport { effect } from './signals.js';\nimport { getCurrentScope, runInScope } from './context.js';\nimport type { AkashNode } from './types.js';\n\n// --- DOM creation helpers (used by compiler output) ---\n\n/** Create an element and optionally set static attributes */\nexport function createElement(\n tag: string,\n attrs?: Record<string, unknown>,\n): HTMLElement {\n const el = document.createElement(tag);\n if (attrs) {\n for (const [key, value] of Object.entries(attrs)) {\n setProperty(el, key, value);\n }\n }\n return el;\n}\n\n/** Create a text node */\nexport function createText(value: string): Text {\n return document.createTextNode(value);\n}\n\n/** Clone a template element for static structure */\nexport function cloneTemplate(html: string): DocumentFragment {\n const template = document.createElement('template');\n template.innerHTML = html;\n return template.content.cloneNode(true) as DocumentFragment;\n}\n\n// --- Property/attribute setting ---\n\nexport function setProperty(el: HTMLElement, key: string, value: unknown): void {\n if (key === 'class' || key === 'className') {\n el.className = value as string;\n } else if (key === 'style' && typeof value === 'object' && value !== null) {\n Object.assign(el.style, value);\n } else if (key === 'innerHTML') {\n el.innerHTML = value as string;\n } else if (key === 'ref') {\n // Handled separately by component system\n } else if (key.startsWith('on')) {\n const event = key.slice(2).toLowerCase();\n el.addEventListener(event, value as EventListener);\n } else if (key in el) {\n (el as unknown as Record<string, unknown>)[key] = value;\n } else if (value === false || value == null) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, value === true ? '' : String(value));\n }\n}\n\n// --- Reactive binding (used by compiler for dynamic expressions) ---\n\n/** Bind a reactive expression to a text node's content */\nexport function bindText(node: Text, fn: () => unknown): () => void {\n return effect(\n () => {\n node.textContent = String(fn());\n },\n { render: true },\n );\n}\n\n/** Bind a reactive expression to an element's attribute/property */\nexport function bindProperty(\n el: HTMLElement,\n key: string,\n fn: () => unknown,\n): () => void {\n return effect(\n () => {\n setProperty(el, key, fn());\n },\n { render: true },\n );\n}\n\n/** Bind a reactive expression to an element's visibility (display) */\nexport function bindVisible(el: HTMLElement, fn: () => boolean): () => void {\n return effect(\n () => {\n el.style.display = fn() ? '' : 'none';\n },\n { render: true },\n );\n}\n\n// --- Conditional rendering ---\n\n/** Anchor node — comment for normal DOM, hidden element for table contexts */\ntype Anchor = Comment | HTMLElement;\n\n/** Table elements where comment nodes get relocated by the browser */\nconst TABLE_TAGS = new Set(['TABLE', 'THEAD', 'TBODY', 'TFOOT', 'TR']);\n\nfunction createAnchor(label = ''): Anchor {\n return document.createComment(label);\n}\n\n/**\n * Create a table-safe anchor. Browsers relocate comment nodes inside\n * table elements, breaking anchor-based insertion. Use a hidden element instead.\n */\nfunction createTableSafeAnchor(parent: Node): Anchor {\n if (parent instanceof HTMLElement && TABLE_TAGS.has(parent.tagName)) {\n const tag = parent.tagName === 'TR' ? 'td' : 'tr';\n const el = document.createElement(tag);\n el.style.display = 'none';\n return el;\n }\n return document.createComment('');\n}\n\ninterface ConditionalBlock {\n nodes: Node[];\n dispose: (() => void) | null;\n}\n\n/**\n * Render a conditional block. Swaps DOM fragments based on a reactive\n * condition. Used by the compiler for :if directives and <Show>.\n */\nexport function renderConditional(\n parent: Node,\n anchor: Node,\n condition: () => boolean,\n trueBranch: () => Node,\n falseBranch?: () => Node,\n): () => void {\n let current: ConditionalBlock | null = null;\n\n // Capture scope so children created in branches inherit provide/inject context\n const scope = getCurrentScope();\n\n const dispose = effect(\n () => {\n const value = condition();\n\n // Remove old nodes\n if (current) {\n for (const node of current.nodes) {\n try { node.parentNode?.removeChild(node); } catch {}\n }\n current.dispose?.();\n current = null;\n }\n\n // Insert new nodes — use anchor.parentNode since the anchor may have\n // moved from the initial DocumentFragment into the real DOM.\n // In table contexts, the browser may relocate comment anchors.\n const branch = value ? trueBranch : falseBranch;\n let liveParent: Node | null = anchor.parentNode;\n if (!liveParent && (current as ConditionalBlock | null)?.nodes[0]?.parentNode) {\n liveParent = (current as ConditionalBlock | null)!.nodes[0].parentNode;\n }\n if (branch && liveParent) {\n const fragment = scope ? runInScope(scope, branch) : branch();\n const nodes = fragment instanceof DocumentFragment\n ? Array.from(fragment.childNodes)\n : [fragment];\n for (const node of nodes) {\n liveParent.insertBefore(node, anchor);\n }\n current = { nodes, dispose: null };\n }\n },\n { render: true },\n );\n\n return () => {\n dispose();\n if (current) {\n for (const node of current.nodes) {\n try { node.parentNode?.removeChild(node); } catch {}\n }\n current.dispose?.();\n }\n };\n}\n\n// --- List rendering ---\n\ninterface ListItem<T> {\n key: unknown;\n value: T;\n nodes: Node[];\n dispose: (() => void) | null;\n}\n\n/**\n * Render a reactive list with keyed reconciliation.\n * Used by the compiler for :for directives and <For>.\n */\nexport function renderList<T>(\n parent: Node,\n anchor: Node,\n items: () => T[],\n keyFn: (item: T, index: number) => unknown,\n renderItem: (item: T, index: number) => Node,\n): () => void {\n let currentItems: ListItem<T>[] = [];\n\n // Capture scope so children created in renderItem inherit provide/inject context\n const scope = getCurrentScope();\n\n const dispose = effect(\n () => {\n const newData = items();\n const newItems: ListItem<T>[] = [];\n const oldMap = new Map<unknown, ListItem<T>>();\n\n for (const item of currentItems) {\n oldMap.set(item.key, item);\n }\n\n // Build new list, reuse existing DOM nodes when keys match\n for (let i = 0; i < newData.length; i++) {\n const data = newData[i];\n const key = keyFn(data, i);\n const existing = oldMap.get(key);\n\n if (existing) {\n oldMap.delete(key);\n // If the reused item's nodes were detached (e.g., parent removed them),\n // treat as new to avoid stale DOM references\n const firstNode = existing.nodes[0];\n if (firstNode && !firstNode.parentNode) {\n // Nodes were detached — create fresh\n const fragment = scope ? runInScope(scope, () => renderItem(data, i)) : renderItem(data, i);\n const nodes = fragment instanceof DocumentFragment\n ? Array.from(fragment.childNodes)\n : [fragment];\n newItems.push({ key, value: data, nodes, dispose: null });\n } else {\n existing.value = data;\n newItems.push(existing);\n }\n } else {\n const fragment = scope ? runInScope(scope, () => renderItem(data, i)) : renderItem(data, i);\n const nodes = fragment instanceof DocumentFragment\n ? Array.from(fragment.childNodes)\n : [fragment];\n newItems.push({ key, value: data, nodes, dispose: null });\n }\n }\n\n // Remove items that are no longer in the list\n for (const item of oldMap.values()) {\n for (const node of item.nodes) {\n if (node.parentNode) node.parentNode.removeChild(node);\n }\n item.dispose?.();\n }\n\n // Reconcile DOM order — insertBefore moves existing nodes, inserts new ones\n const liveParent = anchor.parentNode;\n if (liveParent) {\n // Normal path — anchor is in the DOM, insert before it\n for (const item of newItems) {\n for (const node of item.nodes) {\n liveParent.insertBefore(node, anchor);\n }\n }\n } else {\n // Table fallback — browser relocated the comment anchor.\n // Find the real parent from any node still in the DOM.\n let realParent: Node | null = null;\n for (const item of currentItems) {\n if (item.nodes[0]?.parentNode) { realParent = item.nodes[0].parentNode; break; }\n }\n if (realParent) {\n // Remove old nodes first (oldMap items already removed above)\n // Then append all new items\n for (const item of newItems) {\n for (const node of item.nodes) {\n realParent.appendChild(node);\n }\n }\n }\n }\n\n currentItems = newItems;\n },\n { render: true },\n );\n\n return () => {\n dispose();\n for (const item of currentItems) {\n for (const node of item.nodes) {\n if (node.parentNode) node.parentNode.removeChild(node);\n }\n item.dispose?.();\n }\n currentItems = [];\n };\n}\n\n// --- Built-in control flow components ---\n\n/** Props for the <Show> component */\nexport interface ShowProps<T> {\n when: (() => T | null | undefined | false) | T | null | undefined | false;\n fallback?: () => AkashNode;\n children: (value: T) => AkashNode;\n}\n\n/**\n * <Show> component — conditionally renders children with type narrowing.\n * The children callback receives the non-null/undefined value.\n * `when` can be a reactive getter or a static value.\n */\nexport function Show<T>(props: ShowProps<T>): Node {\n const anchor = createAnchor('show');\n const container = document.createDocumentFragment();\n container.appendChild(anchor);\n\n // Resolve when — if it's a function, always call it (supports both\n // compiler-generated __reactive getters and plain programmatic functions)\n const getWhen = typeof props.when === 'function'\n ? props.when as () => T | null | undefined | false\n : () => props.when as T | null | undefined | false;\n\n // Capture the when value once per evaluation so the condition check\n // and the children callback receive the same value (fixes nested For contexts)\n let whenValue: T | null | undefined | false;\n renderConditional(\n container,\n anchor,\n () => { whenValue = getWhen(); return !!whenValue; },\n () => nodeToDOM(props.children(whenValue as T)),\n props.fallback ? () => nodeToDOM(props.fallback!()) : undefined,\n );\n\n return container;\n}\n\n/** Props for the <For> component */\nexport interface ForProps<T> {\n each: (() => T[]) | T[];\n key: (item: T) => unknown;\n children: (item: T, index: number) => AkashNode;\n}\n\n/**\n * <For> component — renders a list with keyed reconciliation.\n * `each` can be a reactive getter or a static array.\n */\nexport function For<T>(props: ForProps<T>): Node {\n const anchor = createAnchor('for');\n const container = document.createDocumentFragment();\n container.appendChild(anchor);\n\n // Resolve each — if it's a function, always call it (supports both\n // compiler-generated __reactive getters and plain programmatic functions)\n const getEach = typeof props.each === 'function'\n ? props.each as () => T[]\n : () => props.each as T[];\n\n renderList(\n container,\n anchor,\n getEach,\n props.key,\n (item, index) => nodeToDOM(props.children(item, index)),\n );\n\n return container;\n}\n\n// --- Helpers ---\n\n/** Convert an AkashNode to a DOM Node */\nexport function nodeToDOM(node: AkashNode): Node {\n if (node == null || typeof node === 'boolean') {\n return document.createTextNode('');\n }\n if (typeof node === 'string' || typeof node === 'number') {\n return document.createTextNode(String(node));\n }\n if (node instanceof Node) {\n return node;\n }\n if (Array.isArray(node)) {\n const fragment = document.createDocumentFragment();\n for (const child of node) {\n fragment.appendChild(nodeToDOM(child));\n }\n return fragment;\n }\n return document.createTextNode(String(node));\n}\n\n/** Insert a node into a parent before an anchor */\nexport function insert(parent: Node, node: AkashNode, anchor?: Node): void {\n const domNode = nodeToDOM(node);\n if (anchor) {\n parent.insertBefore(domNode, anchor);\n } else {\n parent.appendChild(domNode);\n }\n}\n","/**\n * Component system.\n *\n * Components are functions. defineComponent() wraps a setup function\n * that runs once, establishes signals and effects, and returns a\n * render function that produces DOM nodes.\n */\n\nimport { effect, untrack } from './signals.js';\nimport { pushScope, popScope, getCurrentScope } from './context.js';\nimport { nodeToDOM } from './dom.js';\nimport { akashError } from './errors.js';\nimport type { AkashNode } from './types.js';\n\n// --- Reactive getter marker (used by compiler) ---\n\n/** Mark a function as a compiler-generated reactive getter */\nexport function __getter<T>(fn: () => T): (() => T) & { __reactive: true } {\n (fn as any).__reactive = true;\n return fn as any;\n}\n\n// --- Types ---\n\nexport interface Ref<T = HTMLElement> {\n current: T | undefined;\n}\n\nexport interface ComponentContext<P extends Record<string, unknown> = Record<string, unknown>> {\n props: Readonly<P>;\n children: () => AkashNode;\n}\n\nexport type Component<P extends Record<string, unknown> = Record<string, unknown>> = {\n (props: P & { children?: AkashNode | (() => AkashNode) }): Node;\n _akash: true;\n};\n\n// --- Lifecycle hook storage ---\n\ninterface LifecycleHooks {\n mount: Array<() => void | (() => void)>;\n unmount: Array<() => void>;\n error: Array<(error: Error) => void>;\n}\n\nlet currentHooks: LifecycleHooks | null = null;\n\n// --- Public lifecycle hooks ---\n\n/**\n * Register a callback to run after the component is mounted to the DOM.\n * If the callback returns a function, it will be called on unmount (cleanup).\n */\nexport function onMount(fn: () => void | (() => void)): void {\n if (!currentHooks) {\n throw akashError('AK0020');\n }\n currentHooks.mount.push(fn);\n}\n\n/**\n * Register a callback to run before the component is unmounted.\n */\nexport function onUnmount(fn: () => void): void {\n if (!currentHooks) {\n throw akashError('AK0021');\n }\n currentHooks.unmount.push(fn);\n}\n\n/**\n * Register an error handler for this component and its descendants.\n */\nexport function onError(fn: (error: Error) => void): void {\n if (!currentHooks) {\n throw akashError('AK0022');\n }\n currentHooks.error.push(fn);\n}\n\n/**\n * Create a ref for accessing a DOM element or storing a mutable value.\n */\nexport function ref<T = HTMLElement>(initialValue?: T): Ref<T> {\n return { current: initialValue as T | undefined };\n}\n\n// --- defineComponent ---\n\n/**\n * Define a component. The setup function runs once per instance.\n * It receives a context with typed props and must return a render function.\n *\n * ```ts\n * const Counter = defineComponent<{ initial: number }>((ctx) => {\n * const count = signal(ctx.props.initial);\n * return () => <div>{count()}</div>;\n * });\n * ```\n */\nexport function defineComponent<P extends Record<string, any> = Record<string, any>>(\n setup: (ctx: ComponentContext<P>) => () => AkashNode,\n): Component<P> {\n const component = (rawProps: P & { children?: AkashNode | (() => AkashNode) }): Node => {\n // Separate children from props, unwrap getter functions for reactivity\n const { children: childrenProp, ...restProps } = rawProps ?? {};\n // Props are passed through as-is — no auto-unwrapping.\n // Components use readProp() to unwrap reactive getters/signals inside\n // effects, which preserves dependency tracking. Auto-unwrapping in the\n // Proxy broke reactivity because it called the getter once and returned\n // the plain value, so effects never subscribed to the underlying signal.\n const props = restProps as unknown as P;\n\n const childrenFn: () => AkashNode =\n typeof childrenProp === 'function'\n ? childrenProp\n : () => childrenProp ?? null;\n\n const ctx: ComponentContext<P> = {\n props,\n children: childrenFn,\n };\n\n // Set up lifecycle hooks collector\n const hooks: LifecycleHooks = { mount: [], unmount: [], error: [] };\n const prevHooks = currentHooks;\n currentHooks = hooks;\n\n // Push context scope for provide/inject\n const parentScope = getCurrentScope();\n const scope = pushScope(parentScope);\n\n let renderFn: () => AkashNode;\n let domNode: Node;\n\n try {\n // Untrack component creation so that signals created inside the component\n // don't register with a parent render effect. This prevents parent effects\n // from re-running (and re-creating the entire component) when internal\n // component state changes. The component's own effects still track their\n // dependencies because effect() sets its own subscriber during execution.\n domNode = untrack(() => {\n renderFn = setup(ctx);\n if (typeof renderFn !== 'function') { throw akashError('AK0040'); }\n const rendered = renderFn();\n return nodeToDOM(rendered);\n });\n } catch (err) {\n popScope(scope);\n currentHooks = prevHooks;\n if (hooks.error.length > 0) {\n for (const handler of hooks.error) {\n handler(err instanceof Error ? err : new Error(String(err)));\n }\n return document.createComment('error');\n }\n throw err;\n }\n\n // Restore parent state\n popScope(scope);\n currentHooks = prevHooks;\n\n // Run mount callbacks (microtask to ensure DOM is attached)\n if (hooks.mount.length > 0) {\n queueMicrotask(() => {\n for (const mountFn of hooks.mount) {\n try {\n const cleanup = mountFn();\n if (typeof cleanup === 'function') {\n hooks.unmount.push(cleanup);\n }\n } catch (err) {\n for (const handler of hooks.error) {\n handler(err instanceof Error ? err : new Error(String(err)));\n }\n }\n }\n });\n }\n\n return domNode;\n };\n\n component._akash = true as const;\n return component as Component<P>;\n}\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
var b=new Set(["a","abbr","address","article","aside","b","bdi","bdo","blockquote","br","caption","cite","code","col","colgroup","dd","del","details","dfn","div","dl","dt","em","figcaption","figure","footer","h1","h2","h3","h4","h5","h6","header","hr","i","img","ins","kbd","li","main","mark","nav","ol","p","pre","q","rp","rt","ruby","s","samp","section","small","span","strong","sub","summary","sup","table","tbody","td","tfoot","th","thead","time","tr","u","ul","var","wbr"]),S=new Set(["alt","class","dir","href","id","lang","name","rel","src","style","tabindex","target","title","type","width","height","colspan","rowspan","scope","loading","decoding"]),w=/^(javascript|data|vbscript):/i,A=/^on/i;function O(e,n={}){if(typeof document>"u")return e.replace(/<[^>]*>/g,"");let{allowTags:r=[],allowAttrs:t=[],allowDataAttrs:o=true,allowAriaAttrs:s=true,allowStyle:i=false,tagFilter:a,attrFilter:u}=n,c=new Set([...b,...r]),f=new Set([...S,...t]);i||f.delete("style");let d=new DOMParser().parseFromString(e,"text/html");return h(d.body,c,f,o,s,a,u),d.body.innerHTML}function h(e,n,r,t,o,s,i){let a=Array.from(e.childNodes);for(let u of a)if(u.nodeType===Node.ELEMENT_NODE){let c=u,f=c.tagName.toLowerCase();if(!(s?s(f):n.has(f))){let l=document.createTextNode(c.textContent??"");e.replaceChild(l,u);continue}let y=Array.from(c.attributes);for(let l of y){let p=l.name.toLowerCase(),g=l.value;if(A.test(p)){c.removeAttribute(l.name);continue}if(!(p.startsWith("data-")&&t)&&!(p.startsWith("aria-")&&o)){if(i&&!i(p,g,f)){c.removeAttribute(l.name);continue}if(!r.has(p)){c.removeAttribute(l.name);continue}if((p==="href"||p==="src")&&w.test(g)){c.removeAttribute(l.name);continue}}}h(c,n,r,t,o,s,i);}}function v(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function k(e,n){return r=>{e.innerHTML=O(r,n);}}function P(e={}){let r={...{"default-src":["'self'"],"script-src":["'self'"],"style-src":["'self'","'unsafe-inline'"],"img-src":["'self'","data:","https:"],"font-src":["'self'","https:"],"connect-src":["'self'"],"frame-ancestors":["'none'"],"base-uri":["'self'"],"form-action":["'self'"],"object-src":["'none'"]},...e.directives};if(e.nonce){let t=`'nonce-${e.nonce}'`;r["script-src"]&&r["script-src"].push(t),r["style-src"]&&r["style-src"].push(t);}return e.reportUri&&(r["report-uri"]=[e.reportUri]),Object.entries(r).map(([t,o])=>`${t} ${o.join(" ")}`).join("; ")}function T(e={}){return e.reportOnly?"Content-Security-Policy-Report-Only":"Content-Security-Policy"}function E(e={}){let n={};if(e.csp!==false){let r=e.csp??{};n[T(r)]=P(r);}if(e.frameOptions!==false&&(n["X-Frame-Options"]=e.frameOptions??"DENY"),e.contentTypeOptions!==false&&(n["X-Content-Type-Options"]="nosniff"),n["X-XSS-Protection"]=e.xssProtection?"1; mode=block":"0",e.hsts!==false){let r=e.hsts??{maxAge:31536e3,includeSubDomains:true},t=`max-age=${r.maxAge}`;r.includeSubDomains&&(t+="; includeSubDomains"),r.preload&&(t+="; preload"),n["Strict-Transport-Security"]=t;}if(e.referrerPolicy!==false&&(n["Referrer-Policy"]=e.referrerPolicy??"strict-origin-when-cross-origin"),e.permissionsPolicy!==false){let r=e.permissionsPolicy??{camera:[],microphone:[],geolocation:[],payment:[]};n["Permissions-Policy"]=Object.entries(r).map(([t,o])=>`${t}=(${o.join(" ")})`).join(", ");}return e.coop!==false&&(n["Cross-Origin-Opener-Policy"]=e.coop??"same-origin"),e.coep!==false&&(n["Cross-Origin-Embedder-Policy"]=e.coep??"require-corp"),n}function x(e,...n){let r=new Set(["__proto__","constructor","prototype"]);for(let t of n)if(!(!t||typeof t!="object"))for(let o of Object.keys(t)){if(r.has(o))continue;let s=e[o],i=t[o];m(i)&&m(s)?e[o]=x({...s},i):e[o]=i;}return e}function R(e){if(e===null||typeof e!="object")return e;Object.freeze(e);for(let n of Object.values(e))typeof n=="object"&&n!==null&&R(n);return e}function m(e){return e!==null&&typeof e=="object"&&Object.getPrototypeOf(e)===Object.prototype}async function N(e,n="sha384"){let t=new TextEncoder().encode(e),o=n==="sha256"?"SHA-256":n==="sha384"?"SHA-384":"SHA-512",s=await crypto.subtle.digest(o,t),i=new Uint8Array(s),a=btoa(String.fromCharCode(...i));return `${n}-${a}`}function C(){let e=new Uint8Array(32);return crypto.getRandomValues(e),Array.from(e,n=>n.toString(16).padStart(2,"0")).join("")}function D(e={}){let{headerName:n="X-CSRF-Token",cookieName:r="csrf-token",tokenGenerator:t=C}=e,o=null;function s(){if(!o){if(typeof document<"u"){let a=document.cookie.match(new RegExp(`${r}=([^;]+)`));if(a)return o=a[1],o}o=t();}return o}return {interceptor:async(a,u)=>{let c=a.method.toUpperCase();return ["POST","PUT","PATCH","DELETE"].includes(c)&&a.headers.set(n,s()),u(a)},token:s,refresh(){o=t();}}}function H(e,n={}){if(e==null)return null;let{allowedHosts:r,allowedProtocols:t=["http:","https:"],allowRelative:o=true}=n;if(e.startsWith("/")&&!e.startsWith("//"))return o?e:null;try{let s=new URL(e);return !t.includes(s.protocol)||r&&!r.includes(s.hostname)?null:s.toString()}catch{return null}}function j(e){let{maxAttempts:n,windowMs:r}=e,t=[];return {check(){let o=Date.now();for(;t.length>0&&t[0]<o-r;)t.shift();return t.length>=n?false:(t.push(o),true)},remaining(){let o=Date.now();for(;t.length>0&&t[0]<o-r;)t.shift();return Math.max(0,n-t.length)},reset(){t.length=0;}}}
|
|
2
|
+
export{O as a,v as b,k as c,P as d,T as e,E as f,x as g,R as h,N as i,C as j,D as k,H as l,j as m};//# sourceMappingURL=chunk-KMEGUPH2.js.map
|
|
3
|
+
//# sourceMappingURL=chunk-KMEGUPH2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/security.ts"],"names":["SAFE_TAGS","SAFE_ATTRS","DANGEROUS_PROTOCOLS","DANGEROUS_ATTRS","sanitize","html","options","allowTags","allowAttrs","allowDataAttrs","allowAriaAttrs","allowStyle","tagFilter","attrFilter","allowedTags","allowedAttrs","doc","sanitizeNode","node","children","child","el","tag","text","attrs","attr","name","value","escapeHtml","str","createSafeHTML","generateCSP","config","directives","nonceValue","key","values","getCSPHeaderName","generateSecurityHeaders","headers","cspConfig","hsts","policy","safeMerge","target","sources","DANGEROUS_KEYS","source","targetVal","sourceVal","isPlainObject","deepFreeze","obj","val","generateSRI","content","algorithm","data","hashAlgo","hashBuffer","hashArray","base64","generateCSRFToken","array","b","createCSRFInterceptor","headerName","cookieName","tokenGenerator","token","getToken","match","request","next","method","sanitizeURL","url","allowedHosts","allowedProtocols","allowRelative","parsed","createRateLimiter","maxAttempts","windowMs","attempts","now"],"mappings":"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","file":"chunk-KMEGUPH2.js","sourcesContent":["/**\n * Security module — built-in protection for AkashJS apps.\n *\n * Auto-sanitization, CSP support, prototype pollution prevention,\n * and secure defaults. AkashJS is secure by default.\n */\n\n// =========================================================================\n// HTML Sanitizer — DOMPurify-style, zero dependencies\n// =========================================================================\n\n/** Tags allowed by default in sanitized HTML */\nconst SAFE_TAGS = new Set([\n 'a', 'abbr', 'address', 'article', 'aside', 'b', 'bdi', 'bdo',\n 'blockquote', 'br', 'caption', 'cite', 'code', 'col', 'colgroup',\n 'dd', 'del', 'details', 'dfn', 'div', 'dl', 'dt', 'em', 'figcaption',\n 'figure', 'footer', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header',\n 'hr', 'i', 'img', 'ins', 'kbd', 'li', 'main', 'mark', 'nav', 'ol',\n 'p', 'pre', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'section', 'small',\n 'span', 'strong', 'sub', 'summary', 'sup', 'table', 'tbody', 'td',\n 'tfoot', 'th', 'thead', 'time', 'tr', 'u', 'ul', 'var', 'wbr',\n]);\n\n/** Attributes allowed by default */\nconst SAFE_ATTRS = new Set([\n 'alt', 'class', 'dir', 'href', 'id', 'lang', 'name', 'rel',\n 'src', 'style', 'tabindex', 'target', 'title', 'type', 'width',\n 'height', 'colspan', 'rowspan', 'scope', 'loading', 'decoding',\n]);\n\n/** Dangerous URL protocols */\nconst DANGEROUS_PROTOCOLS = /^(javascript|data|vbscript):/i;\n\n/** Dangerous attribute names (event handlers) */\nconst DANGEROUS_ATTRS = /^on/i;\n\nexport interface SanitizeOptions {\n /** Additional allowed tags */\n allowTags?: string[];\n /** Additional allowed attributes */\n allowAttrs?: string[];\n /** Allow data-* attributes (default: true) */\n allowDataAttrs?: boolean;\n /** Allow aria-* attributes (default: true) */\n allowAriaAttrs?: boolean;\n /** Allow style attribute (default: false) */\n allowStyle?: boolean;\n /** Custom tag filter */\n tagFilter?: (tag: string) => boolean;\n /** Custom attribute filter */\n attrFilter?: (attr: string, value: string, tag: string) => boolean;\n}\n\n/**\n * Sanitize HTML string — remove dangerous tags, attributes, and URLs.\n *\n * ```ts\n * const safe = sanitize(userInput);\n * el.innerHTML = safe; // Safe from XSS\n *\n * // With options:\n * const safe = sanitize(html, { allowTags: ['iframe'], allowStyle: true });\n * ```\n */\nexport function sanitize(html: string, options: SanitizeOptions = {}): string {\n if (typeof document === 'undefined') {\n // SSR fallback — strip all tags\n return html.replace(/<[^>]*>/g, '');\n }\n\n const {\n allowTags = [],\n allowAttrs = [],\n allowDataAttrs = true,\n allowAriaAttrs = true,\n allowStyle = false,\n tagFilter,\n attrFilter,\n } = options;\n\n const allowedTags = new Set([...SAFE_TAGS, ...allowTags]);\n const allowedAttrs = new Set([...SAFE_ATTRS, ...allowAttrs]);\n\n if (!allowStyle) allowedAttrs.delete('style');\n\n // Parse HTML using browser's parser\n const doc = new DOMParser().parseFromString(html, 'text/html');\n sanitizeNode(doc.body, allowedTags, allowedAttrs, allowDataAttrs, allowAriaAttrs, tagFilter, attrFilter);\n\n return doc.body.innerHTML;\n}\n\nfunction sanitizeNode(\n node: Node,\n allowedTags: Set<string>,\n allowedAttrs: Set<string>,\n allowDataAttrs: boolean,\n allowAriaAttrs: boolean,\n tagFilter?: (tag: string) => boolean,\n attrFilter?: (attr: string, value: string, tag: string) => boolean,\n): void {\n const children = Array.from(node.childNodes);\n\n for (const child of children) {\n if (child.nodeType === Node.ELEMENT_NODE) {\n const el = child as Element;\n const tag = el.tagName.toLowerCase();\n\n // Check if tag is allowed\n const isAllowed = tagFilter ? tagFilter(tag) : allowedTags.has(tag);\n\n if (!isAllowed) {\n // Replace dangerous element with its text content\n const text = document.createTextNode(el.textContent ?? '');\n node.replaceChild(text, child);\n continue;\n }\n\n // Sanitize attributes\n const attrs = Array.from(el.attributes);\n for (const attr of attrs) {\n const name = attr.name.toLowerCase();\n const value = attr.value;\n\n // Always remove event handlers\n if (DANGEROUS_ATTRS.test(name)) {\n el.removeAttribute(attr.name);\n continue;\n }\n\n // Check data-* and aria-*\n if (name.startsWith('data-') && allowDataAttrs) continue;\n if (name.startsWith('aria-') && allowAriaAttrs) continue;\n\n // Custom filter\n if (attrFilter && !attrFilter(name, value, tag)) {\n el.removeAttribute(attr.name);\n continue;\n }\n\n // Check if attribute is allowed\n if (!allowedAttrs.has(name)) {\n el.removeAttribute(attr.name);\n continue;\n }\n\n // Sanitize URLs\n if ((name === 'href' || name === 'src') && DANGEROUS_PROTOCOLS.test(value)) {\n el.removeAttribute(attr.name);\n continue;\n }\n }\n\n // Recurse into children\n sanitizeNode(el, allowedTags, allowedAttrs, allowDataAttrs, allowAriaAttrs, tagFilter, attrFilter);\n }\n }\n}\n\n/**\n * Escape HTML entities — prevents XSS in text content.\n */\nexport function escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\n/**\n * Create a safe HTML setter that sanitizes automatically.\n *\n * ```ts\n * const setHTML = createSafeHTML(el);\n * setHTML(userContent); // Auto-sanitized\n * ```\n */\nexport function createSafeHTML(el: HTMLElement, options?: SanitizeOptions): (html: string) => void {\n return (html: string) => {\n el.innerHTML = sanitize(html, options);\n };\n}\n\n// =========================================================================\n// CSP (Content Security Policy) Support\n// =========================================================================\n\nexport interface CSPConfig {\n /** Nonce for inline scripts/styles */\n nonce?: string;\n /** Report-only mode (default: false) */\n reportOnly?: boolean;\n /** Report URI for CSP violations */\n reportUri?: string;\n /** Custom directives */\n directives?: Record<string, string[]>;\n}\n\n/**\n * Generate a CSP header string.\n *\n * ```ts\n * const csp = generateCSP({\n * nonce: 'abc123',\n * directives: {\n * 'script-src': [\"'self'\"],\n * 'style-src': [\"'self'\", \"'unsafe-inline'\"],\n * 'img-src': [\"'self'\", 'data:', 'https:'],\n * },\n * });\n * // \"script-src 'self' 'nonce-abc123'; style-src 'self' 'unsafe-inline'; ...\"\n * ```\n */\nexport function generateCSP(config: CSPConfig = {}): string {\n const defaults: Record<string, string[]> = {\n 'default-src': [\"'self'\"],\n 'script-src': [\"'self'\"],\n 'style-src': [\"'self'\", \"'unsafe-inline'\"],\n 'img-src': [\"'self'\", 'data:', 'https:'],\n 'font-src': [\"'self'\", 'https:'],\n 'connect-src': [\"'self'\"],\n 'frame-ancestors': [\"'none'\"],\n 'base-uri': [\"'self'\"],\n 'form-action': [\"'self'\"],\n 'object-src': [\"'none'\"],\n };\n\n const directives = { ...defaults, ...config.directives };\n\n // Add nonce\n if (config.nonce) {\n const nonceValue = `'nonce-${config.nonce}'`;\n if (directives['script-src']) {\n directives['script-src'].push(nonceValue);\n }\n if (directives['style-src']) {\n directives['style-src'].push(nonceValue);\n }\n }\n\n // Add report-uri\n if (config.reportUri) {\n directives['report-uri'] = [config.reportUri];\n }\n\n return Object.entries(directives)\n .map(([key, values]) => `${key} ${values.join(' ')}`)\n .join('; ');\n}\n\n/**\n * Get the CSP header name based on config.\n */\nexport function getCSPHeaderName(config: CSPConfig = {}): string {\n return config.reportOnly\n ? 'Content-Security-Policy-Report-Only'\n : 'Content-Security-Policy';\n}\n\n// =========================================================================\n// Security Headers (Helmet-like)\n// =========================================================================\n\nexport interface SecurityHeadersConfig {\n /** Content Security Policy (false to disable) */\n csp?: CSPConfig | false;\n /** X-Frame-Options (default: 'DENY') */\n frameOptions?: 'DENY' | 'SAMEORIGIN' | false;\n /** X-Content-Type-Options (default: 'nosniff') */\n contentTypeOptions?: boolean;\n /** X-XSS-Protection (default: '0' — let CSP handle it) */\n xssProtection?: boolean;\n /** Strict-Transport-Security */\n hsts?: { maxAge: number; includeSubDomains?: boolean; preload?: boolean } | false;\n /** Referrer-Policy (default: 'strict-origin-when-cross-origin') */\n referrerPolicy?: string | false;\n /** Permissions-Policy */\n permissionsPolicy?: Record<string, string[]> | false;\n /** Cross-Origin-Opener-Policy */\n coop?: 'same-origin' | 'same-origin-allow-popups' | 'unsafe-none' | false;\n /** Cross-Origin-Embedder-Policy */\n coep?: 'require-corp' | 'credentialless' | 'unsafe-none' | false;\n}\n\n/**\n * Generate security headers for SSR responses.\n *\n * ```ts\n * const headers = generateSecurityHeaders();\n * // Apply to your server response\n * for (const [name, value] of Object.entries(headers)) {\n * res.setHeader(name, value);\n * }\n * ```\n */\nexport function generateSecurityHeaders(config: SecurityHeadersConfig = {}): Record<string, string> {\n const headers: Record<string, string> = {};\n\n // CSP\n if (config.csp !== false) {\n const cspConfig = config.csp ?? {};\n headers[getCSPHeaderName(cspConfig)] = generateCSP(cspConfig);\n }\n\n // X-Frame-Options\n if (config.frameOptions !== false) {\n headers['X-Frame-Options'] = config.frameOptions ?? 'DENY';\n }\n\n // X-Content-Type-Options\n if (config.contentTypeOptions !== false) {\n headers['X-Content-Type-Options'] = 'nosniff';\n }\n\n // X-XSS-Protection (disabled by default — CSP is better)\n headers['X-XSS-Protection'] = config.xssProtection ? '1; mode=block' : '0';\n\n // HSTS\n if (config.hsts !== false) {\n const hsts = config.hsts ?? { maxAge: 31536000, includeSubDomains: true };\n let value = `max-age=${hsts.maxAge}`;\n if (hsts.includeSubDomains) value += '; includeSubDomains';\n if (hsts.preload) value += '; preload';\n headers['Strict-Transport-Security'] = value;\n }\n\n // Referrer-Policy\n if (config.referrerPolicy !== false) {\n headers['Referrer-Policy'] = config.referrerPolicy ?? 'strict-origin-when-cross-origin';\n }\n\n // Permissions-Policy\n if (config.permissionsPolicy !== false) {\n const policy = config.permissionsPolicy ?? {\n camera: [],\n microphone: [],\n geolocation: [],\n 'payment': [],\n };\n headers['Permissions-Policy'] = Object.entries(policy)\n .map(([key, values]) => `${key}=(${values.join(' ')})`)\n .join(', ');\n }\n\n // COOP\n if (config.coop !== false) {\n headers['Cross-Origin-Opener-Policy'] = config.coop ?? 'same-origin';\n }\n\n // COEP\n if (config.coep !== false) {\n headers['Cross-Origin-Embedder-Policy'] = config.coep ?? 'require-corp';\n }\n\n return headers;\n}\n\n// =========================================================================\n// Prototype Pollution Prevention\n// =========================================================================\n\n/**\n * Safe deep merge that prevents prototype pollution.\n * Will not set __proto__, constructor, or prototype keys.\n *\n * ```ts\n * const result = safeMerge(defaults, userConfig);\n * ```\n */\nexport function safeMerge<T extends Record<string, unknown>>(\n target: T,\n ...sources: Partial<T>[]\n): T {\n const DANGEROUS_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\n for (const source of sources) {\n if (!source || typeof source !== 'object') continue;\n\n for (const key of Object.keys(source)) {\n if (DANGEROUS_KEYS.has(key)) continue;\n\n const targetVal = (target as any)[key];\n const sourceVal = (source as any)[key];\n\n if (isPlainObject(sourceVal) && isPlainObject(targetVal)) {\n (target as any)[key] = safeMerge({ ...targetVal }, sourceVal);\n } else {\n (target as any)[key] = sourceVal;\n }\n }\n }\n\n return target;\n}\n\n/**\n * Freeze an object deeply — prevents any modification.\n */\nexport function deepFreeze<T>(obj: T): Readonly<T> {\n if (obj === null || typeof obj !== 'object') return obj;\n Object.freeze(obj);\n for (const value of Object.values(obj)) {\n if (typeof value === 'object' && value !== null) {\n deepFreeze(value);\n }\n }\n return obj;\n}\n\nfunction isPlainObject(val: unknown): val is Record<string, unknown> {\n return val !== null && typeof val === 'object' && Object.getPrototypeOf(val) === Object.prototype;\n}\n\n// =========================================================================\n// Subresource Integrity (SRI)\n// =========================================================================\n\n/**\n * Generate SRI hash for a script/style resource.\n * For use in <script integrity=\"...\"> and <link integrity=\"...\">.\n *\n * ```ts\n * // In Node.js build script:\n * const hash = await generateSRI(fileContent);\n * // 'sha384-...'\n * ```\n */\nexport async function generateSRI(content: string, algorithm: 'sha256' | 'sha384' | 'sha512' = 'sha384'): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(content);\n\n const hashAlgo = algorithm === 'sha256' ? 'SHA-256' : algorithm === 'sha384' ? 'SHA-384' : 'SHA-512';\n const hashBuffer = await crypto.subtle.digest(hashAlgo, data);\n const hashArray = new Uint8Array(hashBuffer);\n const base64 = btoa(String.fromCharCode(...hashArray));\n\n return `${algorithm}-${base64}`;\n}\n\n// =========================================================================\n// CSRF Protection\n// =========================================================================\n\n/**\n * Generate a CSRF token.\n */\nexport function generateCSRFToken(): string {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n return Array.from(array, (b) => b.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Create an HTTP interceptor that attaches CSRF tokens.\n *\n * ```ts\n * const csrf = createCSRFInterceptor();\n * const http = createHttpClient({ interceptors: [csrf.interceptor] });\n * // Token is auto-attached to every mutation request\n * ```\n */\nexport function createCSRFInterceptor(options: {\n headerName?: string;\n cookieName?: string;\n tokenGenerator?: () => string;\n} = {}) {\n const {\n headerName = 'X-CSRF-Token',\n cookieName = 'csrf-token',\n tokenGenerator = generateCSRFToken,\n } = options;\n\n let token: string | null = null;\n\n function getToken(): string {\n if (!token) {\n // Try to read from cookie\n if (typeof document !== 'undefined') {\n const match = document.cookie.match(new RegExp(`${cookieName}=([^;]+)`));\n if (match) {\n token = match[1];\n return token;\n }\n }\n // Generate new token\n token = tokenGenerator();\n }\n return token;\n }\n\n const interceptor = async (request: Request, next: (req: Request) => Promise<Response>): Promise<Response> => {\n const method = request.method.toUpperCase();\n // Only attach to mutating requests\n if (['POST', 'PUT', 'PATCH', 'DELETE'].includes(method)) {\n request.headers.set(headerName, getToken());\n }\n return next(request);\n };\n\n return {\n interceptor,\n token: getToken,\n refresh() { token = tokenGenerator(); },\n };\n}\n\n// =========================================================================\n// Input Validation\n// =========================================================================\n\n/**\n * Validate and sanitize a URL — prevent open redirect attacks.\n *\n * ```ts\n * const safe = sanitizeURL(userInput, { allowedHosts: ['example.com'] });\n * if (safe) window.location.href = safe;\n * ```\n */\nexport function sanitizeURL(url: string, options: {\n allowedHosts?: string[];\n allowedProtocols?: string[];\n allowRelative?: boolean;\n} = {}): string | null {\n if (url == null) return null;\n\n const {\n allowedHosts,\n allowedProtocols = ['http:', 'https:'],\n allowRelative = true,\n } = options;\n\n // Relative URLs\n if (url.startsWith('/') && !url.startsWith('//')) {\n return allowRelative ? url : null;\n }\n\n try {\n const parsed = new URL(url);\n\n // Check protocol\n if (!allowedProtocols.includes(parsed.protocol)) return null;\n\n // Check host\n if (allowedHosts && !allowedHosts.includes(parsed.hostname)) return null;\n\n return parsed.toString();\n } catch {\n return null;\n }\n}\n\n/**\n * Rate limiter for client-side actions (e.g., form submissions).\n *\n * ```ts\n * const limiter = createRateLimiter({ maxAttempts: 5, windowMs: 60000 });\n * if (!limiter.check()) {\n * toast.error('Too many attempts. Please wait.');\n * return;\n * }\n * ```\n */\nexport function createRateLimiter(options: {\n maxAttempts: number;\n windowMs: number;\n}) {\n const { maxAttempts, windowMs } = options;\n const attempts: number[] = [];\n\n return {\n check(): boolean {\n const now = Date.now();\n // Remove old attempts\n while (attempts.length > 0 && attempts[0] < now - windowMs) {\n attempts.shift();\n }\n if (attempts.length >= maxAttempts) return false;\n attempts.push(now);\n return true;\n },\n remaining(): number {\n const now = Date.now();\n while (attempts.length > 0 && attempts[0] < now - windowMs) {\n attempts.shift();\n }\n return Math.max(0, maxAttempts - attempts.length);\n },\n reset(): void {\n attempts.length = 0;\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {s,l}from'./chunk-KE7BJTCD.js';import {c}from'./chunk-YXKQTEPR.js';function j(t,e={}){let{trigger:n="viewport",loading:r,error:i,prefetch:u=false,minLoadTime:l$1=0,rootMargin:b="200px"}=e,f=null,a=null,c$1=null;function g(){if(a)return a;let p=Date.now();return a=t().then(async o=>{let d=Date.now()-p;l$1>0&&d<l$1&&await new Promise(v=>setTimeout(v,l$1-d)),f=o.default;}).catch(o=>{c$1=o instanceof Error?o:new Error(String(o));}),a}return u&&g(),s(p=>{let o=c("idle");async function v(){o()==="idle"&&(o.set("loading"),await g(),o.set(c$1?"error":"ready"));}return ()=>{let s=document.createElement("div");s.style.display="contents";let m=o();return m==="ready"&&f?(s.appendChild(f(p.props)),s):m==="error"&&i&&c$1?(s.appendChild(l(i(c$1))),s):(r&&m==="loading"&&s.appendChild(l(r())),m==="idle"&&w(s,n,v,b).then(C=>{}),s)}})}async function w(t,e,n,r){return e==="immediate"?(n(),()=>{}):e==="viewport"?E(t,n,r):e==="interaction"||e==="hover"?P(t,n,e):e==="idle"?L(n):typeof e=="object"&&e.type==="timer"?k(n,e.delay):typeof e=="object"&&e.type==="custom"?D(n,e.condition):(n(),()=>{})}function E(t,e,n){if(typeof IntersectionObserver>"u")return e(),()=>{};let r=new IntersectionObserver(i=>{i[0]?.isIntersecting&&(r.disconnect(),e());},{rootMargin:n});return requestAnimationFrame(()=>r.observe(t)),()=>r.disconnect()}function P(t,e,n){let r=n==="hover"?["mouseenter","focusin"]:["click","mouseenter","focusin","touchstart"],i=()=>{for(let u of r)t.removeEventListener(u,i);e();};for(let u of r)t.addEventListener(u,i,{once:true,passive:true});return ()=>{for(let u of r)t.removeEventListener(u,i);}}function L(t){if(typeof requestIdleCallback<"u"){let n=requestIdleCallback(()=>t());return ()=>cancelIdleCallback(n)}let e=setTimeout(t,200);return ()=>clearTimeout(e)}function k(t,e){let n=setTimeout(t,e);return ()=>clearTimeout(n)}function D(t,e){let n=()=>{e()?t():requestAnimationFrame(n);};return requestAnimationFrame(n),()=>{}}export{j as a};//# sourceMappingURL=chunk-KUPL3ZVD.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-KUPL3ZVD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/defer.ts"],"names":["defer","loader","options","trigger","loadingFn","errorFn","prefetch","minLoadTime","rootMargin","resolvedComp","loadPromise","loadError","startLoad","start","mod","elapsed","r","err","defineComponent","ctx","state","signal","triggerLoad","container","s","nodeToDOM","setupTrigger","cleanup","el","load","setupViewportTrigger","setupInteractionTrigger","setupIdleTrigger","setupTimerTrigger","setupCustomTrigger","observer","entries","type","events","handler","event","id","timer","delay","condition","check"],"mappings":"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","file":"chunk-KUPL3ZVD.js","sourcesContent":["/**\n * Deferred loading with triggers.\n *\n * Lazy-load components based on viewport visibility, user interaction,\n * idle time, timer, hover, or custom conditions.\n *\n * ```ts\n * const LazyComments = defer(() => import('./Comments.akash'), {\n * trigger: 'viewport',\n * loading: () => <Skeleton variant=\"text\" />,\n * });\n *\n * const LazyChart = defer(() => import('./Chart.akash'), {\n * trigger: 'idle',\n * loading: () => <Spinner />,\n * });\n *\n * const LazyDropdown = defer(() => import('./Dropdown.akash'), {\n * trigger: 'interaction', // loads on hover/focus/click\n * });\n * ```\n */\n\nimport { signal } from './signals.js';\nimport { defineComponent } from './component.js';\nimport { nodeToDOM } from './dom.js';\nimport type { Component } from './component.js';\nimport type { AkashNode } from './types.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport type DeferTrigger =\n | 'immediate'\n | 'viewport'\n | 'interaction'\n | 'idle'\n | 'hover'\n | { type: 'timer'; delay: number }\n | { type: 'custom'; condition: () => boolean };\n\nexport interface DeferOptions {\n /** When to start loading (default: 'viewport') */\n trigger?: DeferTrigger;\n /** Loading placeholder */\n loading?: () => AkashNode;\n /** Error fallback */\n error?: (err: Error) => AkashNode;\n /** Prefetch — start loading early but don't render until triggered */\n prefetch?: boolean;\n /** Minimum loading time in ms (prevent flash of loading state) */\n minLoadTime?: number;\n /** Viewport root margin for 'viewport' trigger */\n rootMargin?: string;\n}\n\n// =========================================================================\n// defer()\n// =========================================================================\n\n/**\n * Create a deferred component that loads based on a trigger.\n */\nexport function defer<P extends Record<string, unknown>>(\n loader: () => Promise<{ default: Component<P> }>,\n options: DeferOptions = {},\n): Component<P> {\n const {\n trigger = 'viewport',\n loading: loadingFn,\n error: errorFn,\n prefetch = false,\n minLoadTime = 0,\n rootMargin = '200px',\n } = options;\n\n let resolvedComp: Component<P> | null = null;\n let loadPromise: Promise<void> | null = null;\n let loadError: Error | null = null;\n\n function startLoad(): Promise<void> {\n if (loadPromise) return loadPromise;\n\n const start = Date.now();\n loadPromise = loader()\n .then(async (mod) => {\n // Enforce minimum load time\n const elapsed = Date.now() - start;\n if (minLoadTime > 0 && elapsed < minLoadTime) {\n await new Promise((r) => setTimeout(r, minLoadTime - elapsed));\n }\n resolvedComp = mod.default;\n })\n .catch((err) => {\n loadError = err instanceof Error ? err : new Error(String(err));\n });\n\n return loadPromise;\n }\n\n // Prefetch if requested\n if (prefetch) startLoad();\n\n return defineComponent<P>((ctx) => {\n const state = signal<'idle' | 'loading' | 'ready' | 'error'>('idle');\n let triggerCleanup: (() => void) | null = null;\n\n async function triggerLoad(): Promise<void> {\n if (state() !== 'idle') return;\n state.set('loading');\n await startLoad();\n state.set(loadError ? 'error' : 'ready');\n }\n\n return () => {\n const container = document.createElement('div');\n container.style.display = 'contents';\n\n const s = state();\n\n if (s === 'ready' && resolvedComp) {\n container.appendChild(resolvedComp(ctx.props as any));\n return container;\n }\n\n if (s === 'error' && errorFn && loadError) {\n container.appendChild(nodeToDOM(errorFn(loadError)));\n return container;\n }\n\n // Show loading placeholder\n if (loadingFn && s === 'loading') {\n container.appendChild(nodeToDOM(loadingFn()));\n }\n\n // Set up trigger\n if (s === 'idle') {\n setupTrigger(container, trigger, triggerLoad, rootMargin).then((cleanup) => {\n triggerCleanup = cleanup;\n });\n }\n\n return container;\n };\n });\n}\n\n// =========================================================================\n// Trigger setup\n// =========================================================================\n\nasync function setupTrigger(\n el: HTMLElement,\n trigger: DeferTrigger,\n load: () => void,\n rootMargin: string,\n): Promise<() => void> {\n if (trigger === 'immediate') {\n load();\n return () => {};\n }\n\n if (trigger === 'viewport') {\n return setupViewportTrigger(el, load, rootMargin);\n }\n\n if (trigger === 'interaction' || trigger === 'hover') {\n return setupInteractionTrigger(el, load, trigger);\n }\n\n if (trigger === 'idle') {\n return setupIdleTrigger(load);\n }\n\n if (typeof trigger === 'object' && trigger.type === 'timer') {\n return setupTimerTrigger(load, trigger.delay);\n }\n\n if (typeof trigger === 'object' && trigger.type === 'custom') {\n return setupCustomTrigger(load, trigger.condition);\n }\n\n load();\n return () => {};\n}\n\nfunction setupViewportTrigger(\n el: HTMLElement,\n load: () => void,\n rootMargin: string,\n): () => void {\n if (typeof IntersectionObserver === 'undefined') {\n load();\n return () => {};\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries[0]?.isIntersecting) {\n observer.disconnect();\n load();\n }\n },\n { rootMargin },\n );\n\n // Observe after element is in DOM\n requestAnimationFrame(() => observer.observe(el));\n return () => observer.disconnect();\n}\n\nfunction setupInteractionTrigger(\n el: HTMLElement,\n load: () => void,\n type: 'interaction' | 'hover',\n): () => void {\n const events = type === 'hover'\n ? ['mouseenter', 'focusin']\n : ['click', 'mouseenter', 'focusin', 'touchstart'];\n\n const handler = () => {\n for (const event of events) {\n el.removeEventListener(event, handler);\n }\n load();\n };\n\n for (const event of events) {\n el.addEventListener(event, handler, { once: true, passive: true });\n }\n\n return () => {\n for (const event of events) {\n el.removeEventListener(event, handler);\n }\n };\n}\n\nfunction setupIdleTrigger(load: () => void): () => void {\n if (typeof requestIdleCallback !== 'undefined') {\n const id = requestIdleCallback(() => load());\n return () => cancelIdleCallback(id);\n }\n // Fallback\n const timer = setTimeout(load, 200);\n return () => clearTimeout(timer);\n}\n\nfunction setupTimerTrigger(load: () => void, delay: number): () => void {\n const timer = setTimeout(load, delay);\n return () => clearTimeout(timer);\n}\n\nfunction setupCustomTrigger(load: () => void, condition: () => boolean): () => void {\n const check = () => {\n if (condition()) load();\n else requestAnimationFrame(check);\n };\n requestAnimationFrame(check);\n return () => {}; // Can't cancel rAF chain easily\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {c}from'./chunk-YXKQTEPR.js';var L=["a[href]","button:not([disabled])","input:not([disabled])","select:not([disabled])","textarea:not([disabled])",'[tabindex]:not([tabindex="-1"])',"[contenteditable]"].join(", ");function A(e,r={}){let{initialFocus:t,returnFocus:l=true,escapeDeactivates:d=true,allowOutsideClick:f=false,onDeactivate:n}=r,o=c(false),c$1=null;function a(){return typeof e=="function"?e():e}function u(){let i=a();return i?Array.from(i.querySelectorAll(L)):[]}function m(i){if(i.key==="Escape"&&d){i.preventDefault(),b(),n?.();return}if(i.key!=="Tab")return;let s=u();if(s.length===0)return;let p=s[0],v=s[s.length-1];i.shiftKey?document.activeElement===p&&(i.preventDefault(),v.focus()):document.activeElement===v&&(i.preventDefault(),p.focus());}function y(i){if(!o()||f)return;let s=a();if(!s)return;let p=i.relatedTarget;if(p&&!s.contains(p)){let v=u();v.length>0&&v[0].focus();}}function h(){if(o())return;o.set(true),c$1=document.activeElement,document.addEventListener("keydown",m,true);let i=a();i&&i.addEventListener("focusout",y),requestAnimationFrame(()=>{if(t)(typeof t=="string"?a()?.querySelector(t):t)?.focus();else {let s=u();s.length>0&&s[0].focus();}});}function b(){if(!o())return;o.set(false),document.removeEventListener("keydown",m,true);let i=a();i&&i.removeEventListener("focusout",y),l&&c$1&&(c$1.focus(),c$1=null);}return {activate:h,deactivate:b,active:()=>o()}}var g=null;function K(){if(g&&document.body.contains(g))return g;let e=document.createElement("div");return e.setAttribute("role","status"),e.setAttribute("aria-live","polite"),e.setAttribute("aria-atomic","true"),e.style.cssText=["position: absolute","width: 1px","height: 1px","padding: 0","margin: -1px","overflow: hidden","clip: rect(0,0,0,0)","white-space: nowrap","border: 0"].join("; "),document.body.appendChild(e),g=e,e}function k(){return (e,r="polite")=>{if(typeof document>"u")return;let t=K();t.setAttribute("aria-live",r),t.textContent="",requestAnimationFrame(()=>{t.textContent=e;});}}function w(){let e=[],r=new Set,t=false;function l(n){for(let o of e)if(!(o.scope&&!r.has(o.scope))&&T(n,o.key)){o.preventDefault!==false&&n.preventDefault(),o.handler(n);return}}function d(){t||typeof document>"u"||(document.addEventListener("keydown",l),t=true);}function f(n,o,c){let a={key:n,handler:o,scope:c?.scope,description:c?.description??"",preventDefault:c?.preventDefault};return e.push(a),d(),()=>{let u=e.indexOf(a);u!==-1&&e.splice(u,1);}}return {bind:f,enableScope(n){r.add(n);},disableScope(n){r.delete(n);},getBindings(){return e.map(n=>({key:M(n.key),description:n.description??"",scope:n.scope}))},dispose(){e.length=0,typeof document<"u"&&document.removeEventListener("keydown",l),t=false;}}}function T(e,r){let t=r.toLowerCase().split("+"),l=t.pop(),d=t.includes("mod"),f=t.includes("ctrl"),n=t.includes("shift"),o=t.includes("alt"),a=typeof navigator<"u"&&navigator.platform?.includes("Mac")?e.metaKey:e.ctrlKey;return d&&!a||f&&!e.ctrlKey||n&&!e.shiftKey||o&&!e.altKey?false:e.key.toLowerCase()===l||e.code.toLowerCase()===l}function M(e){let r=typeof navigator<"u"&&navigator.platform?.includes("Mac");return e.replace(/mod/gi,r?"\u2318":"Ctrl").replace(/shift/gi,r?"\u21E7":"Shift").replace(/alt/gi,r?"\u2325":"Alt").replace(/\+/g,r?"":"+")}export{A as a,k as b,w as c};//# sourceMappingURL=chunk-L3ZZX36S.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-L3ZZX36S.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/a11y.ts"],"names":["FOCUSABLE_SELECTOR","useFocusTrap","container","options","initialFocus","returnFocus","escapeDeactivates","allowOutsideClick","onDeactivate","active","signal","previouslyFocused","getContainer","getFocusableElements","el","handleKeyDown","e","deactivate","focusable","first","last","handleFocusOut","relatedTarget","activate","announceRegion","ensureAnnounceRegion","useAnnounce","message","politeness","region","useKeyboard","bindings","activeScopes","listening","binding","matchesKey","startListening","bind","key","handler","idx","scope","b","formatKeyCombo","combo","parts","needsMod","needsCtrl","needsShift","needsAlt","modPressed","isMac"],"mappings":"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","file":"chunk-L3ZZX36S.js","sourcesContent":["/**\n * Accessibility composables.\n *\n * Built-in a11y primitives that no other framework ships natively.\n * Focus management, screen reader announcements, and keyboard shortcuts.\n */\n\nimport { signal } from './signals.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// =========================================================================\n// useFocusTrap\n// =========================================================================\n\nexport interface FocusTrapOptions {\n /** CSS selector or element to focus initially (default: first focusable) */\n initialFocus?: string | HTMLElement;\n /** Return focus to the previously focused element on deactivate */\n returnFocus?: boolean;\n /** Escape key deactivates the trap (default: true) */\n escapeDeactivates?: boolean;\n /** Allow clicks outside the trap container (default: false) */\n allowOutsideClick?: boolean;\n /** Callback when Escape deactivates */\n onDeactivate?: () => void;\n}\n\nexport interface FocusTrap {\n /** Activate the focus trap */\n activate(): void;\n /** Deactivate the focus trap */\n deactivate(): void;\n /** Whether the trap is currently active */\n active: ReadonlySignal<boolean>;\n}\n\nconst FOCUSABLE_SELECTOR = [\n 'a[href]', 'button:not([disabled])', 'input:not([disabled])',\n 'select:not([disabled])', 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])', '[contenteditable]',\n].join(', ');\n\n/**\n * Trap focus inside a container element.\n *\n * ```ts\n * const trap = useFocusTrap(dialogRef, {\n * initialFocus: '#first-input',\n * returnFocus: true,\n * escapeDeactivates: true,\n * });\n * trap.activate(); // on open\n * trap.deactivate(); // on close\n * ```\n */\nexport function useFocusTrap(\n container: HTMLElement | (() => HTMLElement | null),\n options: FocusTrapOptions = {},\n): FocusTrap {\n const {\n initialFocus,\n returnFocus = true,\n escapeDeactivates = true,\n allowOutsideClick = false,\n onDeactivate,\n } = options;\n\n const active = signal(false);\n let previouslyFocused: HTMLElement | null = null;\n\n function getContainer(): HTMLElement | null {\n return typeof container === 'function' ? container() : container;\n }\n\n function getFocusableElements(): HTMLElement[] {\n const el = getContainer();\n if (!el) return [];\n return Array.from(el.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR));\n }\n\n function handleKeyDown(e: KeyboardEvent): void {\n if (e.key === 'Escape' && escapeDeactivates) {\n e.preventDefault();\n deactivate();\n onDeactivate?.();\n return;\n }\n\n if (e.key !== 'Tab') return;\n\n const focusable = getFocusableElements();\n if (focusable.length === 0) return;\n\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n if (e.shiftKey) {\n // Shift+Tab: wrap from first to last\n if (document.activeElement === first) {\n e.preventDefault();\n last.focus();\n }\n } else {\n // Tab: wrap from last to first\n if (document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n }\n }\n\n function handleFocusOut(e: FocusEvent): void {\n if (!active() || allowOutsideClick) return;\n const el = getContainer();\n if (!el) return;\n\n const relatedTarget = e.relatedTarget as HTMLElement | null;\n if (relatedTarget && !el.contains(relatedTarget)) {\n // Focus escaped — pull it back\n const focusable = getFocusableElements();\n if (focusable.length > 0) {\n focusable[0].focus();\n }\n }\n }\n\n function activate(): void {\n if (active()) return;\n active.set(true);\n\n previouslyFocused = document.activeElement as HTMLElement | null;\n\n document.addEventListener('keydown', handleKeyDown, true);\n\n const el = getContainer();\n if (el) {\n el.addEventListener('focusout', handleFocusOut);\n }\n\n // Focus the initial element\n requestAnimationFrame(() => {\n if (initialFocus) {\n const target = typeof initialFocus === 'string'\n ? getContainer()?.querySelector<HTMLElement>(initialFocus)\n : initialFocus;\n target?.focus();\n } else {\n const focusable = getFocusableElements();\n if (focusable.length > 0) focusable[0].focus();\n }\n });\n }\n\n function deactivate(): void {\n if (!active()) return;\n active.set(false);\n\n document.removeEventListener('keydown', handleKeyDown, true);\n\n const el = getContainer();\n if (el) {\n el.removeEventListener('focusout', handleFocusOut);\n }\n\n if (returnFocus && previouslyFocused) {\n previouslyFocused.focus();\n previouslyFocused = null;\n }\n }\n\n return {\n activate,\n deactivate,\n active: () => active(),\n };\n}\n\n// =========================================================================\n// useAnnounce\n// =========================================================================\n\nexport type AriaLive = 'polite' | 'assertive' | 'off';\n\nlet announceRegion: HTMLElement | null = null;\n\nfunction ensureAnnounceRegion(): HTMLElement {\n if (announceRegion && document.body.contains(announceRegion)) {\n return announceRegion;\n }\n\n const el = document.createElement('div');\n el.setAttribute('role', 'status');\n el.setAttribute('aria-live', 'polite');\n el.setAttribute('aria-atomic', 'true');\n el.style.cssText = [\n 'position: absolute',\n 'width: 1px',\n 'height: 1px',\n 'padding: 0',\n 'margin: -1px',\n 'overflow: hidden',\n 'clip: rect(0,0,0,0)',\n 'white-space: nowrap',\n 'border: 0',\n ].join('; ');\n\n document.body.appendChild(el);\n announceRegion = el;\n return el;\n}\n\n/**\n * Screen reader announcements via ARIA live regions.\n *\n * ```ts\n * const announce = useAnnounce();\n * announce('Page loaded: Dashboard');\n * announce('Error: Invalid email', 'assertive');\n * ```\n */\nexport function useAnnounce(): (message: string, politeness?: AriaLive) => void {\n return (message: string, politeness: AriaLive = 'polite') => {\n if (typeof document === 'undefined') return;\n\n const region = ensureAnnounceRegion();\n region.setAttribute('aria-live', politeness);\n\n // Clear then set to trigger announcement\n region.textContent = '';\n requestAnimationFrame(() => {\n region.textContent = message;\n });\n };\n}\n\n// =========================================================================\n// useKeyboard\n// =========================================================================\n\nexport interface KeyBinding {\n /** Key combo: 'mod+k', 'Escape', 'ArrowDown', 'shift+Enter' */\n key: string;\n /** Handler function */\n handler: (e: KeyboardEvent) => void;\n /** Optional scope (only active when scope is enabled) */\n scope?: string;\n /** Description for help dialog */\n description?: string;\n /** Prevent default browser behavior (default: true) */\n preventDefault?: boolean;\n}\n\nexport interface KeyboardManager {\n /** Register a binding */\n bind(key: string, handler: (e: KeyboardEvent) => void, options?: {\n scope?: string;\n description?: string;\n preventDefault?: boolean;\n }): () => void;\n /** Enable a scope */\n enableScope(scope: string): void;\n /** Disable a scope */\n disableScope(scope: string): void;\n /** Get all bindings (for help dialog) */\n getBindings(): Array<{ key: string; description: string; scope?: string }>;\n /** Dispose all bindings */\n dispose(): void;\n}\n\n/**\n * Keyboard shortcut manager with scope support.\n *\n * ```ts\n * const kb = useKeyboard();\n * kb.bind('mod+k', () => openSearch(), { description: 'Open search' });\n * kb.bind('Escape', () => close(), { scope: 'modal' });\n * kb.enableScope('modal');\n * ```\n */\nexport function useKeyboard(): KeyboardManager {\n const bindings: KeyBinding[] = [];\n const activeScopes = new Set<string>();\n let listening = false;\n\n function handleKeyDown(e: KeyboardEvent): void {\n for (const binding of bindings) {\n if (binding.scope && !activeScopes.has(binding.scope)) continue;\n if (matchesKey(e, binding.key)) {\n if (binding.preventDefault !== false) {\n e.preventDefault();\n }\n binding.handler(e);\n return;\n }\n }\n }\n\n function startListening(): void {\n if (listening) return;\n if (typeof document === 'undefined') return;\n document.addEventListener('keydown', handleKeyDown);\n listening = true;\n }\n\n function bind(\n key: string,\n handler: (e: KeyboardEvent) => void,\n options?: { scope?: string; description?: string; preventDefault?: boolean },\n ): () => void {\n const binding: KeyBinding = {\n key,\n handler,\n scope: options?.scope,\n description: options?.description ?? '',\n preventDefault: options?.preventDefault,\n };\n bindings.push(binding);\n startListening();\n\n return () => {\n const idx = bindings.indexOf(binding);\n if (idx !== -1) bindings.splice(idx, 1);\n };\n }\n\n return {\n bind,\n enableScope(scope: string) { activeScopes.add(scope); },\n disableScope(scope: string) { activeScopes.delete(scope); },\n getBindings() {\n return bindings.map((b) => ({\n key: formatKeyCombo(b.key),\n description: b.description ?? '',\n scope: b.scope,\n }));\n },\n dispose() {\n bindings.length = 0;\n if (typeof document !== 'undefined') {\n document.removeEventListener('keydown', handleKeyDown);\n }\n listening = false;\n },\n };\n}\n\n// --- Key matching ---\n\nfunction matchesKey(e: KeyboardEvent, combo: string): boolean {\n const parts = combo.toLowerCase().split('+');\n const key = parts.pop()!;\n\n const needsMod = parts.includes('mod');\n const needsCtrl = parts.includes('ctrl');\n const needsShift = parts.includes('shift');\n const needsAlt = parts.includes('alt');\n\n // mod = Cmd on Mac, Ctrl elsewhere\n const isMac = typeof navigator !== 'undefined' && navigator.platform?.includes('Mac');\n const modPressed = isMac ? e.metaKey : e.ctrlKey;\n\n if (needsMod && !modPressed) return false;\n if (needsCtrl && !e.ctrlKey) return false;\n if (needsShift && !e.shiftKey) return false;\n if (needsAlt && !e.altKey) return false;\n\n return e.key.toLowerCase() === key || e.code.toLowerCase() === key;\n}\n\nfunction formatKeyCombo(combo: string): string {\n const isMac = typeof navigator !== 'undefined' && navigator.platform?.includes('Mac');\n return combo\n .replace(/mod/gi, isMac ? '⌘' : 'Ctrl')\n .replace(/shift/gi, isMac ? '⇧' : 'Shift')\n .replace(/alt/gi, isMac ? '⌥' : 'Alt')\n .replace(/\\+/g, isMac ? '' : '+');\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var chunkWOZWFMOK_cjs=require('./chunk-WOZWFMOK.cjs');var p=typeof requestAnimationFrame=="function"?requestAnimationFrame:e=>setTimeout(()=>e(Date.now()),16),g=typeof cancelAnimationFrame=="function"?cancelAnimationFrame:e=>clearTimeout(e),S={linear:e=>e,cubicIn:e=>e*e*e,cubicOut:e=>1-Math.pow(1-e,3),cubicInOut:e=>e<.5?4*e*e*e:1-Math.pow(-2*e+2,3)/2,quadIn:e=>e*e,quadOut:e=>1-(1-e)*(1-e),quintOut:e=>1-Math.pow(1-e,5),bounceOut:e=>e<1/2.75?7.5625*e*e:e<2/2.75?7.5625*(e-=1.5/2.75)*e+.75:e<2.5/2.75?7.5625*(e-=2.25/2.75)*e+.9375:7.5625*(e-=2.625/2.75)*e+.984375,elasticOut:e=>e===0||e===1?e:Math.pow(2,-10*e)*Math.sin((e-.1)*5*Math.PI)+1};function A(e,r,o){return typeof e=="number"&&typeof r=="number"?e+(r-e)*o:o<.5?e:r}function k(e,r={}){let{duration:o=400,easing:w=S.cubicOut,interpolate:y=A,delay:O=0}=r,a=chunkWOZWFMOK_cjs.c(e),m=chunkWOZWFMOK_cjs.c(e),i=0,n=false,u=(()=>a());return u.set=(t,s)=>{let f=s?.duration??o,I=s?.easing??w,h=s?.interpolate??y,M=s?.delay??O,P=a();return m.set(t),f===0?(a.set(t),Promise.resolve()):(n&&(g(i),n=false),new Promise(l=>{let x=performance.now()+M;n=true;function c(F){if(!n){l();return}let d=F-x;if(d<0){i=p(c);return}let b=Math.min(d/f,1),q=I(b);a.set(h(P,t,q)),b<1?i=p(c):(n=false,l());}i=p(c);}))},u.setImmediate=t=>{n&&(g(i),n=false),a.set(t),m.set(t);},u.target=()=>m(),u}exports.a=S;exports.b=k;//# sourceMappingURL=chunk-LD4C62JY.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-LD4C62JY.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tweened.ts"],"names":["raf","fn","caf","id","easings","t","defaultInterpolate","from","to","tweened","initialValue","options","duration","easing","interpolate","delay","current","signal","targetValue","rafId","running","read","value","overrides","dur","ease","interp","del","resolve","start","tick","now","elapsed","easedT"],"mappings":"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","file":"chunk-LD4C62JY.cjs","sourcesContent":["/**\n * Tweened values — smooth interpolation between states.\n *\n * Unlike signals that update instantly, tweened values animate\n * smoothly from old to new over a duration.\n *\n * ```ts\n * const progress = tweened(0, { duration: 400 });\n * progress.set(100); // smoothly animates 0 → 100 over 400ms\n * progress(); // intermediate values during animation\n *\n * const color = tweened('#ff0000', { duration: 300, interpolate: lerpColor });\n * ```\n */\n\n// Fallback for non-browser environments (Node.js, SSR)\nconst raf = typeof requestAnimationFrame === 'function'\n ? requestAnimationFrame\n : (fn: (t: number) => void) => setTimeout(() => fn(Date.now()), 16) as unknown as number;\nconst caf = typeof cancelAnimationFrame === 'function'\n ? cancelAnimationFrame\n : (id: number) => clearTimeout(id);\n\nimport { signal } from './signals.js';\nimport type { Signal, ReadonlySignal } from './signals.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport type Interpolator<T> = (from: T, to: T, t: number) => T;\n\nexport type EasingFn = (t: number) => number;\n\nexport interface TweenedOptions<T> {\n /** Duration in ms (default: 400) */\n duration?: number;\n /** Easing function (default: cubicOut) */\n easing?: EasingFn;\n /** Custom interpolation function */\n interpolate?: Interpolator<T>;\n /** Delay before animation starts */\n delay?: number;\n}\n\nexport interface TweenedSignal<T> {\n /** Read current (animated) value */\n (): T;\n /** Set new target — animates from current to new */\n set(value: T, opts?: Partial<TweenedOptions<T>>): Promise<void>;\n /** Set immediately without animation */\n setImmediate(value: T): void;\n /** Current target value */\n target: () => T;\n}\n\n// =========================================================================\n// Built-in easing functions\n// =========================================================================\n\nexport const easings = {\n linear: (t: number) => t,\n cubicIn: (t: number) => t * t * t,\n cubicOut: (t: number) => 1 - Math.pow(1 - t, 3),\n cubicInOut: (t: number) => t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2,\n quadIn: (t: number) => t * t,\n quadOut: (t: number) => 1 - (1 - t) * (1 - t),\n quintOut: (t: number) => 1 - Math.pow(1 - t, 5),\n bounceOut: (t: number) => {\n if (t < 1 / 2.75) return 7.5625 * t * t;\n if (t < 2 / 2.75) return 7.5625 * (t -= 1.5 / 2.75) * t + 0.75;\n if (t < 2.5 / 2.75) return 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375;\n return 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375;\n },\n elasticOut: (t: number) => {\n if (t === 0 || t === 1) return t;\n return Math.pow(2, -10 * t) * Math.sin((t - 0.1) * 5 * Math.PI) + 1;\n },\n} as const;\n\n// =========================================================================\n// Default interpolators\n// =========================================================================\n\nfunction defaultInterpolate<T>(from: T, to: T, t: number): T {\n if (typeof from === 'number' && typeof to === 'number') {\n return (from + (to - from) * t) as T;\n }\n // For non-numbers, snap at halfway\n return t < 0.5 ? from : to;\n}\n\n// =========================================================================\n// tweened()\n// =========================================================================\n\n/**\n * Create a tweened signal that animates between values.\n *\n * ```ts\n * const count = tweened(0, { duration: 300, easing: easings.cubicOut });\n * count.set(100); // smoothly goes 0 → 100\n * count(); // current interpolated value\n * ```\n */\nexport function tweened<T>(\n initialValue: T,\n options: TweenedOptions<T> = {},\n): TweenedSignal<T> {\n const {\n duration = 400,\n easing = easings.cubicOut,\n interpolate = defaultInterpolate,\n delay = 0,\n } = options;\n\n const current = signal<T>(initialValue);\n const targetValue = signal<T>(initialValue);\n let rafId = 0;\n let running = false;\n\n const read = (() => current()) as TweenedSignal<T>;\n\n read.set = (value: T, overrides?: Partial<TweenedOptions<T>>): Promise<void> => {\n const dur = overrides?.duration ?? duration;\n const ease = overrides?.easing ?? easing;\n const interp = overrides?.interpolate ?? interpolate;\n const del = overrides?.delay ?? delay;\n\n const from = current();\n targetValue.set(value);\n\n if (dur === 0) {\n current.set(value);\n return Promise.resolve();\n }\n\n // Cancel any running animation\n if (running) {\n caf(rafId);\n running = false;\n }\n\n return new Promise<void>((resolve) => {\n const start = performance.now() + del;\n running = true;\n\n function tick(now: number): void {\n if (!running) { resolve(); return; }\n\n const elapsed = now - start;\n if (elapsed < 0) {\n rafId = raf(tick);\n return;\n }\n\n const t = Math.min(elapsed / dur, 1);\n const easedT = ease(t);\n current.set(interp(from, value, easedT));\n\n if (t < 1) {\n rafId = raf(tick);\n } else {\n running = false;\n resolve();\n }\n }\n\n rafId = raf(tick);\n });\n };\n\n read.setImmediate = (value: T): void => {\n if (running) { caf(rafId); running = false; }\n current.set(value);\n targetValue.set(value);\n };\n\n read.target = () => targetValue();\n\n return read;\n}\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use strict';var P=`<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
{{head}}
|
|
7
|
+
</head>
|
|
8
|
+
<body>
|
|
9
|
+
<div id="app">{{content}}</div>
|
|
10
|
+
{{scripts}}
|
|
11
|
+
</body>
|
|
12
|
+
</html>`;async function x(t){let{routes:r,render:e,outDir:n="dist",template:l=P,onPage:u,onError:g,concurrency:d=5}=t,m=Date.now(),p=typeof r=="function"?await r():r,a={rendered:[],errors:[],duration:0};for(let c=0;c<p.length;c+=d){let h=p.slice(c,c+d);await Promise.all(h.map(async s=>{try{let o=await e(s),i=l.replace("{{content}}",o).replace("{{head}}","").replace("{{scripts}}",""),f=w(s);a.rendered.push({url:s,file:`${n}/${f}`,size:new Blob([i]).size}),u?.(s,i);}catch(o){let i=o instanceof Error?o:new Error(String(o));a.errors.push({url:s,error:i.message}),g?.(s,i);}}));}return a.duration=Date.now()-m,a}function y(t){return t.filter(r=>!r.path.includes(":")&&!r.path.includes("*")).map(r=>r.path)}function v(t,r){return r.map(e=>{let n=t;for(let[l,u]of Object.entries(e))n=n.replace(`:${l}`,u);return n})}function w(t){let r=t.replace(/^\//,"").replace(/\/$/,"");return r?`${r}/index.html`:"index.html"}function E(t,r){let e=`<?xml version="1.0" encoding="UTF-8"?>
|
|
13
|
+
`;e+=`<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
|
14
|
+
`;for(let n of r.rendered)e+=` <url>
|
|
15
|
+
`,e+=` <loc>${t}${n.url}</loc>
|
|
16
|
+
`,e+=` <lastmod>${new Date().toISOString().split("T")[0]}</lastmod>
|
|
17
|
+
`,e+=` </url>
|
|
18
|
+
`;return e+=`</urlset>
|
|
19
|
+
`,e}exports.a=x;exports.b=y;exports.c=v;exports.d=w;exports.e=E;//# sourceMappingURL=chunk-LWQPLKL6.cjs.map
|
|
20
|
+
//# sourceMappingURL=chunk-LWQPLKL6.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ssg.ts"],"names":["DEFAULT_TEMPLATE","prerender","options","routesInput","render","outDir","template","onPage","onError","concurrency","start","routes","result","i","batch","url","content","html","filePath","urlToFilePath","err","error","discoverStaticRoutes","routeManifest","generatePaths","pattern","params","p","path","key","value","clean","sitemapFromResults","baseUrl","results","xml","page"],"mappings":"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","file":"chunk-LWQPLKL6.cjs","sourcesContent":["/**\n * Static Site Generation (SSG) / Prerendering.\n *\n * Pre-render pages at build time to static HTML files.\n * Combine with hydration for interactive islands.\n *\n * ```ts\n * // In build script or akash build --prerender:\n * await prerender({\n * routes: ['/', '/about', '/blog/hello'],\n * render: (url) => renderToString(App, { url }),\n * outDir: 'dist',\n * });\n * ```\n */\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport interface PrerenderOptions {\n /** Routes to prerender */\n routes: string[] | (() => Promise<string[]>);\n /** Render function — returns HTML for a given URL */\n render: (url: string) => Promise<string> | string;\n /** Output directory (default: 'dist') */\n outDir?: string;\n /** HTML template with {{content}} placeholder */\n template?: string;\n /** Callback per rendered page */\n onPage?: (url: string, html: string) => void;\n /** Callback on error */\n onError?: (url: string, error: Error) => void;\n /** Concurrency limit (default: 5) */\n concurrency?: number;\n}\n\nexport interface PrerenderResult {\n /** Successfully rendered pages */\n rendered: Array<{ url: string; file: string; size: number }>;\n /** Pages that failed to render */\n errors: Array<{ url: string; error: string }>;\n /** Total time in ms */\n duration: number;\n}\n\n// =========================================================================\n// Default HTML template\n// =========================================================================\n\nconst DEFAULT_TEMPLATE = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n {{head}}\n</head>\n<body>\n <div id=\"app\">{{content}}</div>\n {{scripts}}\n</body>\n</html>`;\n\n// =========================================================================\n// prerender()\n// =========================================================================\n\n/**\n * Pre-render routes to static HTML files.\n */\nexport async function prerender(options: PrerenderOptions): Promise<PrerenderResult> {\n const {\n routes: routesInput,\n render,\n outDir = 'dist',\n template = DEFAULT_TEMPLATE,\n onPage,\n onError,\n concurrency = 5,\n } = options;\n\n const start = Date.now();\n\n // Resolve routes\n const routes = typeof routesInput === 'function'\n ? await routesInput()\n : routesInput;\n\n const result: PrerenderResult = {\n rendered: [],\n errors: [],\n duration: 0,\n };\n\n // Process in batches for concurrency control\n for (let i = 0; i < routes.length; i += concurrency) {\n const batch = routes.slice(i, i + concurrency);\n await Promise.all(batch.map(async (url) => {\n try {\n const content = await render(url);\n const html = template\n .replace('{{content}}', content)\n .replace('{{head}}', '')\n .replace('{{scripts}}', '');\n\n const filePath = urlToFilePath(url);\n\n // In a real implementation, we'd write to disk here.\n // For now, we return the result for the caller to handle.\n result.rendered.push({\n url,\n file: `${outDir}/${filePath}`,\n size: new Blob([html]).size,\n });\n\n onPage?.(url, html);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n result.errors.push({ url, error: error.message });\n onError?.(url, error);\n }\n }));\n }\n\n result.duration = Date.now() - start;\n return result;\n}\n\n// =========================================================================\n// Route discovery\n// =========================================================================\n\n/**\n * Discover routes from the file system for prerendering.\n * Scans src/routes/ and returns all static (non-parameterized) paths.\n */\nexport function discoverStaticRoutes(routeManifest: Array<{ path: string }>): string[] {\n return routeManifest\n .filter((r) => !r.path.includes(':') && !r.path.includes('*'))\n .map((r) => r.path);\n}\n\n/**\n * Generate all possible paths for parameterized routes.\n *\n * ```ts\n * const paths = generatePaths('/blog/:slug', [\n * { slug: 'hello' },\n * { slug: 'world' },\n * ]);\n * // ['/blog/hello', '/blog/world']\n * ```\n */\nexport function generatePaths(\n pattern: string,\n params: Record<string, string>[],\n): string[] {\n return params.map((p) => {\n let path = pattern;\n for (const [key, value] of Object.entries(p)) {\n path = path.replace(`:${key}`, value);\n }\n return path;\n });\n}\n\n// =========================================================================\n// Helpers\n// =========================================================================\n\n/**\n * Convert a URL path to a file path for static output.\n * / → index.html\n * /about → about/index.html\n * /blog/hello → blog/hello/index.html\n */\nexport function urlToFilePath(url: string): string {\n const clean = url.replace(/^\\//, '').replace(/\\/$/, '');\n if (!clean) return 'index.html';\n return `${clean}/index.html`;\n}\n\n/**\n * Generate a sitemap from prerender results.\n */\nexport function sitemapFromResults(\n baseUrl: string,\n results: PrerenderResult,\n): 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 page of results.rendered) {\n xml += ` <url>\\n`;\n xml += ` <loc>${baseUrl}${page.url}</loc>\\n`;\n xml += ` <lastmod>${new Date().toISOString().split('T')[0]}</lastmod>\\n`;\n xml += ` </url>\\n`;\n }\n\n xml += '</urlset>\\n';\n return xml;\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
'use strict';var chunkXWVNLE2W_cjs=require('./chunk-XWVNLE2W.cjs');function a(t){return {enterFrom:`${t}-enter-from`,enterActive:`${t}-enter-active`,enterTo:`${t}-enter-to`,exitFrom:`${t}-exit-from`,exitActive:`${t}-exit-active`,exitTo:`${t}-exit-to`}}function d(t,e,i){return new Promise(r=>{t.classList.add(e.enterFrom,e.enterActive),t.offsetHeight,t.classList.remove(e.enterFrom),t.classList.add(e.enterTo);let n=()=>{t.classList.remove(e.enterActive,e.enterTo),t.removeEventListener("transitionend",n),r();};i!==void 0?setTimeout(n,i):(t.addEventListener("transitionend",n,{once:true}),setTimeout(n,5e3));})}function c(t,e,i){return new Promise(r=>{t.classList.add(e.exitFrom,e.exitActive),t.offsetHeight,t.classList.remove(e.exitFrom),t.classList.add(e.exitTo);let n=()=>{t.classList.remove(e.exitActive,e.exitTo),t.removeEventListener("transitionend",n),r();};i!==void 0?setTimeout(n,i):(t.addEventListener("transitionend",n,{once:true}),setTimeout(n,5e3));})}var f=chunkXWVNLE2W_cjs.s(t=>{let e=t.props.name??"akash",i=a(e);return ()=>{let r=document.createElement("div");if(r.style.display="contents",t.props.when){let n=chunkXWVNLE2W_cjs.l(t.children());r.appendChild(n),n instanceof HTMLElement&&(t.props.onEnter?.(n),d(n,i,t.props.duration).then(()=>{t.props.onAfterEnter?.(n);}));}return r}});function v(t,e={}){let{property:i="all",duration:r="0.3s",easing:n="ease"}=e;return `
|
|
2
|
+
.${t}-enter-active,
|
|
3
|
+
.${t}-exit-active {
|
|
4
|
+
transition: ${i} ${r} ${n};
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.${t}-enter-from,
|
|
8
|
+
.${t}-exit-to {
|
|
9
|
+
opacity: 0;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.${t}-enter-to,
|
|
13
|
+
.${t}-exit-from {
|
|
14
|
+
opacity: 1;
|
|
15
|
+
}
|
|
16
|
+
`.trim()}exports.a=a;exports.b=d;exports.c=c;exports.d=f;exports.e=v;//# sourceMappingURL=chunk-M5IACTFC.cjs.map
|
|
17
|
+
//# sourceMappingURL=chunk-M5IACTFC.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/transition.ts"],"names":["getTransitionClasses","name","enterTransition","el","classes","duration","resolve","onEnd","exitTransition","Transition","defineComponent","ctx","container","content","nodeToDOM","generateTransitionCSS","options","property","easing"],"mappings":"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","file":"chunk-M5IACTFC.cjs","sourcesContent":["/**\n * Transition/Animation system.\n *\n * Provides CSS-based enter/exit transitions for elements.\n * Works with <Transition> component or programmatic API.\n *\n * Class naming convention (matches Vue/Svelte):\n * - `{name}-enter-from` — initial enter state\n * - `{name}-enter-active` — active enter transition\n * - `{name}-enter-to` — final enter state\n * - `{name}-exit-from` — initial exit state\n * - `{name}-exit-active` — active exit transition\n * - `{name}-exit-to` — final exit state\n */\n\nimport { defineComponent } from './component.js';\nimport { signal, effect } from './signals.js';\nimport { nodeToDOM } from './dom.js';\nimport type { AkashNode } from './types.js';\n\n// --- Types ---\n\nexport interface TransitionProps {\n /** Transition name (used as CSS class prefix) */\n name?: string;\n /** Duration in ms (overrides CSS transition duration) */\n duration?: number;\n /** Whether the content is shown */\n when: boolean;\n /** CSS transition mode */\n mode?: 'in-out' | 'out-in';\n /** Callback when enter transition starts */\n onEnter?: (el: HTMLElement) => void;\n /** Callback when enter transition completes */\n onAfterEnter?: (el: HTMLElement) => void;\n /** Callback when exit transition starts */\n onExit?: (el: HTMLElement) => void;\n /** Callback when exit transition completes */\n onAfterExit?: (el: HTMLElement) => void;\n}\n\nexport interface TransitionClasses {\n enterFrom: string;\n enterActive: string;\n enterTo: string;\n exitFrom: string;\n exitActive: string;\n exitTo: string;\n}\n\n// --- CSS class helpers ---\n\n/**\n * Get the transition CSS class names for a given transition name.\n */\nexport function getTransitionClasses(name: string): TransitionClasses {\n return {\n enterFrom: `${name}-enter-from`,\n enterActive: `${name}-enter-active`,\n enterTo: `${name}-enter-to`,\n exitFrom: `${name}-exit-from`,\n exitActive: `${name}-exit-active`,\n exitTo: `${name}-exit-to`,\n };\n}\n\n// --- Programmatic transition API ---\n\n/**\n * Run an enter transition on an element.\n * Returns a promise that resolves when the transition completes.\n */\nexport function enterTransition(\n el: HTMLElement,\n classes: TransitionClasses,\n duration?: number,\n): Promise<void> {\n return new Promise((resolve) => {\n // Apply initial state\n el.classList.add(classes.enterFrom, classes.enterActive);\n\n // Force reflow to ensure the initial state is applied\n void el.offsetHeight;\n\n // Transition to final state\n el.classList.remove(classes.enterFrom);\n el.classList.add(classes.enterTo);\n\n const onEnd = () => {\n el.classList.remove(classes.enterActive, classes.enterTo);\n el.removeEventListener('transitionend', onEnd);\n resolve();\n };\n\n if (duration !== undefined) {\n setTimeout(onEnd, duration);\n } else {\n el.addEventListener('transitionend', onEnd, { once: true });\n // Fallback timeout in case transitionend never fires\n setTimeout(onEnd, 5000);\n }\n });\n}\n\n/**\n * Run an exit transition on an element.\n * Returns a promise that resolves when the transition completes.\n */\nexport function exitTransition(\n el: HTMLElement,\n classes: TransitionClasses,\n duration?: number,\n): Promise<void> {\n return new Promise((resolve) => {\n el.classList.add(classes.exitFrom, classes.exitActive);\n\n void el.offsetHeight;\n\n el.classList.remove(classes.exitFrom);\n el.classList.add(classes.exitTo);\n\n const onEnd = () => {\n el.classList.remove(classes.exitActive, classes.exitTo);\n el.removeEventListener('transitionend', onEnd);\n resolve();\n };\n\n if (duration !== undefined) {\n setTimeout(onEnd, duration);\n } else {\n el.addEventListener('transitionend', onEnd, { once: true });\n setTimeout(onEnd, 5000);\n }\n });\n}\n\n// --- <Transition> component ---\n\n/**\n * <Transition> component.\n *\n * Applies CSS enter/exit transitions when `when` changes.\n *\n * ```html\n * <Transition name=\"fade\" when={isVisible()}>\n * <div>Content</div>\n * </Transition>\n * ```\n *\n * CSS:\n * ```css\n * .fade-enter-active, .fade-exit-active {\n * transition: opacity 0.3s;\n * }\n * .fade-enter-from, .fade-exit-to {\n * opacity: 0;\n * }\n * ```\n */\nexport const Transition = defineComponent<TransitionProps>((ctx) => {\n const name = ctx.props.name ?? 'akash';\n const classes = getTransitionClasses(name);\n\n return () => {\n const container = document.createElement('div');\n container.style.display = 'contents';\n\n if (ctx.props.when) {\n const content = nodeToDOM(ctx.children());\n container.appendChild(content);\n\n // Run enter transition on mount\n if (content instanceof HTMLElement) {\n ctx.props.onEnter?.(content);\n enterTransition(content, classes, ctx.props.duration).then(() => {\n ctx.props.onAfterEnter?.(content);\n });\n }\n }\n\n return container;\n };\n});\n\n// --- Preset transition styles ---\n\n/**\n * Generate CSS for common transition presets.\n * Inject this into your app's styles or use the CLI to generate it.\n */\nexport function generateTransitionCSS(name: string, options: {\n property?: string;\n duration?: string;\n easing?: string;\n} = {}): string {\n const {\n property = 'all',\n duration = '0.3s',\n easing = 'ease',\n } = options;\n\n return `\n.${name}-enter-active,\n.${name}-exit-active {\n transition: ${property} ${duration} ${easing};\n}\n\n.${name}-enter-from,\n.${name}-exit-to {\n opacity: 0;\n}\n\n.${name}-enter-to,\n.${name}-exit-from {\n opacity: 1;\n}\n`.trim();\n}\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
var P=`<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
{{head}}
|
|
7
|
+
</head>
|
|
8
|
+
<body>
|
|
9
|
+
<div id="app">{{content}}</div>
|
|
10
|
+
{{scripts}}
|
|
11
|
+
</body>
|
|
12
|
+
</html>`;async function x(t){let{routes:r,render:e,outDir:n="dist",template:l=P,onPage:u,onError:g,concurrency:d=5}=t,m=Date.now(),p=typeof r=="function"?await r():r,a={rendered:[],errors:[],duration:0};for(let c=0;c<p.length;c+=d){let h=p.slice(c,c+d);await Promise.all(h.map(async s=>{try{let o=await e(s),i=l.replace("{{content}}",o).replace("{{head}}","").replace("{{scripts}}",""),f=w(s);a.rendered.push({url:s,file:`${n}/${f}`,size:new Blob([i]).size}),u?.(s,i);}catch(o){let i=o instanceof Error?o:new Error(String(o));a.errors.push({url:s,error:i.message}),g?.(s,i);}}));}return a.duration=Date.now()-m,a}function y(t){return t.filter(r=>!r.path.includes(":")&&!r.path.includes("*")).map(r=>r.path)}function v(t,r){return r.map(e=>{let n=t;for(let[l,u]of Object.entries(e))n=n.replace(`:${l}`,u);return n})}function w(t){let r=t.replace(/^\//,"").replace(/\/$/,"");return r?`${r}/index.html`:"index.html"}function E(t,r){let e=`<?xml version="1.0" encoding="UTF-8"?>
|
|
13
|
+
`;e+=`<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
|
14
|
+
`;for(let n of r.rendered)e+=` <url>
|
|
15
|
+
`,e+=` <loc>${t}${n.url}</loc>
|
|
16
|
+
`,e+=` <lastmod>${new Date().toISOString().split("T")[0]}</lastmod>
|
|
17
|
+
`,e+=` </url>
|
|
18
|
+
`;return e+=`</urlset>
|
|
19
|
+
`,e}export{x as a,y as b,v as c,w as d,E as e};//# sourceMappingURL=chunk-MADMPRT2.js.map
|
|
20
|
+
//# sourceMappingURL=chunk-MADMPRT2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ssg.ts"],"names":["DEFAULT_TEMPLATE","prerender","options","routesInput","render","outDir","template","onPage","onError","concurrency","start","routes","result","i","batch","url","content","html","filePath","urlToFilePath","err","error","discoverStaticRoutes","routeManifest","generatePaths","pattern","params","p","path","key","value","clean","sitemapFromResults","baseUrl","results","xml","page"],"mappings":"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","file":"chunk-MADMPRT2.js","sourcesContent":["/**\n * Static Site Generation (SSG) / Prerendering.\n *\n * Pre-render pages at build time to static HTML files.\n * Combine with hydration for interactive islands.\n *\n * ```ts\n * // In build script or akash build --prerender:\n * await prerender({\n * routes: ['/', '/about', '/blog/hello'],\n * render: (url) => renderToString(App, { url }),\n * outDir: 'dist',\n * });\n * ```\n */\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport interface PrerenderOptions {\n /** Routes to prerender */\n routes: string[] | (() => Promise<string[]>);\n /** Render function — returns HTML for a given URL */\n render: (url: string) => Promise<string> | string;\n /** Output directory (default: 'dist') */\n outDir?: string;\n /** HTML template with {{content}} placeholder */\n template?: string;\n /** Callback per rendered page */\n onPage?: (url: string, html: string) => void;\n /** Callback on error */\n onError?: (url: string, error: Error) => void;\n /** Concurrency limit (default: 5) */\n concurrency?: number;\n}\n\nexport interface PrerenderResult {\n /** Successfully rendered pages */\n rendered: Array<{ url: string; file: string; size: number }>;\n /** Pages that failed to render */\n errors: Array<{ url: string; error: string }>;\n /** Total time in ms */\n duration: number;\n}\n\n// =========================================================================\n// Default HTML template\n// =========================================================================\n\nconst DEFAULT_TEMPLATE = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n {{head}}\n</head>\n<body>\n <div id=\"app\">{{content}}</div>\n {{scripts}}\n</body>\n</html>`;\n\n// =========================================================================\n// prerender()\n// =========================================================================\n\n/**\n * Pre-render routes to static HTML files.\n */\nexport async function prerender(options: PrerenderOptions): Promise<PrerenderResult> {\n const {\n routes: routesInput,\n render,\n outDir = 'dist',\n template = DEFAULT_TEMPLATE,\n onPage,\n onError,\n concurrency = 5,\n } = options;\n\n const start = Date.now();\n\n // Resolve routes\n const routes = typeof routesInput === 'function'\n ? await routesInput()\n : routesInput;\n\n const result: PrerenderResult = {\n rendered: [],\n errors: [],\n duration: 0,\n };\n\n // Process in batches for concurrency control\n for (let i = 0; i < routes.length; i += concurrency) {\n const batch = routes.slice(i, i + concurrency);\n await Promise.all(batch.map(async (url) => {\n try {\n const content = await render(url);\n const html = template\n .replace('{{content}}', content)\n .replace('{{head}}', '')\n .replace('{{scripts}}', '');\n\n const filePath = urlToFilePath(url);\n\n // In a real implementation, we'd write to disk here.\n // For now, we return the result for the caller to handle.\n result.rendered.push({\n url,\n file: `${outDir}/${filePath}`,\n size: new Blob([html]).size,\n });\n\n onPage?.(url, html);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n result.errors.push({ url, error: error.message });\n onError?.(url, error);\n }\n }));\n }\n\n result.duration = Date.now() - start;\n return result;\n}\n\n// =========================================================================\n// Route discovery\n// =========================================================================\n\n/**\n * Discover routes from the file system for prerendering.\n * Scans src/routes/ and returns all static (non-parameterized) paths.\n */\nexport function discoverStaticRoutes(routeManifest: Array<{ path: string }>): string[] {\n return routeManifest\n .filter((r) => !r.path.includes(':') && !r.path.includes('*'))\n .map((r) => r.path);\n}\n\n/**\n * Generate all possible paths for parameterized routes.\n *\n * ```ts\n * const paths = generatePaths('/blog/:slug', [\n * { slug: 'hello' },\n * { slug: 'world' },\n * ]);\n * // ['/blog/hello', '/blog/world']\n * ```\n */\nexport function generatePaths(\n pattern: string,\n params: Record<string, string>[],\n): string[] {\n return params.map((p) => {\n let path = pattern;\n for (const [key, value] of Object.entries(p)) {\n path = path.replace(`:${key}`, value);\n }\n return path;\n });\n}\n\n// =========================================================================\n// Helpers\n// =========================================================================\n\n/**\n * Convert a URL path to a file path for static output.\n * / → index.html\n * /about → about/index.html\n * /blog/hello → blog/hello/index.html\n */\nexport function urlToFilePath(url: string): string {\n const clean = url.replace(/^\\//, '').replace(/\\/$/, '');\n if (!clean) return 'index.html';\n return `${clean}/index.html`;\n}\n\n/**\n * Generate a sitemap from prerender results.\n */\nexport function sitemapFromResults(\n baseUrl: string,\n results: PrerenderResult,\n): 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 page of results.rendered) {\n xml += ` <url>\\n`;\n xml += ` <loc>${baseUrl}${page.url}</loc>\\n`;\n xml += ` <lastmod>${new Date().toISOString().split('T')[0]}</lastmod>\\n`;\n xml += ` </url>\\n`;\n }\n\n xml += '</urlset>\\n';\n return xml;\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function s(e){return {_type:"directive",hooks:e}}function c(e){return s({mounted(n,t){let i=e(n,t);typeof i=="function"&&(n.__directiveCleanup=i);},unmounted(n){n.__directiveCleanup?.();}})}var a=Symbol("akash.directives");function d(e,n,t,i){let o={value:t,arg:i?.arg,modifiers:i?.modifiers},r=e[a]??[];r.push({directive:n,binding:o}),e[a]=r,n.hooks.mounted?.(e,o);}function v(e,n,t){let o=(e[a]??[]).find(r=>r.directive===n);if(o){let r=o.binding.value;o.binding={...o.binding,value:t,oldValue:r},n.hooks.updated?.(e,o.binding);}}function u(e){let n=e[a]??[];for(let t of n)t.directive.hooks.unmounted?.(e,t.binding);delete e[a];}var m=s({mounted(e){requestAnimationFrame(()=>e.focus());}}),l=s({mounted(e,{value:n}){let t=i=>{e.contains(i.target)||n();};document.addEventListener("click",t,true),e.__vClickOutside=t;},unmounted(e){document.removeEventListener("click",e.__vClickOutside,true),delete e.__vClickOutside;}}),T=s({mounted(e,{value:n}){let t=null,i=n.duration??500,o=()=>{t=setTimeout(n.handler,i);},r=()=>{t&&(clearTimeout(t),t=null);};e.addEventListener("pointerdown",o),e.addEventListener("pointerup",r),e.addEventListener("pointerleave",r),e.__vLongPress={start:o,cancel:r};},unmounted(e){let n=e.__vLongPress;n&&(e.removeEventListener("pointerdown",n.start),e.removeEventListener("pointerup",n.cancel),e.removeEventListener("pointerleave",n.cancel));}}),p=s({mounted(e,{value:n}){let t=new IntersectionObserver(i=>{n(i[0].isIntersecting);});t.observe(e),e.__vIntersect=t;},unmounted(e){e.__vIntersect?.disconnect();}}),g=s({mounted(e,{value:n}){let t=new ResizeObserver(i=>{n(i[0]);});t.observe(e),e.__vResize=t;},unmounted(e){e.__vResize?.disconnect();}});export{s as a,c as b,d as c,v as d,u as e,m as f,l as g,T as h,p as i,g as j};//# sourceMappingURL=chunk-MDHWM3C2.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-MDHWM3C2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/directive.ts"],"names":["defineDirective","hooks","directiveFromFn","fn","el","binding","cleanup","DIRECTIVE_KEY","applyDirective","directive","value","options","states","updateDirective","newValue","state","s","oldValue","removeDirectives","vAutoFocus","vClickOutside","handler","listener","e","vLongPress","timer","duration","start","cancel","fns","vIntersect","callback","observer","entries","vResize"],"mappings":"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","file":"chunk-MDHWM3C2.js","sourcesContent":["/**\n * Custom directive system.\n *\n * Reusable attribute behaviors with lifecycle hooks.\n * Directives attach behavior to elements without components.\n *\n * ```ts\n * const vAutoFocus = defineDirective({\n * mounted(el) { el.focus(); },\n * });\n *\n * const vTooltip = defineDirective<string>({\n * mounted(el, { value }) { addTooltip(el, value); },\n * updated(el, { value }) { updateTooltip(el, value); },\n * unmounted(el) { removeTooltip(el); },\n * });\n *\n * // Usage:\n * applyDirective(el, vAutoFocus);\n * applyDirective(el, vTooltip, 'Hello tooltip');\n * ```\n */\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport interface DirectiveBinding<T = any> {\n /** Current value passed to the directive */\n value: T;\n /** Previous value (on update) */\n oldValue?: T;\n /** Argument (e.g., v-on:click → arg = 'click') */\n arg?: string;\n /** Modifiers (e.g., v-on.prevent → modifiers.prevent = true) */\n modifiers?: Record<string, boolean>;\n}\n\nexport interface DirectiveHooks<T = any> {\n /** Called when the element is inserted into the DOM */\n mounted?: (el: HTMLElement, binding: DirectiveBinding<T>) => void;\n /** Called when the bound value updates */\n updated?: (el: HTMLElement, binding: DirectiveBinding<T>) => void;\n /** Called before the element is removed from the DOM */\n unmounted?: (el: HTMLElement, binding: DirectiveBinding<T>) => void;\n}\n\nexport interface Directive<T = any> {\n _type: 'directive';\n hooks: DirectiveHooks<T>;\n}\n\n// =========================================================================\n// defineDirective\n// =========================================================================\n\n/**\n * Define a custom directive.\n *\n * ```ts\n * const vClickOutside = defineDirective<() => void>({\n * mounted(el, { value: handler }) {\n * const listener = (e: Event) => {\n * if (!el.contains(e.target as Node)) handler();\n * };\n * document.addEventListener('click', listener);\n * (el as any).__clickOutside = listener;\n * },\n * unmounted(el) {\n * document.removeEventListener('click', (el as any).__clickOutside);\n * },\n * });\n * ```\n */\nexport function defineDirective<T = any>(hooks: DirectiveHooks<T>): Directive<T> {\n return { _type: 'directive', hooks };\n}\n\n/**\n * Shorthand: directive from a single function (runs on mount).\n */\nexport function directiveFromFn<T = any>(\n fn: (el: HTMLElement, binding: DirectiveBinding<T>) => void | (() => void),\n): Directive<T> {\n return defineDirective<T>({\n mounted(el, binding) {\n const cleanup = fn(el, binding);\n if (typeof cleanup === 'function') {\n (el as any).__directiveCleanup = cleanup;\n }\n },\n unmounted(el) {\n (el as any).__directiveCleanup?.();\n },\n });\n}\n\n// =========================================================================\n// applyDirective — attach a directive to an element\n// =========================================================================\n\nconst DIRECTIVE_KEY = Symbol('akash.directives');\n\ninterface DirectiveState {\n directive: Directive;\n binding: DirectiveBinding;\n}\n\n/**\n * Apply a directive to an element.\n *\n * ```ts\n * applyDirective(el, vAutoFocus);\n * applyDirective(el, vTooltip, 'Hello');\n * ```\n */\nexport function applyDirective<T>(\n el: HTMLElement,\n directive: Directive<T>,\n value?: T,\n options?: { arg?: string; modifiers?: Record<string, boolean> },\n): void {\n const binding: DirectiveBinding<T> = {\n value: value as T,\n arg: options?.arg,\n modifiers: options?.modifiers,\n };\n\n // Store directive state on element\n const states: DirectiveState[] = (el as any)[DIRECTIVE_KEY] ?? [];\n states.push({ directive, binding });\n (el as any)[DIRECTIVE_KEY] = states;\n\n // Call mounted hook\n directive.hooks.mounted?.(el, binding);\n}\n\n/**\n * Update a directive's value on an element.\n */\nexport function updateDirective<T>(\n el: HTMLElement,\n directive: Directive<T>,\n newValue: T,\n): void {\n const states: DirectiveState[] = (el as any)[DIRECTIVE_KEY] ?? [];\n const state = states.find((s) => s.directive === directive);\n\n if (state) {\n const oldValue = state.binding.value;\n state.binding = { ...state.binding, value: newValue, oldValue };\n directive.hooks.updated?.(el, state.binding);\n }\n}\n\n/**\n * Remove all directives from an element (call on unmount).\n */\nexport function removeDirectives(el: HTMLElement): void {\n const states: DirectiveState[] = (el as any)[DIRECTIVE_KEY] ?? [];\n for (const state of states) {\n state.directive.hooks.unmounted?.(el, state.binding);\n }\n delete (el as any)[DIRECTIVE_KEY];\n}\n\n// =========================================================================\n// Built-in directives\n// =========================================================================\n\n/** Auto-focus an element when mounted */\nexport const vAutoFocus = defineDirective({\n mounted(el) {\n requestAnimationFrame(() => el.focus());\n },\n});\n\n/** Click outside handler */\nexport const vClickOutside = defineDirective<() => void>({\n mounted(el, { value: handler }) {\n const listener = (e: Event) => {\n if (!el.contains(e.target as Node)) handler();\n };\n document.addEventListener('click', listener, true);\n (el as any).__vClickOutside = listener;\n },\n unmounted(el) {\n document.removeEventListener('click', (el as any).__vClickOutside, true);\n delete (el as any).__vClickOutside;\n },\n});\n\n/** Long press handler */\nexport const vLongPress = defineDirective<{ handler: () => void; duration?: number }>({\n mounted(el, { value }) {\n let timer: ReturnType<typeof setTimeout> | null = null;\n const duration = value.duration ?? 500;\n\n const start = () => { timer = setTimeout(value.handler, duration); };\n const cancel = () => { if (timer) { clearTimeout(timer); timer = null; } };\n\n el.addEventListener('pointerdown', start);\n el.addEventListener('pointerup', cancel);\n el.addEventListener('pointerleave', cancel);\n\n (el as any).__vLongPress = { start, cancel };\n },\n unmounted(el) {\n const fns = (el as any).__vLongPress;\n if (fns) {\n el.removeEventListener('pointerdown', fns.start);\n el.removeEventListener('pointerup', fns.cancel);\n el.removeEventListener('pointerleave', fns.cancel);\n }\n },\n});\n\n/** Intersection observer — triggers callback when element enters viewport */\nexport const vIntersect = defineDirective<(isIntersecting: boolean) => void>({\n mounted(el, { value: callback }) {\n const observer = new IntersectionObserver((entries) => {\n callback(entries[0].isIntersecting);\n });\n observer.observe(el);\n (el as any).__vIntersect = observer;\n },\n unmounted(el) {\n (el as any).__vIntersect?.disconnect();\n },\n});\n\n/** Resize observer — triggers callback on element resize */\nexport const vResize = defineDirective<(entry: ResizeObserverEntry) => void>({\n mounted(el, { value: callback }) {\n const observer = new ResizeObserver((entries) => {\n callback(entries[0]);\n });\n observer.observe(el);\n (el as any).__vResize = observer;\n },\n unmounted(el) {\n (el as any).__vResize?.disconnect();\n },\n});\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import {p}from'./chunk-KE7BJTCD.js';import {e}from'./chunk-YXKQTEPR.js';var f=[];function m(){let i=f;return f=[],i}function g(i){if(!i||i.length===0)return "";let r="",s=i.reduce((o,t)=>t.title??o,""),c=i.reduce((o,t)=>t.titleTemplate??o,"");if(s){let o=c?c.replace("%s",s):s;r+=`<title>${o}</title>
|
|
2
|
+
`;}for(let o of i)for(let t of o.meta??[])r+=" <meta",t.name&&(r+=` name="${t.name}"`),t.property&&(r+=` property="${t.property}"`),t.httpEquiv&&(r+=` http-equiv="${t.httpEquiv}"`),r+=` content="${t.content}"`,r+=` />
|
|
3
|
+
`;for(let o of i)for(let t of o.link??[])r+=` <link rel="${t.rel}" href="${t.href}"`,t.type&&(r+=` type="${t.type}"`),r+=` />
|
|
4
|
+
`;return r}var a="data-akash-head";function h(i){let r=typeof i=="function"?i:()=>i;if(typeof document>"u")return f.push(r()),()=>{};let s=[],c=e(()=>{let t=r();for(let e of s)e.remove();if(s.length=0,t.title){let e=t.titleTemplate?t.titleTemplate.replace("%s",t.title):t.title;document.title=e;}for(let e of t.meta??[]){let n=document.createElement("meta");n.setAttribute(a,""),e.name&&n.setAttribute("name",e.name),e.property&&n.setAttribute("property",e.property),e.httpEquiv&&n.setAttribute("http-equiv",e.httpEquiv),n.setAttribute("content",e.content),document.head.appendChild(n),s.push(n);}for(let e of t.link??[]){let n=document.createElement("link");n.setAttribute(a,""),n.setAttribute("rel",e.rel),n.setAttribute("href",e.href),e.type&&n.setAttribute("type",e.type),document.head.appendChild(n),s.push(n);}for(let e of t.script??[]){let n=document.createElement("script");n.setAttribute(a,""),e.src&&n.setAttribute("src",e.src),e.type&&n.setAttribute("type",e.type),e.async&&n.setAttribute("async",""),e.defer&&n.setAttribute("defer",""),e.innerHTML&&(n.textContent=e.innerHTML),document.head.appendChild(n),s.push(n);}if(t.htmlAttrs)for(let[e,n]of Object.entries(t.htmlAttrs))document.documentElement.setAttribute(e,n);if(t.bodyAttrs)for(let[e,n]of Object.entries(t.bodyAttrs))document.body.setAttribute(e,n);}),o=()=>{c();for(let t of s)t.remove();s.length=0;};try{p(o);}catch{}return o}export{m as a,g as b,h as c};//# sourceMappingURL=chunk-N3ITIHHM.js.map
|
|
5
|
+
//# sourceMappingURL=chunk-N3ITIHHM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/head.ts"],"names":["ssrHeadTags","collectSSRHead","tags","renderHeadToString","configs","html","title","t","c","titleTemplate","finalTitle","config","meta","link","MANAGED_ATTR","useHead","getConfig","managedElements","dispose","effect","cfg","el","script","key","value","cleanup","onUnmount"],"mappings":"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","file":"chunk-N3ITIHHM.js","sourcesContent":["/**\n * Document head management.\n *\n * Provides Title, Meta, and Head components for managing\n * <head> content declaratively. SSR-compatible — on the server,\n * collects tags; on the client, directly mutates the DOM.\n *\n * ```ts\n * // In any component:\n * useHead({\n * title: 'My Page',\n * meta: [\n * { name: 'description', content: 'Page description' },\n * { property: 'og:title', content: 'My Page' },\n * ],\n * link: [\n * { rel: 'canonical', href: 'https://example.com/page' },\n * ],\n * });\n * ```\n */\n\nimport { effect } from './signals.js';\nimport { onUnmount } from './component.js';\n\n// --- Types ---\n\nexport interface HeadConfig {\n /** Document title */\n title?: string;\n /** Title template — use %s as placeholder */\n titleTemplate?: string;\n /** Meta tags */\n meta?: MetaTag[];\n /** Link tags */\n link?: LinkTag[];\n /** Script tags */\n script?: ScriptTag[];\n /** HTML attributes */\n htmlAttrs?: Record<string, string>;\n /** Body attributes */\n bodyAttrs?: Record<string, string>;\n}\n\nexport interface MetaTag {\n name?: string;\n property?: string;\n httpEquiv?: string;\n content: string;\n}\n\nexport interface LinkTag {\n rel: string;\n href: string;\n type?: string;\n crossorigin?: string;\n}\n\nexport interface ScriptTag {\n src?: string;\n type?: string;\n async?: boolean;\n defer?: boolean;\n innerHTML?: string;\n}\n\n// --- SSR head collection ---\n\nlet ssrHeadTags: HeadConfig[] = [];\n\n/** @internal — collect head tags during SSR */\nexport function collectSSRHead(): HeadConfig[] {\n const tags = ssrHeadTags;\n ssrHeadTags = [];\n return tags;\n}\n\n/** Render collected head tags to HTML string (for SSR) */\nexport function renderHeadToString(configs?: HeadConfig[] | null): string {\n if (!configs || configs.length === 0) return '';\n let html = '';\n\n // Last title wins\n const title = configs.reduce((t, c) => c.title ?? t, '');\n const titleTemplate = configs.reduce((t, c) => c.titleTemplate ?? t, '');\n\n if (title) {\n const finalTitle = titleTemplate\n ? titleTemplate.replace('%s', title)\n : title;\n html += `<title>${finalTitle}</title>\\n`;\n }\n\n // Merge all meta tags\n for (const config of configs) {\n for (const meta of config.meta ?? []) {\n html += ' <meta';\n if (meta.name) html += ` name=\"${meta.name}\"`;\n if (meta.property) html += ` property=\"${meta.property}\"`;\n if (meta.httpEquiv) html += ` http-equiv=\"${meta.httpEquiv}\"`;\n html += ` content=\"${meta.content}\"`;\n html += ' />\\n';\n }\n }\n\n // Merge all link tags\n for (const config of configs) {\n for (const link of config.link ?? []) {\n html += ` <link rel=\"${link.rel}\" href=\"${link.href}\"`;\n if (link.type) html += ` type=\"${link.type}\"`;\n html += ' />\\n';\n }\n }\n\n return html;\n}\n\n// --- Client-side head management ---\n\nconst MANAGED_ATTR = 'data-akash-head';\n\n/**\n * Declaratively manage document head tags.\n * Call inside defineComponent() setup.\n *\n * Tags are automatically cleaned up when the component unmounts.\n * Reactive values (signals) in the config trigger updates.\n */\nexport function useHead(config: HeadConfig | (() => HeadConfig)): () => void {\n const getConfig = typeof config === 'function' ? config : () => config;\n\n // SSR: just collect\n if (typeof document === 'undefined') {\n ssrHeadTags.push(getConfig());\n return () => {};\n }\n\n const managedElements: Element[] = [];\n\n const dispose = effect(() => {\n const cfg = getConfig();\n\n // Clean up previously managed elements\n for (const el of managedElements) {\n el.remove();\n }\n managedElements.length = 0;\n\n // Title\n if (cfg.title) {\n const title = cfg.titleTemplate\n ? cfg.titleTemplate.replace('%s', cfg.title)\n : cfg.title;\n document.title = title;\n }\n\n // Meta tags\n for (const meta of cfg.meta ?? []) {\n const el = document.createElement('meta');\n el.setAttribute(MANAGED_ATTR, '');\n if (meta.name) el.setAttribute('name', meta.name);\n if (meta.property) el.setAttribute('property', meta.property);\n if (meta.httpEquiv) el.setAttribute('http-equiv', meta.httpEquiv);\n el.setAttribute('content', meta.content);\n document.head.appendChild(el);\n managedElements.push(el);\n }\n\n // Link tags\n for (const link of cfg.link ?? []) {\n const el = document.createElement('link');\n el.setAttribute(MANAGED_ATTR, '');\n el.setAttribute('rel', link.rel);\n el.setAttribute('href', link.href);\n if (link.type) el.setAttribute('type', link.type);\n document.head.appendChild(el);\n managedElements.push(el);\n }\n\n // Script tags\n for (const script of cfg.script ?? []) {\n const el = document.createElement('script');\n el.setAttribute(MANAGED_ATTR, '');\n if (script.src) el.setAttribute('src', script.src);\n if (script.type) el.setAttribute('type', script.type);\n if (script.async) el.setAttribute('async', '');\n if (script.defer) el.setAttribute('defer', '');\n if (script.innerHTML) el.textContent = script.innerHTML;\n document.head.appendChild(el);\n managedElements.push(el);\n }\n\n // HTML attributes\n if (cfg.htmlAttrs) {\n for (const [key, value] of Object.entries(cfg.htmlAttrs)) {\n document.documentElement.setAttribute(key, value);\n }\n }\n\n // Body attributes\n if (cfg.bodyAttrs) {\n for (const [key, value] of Object.entries(cfg.bodyAttrs)) {\n document.body.setAttribute(key, value);\n }\n }\n });\n\n const cleanup = () => {\n dispose();\n for (const el of managedElements) {\n el.remove();\n }\n managedElements.length = 0;\n };\n\n // Cleanup on unmount\n try {\n onUnmount(cleanup);\n } catch {\n // onUnmount may throw if called outside component — that's fine,\n // caller can use the returned dispose function manually\n }\n\n return cleanup;\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {e}from'./chunk-YXKQTEPR.js';function w(e$1,t,u={}){let{immediate:x=false,once:O=false,debounce:i,deep:l=false}=u,T=Array.isArray(e$1),s=T?e$1:[e$1],o=s.map(()=>{}),h=true,c=null,f=false,y=null,b=()=>{f=true,c&&clearTimeout(c),y?.();};y=e(()=>{let n=s.map(r=>r());if(h){h=false,o=l?n.map(k):[...n],x&&m(n,s.map(()=>{}));return}if(!(l?n.some((r,p)=>!S(r,o[p])):n.some((r,p)=>!Object.is(r,o[p]))))return;let a=[...o];o=l?n.map(k):[...n],m(n,a);});function m(n,d){if(f)return;let a=()=>{O&&(f=true,queueMicrotask(b)),T?t(n,d):t(n[0],d[0]);};i&&i>0?(c&&clearTimeout(c),c=setTimeout(a,i)):a();}return b}function v(e,t){return w(e,t,{once:true})}function g(e,t,u){return w(e,t,{debounce:u})}function k(e){if(e===null||typeof e!="object")return e;try{return JSON.parse(JSON.stringify(e))}catch{return e}}function S(e,t){if(Object.is(e,t))return true;if(e===null||t===null||typeof e!="object"||typeof t!="object")return false;try{return JSON.stringify(e)===JSON.stringify(t)}catch{return false}}export{w as a,v as b,g as c};//# sourceMappingURL=chunk-N5APNCPB.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-N5APNCPB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/watch.ts"],"names":["watch","source","callback","options","immediate","once","debounceMs","deep","isMulti","sources","oldValues","isFirst","debounceTimer","disposed","disposeEffect","dispose","effect","newValues","s","deepClone","fireCallback","v","i","deepEqual","prevValues","newVals","oldVals","doCall","watchOnce","watchDebounced","ms","value","a","b"],"mappings":"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","file":"chunk-N5APNCPB.js","sourcesContent":["/**\n * watch() — react to signal changes with old/new values.\n *\n * Unlike effect() which just re-runs, watch() gives you the previous\n * and current value so you can react to *what changed*.\n *\n * ```ts\n * const count = signal(0);\n * watch(count, (newVal, oldVal) => {\n * console.log(`Changed from ${oldVal} to ${newVal}`);\n * });\n *\n * // With options:\n * watch(count, callback, { immediate: true, once: true });\n *\n * // Multiple sources:\n * watch([count, name], ([newCount, newName], [oldCount, oldName]) => { ... });\n * ```\n */\n\nimport { effect } from './signals.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport interface WatchOptions {\n /** Run callback immediately with current value (default: false) */\n immediate?: boolean;\n /** Only fire once, then auto-dispose (default: false) */\n once?: boolean;\n /** Debounce callback in ms */\n debounce?: number;\n /** Deep comparison for objects (default: false) */\n deep?: boolean;\n}\n\nexport type WatchSource<T> = () => T;\nexport type WatchCallback<T> = (newValue: T, oldValue: T | undefined) => void;\nexport type WatchArrayCallback<T extends unknown[]> = (newValues: T, oldValues: (T[number] | undefined)[]) => void;\n\n// =========================================================================\n// watch() — single source\n// =========================================================================\n\n/**\n * Watch a reactive source and call back with old + new values.\n *\n * ```ts\n * const dispose = watch(count, (newVal, oldVal) => {\n * analytics.track('count_changed', { from: oldVal, to: newVal });\n * });\n * ```\n */\nexport function watch<T>(\n source: WatchSource<T>,\n callback: WatchCallback<T>,\n options?: WatchOptions,\n): () => void;\n\n/**\n * Watch multiple sources.\n */\nexport function watch<T extends unknown[]>(\n sources: { [K in keyof T]: WatchSource<T[K]> },\n callback: WatchArrayCallback<T>,\n options?: WatchOptions,\n): () => void;\n\nexport function watch(\n source: WatchSource<any> | WatchSource<any>[],\n callback: any,\n options: WatchOptions = {},\n): () => void {\n const { immediate = false, once = false, debounce: debounceMs, deep = false } = options;\n\n const isMulti = Array.isArray(source);\n const sources = isMulti ? source : [source];\n\n let oldValues: any[] = sources.map(() => undefined);\n let isFirst = true;\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n let disposed = false;\n let disposeEffect: (() => void) | null = null;\n\n const dispose = () => {\n disposed = true;\n if (debounceTimer) clearTimeout(debounceTimer);\n disposeEffect?.();\n };\n\n disposeEffect = effect(() => {\n // Read all sources to establish tracking\n const newValues = sources.map((s) => s());\n\n if (isFirst) {\n isFirst = false;\n oldValues = deep ? newValues.map(deepClone) : [...newValues];\n\n if (immediate) {\n fireCallback(newValues, sources.map(() => undefined));\n }\n return;\n }\n\n // Check if anything actually changed\n const changed = deep\n ? newValues.some((v, i) => !deepEqual(v, oldValues[i]))\n : newValues.some((v, i) => !Object.is(v, oldValues[i]));\n\n if (!changed) return;\n\n const prevValues = [...oldValues];\n oldValues = deep ? newValues.map(deepClone) : [...newValues];\n\n fireCallback(newValues, prevValues);\n });\n\n function fireCallback(newVals: any[], oldVals: any[]): void {\n if (disposed) return;\n\n const doCall = () => {\n if (once) {\n // Dispose BEFORE calling callback so any signal writes in the\n // callback don't re-trigger this watcher\n disposed = true;\n queueMicrotask(dispose);\n }\n\n if (isMulti) {\n callback(newVals, oldVals);\n } else {\n callback(newVals[0], oldVals[0]);\n }\n };\n\n if (debounceMs && debounceMs > 0) {\n if (debounceTimer) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(doCall, debounceMs);\n } else {\n doCall();\n }\n }\n\n return dispose;\n}\n\n// =========================================================================\n// watchOnce — convenience\n// =========================================================================\n\n/**\n * Watch a source once, then auto-dispose.\n *\n * ```ts\n * watchOnce(isReady, (ready) => {\n * if (ready) initApp();\n * });\n * ```\n */\nexport function watchOnce<T>(\n source: WatchSource<T>,\n callback: WatchCallback<T>,\n): () => void {\n return watch(source, callback, { once: true });\n}\n\n// =========================================================================\n// watchDebounced — convenience\n// =========================================================================\n\n/**\n * Watch with built-in debounce.\n *\n * ```ts\n * watchDebounced(searchInput, (query) => {\n * fetchResults(query);\n * }, 300);\n * ```\n */\nexport function watchDebounced<T>(\n source: WatchSource<T>,\n callback: WatchCallback<T>,\n ms: number,\n): () => void {\n return watch(source, callback, { debounce: ms });\n}\n\n// =========================================================================\n// Helpers\n// =========================================================================\n\nfunction deepClone<T>(value: T): T {\n if (value === null || typeof value !== 'object') return value;\n try {\n return JSON.parse(JSON.stringify(value));\n } catch {\n return value;\n }\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (a === null || b === null || typeof a !== 'object' || typeof b !== 'object') return false;\n try {\n return JSON.stringify(a) === JSON.stringify(b);\n } catch {\n return false;\n }\n}\n"]}
|