@akashjs/runtime 0.2.6 → 0.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/a11y.cjs +2 -0
- package/dist/a11y.cjs.map +1 -0
- package/dist/a11y.d.cts +99 -0
- package/dist/a11y.d.ts +99 -0
- package/dist/a11y.js +2 -0
- package/dist/a11y.js.map +1 -0
- package/dist/async-component.cjs +2 -0
- package/dist/async-component.cjs.map +1 -0
- package/dist/async-component.d.cts +44 -0
- package/dist/async-component.d.ts +44 -0
- package/dist/async-component.js +2 -0
- package/dist/async-component.js.map +1 -0
- package/dist/await-block.cjs +2 -0
- package/dist/await-block.cjs.map +1 -0
- package/dist/await-block.d.cts +37 -0
- package/dist/await-block.d.ts +37 -0
- package/dist/await-block.js +2 -0
- package/dist/await-block.js.map +1 -0
- package/dist/browser.cjs +2 -0
- package/dist/browser.cjs.map +1 -0
- package/dist/browser.d.cts +125 -0
- package/dist/browser.d.ts +125 -0
- package/dist/browser.js +2 -0
- package/dist/browser.js.map +1 -0
- package/dist/chunk-2HLDEWRT.cjs +2 -0
- package/dist/chunk-2HLDEWRT.cjs.map +1 -0
- package/dist/{chunk-2U643GJZ.cjs → chunk-2LKFIID7.cjs} +2 -2
- package/dist/{chunk-2U643GJZ.cjs.map → chunk-2LKFIID7.cjs.map} +1 -1
- package/dist/chunk-34PQECMN.cjs +2 -0
- package/dist/chunk-34PQECMN.cjs.map +1 -0
- package/dist/chunk-36VM3RJW.cjs +2 -0
- package/dist/chunk-36VM3RJW.cjs.map +1 -0
- package/dist/chunk-3PGU24B5.cjs +3 -0
- package/dist/chunk-3PGU24B5.cjs.map +1 -0
- package/dist/chunk-3XREYIJH.cjs +2 -0
- package/dist/chunk-3XREYIJH.cjs.map +1 -0
- package/dist/chunk-45DPEU7T.cjs +2 -0
- package/dist/chunk-45DPEU7T.cjs.map +1 -0
- package/dist/chunk-4J3QBQVW.js +4 -0
- package/dist/chunk-4J3QBQVW.js.map +1 -0
- package/dist/{chunk-2Q6SYE5O.cjs → chunk-4NQEIKH5.cjs} +2 -2
- package/dist/{chunk-2Q6SYE5O.cjs.map → chunk-4NQEIKH5.cjs.map} +1 -1
- package/dist/chunk-5QCWH6QA.cjs +4 -0
- package/dist/chunk-5QCWH6QA.cjs.map +1 -0
- package/dist/chunk-6O46EMQS.cjs +2 -0
- package/dist/chunk-6O46EMQS.cjs.map +1 -0
- package/dist/chunk-7IJUJUXE.cjs +2 -0
- package/dist/chunk-7IJUJUXE.cjs.map +1 -0
- package/dist/chunk-7UX5CSGZ.cjs +2 -0
- package/dist/chunk-7UX5CSGZ.cjs.map +1 -0
- package/dist/chunk-7VBH4F3P.js +2 -0
- package/dist/chunk-7VBH4F3P.js.map +1 -0
- package/dist/chunk-7ZPSYZHD.cjs +2 -0
- package/dist/chunk-7ZPSYZHD.cjs.map +1 -0
- package/dist/chunk-AOFLE33X.js +5 -0
- package/dist/chunk-AOFLE33X.js.map +1 -0
- package/dist/chunk-AQQQVDBQ.cjs +2 -0
- package/dist/chunk-AQQQVDBQ.cjs.map +1 -0
- package/dist/chunk-AXB5GHGO.js +2 -0
- package/dist/chunk-AXB5GHGO.js.map +1 -0
- package/dist/chunk-AZCELE44.cjs +2 -0
- package/dist/chunk-AZCELE44.cjs.map +1 -0
- package/dist/chunk-BB7P6HTR.js +2 -0
- package/dist/chunk-BB7P6HTR.js.map +1 -0
- package/dist/chunk-BGSF77LF.js +2 -0
- package/dist/chunk-BGSF77LF.js.map +1 -0
- package/dist/chunk-BHP3UTTQ.cjs +3 -0
- package/dist/chunk-BHP3UTTQ.cjs.map +1 -0
- package/dist/chunk-CP6SK2B4.js +2 -0
- package/dist/{chunk-5NHDEY2C.js.map → chunk-CP6SK2B4.js.map} +1 -1
- package/dist/chunk-DFYXFKCH.cjs +2 -0
- package/dist/chunk-DFYXFKCH.cjs.map +1 -0
- package/dist/chunk-DHFVVFZF.cjs +2 -0
- package/dist/chunk-DHFVVFZF.cjs.map +1 -0
- package/dist/chunk-DP7G45QM.cjs +13 -0
- package/dist/chunk-DP7G45QM.cjs.map +1 -0
- package/dist/chunk-E6RB7PRO.js +2 -0
- package/dist/chunk-E6RB7PRO.js.map +1 -0
- package/dist/chunk-F4FXIPR3.js +2 -0
- package/dist/chunk-F4FXIPR3.js.map +1 -0
- package/dist/chunk-F6VSSM2P.js +2 -0
- package/dist/chunk-F6VSSM2P.js.map +1 -0
- package/dist/chunk-FUVSCPU4.cjs +2 -0
- package/dist/chunk-FUVSCPU4.cjs.map +1 -0
- package/dist/chunk-FVF3T4JJ.js +2 -0
- package/dist/chunk-FVF3T4JJ.js.map +1 -0
- package/dist/chunk-FVWHMFX6.cjs +5 -0
- package/dist/chunk-FVWHMFX6.cjs.map +1 -0
- package/dist/chunk-IHEW6F2H.js +2 -0
- package/dist/chunk-IHEW6F2H.js.map +1 -0
- package/dist/chunk-IJS2EMSE.js +2 -0
- package/dist/chunk-IJS2EMSE.js.map +1 -0
- package/dist/chunk-IKVHLORY.cjs +11 -0
- package/dist/chunk-IKVHLORY.cjs.map +1 -0
- package/dist/chunk-IQGSDFBI.cjs +2 -0
- package/dist/chunk-IQGSDFBI.cjs.map +1 -0
- package/dist/chunk-J6KDUWX6.cjs +2 -0
- package/dist/chunk-J6KDUWX6.cjs.map +1 -0
- package/dist/chunk-JD3LDHUI.cjs +2 -0
- package/dist/chunk-JD3LDHUI.cjs.map +1 -0
- package/dist/chunk-JEYTB4AG.js +2 -0
- package/dist/chunk-JEYTB4AG.js.map +1 -0
- package/dist/chunk-JFLZJPVN.js +2 -0
- package/dist/chunk-JFLZJPVN.js.map +1 -0
- package/dist/chunk-JLPJ22CE.js +2 -0
- package/dist/chunk-JLPJ22CE.js.map +1 -0
- package/dist/chunk-JQCN42XX.js +2 -0
- package/dist/chunk-JQCN42XX.js.map +1 -0
- package/dist/chunk-K2HB5VFA.cjs +2 -0
- package/dist/chunk-K2HB5VFA.cjs.map +1 -0
- package/dist/chunk-K7TMUF3F.cjs +2 -0
- package/dist/chunk-K7TMUF3F.cjs.map +1 -0
- package/dist/chunk-KE7BJTCD.js +2 -0
- package/dist/chunk-KE7BJTCD.js.map +1 -0
- package/dist/chunk-KMEGUPH2.js +3 -0
- package/dist/chunk-KMEGUPH2.js.map +1 -0
- package/dist/chunk-KUPL3ZVD.js +2 -0
- package/dist/chunk-KUPL3ZVD.js.map +1 -0
- package/dist/chunk-L3ZZX36S.js +2 -0
- package/dist/chunk-L3ZZX36S.js.map +1 -0
- package/dist/chunk-LD4C62JY.cjs +2 -0
- package/dist/chunk-LD4C62JY.cjs.map +1 -0
- package/dist/chunk-LWQPLKL6.cjs +20 -0
- package/dist/chunk-LWQPLKL6.cjs.map +1 -0
- package/dist/chunk-M5IACTFC.cjs +17 -0
- package/dist/chunk-M5IACTFC.cjs.map +1 -0
- package/dist/chunk-MADMPRT2.js +20 -0
- package/dist/chunk-MADMPRT2.js.map +1 -0
- package/dist/chunk-MDHWM3C2.js +2 -0
- package/dist/chunk-MDHWM3C2.js.map +1 -0
- package/dist/chunk-N3ITIHHM.js +5 -0
- package/dist/chunk-N3ITIHHM.js.map +1 -0
- package/dist/chunk-N5APNCPB.js +2 -0
- package/dist/chunk-N5APNCPB.js.map +1 -0
- package/dist/{chunk-U53YRJNV.js → chunk-NBYFHJWB.js} +3 -3
- package/dist/{chunk-U53YRJNV.js.map → chunk-NBYFHJWB.js.map} +1 -1
- package/dist/chunk-NCXMNJUN.js +2 -0
- package/dist/chunk-NCXMNJUN.js.map +1 -0
- package/dist/chunk-NEQ5TENE.cjs +2 -0
- package/dist/chunk-NEQ5TENE.cjs.map +1 -0
- package/dist/chunk-NGU2W4PD.cjs +2 -0
- package/dist/chunk-NGU2W4PD.cjs.map +1 -0
- package/dist/{chunk-ZYVQQ5VR.cjs → chunk-NHDYQTC5.cjs} +3 -3
- package/dist/{chunk-ZYVQQ5VR.cjs.map → chunk-NHDYQTC5.cjs.map} +1 -1
- package/dist/chunk-NJXXC5JB.js +2 -0
- package/dist/chunk-NJXXC5JB.js.map +1 -0
- package/dist/chunk-NQEY7DR5.cjs +2 -0
- package/dist/chunk-NQEY7DR5.cjs.map +1 -0
- package/dist/chunk-OQV3NYDH.js +3 -0
- package/dist/chunk-OQV3NYDH.js.map +1 -0
- package/dist/chunk-OZ4GNBKA.js +2 -0
- package/dist/chunk-OZ4GNBKA.js.map +1 -0
- package/dist/chunk-PPNEAFKE.cjs +5 -0
- package/dist/chunk-PPNEAFKE.cjs.map +1 -0
- package/dist/chunk-PYASLKWF.js +2 -0
- package/dist/chunk-PYASLKWF.js.map +1 -0
- package/dist/chunk-Q6S7SUOM.js +2 -0
- package/dist/chunk-Q6S7SUOM.js.map +1 -0
- package/dist/chunk-QE2TJ6P5.cjs +2 -0
- package/dist/chunk-QE2TJ6P5.cjs.map +1 -0
- package/dist/chunk-QNVMBXVH.js +2 -0
- package/dist/chunk-QNVMBXVH.js.map +1 -0
- package/dist/chunk-QQ725EZL.js +2 -0
- package/dist/chunk-QQ725EZL.js.map +1 -0
- package/dist/chunk-QQTZQ6UX.cjs +2 -0
- package/dist/chunk-QQTZQ6UX.cjs.map +1 -0
- package/dist/{chunk-AVVJKYT3.cjs → chunk-QSPRVXFV.cjs} +2 -2
- package/dist/{chunk-AVVJKYT3.cjs.map → chunk-QSPRVXFV.cjs.map} +1 -1
- package/dist/chunk-QTQ6RUX4.cjs +5 -0
- package/dist/chunk-QTQ6RUX4.cjs.map +1 -0
- package/dist/chunk-R65RPMQX.cjs +2 -0
- package/dist/chunk-R65RPMQX.cjs.map +1 -0
- package/dist/chunk-R7NUVVHP.js +2 -0
- package/dist/{chunk-5A7KDBDU.js.map → chunk-R7NUVVHP.js.map} +1 -1
- package/dist/chunk-SXYPAP4B.js +2 -0
- package/dist/chunk-SXYPAP4B.js.map +1 -0
- package/dist/chunk-T2RVAQEU.js +2 -0
- package/dist/chunk-T2RVAQEU.js.map +1 -0
- package/dist/chunk-T7A5YOEG.cjs +2 -0
- package/dist/chunk-T7A5YOEG.cjs.map +1 -0
- package/dist/chunk-TDKDZ3QJ.cjs +2 -0
- package/dist/chunk-TDKDZ3QJ.cjs.map +1 -0
- package/dist/chunk-TFEHO7SF.cjs +2 -0
- package/dist/chunk-TFEHO7SF.cjs.map +1 -0
- package/dist/chunk-TSFY5HKB.js +17 -0
- package/dist/chunk-TSFY5HKB.js.map +1 -0
- package/dist/chunk-TYTEJYUQ.cjs +2 -0
- package/dist/chunk-TYTEJYUQ.cjs.map +1 -0
- package/dist/chunk-TZHEZW6R.js +11 -0
- package/dist/chunk-TZHEZW6R.js.map +1 -0
- package/dist/chunk-U65WRXZC.js +13 -0
- package/dist/chunk-U65WRXZC.js.map +1 -0
- package/dist/chunk-UT4MWGJ3.js +2 -0
- package/dist/chunk-UT4MWGJ3.js.map +1 -0
- package/dist/chunk-V2JDKH3W.cjs +2 -0
- package/dist/chunk-V2JDKH3W.cjs.map +1 -0
- package/dist/chunk-VNDSKBXQ.cjs +2 -0
- package/dist/chunk-VNDSKBXQ.cjs.map +1 -0
- package/dist/chunk-VO4FCKHM.js +2 -0
- package/dist/chunk-VO4FCKHM.js.map +1 -0
- package/dist/chunk-VUMMC2P5.js +2 -0
- package/dist/chunk-VUMMC2P5.js.map +1 -0
- package/dist/chunk-VUSNUBNI.js +2 -0
- package/dist/chunk-VUSNUBNI.js.map +1 -0
- package/dist/chunk-VWTULWXF.js +2 -0
- package/dist/{chunk-TKFJGLUO.js.map → chunk-VWTULWXF.js.map} +1 -1
- package/dist/chunk-VX7PSSOU.js +5 -0
- package/dist/chunk-VX7PSSOU.js.map +1 -0
- package/dist/chunk-WLSXJU2N.js +13 -0
- package/dist/chunk-WLSXJU2N.js.map +1 -0
- package/dist/chunk-WOZWFMOK.cjs +2 -0
- package/dist/chunk-WOZWFMOK.cjs.map +1 -0
- package/dist/chunk-WTDTVWCQ.cjs +2 -0
- package/dist/chunk-WTDTVWCQ.cjs.map +1 -0
- package/dist/chunk-WZ5ULION.js +2 -0
- package/dist/chunk-WZ5ULION.js.map +1 -0
- package/dist/chunk-XPLIEN2G.cjs +13 -0
- package/dist/chunk-XPLIEN2G.cjs.map +1 -0
- package/dist/chunk-XWVNLE2W.cjs +2 -0
- package/dist/chunk-XWVNLE2W.cjs.map +1 -0
- package/dist/chunk-XZR3J626.cjs +2 -0
- package/dist/chunk-XZR3J626.cjs.map +1 -0
- package/dist/chunk-YDO5KARN.js +2 -0
- package/dist/chunk-YDO5KARN.js.map +1 -0
- package/dist/chunk-YURIYBTN.cjs +2 -0
- package/dist/chunk-YURIYBTN.cjs.map +1 -0
- package/dist/chunk-YXKQTEPR.js +2 -0
- package/dist/chunk-YXKQTEPR.js.map +1 -0
- package/dist/chunk-Z6K4FYG6.js +2 -0
- package/dist/chunk-Z6K4FYG6.js.map +1 -0
- package/dist/chunk-ZJULEDLY.js +2 -0
- package/dist/chunk-ZJULEDLY.js.map +1 -0
- package/dist/{component-C1WnFcRp.d.ts → component-CPVtkASo.d.ts} +2 -3
- package/dist/{component-C1WnFcRp.d.cts → component-CxlupKuc.d.cts} +2 -3
- package/dist/composables.cjs +2 -0
- package/dist/composables.cjs.map +1 -0
- package/dist/composables.d.cts +103 -0
- package/dist/composables.d.ts +103 -0
- package/dist/composables.js +2 -0
- package/dist/composables.js.map +1 -0
- package/dist/{context-CB1mCq2h.d.cts → context-Cwt7QCpk.d.cts} +1 -9
- package/dist/{context-CB1mCq2h.d.ts → context-Cwt7QCpk.d.ts} +1 -9
- package/dist/core.cjs +1 -1
- package/dist/core.d.cts +5 -4
- package/dist/core.d.ts +5 -4
- package/dist/core.js +1 -1
- package/dist/css.cjs +2 -0
- package/dist/css.cjs.map +1 -0
- package/dist/css.d.cts +42 -0
- package/dist/css.d.ts +42 -0
- package/dist/css.js +2 -0
- package/dist/css.js.map +1 -0
- package/dist/data-table.cjs +2 -0
- package/dist/data-table.cjs.map +1 -0
- package/dist/data-table.d.cts +97 -0
- package/dist/data-table.d.ts +97 -0
- package/dist/data-table.js +2 -0
- package/dist/data-table.js.map +1 -0
- package/dist/deep-signal.cjs +2 -0
- package/dist/deep-signal.cjs.map +1 -0
- package/dist/deep-signal.d.cts +48 -0
- package/dist/deep-signal.d.ts +48 -0
- package/dist/deep-signal.js +2 -0
- package/dist/deep-signal.js.map +1 -0
- package/dist/defer.cjs +2 -0
- package/dist/defer.cjs.map +1 -0
- package/dist/defer.d.cts +55 -0
- package/dist/defer.d.ts +55 -0
- package/dist/defer.js +2 -0
- package/dist/defer.js.map +1 -0
- package/dist/deprecation.cjs +2 -0
- package/dist/deprecation.cjs.map +1 -0
- package/dist/deprecation.d.cts +119 -0
- package/dist/deprecation.d.ts +119 -0
- package/dist/deprecation.js +2 -0
- package/dist/deprecation.js.map +1 -0
- package/dist/{devtools-overlay-CJWKBTP4.js → devtools-overlay-3WRM6GKM.js} +3 -3
- package/dist/{devtools-overlay-CJWKBTP4.js.map → devtools-overlay-3WRM6GKM.js.map} +1 -1
- package/dist/{devtools-overlay-EQ3G755P.cjs → devtools-overlay-WJGSIB4N.cjs} +4 -4
- package/dist/{devtools-overlay-EQ3G755P.cjs.map → devtools-overlay-WJGSIB4N.cjs.map} +1 -1
- package/dist/devtools.cjs +2 -0
- package/dist/devtools.cjs.map +1 -0
- package/dist/devtools.d.cts +78 -0
- package/dist/devtools.d.ts +78 -0
- package/dist/devtools.js +2 -0
- package/dist/devtools.js.map +1 -0
- package/dist/di.cjs +2 -0
- package/dist/di.cjs.map +1 -0
- package/dist/di.d.cts +93 -0
- package/dist/di.d.ts +93 -0
- package/dist/di.js +2 -0
- package/dist/di.js.map +1 -0
- package/dist/directive.cjs +2 -0
- package/dist/directive.cjs.map +1 -0
- package/dist/directive.d.cts +102 -0
- package/dist/directive.d.ts +102 -0
- package/dist/directive.js +2 -0
- package/dist/directive.js.map +1 -0
- package/dist/error-boundary.cjs +2 -0
- package/dist/error-boundary.cjs.map +1 -0
- package/dist/error-boundary.d.cts +17 -0
- package/dist/error-boundary.d.ts +17 -0
- package/dist/error-boundary.js +2 -0
- package/dist/error-boundary.js.map +1 -0
- package/dist/error-hints.cjs +2 -0
- package/dist/error-hints.cjs.map +1 -0
- package/dist/error-hints.d.cts +17 -0
- package/dist/error-hints.d.ts +17 -0
- package/dist/error-hints.js +2 -0
- package/dist/error-hints.js.map +1 -0
- package/dist/errors.cjs +2 -0
- package/dist/errors.cjs.map +1 -0
- package/dist/errors.d.cts +35 -0
- package/dist/errors.d.ts +35 -0
- package/dist/errors.js +2 -0
- package/dist/errors.js.map +1 -0
- package/dist/event-bus.cjs +2 -0
- package/dist/event-bus.cjs.map +1 -0
- package/dist/event-bus.d.cts +68 -0
- package/dist/event-bus.d.ts +68 -0
- package/dist/event-bus.js +2 -0
- package/dist/event-bus.js.map +1 -0
- package/dist/event-modifiers.cjs +2 -0
- package/dist/event-modifiers.cjs.map +1 -0
- package/dist/event-modifiers.d.cts +130 -0
- package/dist/event-modifiers.d.ts +130 -0
- package/dist/event-modifiers.js +2 -0
- package/dist/event-modifiers.js.map +1 -0
- package/dist/flip.cjs +2 -0
- package/dist/flip.cjs.map +1 -0
- package/dist/flip.d.cts +66 -0
- package/dist/flip.d.ts +66 -0
- package/dist/flip.js +2 -0
- package/dist/flip.js.map +1 -0
- package/dist/head.cjs +2 -0
- package/dist/head.cjs.map +1 -0
- package/dist/head.d.cts +70 -0
- package/dist/head.d.ts +70 -0
- package/dist/head.js +2 -0
- package/dist/head.js.map +1 -0
- package/dist/hydration.cjs +2 -0
- package/dist/hydration.cjs.map +1 -0
- package/dist/hydration.d.cts +84 -0
- package/dist/hydration.d.ts +84 -0
- package/dist/hydration.js +2 -0
- package/dist/hydration.js.map +1 -0
- package/dist/image.cjs +2 -0
- package/dist/image.cjs.map +1 -0
- package/dist/image.d.cts +54 -0
- package/dist/image.d.ts +54 -0
- package/dist/image.js +2 -0
- package/dist/image.js.map +1 -0
- package/dist/index.cjs +1 -63
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +50 -3155
- package/dist/index.d.ts +50 -3155
- package/dist/index.js +1 -63
- package/dist/index.js.map +1 -1
- package/dist/infinite-scroll.cjs +2 -0
- package/dist/infinite-scroll.cjs.map +1 -0
- package/dist/infinite-scroll.d.cts +49 -0
- package/dist/infinite-scroll.d.ts +49 -0
- package/dist/infinite-scroll.js +2 -0
- package/dist/infinite-scroll.js.map +1 -0
- package/dist/leak-detector.cjs +2 -0
- package/dist/leak-detector.cjs.map +1 -0
- package/dist/leak-detector.d.cts +71 -0
- package/dist/leak-detector.d.ts +71 -0
- package/dist/leak-detector.js +2 -0
- package/dist/leak-detector.js.map +1 -0
- package/dist/machine.cjs +1 -1
- package/dist/machine.d.cts +1 -1
- package/dist/machine.d.ts +1 -1
- package/dist/machine.js +1 -1
- package/dist/offline.cjs +1 -1
- package/dist/offline.d.cts +1 -1
- package/dist/offline.d.ts +1 -1
- package/dist/offline.js +1 -1
- package/dist/perf.cjs +2 -0
- package/dist/perf.cjs.map +1 -0
- package/dist/perf.d.cts +97 -0
- package/dist/perf.d.ts +97 -0
- package/dist/perf.js +2 -0
- package/dist/perf.js.map +1 -0
- package/dist/pipes.cjs +2 -0
- package/dist/pipes.cjs.map +1 -0
- package/dist/pipes.d.cts +130 -0
- package/dist/pipes.d.ts +130 -0
- package/dist/pipes.js +2 -0
- package/dist/pipes.js.map +1 -0
- package/dist/plugin.cjs +2 -0
- package/dist/plugin.cjs.map +1 -0
- package/dist/plugin.d.cts +70 -0
- package/dist/plugin.d.ts +70 -0
- package/dist/plugin.js +2 -0
- package/dist/plugin.js.map +1 -0
- package/dist/portal.cjs +2 -0
- package/dist/portal.cjs.map +1 -0
- package/dist/portal.d.cts +30 -0
- package/dist/portal.d.ts +30 -0
- package/dist/portal.js +2 -0
- package/dist/portal.js.map +1 -0
- package/dist/pwa.cjs +1 -1
- package/dist/pwa.d.cts +1 -1
- package/dist/pwa.d.ts +1 -1
- package/dist/pwa.js +1 -1
- package/dist/query-state.cjs +2 -0
- package/dist/query-state.cjs.map +1 -0
- package/dist/query-state.d.cts +82 -0
- package/dist/query-state.d.ts +82 -0
- package/dist/query-state.js +2 -0
- package/dist/query-state.js.map +1 -0
- package/dist/reconcile.cjs +2 -0
- package/dist/reconcile.cjs.map +1 -0
- package/dist/reconcile.d.cts +42 -0
- package/dist/reconcile.d.ts +42 -0
- package/dist/reconcile.js +2 -0
- package/dist/reconcile.js.map +1 -0
- package/dist/scheduler-CKi1esN-.d.cts +9 -0
- package/dist/scheduler-CKi1esN-.d.ts +9 -0
- package/dist/security.cjs +2 -0
- package/dist/security.cjs.map +1 -0
- package/dist/security.d.cts +193 -0
- package/dist/security.d.ts +193 -0
- package/dist/security.js +2 -0
- package/dist/security.js.map +1 -0
- package/dist/seo.cjs +2 -0
- package/dist/seo.cjs.map +1 -0
- package/dist/seo.d.cts +118 -0
- package/dist/seo.d.ts +118 -0
- package/dist/seo.js +2 -0
- package/dist/seo.js.map +1 -0
- package/dist/{signals-C7XfOHHR.d.cts → signals-DionyGGY.d.cts} +7 -0
- package/dist/{signals-C7XfOHHR.d.ts → signals-DionyGGY.d.ts} +7 -0
- package/dist/snippets.cjs +2 -0
- package/dist/snippets.cjs.map +1 -0
- package/dist/snippets.d.cts +109 -0
- package/dist/snippets.d.ts +109 -0
- package/dist/snippets.js +2 -0
- package/dist/snippets.js.map +1 -0
- package/dist/ssg.cjs +2 -0
- package/dist/ssg.cjs.map +1 -0
- package/dist/ssg.d.cts +82 -0
- package/dist/ssg.d.ts +82 -0
- package/dist/ssg.js +2 -0
- package/dist/ssg.js.map +1 -0
- package/dist/ssr.cjs +1 -1
- package/dist/ssr.d.cts +2 -1
- package/dist/ssr.d.ts +2 -1
- package/dist/ssr.js +1 -1
- package/dist/store.cjs +1 -1
- package/dist/store.d.cts +1 -1
- package/dist/store.d.ts +1 -1
- package/dist/store.js +1 -1
- package/dist/suspense.cjs +2 -0
- package/dist/suspense.cjs.map +1 -0
- package/dist/suspense.d.cts +36 -0
- package/dist/suspense.d.ts +36 -0
- package/dist/suspense.js +2 -0
- package/dist/suspense.js.map +1 -0
- package/dist/switch.cjs +2 -0
- package/dist/switch.cjs.map +1 -0
- package/dist/switch.d.cts +48 -0
- package/dist/switch.d.ts +48 -0
- package/dist/switch.js +2 -0
- package/dist/switch.js.map +1 -0
- package/dist/sync.cjs +1 -1
- package/dist/sync.d.cts +1 -1
- package/dist/sync.d.ts +1 -1
- package/dist/sync.js +1 -1
- package/dist/test.cjs +2 -2
- package/dist/test.cjs.map +1 -1
- package/dist/test.d.cts +5 -4
- package/dist/test.d.ts +5 -4
- package/dist/test.js +2 -2
- package/dist/test.js.map +1 -1
- package/dist/theme.cjs +2 -0
- package/dist/theme.cjs.map +1 -0
- package/dist/theme.d.cts +56 -0
- package/dist/theme.d.ts +56 -0
- package/dist/theme.js +2 -0
- package/dist/theme.js.map +1 -0
- package/dist/toast.cjs +2 -0
- package/dist/toast.cjs.map +1 -0
- package/dist/toast.d.cts +66 -0
- package/dist/toast.d.ts +66 -0
- package/dist/toast.js +2 -0
- package/dist/toast.js.map +1 -0
- package/dist/transition.cjs +2 -0
- package/dist/transition.cjs.map +1 -0
- package/dist/transition.d.cts +90 -0
- package/dist/transition.d.ts +90 -0
- package/dist/transition.js +2 -0
- package/dist/transition.js.map +1 -0
- package/dist/tweened.cjs +2 -0
- package/dist/tweened.cjs.map +1 -0
- package/dist/tweened.d.cts +59 -0
- package/dist/tweened.d.ts +59 -0
- package/dist/tweened.js +2 -0
- package/dist/tweened.js.map +1 -0
- package/dist/types-DjZCk1xT.d.cts +4 -0
- package/dist/types-DjZCk1xT.d.ts +4 -0
- package/dist/view-transition.cjs +2 -0
- package/dist/view-transition.cjs.map +1 -0
- package/dist/view-transition.d.cts +80 -0
- package/dist/view-transition.d.ts +80 -0
- package/dist/view-transition.js +2 -0
- package/dist/view-transition.js.map +1 -0
- package/dist/virtual-list.cjs +2 -0
- package/dist/virtual-list.cjs.map +1 -0
- package/dist/virtual-list.d.cts +67 -0
- package/dist/virtual-list.d.ts +67 -0
- package/dist/virtual-list.js +2 -0
- package/dist/virtual-list.js.map +1 -0
- package/dist/watch.cjs +2 -0
- package/dist/watch.cjs.map +1 -0
- package/dist/watch.d.cts +70 -0
- package/dist/watch.d.ts +70 -0
- package/dist/watch.js +2 -0
- package/dist/watch.js.map +1 -0
- package/dist/web-component.cjs +2 -0
- package/dist/web-component.cjs.map +1 -0
- package/dist/web-component.d.cts +51 -0
- package/dist/web-component.d.ts +51 -0
- package/dist/web-component.js +2 -0
- package/dist/web-component.js.map +1 -0
- package/package.json +249 -11
- package/dist/chunk-35DJOBEO.cjs +0 -2
- package/dist/chunk-35DJOBEO.cjs.map +0 -1
- package/dist/chunk-3GRR4VW2.js +0 -13
- package/dist/chunk-3GRR4VW2.js.map +0 -1
- package/dist/chunk-5A7KDBDU.js +0 -2
- package/dist/chunk-5NHDEY2C.js +0 -2
- package/dist/chunk-6GGYM5SF.cjs +0 -5
- package/dist/chunk-6GGYM5SF.cjs.map +0 -1
- package/dist/chunk-EEILP4OL.cjs +0 -13
- package/dist/chunk-EEILP4OL.cjs.map +0 -1
- package/dist/chunk-FTTNKDZQ.js +0 -5
- package/dist/chunk-FTTNKDZQ.js.map +0 -1
- package/dist/chunk-H2HNKYN2.js +0 -2
- package/dist/chunk-H2HNKYN2.js.map +0 -1
- package/dist/chunk-TKFJGLUO.js +0 -2
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var r=false,t=null;function m(){return r}function c(e){let{container:n,component:o,props:i={}}=e;r=true,t=document.createTreeWalker(n,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT);try{o(i);}finally{r=false,t=null;}return ()=>{}}function y(e){if(!r||!t)return null;let n=t.nextNode();for(;n;){if(n instanceof HTMLElement&&n.tagName.toLowerCase()===e.toLowerCase())return n;n=t.nextNode();}return null}function H(){if(!r||!t)return null;let e=t.nextNode();for(;e;){if(e instanceof Text)return e;e=t.nextNode();}return null}function T(e){let{target:n,component:o,props:i,rootMargin:p="200px"}=e;if(typeof IntersectionObserver>"u")return c({container:n,component:o,props:i});let s=false,l=new IntersectionObserver(d=>{for(let u of d)u.isIntersecting&&!s&&(l.disconnect(),c({container:n,component:o,props:i}));},{rootMargin:p});return l.observe(n),()=>{s=true,l.disconnect();}}var f="data-akash-hydrate";function x(e=document.body){return Array.from(e.querySelectorAll(`[${f}]`))}exports.a=m;exports.b=c;exports.c=y;exports.d=H;exports.e=T;exports.f=f;exports.g=x;//# sourceMappingURL=chunk-K2HB5VFA.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-K2HB5VFA.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hydration.ts"],"names":["isHydrating","hydrateWalker","isHydrationActive","hydrate","options","container","component","props","claimElement","tag","node","claimText","progressiveHydrate","target","rootMargin","disposed","observer","entries","entry","HYDRATE_ATTR","findHydrationBoundaries","root"],"mappings":"aAiBA,IAAIA,CAAAA,CAAc,KAAA,CAEdC,CAAAA,CAAmC,KAGhC,SAASC,CAAAA,EAA6B,CAC3C,OAAOF,CACT,CA8BO,SAASG,CAAAA,CAAQC,CAAAA,CAAqC,CAC3D,GAAM,CAAE,SAAA,CAAAC,CAAAA,CAAW,SAAA,CAAAC,CAAAA,CAAW,KAAA,CAAAC,CAAAA,CAAQ,EAAG,CAAA,CAAIH,EAE7CJ,CAAAA,CAAc,IAAA,CAIdC,CAAAA,CAAgB,QAAA,CAAS,iBACvBI,CAAAA,CACA,UAAA,CAAW,YAAA,CAAe,UAAA,CAAW,SACvC,CAAA,CAEA,GAAI,CAGFC,CAAAA,CAAUC,CAAY,EACxB,CAAA,OAAE,CACAP,CAAAA,CAAc,KAAA,CAEdC,CAAAA,CAAgB,KAClB,CAEA,OAAO,IAAM,CAEb,CACF,CAMO,SAASO,CAAAA,CAAaC,CAAAA,CAAiC,CAC5D,GAAI,CAACT,CAAAA,EAAe,CAACC,CAAAA,CAAe,OAAO,KAE3C,IAAIS,CAAAA,CAAOT,CAAAA,CAAc,QAAA,EAAS,CAClC,KAAOS,CAAAA,EAAM,CACX,GACEA,CAAAA,YAAgB,WAAA,EAChBA,CAAAA,CAAK,OAAA,CAAQ,WAAA,KAAkBD,CAAAA,CAAI,WAAA,EAAY,CAE/C,OAAOC,CAAAA,CAETA,CAAAA,CAAOT,EAAc,QAAA,GACvB,CAEA,OAAO,IACT,CAKO,SAASU,CAAAA,EAAyB,CACvC,GAAI,CAACX,CAAAA,EAAe,CAACC,CAAAA,CAAe,OAAO,IAAA,CAE3C,IAAIS,CAAAA,CAAOT,CAAAA,CAAc,QAAA,EAAS,CAClC,KAAOS,CAAAA,EAAM,CACX,GAAIA,CAAAA,YAAgB,IAAA,CAClB,OAAOA,EAETA,CAAAA,CAAOT,CAAAA,CAAc,QAAA,GACvB,CAEA,OAAO,IACT,CA6BO,SAASW,CAAAA,CAAmBR,CAAAA,CAAgD,CACjF,GAAM,CAAE,MAAA,CAAAS,CAAAA,CAAQ,SAAA,CAAAP,CAAAA,CAAW,KAAA,CAAAC,CAAAA,CAAO,UAAA,CAAAO,EAAa,OAAQ,CAAA,CAAIV,CAAAA,CAE3D,GAAI,OAAO,oBAAA,CAAyB,IAElC,OAAOD,CAAAA,CAAQ,CAAE,SAAA,CAAWU,CAAAA,CAAQ,SAAA,CAAAP,EAAW,KAAA,CAAAC,CAAM,CAAC,CAAA,CAGxD,IAAIQ,CAAAA,CAAW,KAAA,CAETC,CAAAA,CAAW,IAAI,oBAAA,CAClBC,CAAAA,EAAY,CACX,IAAA,IAAWC,CAAAA,IAASD,EACdC,CAAAA,CAAM,cAAA,EAAkB,CAACH,CAAAA,GAC3BC,CAAAA,CAAS,UAAA,GACTb,CAAAA,CAAQ,CAAE,SAAA,CAAWU,CAAAA,CAAQ,SAAA,CAAAP,CAAAA,CAAW,MAAAC,CAAM,CAAC,CAAA,EAGrD,CAAA,CACA,CAAE,UAAA,CAAAO,CAAW,CACf,CAAA,CAEA,OAAAE,CAAAA,CAAS,OAAA,CAAQH,CAAM,CAAA,CAEhB,IAAM,CACXE,CAAAA,CAAW,IAAA,CACXC,CAAAA,CAAS,UAAA,GACX,CACF,CAKO,IAAMG,CAAAA,CAAe,qBAKrB,SAASC,CAAAA,CACdC,EAAoB,QAAA,CAAS,IAAA,CACd,CACf,OAAO,KAAA,CAAM,IAAA,CAAKA,CAAAA,CAAK,gBAAA,CAA8B,CAAA,CAAA,EAAIF,CAAY,CAAA,CAAA,CAAG,CAAC,CAC3E","file":"chunk-K2HB5VFA.cjs","sourcesContent":["/**\n * Client-side hydration.\n *\n * After SSR delivers HTML, the client needs to \"hydrate\" —\n * walk the existing DOM, attach signal effects, and make it interactive.\n * No new DOM nodes are created during hydration.\n *\n * Supports progressive hydration via IntersectionObserver:\n * components hydrate lazily when they enter the viewport.\n */\n\nimport { signal, effect } from './signals.js';\nimport type { Component } from './component.js';\nimport type { AkashNode } from './types.js';\n\n// --- Hydration state ---\n\nlet isHydrating = false;\nlet hydrateRoot: Node | null = null;\nlet hydrateWalker: TreeWalker | null = null;\n\n/** Check if we're currently hydrating (vs. fresh rendering) */\nexport function isHydrationActive(): boolean {\n return isHydrating;\n}\n\n// --- Hydration context ---\n\nexport interface HydrateOptions {\n /** The root DOM element (rendered by SSR) */\n container: HTMLElement;\n /** The root component to hydrate */\n component: Component<any>;\n /** Props to pass to the root component */\n props?: Record<string, unknown>;\n}\n\n/**\n * Hydrate a server-rendered DOM tree.\n *\n * Walks the existing DOM instead of creating new nodes,\n * attaching signal effects to existing elements.\n *\n * ```ts\n * import { hydrate } from '@akashjs/runtime';\n * import App from './App.akash';\n *\n * hydrate({\n * container: document.getElementById('app')!,\n * component: App,\n * props: { title: 'Home' },\n * });\n * ```\n */\nexport function hydrate(options: HydrateOptions): () => void {\n const { container, component, props = {} } = options;\n\n isHydrating = true;\n hydrateRoot = container;\n\n // Create a tree walker to traverse the existing DOM\n hydrateWalker = document.createTreeWalker(\n container,\n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT,\n );\n\n try {\n // Run the component — during hydration, DOM creation helpers\n // will claim existing nodes instead of creating new ones\n component(props as any);\n } finally {\n isHydrating = false;\n hydrateRoot = null;\n hydrateWalker = null;\n }\n\n return () => {\n // Cleanup — dispose all hydration effects\n };\n}\n\n/**\n * Claim the next DOM node during hydration.\n * Instead of creating a new element, returns the existing one.\n */\nexport function claimElement(tag: string): HTMLElement | null {\n if (!isHydrating || !hydrateWalker) return null;\n\n let node = hydrateWalker.nextNode();\n while (node) {\n if (\n node instanceof HTMLElement &&\n node.tagName.toLowerCase() === tag.toLowerCase()\n ) {\n return node;\n }\n node = hydrateWalker.nextNode();\n }\n\n return null;\n}\n\n/**\n * Claim the next text node during hydration.\n */\nexport function claimText(): Text | null {\n if (!isHydrating || !hydrateWalker) return null;\n\n let node = hydrateWalker.nextNode();\n while (node) {\n if (node instanceof Text) {\n return node;\n }\n node = hydrateWalker.nextNode();\n }\n\n return null;\n}\n\n// --- Progressive hydration ---\n\nexport interface ProgressiveHydrateOptions {\n /** CSS selector or element to observe */\n target: HTMLElement;\n /** Component to hydrate when visible */\n component: Component<any>;\n /** Props */\n props?: Record<string, unknown>;\n /** IntersectionObserver root margin (default: '200px') */\n rootMargin?: string;\n}\n\n/**\n * Hydrate a component lazily when it enters the viewport.\n *\n * Uses IntersectionObserver to detect when the SSR placeholder\n * becomes visible, then runs full hydration.\n *\n * ```ts\n * progressiveHydrate({\n * target: document.querySelector('[data-hydrate=\"comments\"]')!,\n * component: Comments,\n * props: { postId: 123 },\n * });\n * ```\n */\nexport function progressiveHydrate(options: ProgressiveHydrateOptions): () => void {\n const { target, component, props, rootMargin = '200px' } = options;\n\n if (typeof IntersectionObserver === 'undefined') {\n // Fallback: hydrate immediately if IO is not available\n return hydrate({ container: target, component, props });\n }\n\n let disposed = false;\n\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting && !disposed) {\n observer.disconnect();\n hydrate({ container: target, component, props });\n }\n }\n },\n { rootMargin },\n );\n\n observer.observe(target);\n\n return () => {\n disposed = true;\n observer.disconnect();\n };\n}\n\n// --- Hydrate boundary marker ---\n\n/** Data attribute used to mark hydration boundaries in SSR HTML */\nexport const HYDRATE_ATTR = 'data-akash-hydrate';\n\n/**\n * Find all hydration boundaries in the document.\n */\nexport function findHydrationBoundaries(\n root: HTMLElement = document.body,\n): HTMLElement[] {\n return Array.from(root.querySelectorAll<HTMLElement>(`[${HYDRATE_ATTR}]`));\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';function l(n,t,...r){if(r.length>0&&r.every(e=>typeof e=="function")){let e=t(n);for(let i of r)e=i(e);return e}return t(n,...r)}function f(...n){return (t,...r)=>{let e=t;for(let i of n)e=i(e,...r);return e}}function y(n){return n}var F=n=>String(n).toUpperCase(),d=n=>String(n).toLowerCase(),b=n=>{let t=String(n);return t.charAt(0).toUpperCase()+t.slice(1)},T=n=>String(n).replace(/\b\w/g,t=>t.toUpperCase()),h=n=>String(n).trim(),x=(n,t=50,r="...")=>{let e=String(n);return e.length<=t?e:e.slice(0,t-r.length)+r},P=(n,t="medium",r)=>{let e=n instanceof Date?n:new Date(n);if(isNaN(e.getTime()))return String(n);if(t==="iso")return e.toISOString();let i=r??"en-US",o={short:{year:"2-digit",month:"numeric",day:"numeric"},medium:{year:"numeric",month:"numeric",day:"numeric"},long:{year:"numeric",month:"long",day:"numeric"},full:{weekday:"long",year:"numeric",month:"long",day:"numeric"},time:{hour:"numeric",minute:"2-digit"}};return new Intl.DateTimeFormat(i,o[t]).format(e)},I=(n,t="USD",r)=>new Intl.NumberFormat(r??"en-US",{style:"currency",currency:t}).format(Number(n)),S=(n,t,r)=>{let e={};if(t){let[i,o]=t.split("-").map(Number);e.minimumFractionDigits=i,e.maximumFractionDigits=o??i;}return new Intl.NumberFormat(r??"en-US",e).format(Number(n))},D=(n,t=0,r)=>new Intl.NumberFormat(r??"en-US",{style:"percent",minimumFractionDigits:t,maximumFractionDigits:t}).format(Number(n)),w=(n,t=2)=>JSON.stringify(n,null,t),N=(n,t,r)=>{let e=r??`${t}s`;return `${n} ${n===1?t:e}`},U=(n,t)=>{let e=(n instanceof Date?n.getTime():Number(n))-Date.now(),i=Math.abs(e),o=[[6e4,"second"],[36e5,"minute"],[864e5,"hour"],[2592e6,"day"],[31536e6,"month"],[1/0,"year"]],a={second:1e3,minute:6e4,hour:36e5,day:864e5,month:2592e6,year:31536e6},s="second";for(let[p,g]of o)if(i<p){s=g;break}let m=Math.round(e/a[s]);if(typeof Intl<"u"&&Intl.RelativeTimeFormat)return new Intl.RelativeTimeFormat(t??"en",{numeric:"auto"}).format(m,s);let u=Math.abs(m),c=m<0?"ago":"from now";return `${u} ${s}${u!==1?"s":""} ${c}`};exports.a=l;exports.b=f;exports.c=y;exports.d=F;exports.e=d;exports.f=b;exports.g=T;exports.h=h;exports.i=x;exports.j=P;exports.k=I;exports.l=S;exports.m=D;exports.n=w;exports.o=N;exports.p=U;//# sourceMappingURL=chunk-K7TMUF3F.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-K7TMUF3F.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/pipes.ts"],"names":["pipe","value","transform","rest","a","result","fn","chain","pipes","args","p","definePipe","uppercase","lowercase","capitalize","s","titleCase","c","trim","truncate","maxLength","suffix","date","format","locale","d","loc","options","currency","currencyCode","number","digitsInfo","opts","min","max","percent","decimals","json","indent","plural","singular","pluralForm","relativeTime","diff","absDiff","units","divisors","unit","threshold","u","n","abs"],"mappings":"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","file":"chunk-K7TMUF3F.cjs","sourcesContent":["/**\n * Pipes — template transform functions.\n *\n * Pure functions that transform display values. Chainable, memoized,\n * and usable both in templates and in script.\n *\n * ```ts\n * import { pipe, uppercase, date, currency } from '@akashjs/runtime';\n *\n * pipe('hello', uppercase); // 'HELLO'\n * pipe(new Date(), date, 'short'); // '3/29/26'\n * pipe(1234.5, currency, 'USD'); // '$1,234.50'\n * pipe('hello world', capitalize, truncate, 5); // 'Hello...'\n * ```\n */\n\n// =========================================================================\n// Pipe type and runner\n// =========================================================================\n\nexport type PipeFn<TIn = any, TOut = any> = (value: TIn, ...args: any[]) => TOut;\n\n/**\n * Apply a pipe transform to a value.\n *\n * ```ts\n * pipe('hello', uppercase); // 'HELLO'\n * pipe(1234, currency, 'USD'); // '$1,234.00'\n * ```\n */\nexport function pipe(value: any, transform: Function, ...rest: any[]): any {\n // If all remaining args are functions, chain them: pipe(5, fn1, fn2, fn3)\n if (rest.length > 0 && rest.every(a => typeof a === 'function')) {\n let result = transform(value);\n for (const fn of rest) {\n result = fn(result);\n }\n return result;\n }\n // Otherwise, pass extra args to the transform: pipe('hello', truncate, 5)\n return transform(value, ...rest);\n}\n\n/**\n * Chain multiple pipes together.\n *\n * ```ts\n * const format = chain(trim, capitalize, truncate);\n * format(' hello world ', 10); // 'Hello w...'\n * ```\n */\nexport function chain<T>(...pipes: PipeFn[]): PipeFn<T, any> {\n return (value: T, ...args: any[]) => {\n let result: any = value;\n for (const p of pipes) {\n result = p(result, ...args);\n }\n return result;\n };\n}\n\n/**\n * Define a custom pipe.\n *\n * ```ts\n * const reverse = definePipe<string, string>((value) =>\n * value.split('').reverse().join('')\n * );\n * pipe('hello', reverse); // 'olleh'\n * ```\n */\nexport function definePipe<TIn, TOut>(fn: PipeFn<TIn, TOut>): PipeFn<TIn, TOut> {\n return fn;\n}\n\n// =========================================================================\n// Built-in pipes\n// =========================================================================\n\n/** Convert string to uppercase */\nexport const uppercase: PipeFn<string, string> = (value) => String(value).toUpperCase();\n\n/** Convert string to lowercase */\nexport const lowercase: PipeFn<string, string> = (value) => String(value).toLowerCase();\n\n/** Capitalize first letter */\nexport const capitalize: PipeFn<string, string> = (value) => {\n const s = String(value);\n return s.charAt(0).toUpperCase() + s.slice(1);\n};\n\n/** Title case — capitalize each word */\nexport const titleCase: PipeFn<string, string> = (value) => {\n return String(value).replace(/\\b\\w/g, (c) => c.toUpperCase());\n};\n\n/** Trim whitespace */\nexport const trim: PipeFn<string, string> = (value) => String(value).trim();\n\n/**\n * Truncate string to a max length, adding ellipsis.\n *\n * ```ts\n * pipe('Hello World', truncate, 8); // 'Hello...'\n * ```\n */\nexport const truncate: PipeFn<string, string> = (value, maxLength: number = 50, suffix = '...') => {\n const s = String(value);\n if (s.length <= maxLength) return s;\n return s.slice(0, maxLength - suffix.length) + suffix;\n};\n\n/**\n * Format a date.\n *\n * ```ts\n * pipe(new Date(), date); // '3/29/2026'\n * pipe(new Date(), date, 'short'); // '3/29/26'\n * pipe(new Date(), date, 'long'); // 'March 29, 2026'\n * pipe(new Date(), date, 'time'); // '2:30 PM'\n * pipe(new Date(), date, 'iso'); // '2026-03-29T...'\n * ```\n */\nexport const date: PipeFn<Date | string | number, string> = (\n value,\n format: 'short' | 'medium' | 'long' | 'full' | 'time' | 'iso' = 'medium',\n locale?: string,\n) => {\n const d = value instanceof Date ? value : new Date(value);\n if (isNaN(d.getTime())) return String(value);\n\n if (format === 'iso') return d.toISOString();\n\n const loc = locale ?? 'en-US';\n\n const options: Record<string, Intl.DateTimeFormatOptions> = {\n short: { year: '2-digit', month: 'numeric', day: 'numeric' },\n medium: { year: 'numeric', month: 'numeric', day: 'numeric' },\n long: { year: 'numeric', month: 'long', day: 'numeric' },\n full: { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' },\n time: { hour: 'numeric', minute: '2-digit' },\n };\n\n return new Intl.DateTimeFormat(loc, options[format]).format(d);\n};\n\n/**\n * Format a number as currency.\n *\n * ```ts\n * pipe(1234.5, currency); // '$1,234.50'\n * pipe(1234.5, currency, 'EUR'); // '€1,234.50'\n * ```\n */\nexport const currency: PipeFn<number, string> = (value, currencyCode = 'USD', locale?: string) => {\n return new Intl.NumberFormat(locale ?? 'en-US', {\n style: 'currency',\n currency: currencyCode,\n }).format(Number(value));\n};\n\n/**\n * Format a number with locale formatting.\n *\n * ```ts\n * pipe(1234567.89, number); // '1,234,567.89'\n * pipe(1234567.89, number, '0-2'); // '1,234,567.89' (0-2 decimal digits)\n * ```\n */\nexport const number: PipeFn<number, string> = (value, digitsInfo?: string, locale?: string) => {\n const opts: Intl.NumberFormatOptions = {};\n if (digitsInfo) {\n const [min, max] = digitsInfo.split('-').map(Number);\n opts.minimumFractionDigits = min;\n opts.maximumFractionDigits = max ?? min;\n }\n return new Intl.NumberFormat(locale ?? 'en-US', opts).format(Number(value));\n};\n\n/**\n * Format a number as a percentage.\n *\n * ```ts\n * pipe(0.85, percent); // '85%'\n * pipe(0.856, percent); // '86%'\n * ```\n */\nexport const percent: PipeFn<number, string> = (value, decimals = 0, locale?: string) => {\n return new Intl.NumberFormat(locale ?? 'en-US', {\n style: 'percent',\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(Number(value));\n};\n\n/**\n * JSON stringify with formatting.\n *\n * ```ts\n * pipe({ a: 1 }, json); // '{\\n \"a\": 1\\n}'\n * pipe({ a: 1 }, json, 0); // '{\"a\":1}'\n * ```\n */\nexport const json: PipeFn<unknown, string> = (value, indent = 2) => {\n return JSON.stringify(value, null, indent);\n};\n\n/**\n * Pluralize a string based on count.\n *\n * ```ts\n * pipe(1, plural, 'item', 'items'); // '1 item'\n * pipe(5, plural, 'item', 'items'); // '5 items'\n * ```\n */\nexport const plural: PipeFn<number, string> = (value, singular: string, pluralForm?: string) => {\n const p = pluralForm ?? `${singular}s`;\n return `${value} ${value === 1 ? singular : p}`;\n};\n\n/**\n * Relative time formatting.\n *\n * ```ts\n * pipe(Date.now() - 60000, relativeTime); // '1 minute ago'\n * ```\n */\nexport const relativeTime: PipeFn<Date | number, string> = (value, locale?: string) => {\n const d = value instanceof Date ? value.getTime() : Number(value);\n const diff = d - Date.now();\n const absDiff = Math.abs(diff);\n\n const units: Array<[number, Intl.RelativeTimeFormatUnit]> = [\n [60000, 'second'],\n [3600000, 'minute'],\n [86400000, 'hour'],\n [2592000000, 'day'],\n [31536000000, 'month'],\n [Infinity, 'year'],\n ];\n\n const divisors: Record<string, number> = {\n second: 1000, minute: 60000, hour: 3600000,\n day: 86400000, month: 2592000000, year: 31536000000,\n };\n\n let unit: Intl.RelativeTimeFormatUnit = 'second';\n for (const [threshold, u] of units) {\n if (absDiff < threshold) { unit = u; break; }\n }\n\n const n = Math.round(diff / divisors[unit]);\n\n if (typeof Intl !== 'undefined' && Intl.RelativeTimeFormat) {\n return new Intl.RelativeTimeFormat(locale ?? 'en', { numeric: 'auto' }).format(n, unit);\n }\n\n const abs = Math.abs(n);\n const suffix = n < 0 ? 'ago' : 'from now';\n return `${abs} ${unit}${abs !== 1 ? 's' : ''} ${suffix}`;\n};\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {c,d,a,b as b$2}from'./chunk-VUMMC2P5.js';import {b as b$1}from'./chunk-AOFLE33X.js';import {e,f}from'./chunk-YXKQTEPR.js';function D(e,n){let o=document.createElement(e);if(n)for(let[c,a]of Object.entries(n))L(o,c,a);return o}function R(e){return document.createTextNode(e)}function B(e){let n=document.createElement("template");return n.innerHTML=e,n.content.cloneNode(true)}function L(e,n,o){if(n==="class"||n==="className")e.className=o;else if(n==="style"&&typeof o=="object"&&o!==null)Object.assign(e.style,o);else if(n==="innerHTML")e.innerHTML=o;else if(n!=="ref")if(n.startsWith("on")){let c=n.slice(2).toLowerCase();e.addEventListener(c,o);}else n in e?e[n]=o:o===false||o==null?e.removeAttribute(n):e.setAttribute(n,o===true?"":String(o));}function _(e$1,n){return e(()=>{e$1.textContent=String(n());},{render:true})}function O(e$1,n,o){return e(()=>{L(e$1,n,o());},{render:true})}function j(e$1,n){return e(()=>{e$1.style.display=n()?"":"none";},{render:true})}function b(e=""){return document.createComment(e)}function S(e$1,n,o,c$1,a){let s=null,h=c(),k=e(()=>{let i=o();if(s){for(let l of s.nodes)try{l.parentNode?.removeChild(l);}catch{}s.dispose?.(),s=null;}let d$1=i?c$1:a,m=n.parentNode;if(!m&&s?.nodes[0]?.parentNode&&(m=s.nodes[0].parentNode),d$1&&m){let l=h?d(h,d$1):d$1(),t=l instanceof DocumentFragment?Array.from(l.childNodes):[l];for(let r of t)m.insertBefore(r,n);s={nodes:t,dispose:null};}},{render:true});return ()=>{if(k(),s){for(let i of s.nodes)try{i.parentNode?.removeChild(i);}catch{}s.dispose?.();}}}function H(e$1,n,o,c$1,a){let s=[],h=c(),k=e(()=>{let i=o(),d$1=[],m=new Map;for(let t of s)m.set(t.key,t);for(let t=0;t<i.length;t++){let r=i[t],u=c$1(r,t),f=m.get(u);if(f){m.delete(u);let T=f.nodes[0];if(T&&!T.parentNode){let x=h?d(h,()=>a(r,t)):a(r,t),P=x instanceof DocumentFragment?Array.from(x.childNodes):[x];d$1.push({key:u,value:r,nodes:P,dispose:null});}else f.value=r,d$1.push(f);}else {let T=h?d(h,()=>a(r,t)):a(r,t),x=T instanceof DocumentFragment?Array.from(T.childNodes):[T];d$1.push({key:u,value:r,nodes:x,dispose:null});}}for(let t of m.values()){for(let r of t.nodes)r.parentNode&&r.parentNode.removeChild(r);t.dispose?.();}let l=n.parentNode;if(l)for(let t of d$1)for(let r of t.nodes)l.insertBefore(r,n);else {let t=null;for(let r of s)if(r.nodes[0]?.parentNode){t=r.nodes[0].parentNode;break}if(t)for(let r of d$1)for(let u of r.nodes)t.appendChild(u);}s=d$1;},{render:true});return ()=>{k();for(let i of s){for(let d of i.nodes)d.parentNode&&d.parentNode.removeChild(d);i.dispose?.();}s=[];}}function I(e){let n=b("show"),o=document.createDocumentFragment();o.appendChild(n);let c=typeof e.when=="function"?e.when:()=>e.when,a;return S(o,n,()=>(a=c(),!!a),()=>N(e.children(a)),e.fallback?()=>N(e.fallback()):void 0),o}function K(e){let n=b("for"),o=document.createDocumentFragment();o.appendChild(n);let c=typeof e.each=="function"?e.each:()=>e.each;return H(o,n,c,e.key,(a,s)=>N(e.children(a,s))),o}function N(e){if(e==null||typeof e=="boolean")return document.createTextNode("");if(typeof e=="string"||typeof e=="number")return document.createTextNode(String(e));if(e instanceof Node)return e;if(Array.isArray(e)){let n=document.createDocumentFragment();for(let o of e)n.appendChild(N(o));return n}return document.createTextNode(String(e))}function V(e,n,o){let c=N(n);o?e.insertBefore(c,o):e.appendChild(c);}function J(e){return e.__reactive=true,e}var p=null;function Q(e){if(!p)throw b$1("AK0020");p.mount.push(e);}function X(e){if(!p)throw b$1("AK0021");p.unmount.push(e);}function Z(e){if(!p)throw b$1("AK0022");p.error.push(e);}function $(e){return {current:e}}function ee(e){let n=o=>{let{children:c$1,...a$1}=o??{},k={props:a$1,children:typeof c$1=="function"?c$1:()=>c$1??null},i={mount:[],unmount:[],error:[]},d=p;p=i;let m=c(),l=a(m),t,r;try{r=f(()=>{if(t=e(k),typeof t!="function")throw b$1("AK0040");let u=t();return N(u)});}catch(u){if(b$2(l),p=d,i.error.length>0){for(let f of i.error)f(u instanceof Error?u:new Error(String(u)));return document.createComment("error")}throw u}return b$2(l),p=d,i.mount.length>0&&queueMicrotask(()=>{for(let u of i.mount)try{let f=u();typeof f=="function"&&i.unmount.push(f);}catch(f){for(let T of i.error)T(f instanceof Error?f:new Error(String(f)));}}),r};return n._akash=true,n}export{D as a,R as b,B as c,L as d,_ as e,O as f,j as g,S as h,H as i,I as j,K as k,N as l,V as m,J as n,Q as o,X as p,Z as q,$ as r,ee as s};//# sourceMappingURL=chunk-KE7BJTCD.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-KE7BJTCD.js.map
|
|
@@ -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":"AAkDA,IAAMA,CAAAA,CAAmB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAAA,CAAA,CAoBzB,eAAsBC,CAAAA,CAAUC,CAAAA,CAAqD,CACnF,GAAM,CACJ,MAAA,CAAQC,CAAAA,CACR,MAAA,CAAAC,CAAAA,CACA,MAAA,CAAAC,CAAAA,CAAS,MAAA,CACT,QAAA,CAAAC,CAAAA,CAAWN,CAAAA,CACX,MAAA,CAAAO,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CAAc,CAChB,CAAA,CAAIP,CAAAA,CAEEQ,CAAAA,CAAQ,IAAA,CAAK,GAAA,EAAI,CAGjBC,CAAAA,CAAS,OAAOR,CAAAA,EAAgB,UAAA,CAClC,MAAMA,CAAAA,EAAY,CAClBA,CAAAA,CAEES,CAAAA,CAA0B,CAC9B,QAAA,CAAU,EAAC,CACX,MAAA,CAAQ,EAAC,CACT,QAAA,CAAU,CACZ,CAAA,CAGA,IAAA,IAASC,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIF,CAAAA,CAAO,MAAA,CAAQE,CAAAA,EAAKJ,CAAAA,CAAa,CACnD,IAAMK,CAAAA,CAAQH,CAAAA,CAAO,MAAME,CAAAA,CAAGA,CAAAA,CAAIJ,CAAW,CAAA,CAC7C,MAAM,OAAA,CAAQ,GAAA,CAAIK,CAAAA,CAAM,GAAA,CAAI,MAAOC,CAAAA,EAAQ,CACzC,GAAI,CACF,IAAMC,CAAAA,CAAU,MAAMZ,CAAAA,CAAOW,CAAG,CAAA,CAC1BE,CAAAA,CAAOX,CAAAA,CACV,OAAA,CAAQ,aAAA,CAAeU,CAAO,CAAA,CAC9B,OAAA,CAAQ,UAAA,CAAY,EAAE,CAAA,CACtB,OAAA,CAAQ,aAAA,CAAe,EAAE,CAAA,CAEtBE,CAAAA,CAAWC,CAAAA,CAAcJ,CAAG,CAAA,CAIlCH,CAAAA,CAAO,QAAA,CAAS,IAAA,CAAK,CACnB,GAAA,CAAAG,CAAAA,CACA,IAAA,CAAM,CAAA,EAAGV,CAAM,CAAA,CAAA,EAAIa,CAAQ,CAAA,CAAA,CAC3B,IAAA,CAAM,IAAI,IAAA,CAAK,CAACD,CAAI,CAAC,CAAA,CAAE,IACzB,CAAC,CAAA,CAEDV,CAAAA,GAASQ,CAAAA,CAAKE,CAAI,EACpB,CAAA,MAASG,EAAK,CACZ,IAAMC,CAAAA,CAAQD,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAM,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAG,CAAC,CAAA,CAChER,CAAAA,CAAO,MAAA,CAAO,IAAA,CAAK,CAAE,GAAA,CAAAG,CAAAA,CAAK,KAAA,CAAOM,CAAAA,CAAM,OAAQ,CAAC,CAAA,CAChDb,CAAAA,GAAUO,CAAAA,CAAKM,CAAK,EACtB,CACF,CAAC,CAAC,EACJ,CAEA,OAAAT,CAAAA,CAAO,QAAA,CAAW,IAAA,CAAK,GAAA,EAAI,CAAIF,CAAAA,CACxBE,CACT,CAUO,SAASU,CAAAA,CAAqBC,CAAAA,CAAkD,CACrF,OAAOA,CAAAA,CACJ,MAAA,CAAQ,CAAA,EAAM,CAAC,CAAA,CAAE,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAK,CAAC,CAAA,CAAE,IAAA,CAAK,QAAA,CAAS,GAAG,CAAC,CAAA,CAC5D,GAAA,CAAK,CAAA,EAAM,EAAE,IAAI,CACtB,CAaO,SAASC,CAAAA,CACdC,CAAAA,CACAC,CAAAA,CACU,CACV,OAAOA,CAAAA,CAAO,GAAA,CAAKC,CAAAA,EAAM,CACvB,IAAIC,CAAAA,CAAOH,CAAAA,CACX,IAAA,GAAW,CAACI,CAAAA,CAAKC,CAAK,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQH,CAAC,CAAA,CACzCC,CAAAA,CAAOA,CAAAA,CAAK,OAAA,CAAQ,CAAA,CAAA,EAAIC,CAAG,CAAA,CAAA,CAAIC,CAAK,EAEtC,OAAOF,CACT,CAAC,CACH,CAYO,SAAST,CAAAA,CAAcJ,CAAAA,CAAqB,CACjD,IAAMgB,CAAAA,CAAQhB,CAAAA,CAAI,OAAA,CAAQ,KAAA,CAAO,EAAE,CAAA,CAAE,OAAA,CAAQ,KAAA,CAAO,EAAE,CAAA,CACtD,OAAKgB,CAAAA,CACE,CAAA,EAAGA,CAAK,CAAA,WAAA,CAAA,CADI,YAErB,CAKO,SAASC,CAAAA,CACdC,CAAAA,CACAC,CAAAA,CACQ,CACR,IAAIC,CAAAA,CAAM,CAAA;AAAA,CAAA,CACVA,CAAAA,EAAO,CAAA;AAAA,CAAA,CAEP,IAAA,IAAWC,CAAAA,IAAQF,CAAAA,CAAQ,QAAA,CACzBC,CAAAA,EAAO,CAAA;AAAA,CAAA,CACPA,CAAAA,EAAO,CAAA,SAAA,EAAYF,CAAO,CAAA,EAAGG,EAAK,GAAG,CAAA;AAAA,CAAA,CACrCD,CAAAA,EAAO,CAAA,aAAA,EAAgB,IAAI,IAAA,EAAK,CAAE,WAAA,EAAY,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,CAAA,CAC7DA,CAAAA,EAAO,CAAA;AAAA,CAAA,CAGT,OAAAA,CAAAA,EAAO,CAAA;AAAA,CAAA,CACAA,CACT","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
|