@akashjs/runtime 0.2.7 → 0.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/a11y.cjs +1 -1
- package/dist/a11y.js +1 -1
- package/dist/async-component.cjs +1 -1
- package/dist/async-component.js +1 -1
- package/dist/await-block.cjs +1 -1
- package/dist/await-block.js +1 -1
- package/dist/browser.cjs +1 -1
- package/dist/browser.js +1 -1
- package/dist/{chunk-SXYPAP4B.js → chunk-2GGCZC4O.js} +2 -2
- package/dist/{chunk-SXYPAP4B.js.map → chunk-2GGCZC4O.js.map} +1 -1
- package/dist/chunk-2UATNCKC.js +2 -0
- package/dist/chunk-2UATNCKC.js.map +1 -0
- package/dist/{chunk-FVF3T4JJ.js → chunk-2XFW6MT7.js} +2 -2
- package/dist/{chunk-FVF3T4JJ.js.map → chunk-2XFW6MT7.js.map} +1 -1
- package/dist/{chunk-ZJULEDLY.js → chunk-3CD6A5YV.js} +2 -2
- package/dist/{chunk-ZJULEDLY.js.map → chunk-3CD6A5YV.js.map} +1 -1
- package/dist/{chunk-N5APNCPB.js → chunk-3PCZFKBH.js} +2 -2
- package/dist/{chunk-N5APNCPB.js.map → chunk-3PCZFKBH.js.map} +1 -1
- package/dist/{chunk-Q6S7SUOM.js → chunk-3PLQPLVA.js} +2 -2
- package/dist/{chunk-Q6S7SUOM.js.map → chunk-3PLQPLVA.js.map} +1 -1
- package/dist/chunk-3RDEFZMT.js +2 -0
- package/dist/{chunk-NCXMNJUN.js.map → chunk-3RDEFZMT.js.map} +1 -1
- package/dist/{chunk-KUPL3ZVD.js → chunk-3VYMJMAU.js} +2 -2
- package/dist/{chunk-KUPL3ZVD.js.map → chunk-3VYMJMAU.js.map} +1 -1
- package/dist/{chunk-QQ725EZL.js → chunk-3Y663FYJ.js} +2 -2
- package/dist/{chunk-QQ725EZL.js.map → chunk-3Y663FYJ.js.map} +1 -1
- package/dist/{chunk-VNDSKBXQ.cjs → chunk-4VLBY2BW.cjs} +2 -2
- package/dist/{chunk-VNDSKBXQ.cjs.map → chunk-4VLBY2BW.cjs.map} +1 -1
- package/dist/{chunk-VUSNUBNI.js → chunk-5GDMAABU.js} +2 -2
- package/dist/{chunk-VUSNUBNI.js.map → chunk-5GDMAABU.js.map} +1 -1
- package/dist/{chunk-QE2TJ6P5.cjs → chunk-5JKXREA2.cjs} +2 -2
- package/dist/{chunk-QE2TJ6P5.cjs.map → chunk-5JKXREA2.cjs.map} +1 -1
- package/dist/{chunk-AZCELE44.cjs → chunk-637ENG3A.cjs} +2 -2
- package/dist/{chunk-AZCELE44.cjs.map → chunk-637ENG3A.cjs.map} +1 -1
- package/dist/{chunk-BB7P6HTR.js → chunk-66PLXQS3.js} +2 -2
- package/dist/{chunk-BB7P6HTR.js.map → chunk-66PLXQS3.js.map} +1 -1
- package/dist/{chunk-TDKDZ3QJ.cjs → chunk-6GY6HC75.cjs} +2 -2
- package/dist/{chunk-TDKDZ3QJ.cjs.map → chunk-6GY6HC75.cjs.map} +1 -1
- package/dist/{chunk-M5IACTFC.cjs → chunk-6I5PPQ34.cjs} +3 -3
- package/dist/{chunk-M5IACTFC.cjs.map → chunk-6I5PPQ34.cjs.map} +1 -1
- package/dist/{chunk-QNVMBXVH.js → chunk-6ZCFPR4O.js} +2 -2
- package/dist/{chunk-QNVMBXVH.js.map → chunk-6ZCFPR4O.js.map} +1 -1
- package/dist/{chunk-R7NUVVHP.js → chunk-7T4HMWUC.js} +2 -2
- package/dist/{chunk-R7NUVVHP.js.map → chunk-7T4HMWUC.js.map} +1 -1
- package/dist/{chunk-36VM3RJW.cjs → chunk-BLT7XOSX.cjs} +2 -2
- package/dist/{chunk-36VM3RJW.cjs.map → chunk-BLT7XOSX.cjs.map} +1 -1
- package/dist/chunk-CDZR6GWB.js +2 -0
- package/dist/chunk-CDZR6GWB.js.map +1 -0
- package/dist/chunk-DWSIR5SL.cjs +2 -0
- package/dist/{chunk-7ZPSYZHD.cjs.map → chunk-DWSIR5SL.cjs.map} +1 -1
- package/dist/{chunk-NJXXC5JB.js → chunk-E7BPGVIS.js} +2 -2
- package/dist/{chunk-NJXXC5JB.js.map → chunk-E7BPGVIS.js.map} +1 -1
- package/dist/chunk-E7GAIKQT.cjs +2 -0
- package/dist/{chunk-FUVSCPU4.cjs.map → chunk-E7GAIKQT.cjs.map} +1 -1
- package/dist/{chunk-VWTULWXF.js → chunk-EEQZFKEG.js} +2 -2
- package/dist/{chunk-VWTULWXF.js.map → chunk-EEQZFKEG.js.map} +1 -1
- package/dist/{chunk-7IJUJUXE.cjs → chunk-EXKQPZ5N.cjs} +2 -2
- package/dist/{chunk-7IJUJUXE.cjs.map → chunk-EXKQPZ5N.cjs.map} +1 -1
- package/dist/{chunk-NHDYQTC5.cjs → chunk-F2F5OXCK.cjs} +3 -3
- package/dist/{chunk-NHDYQTC5.cjs.map → chunk-F2F5OXCK.cjs.map} +1 -1
- package/dist/{chunk-7VBH4F3P.js → chunk-GAAO2KXN.js} +2 -2
- package/dist/{chunk-7VBH4F3P.js.map → chunk-GAAO2KXN.js.map} +1 -1
- package/dist/{chunk-F6VSSM2P.js → chunk-GB7IUC6E.js} +2 -2
- package/dist/{chunk-F6VSSM2P.js.map → chunk-GB7IUC6E.js.map} +1 -1
- package/dist/{chunk-TZHEZW6R.js → chunk-GHSJ4B55.js} +3 -3
- package/dist/{chunk-TZHEZW6R.js.map → chunk-GHSJ4B55.js.map} +1 -1
- package/dist/{chunk-NBYFHJWB.js → chunk-GRXHWCFR.js} +3 -3
- package/dist/{chunk-NBYFHJWB.js.map → chunk-GRXHWCFR.js.map} +1 -1
- package/dist/{chunk-WTDTVWCQ.cjs → chunk-HHPRQMGX.cjs} +2 -2
- package/dist/{chunk-WTDTVWCQ.cjs.map → chunk-HHPRQMGX.cjs.map} +1 -1
- package/dist/chunk-HL2VGVJT.cjs +2 -0
- package/dist/chunk-HL2VGVJT.cjs.map +1 -0
- package/dist/{chunk-Z6K4FYG6.js → chunk-IDTJWCYW.js} +2 -2
- package/dist/{chunk-Z6K4FYG6.js.map → chunk-IDTJWCYW.js.map} +1 -1
- package/dist/{chunk-6O46EMQS.cjs → chunk-JMY6E7VR.cjs} +2 -2
- package/dist/{chunk-6O46EMQS.cjs.map → chunk-JMY6E7VR.cjs.map} +1 -1
- package/dist/{chunk-XZR3J626.cjs → chunk-KFMCMKSC.cjs} +2 -2
- package/dist/{chunk-XZR3J626.cjs.map → chunk-KFMCMKSC.cjs.map} +1 -1
- package/dist/{chunk-IKVHLORY.cjs → chunk-KGV5MKBC.cjs} +3 -3
- package/dist/{chunk-IKVHLORY.cjs.map → chunk-KGV5MKBC.cjs.map} +1 -1
- package/dist/{chunk-R65RPMQX.cjs → chunk-KQAYFPJI.cjs} +2 -2
- package/dist/{chunk-R65RPMQX.cjs.map → chunk-KQAYFPJI.cjs.map} +1 -1
- package/dist/chunk-LSD7DEMV.cjs +2 -0
- package/dist/chunk-LSD7DEMV.cjs.map +1 -0
- package/dist/{chunk-2LKFIID7.cjs → chunk-LTMDSGQ6.cjs} +2 -2
- package/dist/{chunk-2LKFIID7.cjs.map → chunk-LTMDSGQ6.cjs.map} +1 -1
- package/dist/{chunk-4NQEIKH5.cjs → chunk-M2OWSNOM.cjs} +2 -2
- package/dist/{chunk-4NQEIKH5.cjs.map → chunk-M2OWSNOM.cjs.map} +1 -1
- package/dist/{chunk-PYASLKWF.js → chunk-MGFRVOM5.js} +2 -2
- package/dist/{chunk-PYASLKWF.js.map → chunk-MGFRVOM5.js.map} +1 -1
- package/dist/{chunk-JQCN42XX.js → chunk-MNUOIAXS.js} +2 -2
- package/dist/{chunk-JQCN42XX.js.map → chunk-MNUOIAXS.js.map} +1 -1
- package/dist/{chunk-NEQ5TENE.cjs → chunk-ND2HZRMR.cjs} +2 -2
- package/dist/{chunk-NEQ5TENE.cjs.map → chunk-ND2HZRMR.cjs.map} +1 -1
- package/dist/chunk-O5OTZP5M.cjs +2 -0
- package/dist/{chunk-JD3LDHUI.cjs.map → chunk-O5OTZP5M.cjs.map} +1 -1
- package/dist/{chunk-LD4C62JY.cjs → chunk-P4USGNUK.cjs} +2 -2
- package/dist/{chunk-LD4C62JY.cjs.map → chunk-P4USGNUK.cjs.map} +1 -1
- package/dist/{chunk-L3ZZX36S.js → chunk-P55EWYAD.js} +2 -2
- package/dist/{chunk-L3ZZX36S.js.map → chunk-P55EWYAD.js.map} +1 -1
- package/dist/{chunk-OZ4GNBKA.js → chunk-PVIYD25D.js} +2 -2
- package/dist/{chunk-OZ4GNBKA.js.map → chunk-PVIYD25D.js.map} +1 -1
- package/dist/{chunk-2HLDEWRT.cjs → chunk-PWJMCURK.cjs} +2 -2
- package/dist/{chunk-2HLDEWRT.cjs.map → chunk-PWJMCURK.cjs.map} +1 -1
- package/dist/{chunk-7UX5CSGZ.cjs → chunk-SBDFBADL.cjs} +2 -2
- package/dist/{chunk-7UX5CSGZ.cjs.map → chunk-SBDFBADL.cjs.map} +1 -1
- package/dist/{chunk-DHFVVFZF.cjs → chunk-SPS3LM47.cjs} +2 -2
- package/dist/{chunk-DHFVVFZF.cjs.map → chunk-SPS3LM47.cjs.map} +1 -1
- package/dist/{chunk-N3ITIHHM.js → chunk-SVNS64LE.js} +3 -3
- package/dist/{chunk-N3ITIHHM.js.map → chunk-SVNS64LE.js.map} +1 -1
- package/dist/{chunk-TSFY5HKB.js → chunk-SZDKDXRV.js} +3 -3
- package/dist/{chunk-TSFY5HKB.js.map → chunk-SZDKDXRV.js.map} +1 -1
- package/dist/{chunk-T2RVAQEU.js → chunk-UXHQ5OFW.js} +2 -2
- package/dist/{chunk-T2RVAQEU.js.map → chunk-UXHQ5OFW.js.map} +1 -1
- package/dist/{chunk-TFEHO7SF.cjs → chunk-UYJ4BAPL.cjs} +2 -2
- package/dist/{chunk-TFEHO7SF.cjs.map → chunk-UYJ4BAPL.cjs.map} +1 -1
- package/dist/chunk-VDHUPQDK.cjs +2 -0
- package/dist/{chunk-TYTEJYUQ.cjs.map → chunk-VDHUPQDK.cjs.map} +1 -1
- package/dist/{chunk-YDO5KARN.js → chunk-VTD3TI3M.js} +2 -2
- package/dist/{chunk-YDO5KARN.js.map → chunk-VTD3TI3M.js.map} +1 -1
- package/dist/{chunk-CP6SK2B4.js → chunk-WB7QDCEA.js} +2 -2
- package/dist/{chunk-CP6SK2B4.js.map → chunk-WB7QDCEA.js.map} +1 -1
- package/dist/{chunk-WZ5ULION.js → chunk-XAGYLTHV.js} +2 -2
- package/dist/{chunk-WZ5ULION.js.map → chunk-XAGYLTHV.js.map} +1 -1
- package/dist/{chunk-QSPRVXFV.cjs → chunk-XE7JC7Y3.cjs} +2 -2
- package/dist/{chunk-QSPRVXFV.cjs.map → chunk-XE7JC7Y3.cjs.map} +1 -1
- package/dist/{chunk-FVWHMFX6.cjs → chunk-XMNDNTHK.cjs} +3 -3
- package/dist/{chunk-FVWHMFX6.cjs.map → chunk-XMNDNTHK.cjs.map} +1 -1
- package/dist/{chunk-J6KDUWX6.cjs → chunk-XOPRWJCX.cjs} +2 -2
- package/dist/{chunk-J6KDUWX6.cjs.map → chunk-XOPRWJCX.cjs.map} +1 -1
- package/dist/{chunk-VO4FCKHM.js → chunk-XRWOZO67.js} +2 -2
- package/dist/{chunk-VO4FCKHM.js.map → chunk-XRWOZO67.js.map} +1 -1
- package/dist/chunk-XZOP3IWH.cjs +2 -0
- package/dist/{chunk-YURIYBTN.cjs.map → chunk-XZOP3IWH.cjs.map} +1 -1
- package/dist/{chunk-BGSF77LF.js → chunk-YG76TVFL.js} +2 -2
- package/dist/{chunk-BGSF77LF.js.map → chunk-YG76TVFL.js.map} +1 -1
- package/dist/{chunk-V2JDKH3W.cjs → chunk-YQQDRDJ7.cjs} +2 -2
- package/dist/{chunk-V2JDKH3W.cjs.map → chunk-YQQDRDJ7.cjs.map} +1 -1
- package/dist/{chunk-3XREYIJH.cjs → chunk-ZGE46DPV.cjs} +2 -2
- package/dist/{chunk-3XREYIJH.cjs.map → chunk-ZGE46DPV.cjs.map} +1 -1
- package/dist/composables.cjs +1 -1
- package/dist/composables.js +1 -1
- package/dist/core.cjs +1 -1
- package/dist/core.js +1 -1
- package/dist/data-table.cjs +1 -1
- package/dist/data-table.js +1 -1
- package/dist/deep-signal.cjs +1 -1
- package/dist/deep-signal.js +1 -1
- package/dist/defer.cjs +1 -1
- package/dist/defer.js +1 -1
- package/dist/{devtools-overlay-3WRM6GKM.js → devtools-overlay-3PHULVP4.js} +3 -3
- package/dist/{devtools-overlay-3WRM6GKM.js.map → devtools-overlay-3PHULVP4.js.map} +1 -1
- package/dist/{devtools-overlay-WJGSIB4N.cjs → devtools-overlay-SJV7WNNS.cjs} +4 -4
- package/dist/{devtools-overlay-WJGSIB4N.cjs.map → devtools-overlay-SJV7WNNS.cjs.map} +1 -1
- package/dist/devtools.cjs +1 -1
- package/dist/devtools.js +1 -1
- package/dist/di.cjs +1 -1
- package/dist/di.js +1 -1
- package/dist/error-boundary.cjs +1 -1
- package/dist/error-boundary.js +1 -1
- package/dist/event-modifiers.cjs +1 -1
- package/dist/event-modifiers.js +1 -1
- package/dist/head.cjs +1 -1
- package/dist/head.js +1 -1
- package/dist/hydration.cjs +1 -1
- package/dist/hydration.js +1 -1
- package/dist/image.cjs +1 -1
- package/dist/image.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/dist/infinite-scroll.cjs +1 -1
- package/dist/infinite-scroll.js +1 -1
- package/dist/machine.cjs +1 -1
- package/dist/machine.js +1 -1
- package/dist/offline.cjs +1 -1
- package/dist/offline.js +1 -1
- package/dist/portal.cjs +1 -1
- package/dist/portal.js +1 -1
- package/dist/pwa.cjs +1 -1
- package/dist/pwa.js +1 -1
- package/dist/query-state.cjs +1 -1
- package/dist/query-state.js +1 -1
- package/dist/seo.cjs +1 -1
- package/dist/seo.js +1 -1
- package/dist/snippets.cjs +1 -1
- package/dist/snippets.js +1 -1
- package/dist/ssr.cjs +1 -1
- package/dist/ssr.js +1 -1
- package/dist/store.cjs +1 -1
- package/dist/store.js +1 -1
- package/dist/suspense.cjs +1 -1
- package/dist/suspense.js +1 -1
- package/dist/switch.cjs +1 -1
- package/dist/switch.js +1 -1
- package/dist/sync.cjs +1 -1
- package/dist/sync.js +1 -1
- package/dist/test.cjs +2 -2
- package/dist/test.js +1 -1
- package/dist/theme.cjs +1 -1
- package/dist/theme.js +1 -1
- package/dist/toast.cjs +1 -1
- package/dist/toast.js +1 -1
- package/dist/transition.cjs +1 -1
- package/dist/transition.js +1 -1
- package/dist/tweened.cjs +1 -1
- package/dist/tweened.js +1 -1
- package/dist/virtual-list.cjs +1 -1
- package/dist/virtual-list.js +1 -1
- package/dist/watch.cjs +1 -1
- package/dist/watch.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-7ZPSYZHD.cjs +0 -2
- package/dist/chunk-FUVSCPU4.cjs +0 -2
- package/dist/chunk-JD3LDHUI.cjs +0 -2
- package/dist/chunk-KE7BJTCD.js +0 -2
- package/dist/chunk-KE7BJTCD.js.map +0 -1
- package/dist/chunk-NCXMNJUN.js +0 -2
- package/dist/chunk-TYTEJYUQ.cjs +0 -2
- package/dist/chunk-WOZWFMOK.cjs +0 -2
- package/dist/chunk-WOZWFMOK.cjs.map +0 -1
- package/dist/chunk-XWVNLE2W.cjs +0 -2
- package/dist/chunk-XWVNLE2W.cjs.map +0 -1
- package/dist/chunk-YURIYBTN.cjs +0 -2
- package/dist/chunk-YXKQTEPR.js +0 -2
- package/dist/chunk-YXKQTEPR.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/store.ts"],"names":["globalPlugins","configureStores","options","storeInstances","defineStore","id","definition","initialState","store","createStoreInstance","stateSignals","stateKeys","key","signal","getterKeys","actionKeys","getterFn","computed","plugins","actionFn","args","plugin","fresh","partialOrFn","batch","value","snapshot","subscribers","subscribeEffect","callback","isInitial","effect","cb","configs","normalizePersistConfigs","cfg","storage","serialize","deserialize","persistKeys","raw","saved","persistScheduled","isInitialPersist","e","updated","syncOpts","syncKeys","syncState","doc","createSync","localSignal","syncSignal","originalSet","fromSync","remoteVal","persist","p","i","clearStores","__getStoreInstances"],"mappings":"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","file":"chunk-VWTULWXF.js","sourcesContent":["/**\n * Global state management via defineStore().\n *\n * Stores are singleton signal containers that persist across\n * components. They provide shared state, computed getters,\n * and actions — no external library needed.\n *\n * ```ts\n * const useCounterStore = defineStore('counter', {\n * state: () => ({ count: 0, name: 'Counter' }),\n * getters: {\n * doubled: (state) => state.count() * 2,\n * },\n * actions: {\n * increment() { this.count.update(c => c + 1); },\n * reset() { this.count.set(0); },\n * },\n * });\n *\n * // In any component:\n * const store = useCounterStore();\n * store.count(); // 0\n * store.doubled(); // 0\n * store.increment();\n * store.count(); // 1\n * ```\n */\n\nimport { signal, computed, effect } from './signals.js';\nimport { batch } from './scheduler.js';\nimport { createSync } from './sync.js';\nimport type { SyncDoc } from './sync.js';\nimport type { Signal, ReadonlySignal } from './signals.js';\n\n// --- Types ---\n\ntype StateFactory<S> = () => S;\n\ntype Getters<S, G> = {\n [K in keyof G]: (state: SignalifiedState<S>) => G[K];\n};\n\ntype Actions<A> = {\n [K in keyof A]: A[K] extends (...args: infer P) => infer R\n ? (...args: P) => R\n : never;\n};\n\n/** Maps plain state values to signals */\ntype SignalifiedState<S> = {\n [K in keyof S]: Signal<S[K]>;\n};\n\n/** The store instance returned to consumers */\nexport type Store<S, G, A> = SignalifiedState<S> & {\n [K in keyof G]: ReadonlySignal<G[K]>;\n} & {\n [K in keyof A]: A[K] extends (...args: infer P) => infer R\n ? (...args: P) => R\n : never;\n} & {\n /** Reset all state to initial values */\n $reset(): void;\n /** Merge partial state into the store, or apply changes via callback */\n $patch(partialOrFn: Partial<S> | ((state: SignalifiedState<S>) => void)): void;\n /** Subscribe to all state changes */\n $subscribe(callback: (state: S) => void): () => void;\n /** Get a plain snapshot of current state */\n $snapshot(): S;\n /** Store ID */\n $id: string;\n};\n\nexport interface PersistOptions<S> {\n /** Only persist these state keys (default: all) */\n pick?: (keyof S)[];\n /** Storage backend (default: 'localStorage') */\n storage?: 'localStorage' | 'sessionStorage';\n /** Custom storage key (default: 'akash-store:{storeId}') */\n key?: string;\n /** Custom serializer (default: JSON.stringify) */\n serialize?: (value: unknown) => string;\n /** Custom deserializer (default: JSON.parse) */\n deserialize?: (value: string) => unknown;\n}\n\nexport interface StoreSyncOptions {\n /** Sync transport (WebSocket, local, etc.) */\n transport?: import('./sync.js').SyncTransport;\n /** Enable sync — uses provided or default transport */\n enabled?: boolean;\n /** Sync room/channel name (default: store ID) */\n room?: string;\n /** Unique peer ID */\n peerId?: string;\n /** Enable presence tracking */\n presence?: boolean;\n /** Only sync these state keys (default: all) */\n pick?: string[];\n}\n\nexport interface StoreDefinition<S, G, A> {\n state: StateFactory<S>;\n getters?: Getters<S, G>;\n actions?: A & ThisType<\n SignalifiedState<S> &\n { [K in keyof G]: ReadonlySignal<G[K]> } &\n A\n >;\n plugins?: StorePlugin[];\n /** Auto-persist state to storage. true = persist all to localStorage. */\n persist?: boolean | PersistOptions<S> | PersistOptions<S>[];\n /** Sync state across peers via CRDT. Adds real-time collaboration to any store. */\n sync?: StoreSyncOptions;\n}\n\n// --- Plugin system ---\n\nexport interface StorePlugin {\n init?(store: Store<any, any, any>): void;\n onAction?(store: Store<any, any, any>, actionName: string, args: unknown[]): void;\n}\n\nconst globalPlugins: StorePlugin[] = [];\n\n/** Register global plugins that apply to all stores */\nexport function configureStores(options: { plugins: StorePlugin[] }): void {\n globalPlugins.push(...options.plugins);\n}\n\n// --- Store registry (singleton) ---\n\nconst storeInstances = new Map<string, Store<any, any, any>>();\n\n// --- defineStore ---\n\n/**\n * Define a global store. Returns a composable function that\n * always returns the same store instance (singleton).\n */\nexport function defineStore<\n S extends Record<string, unknown>,\n G extends Record<string, unknown> = {},\n A extends Record<string, (...args: any[]) => any> = {},\n>(\n id: string,\n definition: StoreDefinition<S, G, A>,\n): () => Store<S, G, A> {\n return () => {\n // Return existing instance if already created\n if (storeInstances.has(id)) {\n return storeInstances.get(id) as Store<S, G, A>;\n }\n\n const initialState = definition.state();\n const store = createStoreInstance(id, initialState, definition);\n storeInstances.set(id, store);\n return store;\n };\n}\n\nfunction createStoreInstance<\n S extends Record<string, unknown>,\n G extends Record<string, unknown>,\n A extends Record<string, (...args: any[]) => any>,\n>(\n id: string,\n initialState: S,\n definition: StoreDefinition<S, G, A>,\n): Store<S, G, A> {\n // Create signals for each state property\n const stateSignals: Record<string, Signal<unknown>> = {};\n const stateKeys = Object.keys(initialState);\n\n for (const key of stateKeys) {\n stateSignals[key] = signal(initialState[key]);\n }\n\n // Build the store object first so getters can reference other getters via `this`\n const store: any = { $id: id };\n\n // Add state signals\n for (const key of stateKeys) {\n store[key] = stateSignals[key];\n }\n\n // Metadata for devtools — avoids calling functions to classify them\n const getterKeys: string[] = [];\n const actionKeys: string[] = [];\n store.$__meta = { stateKeys, getterKeys, actionKeys };\n\n // Create computed getters — bound to store so `this.otherGetter()` works\n if (definition.getters) {\n for (const [key, getterFn] of Object.entries(definition.getters)) {\n getterKeys.push(key);\n store[key] = computed(() =>\n (getterFn as Function).call(store, stateSignals),\n );\n }\n }\n\n // Collect all plugins (global + per-store)\n const plugins = [...globalPlugins, ...(definition.plugins ?? [])];\n\n // Bind actions with `this` pointing to the full store (state + getters + actions)\n if (definition.actions) {\n for (const [key, actionFn] of Object.entries(definition.actions)) {\n actionKeys.push(key);\n store[key] = (...args: unknown[]) => {\n for (const plugin of plugins) plugin.onAction?.(store, key, args);\n return (actionFn as Function).apply(store, args);\n };\n }\n }\n\n // $reset\n store.$reset = () => {\n const fresh = definition.state();\n for (const key of stateKeys) {\n stateSignals[key].set(fresh[key as keyof S]);\n }\n };\n\n // $patch — merge partial state or apply via callback (batched)\n store.$patch = (partialOrFn: Partial<S> | ((state: any) => void)) => {\n batch(() => {\n if (typeof partialOrFn === 'function') {\n partialOrFn(stateSignals);\n } else {\n for (const [key, value] of Object.entries(partialOrFn)) {\n if (key in stateSignals) {\n stateSignals[key].set(value);\n }\n }\n }\n });\n };\n\n // $snapshot\n store.$snapshot = (): S => {\n const snapshot: Record<string, unknown> = {};\n for (const key of stateKeys) {\n snapshot[key] = stateSignals[key]();\n }\n return snapshot as S;\n };\n\n // $subscribe — watch all state signals and notify on change\n const subscribers = new Set<(state: S) => void>();\n let subscribeEffect: (() => void) | null = null;\n store.$subscribe = (callback: (state: S) => void): (() => void) => {\n subscribers.add(callback);\n // Start watching if this is the first subscriber\n if (!subscribeEffect) {\n let isInitial = true;\n subscribeEffect = effect(() => {\n // Read all state signals to track them\n for (const key of stateKeys) {\n stateSignals[key]();\n }\n // Skip initial run — only notify on actual changes\n if (isInitial) {\n isInitial = false;\n return;\n }\n const snapshot = store.$snapshot();\n for (const cb of subscribers) {\n cb(snapshot);\n }\n });\n }\n return () => {\n subscribers.delete(callback);\n // Dispose effect when no subscribers remain\n if (subscribers.size === 0 && subscribeEffect) {\n subscribeEffect();\n subscribeEffect = null;\n }\n };\n };\n\n // --- Persistence ---\n if (definition.persist && typeof window !== 'undefined') {\n const configs = normalizePersistConfigs(id, definition.persist);\n for (const cfg of configs) {\n const storage = cfg.storage === 'sessionStorage' ? sessionStorage : localStorage;\n const serialize = cfg.serialize ?? JSON.stringify;\n const deserialize = cfg.deserialize ?? JSON.parse;\n const persistKeys = cfg.pick ?? stateKeys;\n\n // Hydrate: read from storage and merge into state\n try {\n const raw = storage.getItem(cfg.key);\n if (raw) {\n const saved = deserialize(raw) as Record<string, unknown>;\n for (const key of persistKeys as string[]) {\n if (key in saved && key in stateSignals) {\n stateSignals[key].set(saved[key]);\n }\n }\n }\n } catch { /* corrupt storage — ignore */ }\n\n // Write: subscribe to state changes and persist (debounced via microtask)\n // The effect tracks signals to detect changes; the microtask reads\n // fresh values so sequential updates in the same tick are all captured.\n let persistScheduled = false;\n let isInitialPersist = true;\n effect(() => {\n // Track the persisted signals (read them so the effect re-runs on change)\n for (const key of persistKeys as string[]) {\n if (key in stateSignals) stateSignals[key]();\n }\n // Skip the initial run (hydration just happened, don't write stale defaults)\n if (isInitialPersist) { isInitialPersist = false; return; }\n // Schedule a microtask to capture the LATEST values after all sync updates\n if (!persistScheduled) {\n persistScheduled = true;\n queueMicrotask(() => {\n persistScheduled = false;\n // Read fresh values NOW, not when the effect ran\n const snapshot: Record<string, unknown> = {};\n for (const key of persistKeys as string[]) {\n if (key in stateSignals) snapshot[key] = stateSignals[key].peek();\n }\n try { storage.setItem(cfg.key, serialize(snapshot)); } catch { /* quota exceeded */ }\n });\n }\n });\n\n // Cross-tab sync: listen for storage events from other tabs\n if (cfg.storage !== 'sessionStorage') {\n window.addEventListener('storage', (e) => {\n if (e.key !== cfg.key || !e.newValue) return;\n try {\n const updated = deserialize(e.newValue) as Record<string, unknown>;\n for (const key of persistKeys as string[]) {\n if (key in updated && key in stateSignals) {\n stateSignals[key].set(updated[key]);\n }\n }\n } catch { /* ignore parse errors */ }\n });\n }\n }\n }\n\n // --- Sync ---\n if (definition.sync && (definition.sync.enabled !== false)) {\n const syncOpts = definition.sync;\n const syncKeys = syncOpts.pick ?? stateKeys;\n\n const syncState: Record<string, unknown> = {};\n for (const key of syncKeys) {\n syncState[key] = stateSignals[key]?.peek?.() ?? initialState[key as keyof S];\n }\n\n const doc = createSync(syncState as Record<string, unknown>, {\n transport: syncOpts.transport,\n peerId: syncOpts.peerId,\n });\n\n // Wire: local signal changes → sync broadcast\n for (const key of syncKeys) {\n if (!(key in stateSignals) || !(key in doc.state)) continue;\n const localSignal = stateSignals[key];\n const syncSignal = (doc.state as Record<string, any>)[key];\n\n const originalSet = localSignal.set;\n let fromSync = false;\n localSignal.set = (value: unknown) => {\n originalSet.call(localSignal, value);\n if (!fromSync) syncSignal.set(value);\n };\n\n // Listen for remote changes\n effect(() => {\n const remoteVal = syncSignal();\n fromSync = true;\n localSignal.set(remoteVal);\n fromSync = false;\n });\n }\n\n // Expose sync metadata on the store\n (store as any).$sync = {\n peers: doc.peers,\n presence: doc.presence,\n peerPresence: doc.peerPresence,\n peerId: doc.peerId,\n connected: doc.connected,\n connect: doc.connect.bind(doc),\n disconnect: doc.disconnect.bind(doc),\n };\n }\n\n // Initialize plugins\n for (const plugin of plugins) plugin.init?.(store);\n\n return store as Store<S, G, A>;\n}\n\nfunction normalizePersistConfigs<S>(id: string, persist: boolean | PersistOptions<S> | PersistOptions<S>[]): Array<PersistOptions<S> & { key: string }> {\n if (persist === true) {\n return [{ key: `akash-store:${id}` }];\n }\n if (persist === false) return [];\n if (Array.isArray(persist)) {\n return persist.map((p, i) => ({ ...p, key: p.key ?? `akash-store:${id}:${i}` }));\n }\n return [{ ...persist, key: persist.key ?? `akash-store:${id}` }];\n}\n\n/**\n * Clear all store instances (useful for testing).\n */\nexport function clearStores(): void {\n storeInstances.clear();\n}\n\n/** @internal — exposes store registry for devtools */\nexport function __getStoreInstances(): Record<string, Store<any, any, any>> {\n return Object.fromEntries(storeInstances);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/store.ts"],"names":["globalPlugins","configureStores","options","storeInstances","defineStore","id","definition","initialState","store","createStoreInstance","stateSignals","stateKeys","key","signal","getterKeys","actionKeys","getterFn","computed","plugins","actionFn","args","plugin","fresh","partialOrFn","batch","value","snapshot","subscribers","subscribeEffect","callback","isInitial","effect","cb","configs","normalizePersistConfigs","cfg","storage","serialize","deserialize","persistKeys","raw","saved","persistScheduled","isInitialPersist","e","updated","syncOpts","syncKeys","syncState","doc","createSync","localSignal","syncSignal","originalSet","fromSync","remoteVal","persist","p","i","clearStores","__getStoreInstances"],"mappings":"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","file":"chunk-EEQZFKEG.js","sourcesContent":["/**\n * Global state management via defineStore().\n *\n * Stores are singleton signal containers that persist across\n * components. They provide shared state, computed getters,\n * and actions — no external library needed.\n *\n * ```ts\n * const useCounterStore = defineStore('counter', {\n * state: () => ({ count: 0, name: 'Counter' }),\n * getters: {\n * doubled: (state) => state.count() * 2,\n * },\n * actions: {\n * increment() { this.count.update(c => c + 1); },\n * reset() { this.count.set(0); },\n * },\n * });\n *\n * // In any component:\n * const store = useCounterStore();\n * store.count(); // 0\n * store.doubled(); // 0\n * store.increment();\n * store.count(); // 1\n * ```\n */\n\nimport { signal, computed, effect } from './signals.js';\nimport { batch } from './scheduler.js';\nimport { createSync } from './sync.js';\nimport type { SyncDoc } from './sync.js';\nimport type { Signal, ReadonlySignal } from './signals.js';\n\n// --- Types ---\n\ntype StateFactory<S> = () => S;\n\ntype Getters<S, G> = {\n [K in keyof G]: (state: SignalifiedState<S>) => G[K];\n};\n\ntype Actions<A> = {\n [K in keyof A]: A[K] extends (...args: infer P) => infer R\n ? (...args: P) => R\n : never;\n};\n\n/** Maps plain state values to signals */\ntype SignalifiedState<S> = {\n [K in keyof S]: Signal<S[K]>;\n};\n\n/** The store instance returned to consumers */\nexport type Store<S, G, A> = SignalifiedState<S> & {\n [K in keyof G]: ReadonlySignal<G[K]>;\n} & {\n [K in keyof A]: A[K] extends (...args: infer P) => infer R\n ? (...args: P) => R\n : never;\n} & {\n /** Reset all state to initial values */\n $reset(): void;\n /** Merge partial state into the store, or apply changes via callback */\n $patch(partialOrFn: Partial<S> | ((state: SignalifiedState<S>) => void)): void;\n /** Subscribe to all state changes */\n $subscribe(callback: (state: S) => void): () => void;\n /** Get a plain snapshot of current state */\n $snapshot(): S;\n /** Store ID */\n $id: string;\n};\n\nexport interface PersistOptions<S> {\n /** Only persist these state keys (default: all) */\n pick?: (keyof S)[];\n /** Storage backend (default: 'localStorage') */\n storage?: 'localStorage' | 'sessionStorage';\n /** Custom storage key (default: 'akash-store:{storeId}') */\n key?: string;\n /** Custom serializer (default: JSON.stringify) */\n serialize?: (value: unknown) => string;\n /** Custom deserializer (default: JSON.parse) */\n deserialize?: (value: string) => unknown;\n}\n\nexport interface StoreSyncOptions {\n /** Sync transport (WebSocket, local, etc.) */\n transport?: import('./sync.js').SyncTransport;\n /** Enable sync — uses provided or default transport */\n enabled?: boolean;\n /** Sync room/channel name (default: store ID) */\n room?: string;\n /** Unique peer ID */\n peerId?: string;\n /** Enable presence tracking */\n presence?: boolean;\n /** Only sync these state keys (default: all) */\n pick?: string[];\n}\n\nexport interface StoreDefinition<S, G, A> {\n state: StateFactory<S>;\n getters?: Getters<S, G>;\n actions?: A & ThisType<\n SignalifiedState<S> &\n { [K in keyof G]: ReadonlySignal<G[K]> } &\n A\n >;\n plugins?: StorePlugin[];\n /** Auto-persist state to storage. true = persist all to localStorage. */\n persist?: boolean | PersistOptions<S> | PersistOptions<S>[];\n /** Sync state across peers via CRDT. Adds real-time collaboration to any store. */\n sync?: StoreSyncOptions;\n}\n\n// --- Plugin system ---\n\nexport interface StorePlugin {\n init?(store: Store<any, any, any>): void;\n onAction?(store: Store<any, any, any>, actionName: string, args: unknown[]): void;\n}\n\nconst globalPlugins: StorePlugin[] = [];\n\n/** Register global plugins that apply to all stores */\nexport function configureStores(options: { plugins: StorePlugin[] }): void {\n globalPlugins.push(...options.plugins);\n}\n\n// --- Store registry (singleton) ---\n\nconst storeInstances = new Map<string, Store<any, any, any>>();\n\n// --- defineStore ---\n\n/**\n * Define a global store. Returns a composable function that\n * always returns the same store instance (singleton).\n */\nexport function defineStore<\n S extends Record<string, unknown>,\n G extends Record<string, unknown> = {},\n A extends Record<string, (...args: any[]) => any> = {},\n>(\n id: string,\n definition: StoreDefinition<S, G, A>,\n): () => Store<S, G, A> {\n return () => {\n // Return existing instance if already created\n if (storeInstances.has(id)) {\n return storeInstances.get(id) as Store<S, G, A>;\n }\n\n const initialState = definition.state();\n const store = createStoreInstance(id, initialState, definition);\n storeInstances.set(id, store);\n return store;\n };\n}\n\nfunction createStoreInstance<\n S extends Record<string, unknown>,\n G extends Record<string, unknown>,\n A extends Record<string, (...args: any[]) => any>,\n>(\n id: string,\n initialState: S,\n definition: StoreDefinition<S, G, A>,\n): Store<S, G, A> {\n // Create signals for each state property\n const stateSignals: Record<string, Signal<unknown>> = {};\n const stateKeys = Object.keys(initialState);\n\n for (const key of stateKeys) {\n stateSignals[key] = signal(initialState[key]);\n }\n\n // Build the store object first so getters can reference other getters via `this`\n const store: any = { $id: id };\n\n // Add state signals\n for (const key of stateKeys) {\n store[key] = stateSignals[key];\n }\n\n // Metadata for devtools — avoids calling functions to classify them\n const getterKeys: string[] = [];\n const actionKeys: string[] = [];\n store.$__meta = { stateKeys, getterKeys, actionKeys };\n\n // Create computed getters — bound to store so `this.otherGetter()` works\n if (definition.getters) {\n for (const [key, getterFn] of Object.entries(definition.getters)) {\n getterKeys.push(key);\n store[key] = computed(() =>\n (getterFn as Function).call(store, stateSignals),\n );\n }\n }\n\n // Collect all plugins (global + per-store)\n const plugins = [...globalPlugins, ...(definition.plugins ?? [])];\n\n // Bind actions with `this` pointing to the full store (state + getters + actions)\n if (definition.actions) {\n for (const [key, actionFn] of Object.entries(definition.actions)) {\n actionKeys.push(key);\n store[key] = (...args: unknown[]) => {\n for (const plugin of plugins) plugin.onAction?.(store, key, args);\n return (actionFn as Function).apply(store, args);\n };\n }\n }\n\n // $reset\n store.$reset = () => {\n const fresh = definition.state();\n for (const key of stateKeys) {\n stateSignals[key].set(fresh[key as keyof S]);\n }\n };\n\n // $patch — merge partial state or apply via callback (batched)\n store.$patch = (partialOrFn: Partial<S> | ((state: any) => void)) => {\n batch(() => {\n if (typeof partialOrFn === 'function') {\n partialOrFn(stateSignals);\n } else {\n for (const [key, value] of Object.entries(partialOrFn)) {\n if (key in stateSignals) {\n stateSignals[key].set(value);\n }\n }\n }\n });\n };\n\n // $snapshot\n store.$snapshot = (): S => {\n const snapshot: Record<string, unknown> = {};\n for (const key of stateKeys) {\n snapshot[key] = stateSignals[key]();\n }\n return snapshot as S;\n };\n\n // $subscribe — watch all state signals and notify on change\n const subscribers = new Set<(state: S) => void>();\n let subscribeEffect: (() => void) | null = null;\n store.$subscribe = (callback: (state: S) => void): (() => void) => {\n subscribers.add(callback);\n // Start watching if this is the first subscriber\n if (!subscribeEffect) {\n let isInitial = true;\n subscribeEffect = effect(() => {\n // Read all state signals to track them\n for (const key of stateKeys) {\n stateSignals[key]();\n }\n // Skip initial run — only notify on actual changes\n if (isInitial) {\n isInitial = false;\n return;\n }\n const snapshot = store.$snapshot();\n for (const cb of subscribers) {\n cb(snapshot);\n }\n });\n }\n return () => {\n subscribers.delete(callback);\n // Dispose effect when no subscribers remain\n if (subscribers.size === 0 && subscribeEffect) {\n subscribeEffect();\n subscribeEffect = null;\n }\n };\n };\n\n // --- Persistence ---\n if (definition.persist && typeof window !== 'undefined') {\n const configs = normalizePersistConfigs(id, definition.persist);\n for (const cfg of configs) {\n const storage = cfg.storage === 'sessionStorage' ? sessionStorage : localStorage;\n const serialize = cfg.serialize ?? JSON.stringify;\n const deserialize = cfg.deserialize ?? JSON.parse;\n const persistKeys = cfg.pick ?? stateKeys;\n\n // Hydrate: read from storage and merge into state\n try {\n const raw = storage.getItem(cfg.key);\n if (raw) {\n const saved = deserialize(raw) as Record<string, unknown>;\n for (const key of persistKeys as string[]) {\n if (key in saved && key in stateSignals) {\n stateSignals[key].set(saved[key]);\n }\n }\n }\n } catch { /* corrupt storage — ignore */ }\n\n // Write: subscribe to state changes and persist (debounced via microtask)\n // The effect tracks signals to detect changes; the microtask reads\n // fresh values so sequential updates in the same tick are all captured.\n let persistScheduled = false;\n let isInitialPersist = true;\n effect(() => {\n // Track the persisted signals (read them so the effect re-runs on change)\n for (const key of persistKeys as string[]) {\n if (key in stateSignals) stateSignals[key]();\n }\n // Skip the initial run (hydration just happened, don't write stale defaults)\n if (isInitialPersist) { isInitialPersist = false; return; }\n // Schedule a microtask to capture the LATEST values after all sync updates\n if (!persistScheduled) {\n persistScheduled = true;\n queueMicrotask(() => {\n persistScheduled = false;\n // Read fresh values NOW, not when the effect ran\n const snapshot: Record<string, unknown> = {};\n for (const key of persistKeys as string[]) {\n if (key in stateSignals) snapshot[key] = stateSignals[key].peek();\n }\n try { storage.setItem(cfg.key, serialize(snapshot)); } catch { /* quota exceeded */ }\n });\n }\n });\n\n // Cross-tab sync: listen for storage events from other tabs\n if (cfg.storage !== 'sessionStorage') {\n window.addEventListener('storage', (e) => {\n if (e.key !== cfg.key || !e.newValue) return;\n try {\n const updated = deserialize(e.newValue) as Record<string, unknown>;\n for (const key of persistKeys as string[]) {\n if (key in updated && key in stateSignals) {\n stateSignals[key].set(updated[key]);\n }\n }\n } catch { /* ignore parse errors */ }\n });\n }\n }\n }\n\n // --- Sync ---\n if (definition.sync && (definition.sync.enabled !== false)) {\n const syncOpts = definition.sync;\n const syncKeys = syncOpts.pick ?? stateKeys;\n\n const syncState: Record<string, unknown> = {};\n for (const key of syncKeys) {\n syncState[key] = stateSignals[key]?.peek?.() ?? initialState[key as keyof S];\n }\n\n const doc = createSync(syncState as Record<string, unknown>, {\n transport: syncOpts.transport,\n peerId: syncOpts.peerId,\n });\n\n // Wire: local signal changes → sync broadcast\n for (const key of syncKeys) {\n if (!(key in stateSignals) || !(key in doc.state)) continue;\n const localSignal = stateSignals[key];\n const syncSignal = (doc.state as Record<string, any>)[key];\n\n const originalSet = localSignal.set;\n let fromSync = false;\n localSignal.set = (value: unknown) => {\n originalSet.call(localSignal, value);\n if (!fromSync) syncSignal.set(value);\n };\n\n // Listen for remote changes\n effect(() => {\n const remoteVal = syncSignal();\n fromSync = true;\n localSignal.set(remoteVal);\n fromSync = false;\n });\n }\n\n // Expose sync metadata on the store\n (store as any).$sync = {\n peers: doc.peers,\n presence: doc.presence,\n peerPresence: doc.peerPresence,\n peerId: doc.peerId,\n connected: doc.connected,\n connect: doc.connect.bind(doc),\n disconnect: doc.disconnect.bind(doc),\n };\n }\n\n // Initialize plugins\n for (const plugin of plugins) plugin.init?.(store);\n\n return store as Store<S, G, A>;\n}\n\nfunction normalizePersistConfigs<S>(id: string, persist: boolean | PersistOptions<S> | PersistOptions<S>[]): Array<PersistOptions<S> & { key: string }> {\n if (persist === true) {\n return [{ key: `akash-store:${id}` }];\n }\n if (persist === false) return [];\n if (Array.isArray(persist)) {\n return persist.map((p, i) => ({ ...p, key: p.key ?? `akash-store:${id}:${i}` }));\n }\n return [{ ...persist, key: persist.key ?? `akash-store:${id}` }];\n}\n\n/**\n * Clear all store instances (useful for testing).\n */\nexport function clearStores(): void {\n storeInstances.clear();\n}\n\n/** @internal — exposes store registry for devtools */\nexport function __getStoreInstances(): Record<string, Store<any, any, any>> {\n return Object.fromEntries(storeInstances);\n}\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
'use strict';var chunkHL2VGVJT_cjs=require('./chunk-HL2VGVJT.cjs');function E(r){let{data:n,columns:l,pageSize:s=0,initialSort:x}=r,i=chunkHL2VGVJT_cjs.c(x??{column:null,direction:null}),f=chunkHL2VGVJT_cjs.c(""),o=chunkHL2VGVJT_cjs.c(1),m=chunkHL2VGVJT_cjs.c(Object.fromEntries(l.map(e=>[e.key,e.visible!==false]))),C=chunkHL2VGVJT_cjs.d(()=>{let e=m();return l.filter(t=>e[t.key])}),T=chunkHL2VGVJT_cjs.d(()=>{let e=f().toLowerCase().trim();if(!e)return n();let t=l.filter(a=>a.filterable),d=t.length>0?t:l;return n().filter(a=>d.some(c=>{let p=b(a,c.key);return String(p).toLowerCase().includes(e)}))}),v=chunkHL2VGVJT_cjs.d(()=>{let{column:e,direction:t}=i(),d=[...T()];if(!e||!t)return d;let a=l.find(c=>c.key===e);return a?d.sort((c,p)=>{if(a.compare){let R=a.compare(c,p);return t==="desc"?-R:R}let O=b(c,e),j=b(p,e),y=z(O,j);return t==="desc"?-y:y}):d}),w=chunkHL2VGVJT_cjs.d(()=>T().length),S=chunkHL2VGVJT_cjs.d(()=>s<=0?1:Math.max(1,Math.ceil(w()/s))),h=chunkHL2VGVJT_cjs.d(()=>{let e=v();if(s<=0)return e;let t=(o()-1)*s;return e.slice(t,t+s)});function D(e){let t=i();t.column===e?t.direction==="asc"?i.set({column:e,direction:"desc"}):t.direction==="desc"?i.set({column:null,direction:null}):i.set({column:e,direction:"asc"}):i.set({column:e,direction:"asc"}),o.set(1);}function k(e){f.set(e),o.set(1);}function P(e){m.update(t=>({...t,[e]:!t[e]}));}function M(e){m.update(t=>({...t,[e]:true}));}function V(e){m.update(t=>({...t,[e]:false}));}return {rows:h,allRows:v,totalRows:w,visibleColumns:C,sortState:()=>i(),filterText:()=>f(),page:()=>o(),totalPages:S,sort:D,filter:k,toggleColumn:P,showColumn:M,hideColumn:V,nextPage(){o()<S()&&o.update(e=>e+1);},prevPage(){o()>1&&o.update(e=>e-1);},goToPage(e){o.set(Math.max(1,Math.min(e,S())));},reset(){i.set({column:null,direction:null}),f.set(""),o.set(1);}}}function b(r,n){return n.split(".").reduce((l,s)=>l?.[s],r)}function z(r,n){return r==null&&n==null?0:r==null?-1:n==null?1:typeof r=="number"&&typeof n=="number"?r-n:String(r).localeCompare(String(n))}exports.a=E;//# sourceMappingURL=chunk-EXKQPZ5N.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-EXKQPZ5N.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data-table.ts"],"names":["createDataTable","options","data","columns","pageSize","initialSort","sortState","signal","filterText","page","columnVisibility","c","visibleColumns","computed","vis","filteredRows","text","filterableCols","colsToSearch","row","col","value","getNestedValue","sortedRows","column","direction","rows","colDef","a","b","result","aVal","bVal","defaultCompare","totalRows","totalPages","paginatedRows","all","start","sort","columnKey","current","filter","toggleColumn","key","showColumn","hideColumn","p","obj","path","o","k"],"mappings":"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","file":"chunk-7IJUJUXE.cjs","sourcesContent":["/**\n * Headless data table.\n *\n * Signal-based table state management with sorting, filtering,\n * column visibility, and pagination integration. No DOM — just logic.\n *\n * ```ts\n * const table = createDataTable({\n * data: () => users(),\n * columns: [\n * { key: 'name', header: 'Name', sortable: true },\n * { key: 'email', header: 'Email', sortable: true, filterable: true },\n * { key: 'age', header: 'Age', sortable: true },\n * ],\n * pageSize: 20,\n * });\n *\n * table.rows(); // current page of sorted/filtered data\n * table.sort('name'); // toggle sort by column\n * table.filter('search term');\n * table.toggleColumn('age');\n * table.nextPage();\n * ```\n */\n\nimport { signal, computed } from './signals.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// --- Types ---\n\nexport interface ColumnDef<T> {\n /** Key to access the data (dot notation supported) */\n key: string;\n /** Display header */\n header: string;\n /** Whether this column is sortable (default: false) */\n sortable?: boolean;\n /** Whether this column is searchable by the global filter (default: false) */\n filterable?: boolean;\n /** Custom sort comparator */\n compare?: (a: T, b: T) => number;\n /** Custom cell value accessor */\n accessor?: (row: T) => unknown;\n /** Whether column is visible by default (default: true) */\n visible?: boolean;\n}\n\nexport type SortDirection = 'asc' | 'desc' | null;\n\nexport interface SortState {\n column: string | null;\n direction: SortDirection;\n}\n\nexport interface DataTableOptions<T> {\n /** Reactive data source */\n data: () => T[];\n /** Column definitions */\n columns: ColumnDef<T>[];\n /** Page size (0 = no pagination) */\n pageSize?: number;\n /** Initial sort */\n initialSort?: SortState;\n}\n\nexport interface DataTable<T> {\n /** Current page of processed (sorted + filtered) rows */\n rows: ReadonlySignal<T[]>;\n /** All processed rows (before pagination) */\n allRows: ReadonlySignal<T[]>;\n /** Total row count after filtering */\n totalRows: ReadonlySignal<number>;\n /** Visible columns */\n visibleColumns: ReadonlySignal<ColumnDef<T>[]>;\n /** Current sort state */\n sortState: ReadonlySignal<SortState>;\n /** Current filter text */\n filterText: ReadonlySignal<string>;\n /** Current page (1-based) */\n page: ReadonlySignal<number>;\n /** Total pages */\n totalPages: ReadonlySignal<number>;\n /** Toggle or set sort on a column */\n sort(columnKey: string): void;\n /** Set the global filter text */\n filter(text: string): void;\n /** Toggle column visibility */\n toggleColumn(columnKey: string): void;\n /** Show a column */\n showColumn(columnKey: string): void;\n /** Hide a column */\n hideColumn(columnKey: string): void;\n /** Go to next page */\n nextPage(): void;\n /** Go to previous page */\n prevPage(): void;\n /** Go to specific page */\n goToPage(page: number): void;\n /** Reset all state (sort, filter, page) */\n reset(): void;\n}\n\n// --- Implementation ---\n\nexport function createDataTable<T extends Record<string, unknown>>(\n options: DataTableOptions<T>,\n): DataTable<T> {\n const { data, columns, pageSize = 0, initialSort } = options;\n\n const sortState = signal<SortState>(initialSort ?? { column: null, direction: null });\n const filterText = signal('');\n const page = signal(1);\n const columnVisibility = signal<Record<string, boolean>>(\n Object.fromEntries(columns.map((c) => [c.key, c.visible !== false])),\n );\n\n // Visible columns\n const visibleColumns = computed(() => {\n const vis = columnVisibility();\n return columns.filter((c) => vis[c.key]);\n });\n\n // Filtered rows\n const filteredRows = computed(() => {\n const text = filterText().toLowerCase().trim();\n if (!text) return data();\n\n // If no columns explicitly marked filterable, filter all columns\n const filterableCols = columns.filter((c) => c.filterable);\n const colsToSearch = filterableCols.length > 0 ? filterableCols : columns;\n\n return data().filter((row) => {\n return colsToSearch.some((col) => {\n const value = getNestedValue(row, col.key);\n return String(value).toLowerCase().includes(text);\n });\n });\n });\n\n // Sorted rows\n const sortedRows = computed(() => {\n const { column, direction } = sortState();\n const rows = [...filteredRows()];\n\n if (!column || !direction) return rows;\n\n const colDef = columns.find((c) => c.key === column);\n if (!colDef) return rows;\n\n return rows.sort((a, b) => {\n if (colDef.compare) {\n const result = colDef.compare(a, b);\n return direction === 'desc' ? -result : result;\n }\n\n const aVal = getNestedValue(a, column);\n const bVal = getNestedValue(b, column);\n const result = defaultCompare(aVal, bVal);\n return direction === 'desc' ? -result : result;\n });\n });\n\n // Total rows after filtering\n const totalRows = computed(() => filteredRows().length);\n\n // Total pages\n const totalPages = computed(() => {\n if (pageSize <= 0) return 1;\n return Math.max(1, Math.ceil(totalRows() / pageSize));\n });\n\n // Paginated rows\n const paginatedRows = computed(() => {\n const all = sortedRows();\n if (pageSize <= 0) return all;\n const start = (page() - 1) * pageSize;\n return all.slice(start, start + pageSize);\n });\n\n // --- Actions ---\n\n function sort(columnKey: string): void {\n const current = sortState();\n if (current.column === columnKey) {\n // Cycle: asc → desc → none\n if (current.direction === 'asc') {\n sortState.set({ column: columnKey, direction: 'desc' });\n } else if (current.direction === 'desc') {\n sortState.set({ column: null, direction: null });\n } else {\n sortState.set({ column: columnKey, direction: 'asc' });\n }\n } else {\n sortState.set({ column: columnKey, direction: 'asc' });\n }\n page.set(1);\n }\n\n function filter(text: string): void {\n filterText.set(text);\n page.set(1);\n }\n\n function toggleColumn(key: string): void {\n columnVisibility.update((vis) => ({ ...vis, [key]: !vis[key] }));\n }\n\n function showColumn(key: string): void {\n columnVisibility.update((vis) => ({ ...vis, [key]: true }));\n }\n\n function hideColumn(key: string): void {\n columnVisibility.update((vis) => ({ ...vis, [key]: false }));\n }\n\n return {\n rows: paginatedRows,\n allRows: sortedRows,\n totalRows,\n visibleColumns,\n sortState: () => sortState(),\n filterText: () => filterText(),\n page: () => page(),\n totalPages,\n sort,\n filter,\n toggleColumn,\n showColumn,\n hideColumn,\n nextPage() { if (page() < totalPages()) page.update((p) => p + 1); },\n prevPage() { if (page() > 1) page.update((p) => p - 1); },\n goToPage(p: number) { page.set(Math.max(1, Math.min(p, totalPages()))); },\n reset() {\n sortState.set({ column: null, direction: null });\n filterText.set('');\n page.set(1);\n },\n };\n}\n\n// --- Helpers ---\n\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n return path.split('.').reduce((o: any, k) => o?.[k], obj);\n}\n\nfunction defaultCompare(a: unknown, b: unknown): number {\n if (a == null && b == null) return 0;\n if (a == null) return -1;\n if (b == null) return 1;\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n return String(a).localeCompare(String(b));\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/data-table.ts"],"names":["createDataTable","options","data","columns","pageSize","initialSort","sortState","signal","filterText","page","columnVisibility","c","visibleColumns","computed","vis","filteredRows","text","filterableCols","colsToSearch","row","col","value","getNestedValue","sortedRows","column","direction","rows","colDef","a","b","result","aVal","bVal","defaultCompare","totalRows","totalPages","paginatedRows","all","start","sort","columnKey","current","filter","toggleColumn","key","showColumn","hideColumn","p","obj","path","o","k"],"mappings":"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","file":"chunk-EXKQPZ5N.cjs","sourcesContent":["/**\n * Headless data table.\n *\n * Signal-based table state management with sorting, filtering,\n * column visibility, and pagination integration. No DOM — just logic.\n *\n * ```ts\n * const table = createDataTable({\n * data: () => users(),\n * columns: [\n * { key: 'name', header: 'Name', sortable: true },\n * { key: 'email', header: 'Email', sortable: true, filterable: true },\n * { key: 'age', header: 'Age', sortable: true },\n * ],\n * pageSize: 20,\n * });\n *\n * table.rows(); // current page of sorted/filtered data\n * table.sort('name'); // toggle sort by column\n * table.filter('search term');\n * table.toggleColumn('age');\n * table.nextPage();\n * ```\n */\n\nimport { signal, computed } from './signals.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// --- Types ---\n\nexport interface ColumnDef<T> {\n /** Key to access the data (dot notation supported) */\n key: string;\n /** Display header */\n header: string;\n /** Whether this column is sortable (default: false) */\n sortable?: boolean;\n /** Whether this column is searchable by the global filter (default: false) */\n filterable?: boolean;\n /** Custom sort comparator */\n compare?: (a: T, b: T) => number;\n /** Custom cell value accessor */\n accessor?: (row: T) => unknown;\n /** Whether column is visible by default (default: true) */\n visible?: boolean;\n}\n\nexport type SortDirection = 'asc' | 'desc' | null;\n\nexport interface SortState {\n column: string | null;\n direction: SortDirection;\n}\n\nexport interface DataTableOptions<T> {\n /** Reactive data source */\n data: () => T[];\n /** Column definitions */\n columns: ColumnDef<T>[];\n /** Page size (0 = no pagination) */\n pageSize?: number;\n /** Initial sort */\n initialSort?: SortState;\n}\n\nexport interface DataTable<T> {\n /** Current page of processed (sorted + filtered) rows */\n rows: ReadonlySignal<T[]>;\n /** All processed rows (before pagination) */\n allRows: ReadonlySignal<T[]>;\n /** Total row count after filtering */\n totalRows: ReadonlySignal<number>;\n /** Visible columns */\n visibleColumns: ReadonlySignal<ColumnDef<T>[]>;\n /** Current sort state */\n sortState: ReadonlySignal<SortState>;\n /** Current filter text */\n filterText: ReadonlySignal<string>;\n /** Current page (1-based) */\n page: ReadonlySignal<number>;\n /** Total pages */\n totalPages: ReadonlySignal<number>;\n /** Toggle or set sort on a column */\n sort(columnKey: string): void;\n /** Set the global filter text */\n filter(text: string): void;\n /** Toggle column visibility */\n toggleColumn(columnKey: string): void;\n /** Show a column */\n showColumn(columnKey: string): void;\n /** Hide a column */\n hideColumn(columnKey: string): void;\n /** Go to next page */\n nextPage(): void;\n /** Go to previous page */\n prevPage(): void;\n /** Go to specific page */\n goToPage(page: number): void;\n /** Reset all state (sort, filter, page) */\n reset(): void;\n}\n\n// --- Implementation ---\n\nexport function createDataTable<T extends Record<string, unknown>>(\n options: DataTableOptions<T>,\n): DataTable<T> {\n const { data, columns, pageSize = 0, initialSort } = options;\n\n const sortState = signal<SortState>(initialSort ?? { column: null, direction: null });\n const filterText = signal('');\n const page = signal(1);\n const columnVisibility = signal<Record<string, boolean>>(\n Object.fromEntries(columns.map((c) => [c.key, c.visible !== false])),\n );\n\n // Visible columns\n const visibleColumns = computed(() => {\n const vis = columnVisibility();\n return columns.filter((c) => vis[c.key]);\n });\n\n // Filtered rows\n const filteredRows = computed(() => {\n const text = filterText().toLowerCase().trim();\n if (!text) return data();\n\n // If no columns explicitly marked filterable, filter all columns\n const filterableCols = columns.filter((c) => c.filterable);\n const colsToSearch = filterableCols.length > 0 ? filterableCols : columns;\n\n return data().filter((row) => {\n return colsToSearch.some((col) => {\n const value = getNestedValue(row, col.key);\n return String(value).toLowerCase().includes(text);\n });\n });\n });\n\n // Sorted rows\n const sortedRows = computed(() => {\n const { column, direction } = sortState();\n const rows = [...filteredRows()];\n\n if (!column || !direction) return rows;\n\n const colDef = columns.find((c) => c.key === column);\n if (!colDef) return rows;\n\n return rows.sort((a, b) => {\n if (colDef.compare) {\n const result = colDef.compare(a, b);\n return direction === 'desc' ? -result : result;\n }\n\n const aVal = getNestedValue(a, column);\n const bVal = getNestedValue(b, column);\n const result = defaultCompare(aVal, bVal);\n return direction === 'desc' ? -result : result;\n });\n });\n\n // Total rows after filtering\n const totalRows = computed(() => filteredRows().length);\n\n // Total pages\n const totalPages = computed(() => {\n if (pageSize <= 0) return 1;\n return Math.max(1, Math.ceil(totalRows() / pageSize));\n });\n\n // Paginated rows\n const paginatedRows = computed(() => {\n const all = sortedRows();\n if (pageSize <= 0) return all;\n const start = (page() - 1) * pageSize;\n return all.slice(start, start + pageSize);\n });\n\n // --- Actions ---\n\n function sort(columnKey: string): void {\n const current = sortState();\n if (current.column === columnKey) {\n // Cycle: asc → desc → none\n if (current.direction === 'asc') {\n sortState.set({ column: columnKey, direction: 'desc' });\n } else if (current.direction === 'desc') {\n sortState.set({ column: null, direction: null });\n } else {\n sortState.set({ column: columnKey, direction: 'asc' });\n }\n } else {\n sortState.set({ column: columnKey, direction: 'asc' });\n }\n page.set(1);\n }\n\n function filter(text: string): void {\n filterText.set(text);\n page.set(1);\n }\n\n function toggleColumn(key: string): void {\n columnVisibility.update((vis) => ({ ...vis, [key]: !vis[key] }));\n }\n\n function showColumn(key: string): void {\n columnVisibility.update((vis) => ({ ...vis, [key]: true }));\n }\n\n function hideColumn(key: string): void {\n columnVisibility.update((vis) => ({ ...vis, [key]: false }));\n }\n\n return {\n rows: paginatedRows,\n allRows: sortedRows,\n totalRows,\n visibleColumns,\n sortState: () => sortState(),\n filterText: () => filterText(),\n page: () => page(),\n totalPages,\n sort,\n filter,\n toggleColumn,\n showColumn,\n hideColumn,\n nextPage() { if (page() < totalPages()) page.update((p) => p + 1); },\n prevPage() { if (page() > 1) page.update((p) => p - 1); },\n goToPage(p: number) { page.set(Math.max(1, Math.min(p, totalPages()))); },\n reset() {\n sortState.set({ column: null, direction: null });\n filterText.set('');\n page.set(1);\n },\n };\n}\n\n// --- Helpers ---\n\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n return path.split('.').reduce((o: any, k) => o?.[k], obj);\n}\n\nfunction defaultCompare(a: unknown, b: unknown): number {\n if (a == null && b == null) return 0;\n if (a == null) return -1;\n if (b == null) return 1;\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n return String(a).localeCompare(String(b));\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
'use strict';var
|
|
1
|
+
'use strict';var chunkHL2VGVJT_cjs=require('./chunk-HL2VGVJT.cjs');function v(e,t={}){let s=chunkHL2VGVJT_cjs.c(false),i=chunkHL2VGVJT_cjs.c(false),n=chunkHL2VGVJT_cjs.c(!navigator.onLine),r=null;window.addEventListener("online",()=>n.set(false)),window.addEventListener("offline",()=>n.set(true));let c=new Promise((u,o)=>{if(!("serviceWorker"in navigator)){o(new Error("Service workers not supported"));return}navigator.serviceWorker.register(e,{scope:t.scope}).then(a=>{r=a,s.set(true),t.onReady?.(a),u(a),a.addEventListener("updatefound",()=>{let l=a.installing;l&&l.addEventListener("statechange",()=>{l.state==="installed"&&navigator.serviceWorker.controller&&(i.set(true),t.onUpdate?.(a),t.autoReload&&(l.postMessage({type:"SKIP_WAITING"}),window.location.reload()));});});}).catch(a=>{t.onError?.(a),o(a);});});return {registered:()=>s(),updateAvailable:()=>i(),offline:()=>n(),ready:c,async update(){r&&await r.update();},skipWaiting(){r?.waiting&&(r.waiting.postMessage({type:"SKIP_WAITING"}),window.location.reload());},async unregister(){return r?r.unregister():false}}}function f(e){let t=Array.isArray(e)?e:e.runtimeCache??[],s=Array.isArray(e)?[]:e.precache??[],i=Array.isArray(e)?"akash-cache-v1":e.cacheName??"akash-cache-v1",n=`// Auto-generated service worker by AkashJS
|
|
2
2
|
const CACHE_NAME = '${i}';
|
|
3
3
|
const PRECACHE_URLS = ${JSON.stringify(s)};
|
|
4
4
|
|
|
@@ -32,5 +32,5 @@ self.addEventListener('fetch', (event) => {
|
|
|
32
32
|
fetch(event.request).catch(() => caches.match(event.request))
|
|
33
33
|
);
|
|
34
34
|
});
|
|
35
|
-
`,n}function p(e,t){switch(e){case "cache-first":return `caches.match(event.request).then(cached => cached || fetch(event.request).then(response => { const clone = response.clone(); caches.open('${t}').then(cache => cache.put(event.request, clone)); return response; }))`;case "network-first":return `fetch(event.request).then(response => { const clone = response.clone(); caches.open('${t}').then(cache => cache.put(event.request, clone)); return response; }).catch(() => caches.match(event.request))`;case "stale-while-revalidate":return `caches.match(event.request).then(cached => { const fetchPromise = fetch(event.request).then(response => { caches.open('${t}').then(cache => cache.put(event.request, response.clone())); return response; }); return cached || fetchPromise; })`;case "network-only":return "fetch(event.request)";case "cache-only":return "caches.match(event.request)"}}async function y(e,t){return await Notification.requestPermission()!=="granted"?null:await e.pushManager.subscribe({userVisibleOnly:true,applicationServerKey:d(t)})}function d(e){let t="=".repeat((4-e.length%4)%4),s=(e+t).replace(/-/g,"+").replace(/_/g,"/"),i=atob(s);return Uint8Array.from(i,n=>n.charCodeAt(0))}exports.a=v;exports.b=f;exports.c=y;//# sourceMappingURL=chunk-
|
|
36
|
-
//# sourceMappingURL=chunk-
|
|
35
|
+
`,n}function p(e,t){switch(e){case "cache-first":return `caches.match(event.request).then(cached => cached || fetch(event.request).then(response => { const clone = response.clone(); caches.open('${t}').then(cache => cache.put(event.request, clone)); return response; }))`;case "network-first":return `fetch(event.request).then(response => { const clone = response.clone(); caches.open('${t}').then(cache => cache.put(event.request, clone)); return response; }).catch(() => caches.match(event.request))`;case "stale-while-revalidate":return `caches.match(event.request).then(cached => { const fetchPromise = fetch(event.request).then(response => { caches.open('${t}').then(cache => cache.put(event.request, response.clone())); return response; }); return cached || fetchPromise; })`;case "network-only":return "fetch(event.request)";case "cache-only":return "caches.match(event.request)"}}async function y(e,t){return await Notification.requestPermission()!=="granted"?null:await e.pushManager.subscribe({userVisibleOnly:true,applicationServerKey:d(t)})}function d(e){let t="=".repeat((4-e.length%4)%4),s=(e+t).replace(/-/g,"+").replace(/_/g,"/"),i=atob(s);return Uint8Array.from(i,n=>n.charCodeAt(0))}exports.a=v;exports.b=f;exports.c=y;//# sourceMappingURL=chunk-F2F5OXCK.cjs.map
|
|
36
|
+
//# sourceMappingURL=chunk-F2F5OXCK.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/pwa.ts"],"names":["registerServiceWorker","swUrl","options","registered","signal","updateAvailable","offline","registration","ready","resolve","reject","reg","newWorker","err","generateSWScript","routesOrConfig","routes","precache","globalCacheName","script","route","matchValue","pattern","cacheName","generateStrategyCode","strategy","subscribePush","vapidPublicKey","urlBase64ToUint8Array","base64String","padding","base64","rawData","char"],"mappings":"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","file":"chunk-NHDYQTC5.cjs","sourcesContent":["/**\n * PWA / Service Worker support.\n *\n * Register service workers, configure caching strategies,\n * handle updates, and manage push notifications.\n *\n * ```ts\n * const sw = registerServiceWorker('/sw.js', {\n * onUpdate: () => toast.info('New version available!'),\n * });\n * sw.ready; // Promise<ServiceWorkerRegistration>\n * sw.update(); // check for updates\n * ```\n */\n\nimport { signal } from './signals.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport interface SWOptions {\n /** Callback when a new version is available */\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n /** Callback when the SW is ready */\n onReady?: (registration: ServiceWorkerRegistration) => void;\n /** Callback on registration error */\n onError?: (error: Error) => void;\n /** Auto-reload on update (default: false) */\n autoReload?: boolean;\n /** Scope of the service worker */\n scope?: string;\n}\n\nexport interface SWRegistration {\n /** Whether the SW is registered */\n registered: ReadonlySignal<boolean>;\n /** Whether an update is available */\n updateAvailable: ReadonlySignal<boolean>;\n /** Whether the app is running offline */\n offline: ReadonlySignal<boolean>;\n /** The raw SW registration (available after ready) */\n ready: Promise<ServiceWorkerRegistration>;\n /** Check for updates */\n update(): Promise<void>;\n /** Skip waiting and activate new SW */\n skipWaiting(): void;\n /** Unregister the service worker */\n unregister(): Promise<boolean>;\n}\n\n// =========================================================================\n// Service Worker registration\n// =========================================================================\n\n/**\n * Register a service worker with update detection.\n */\nexport function registerServiceWorker(\n swUrl: string,\n options: SWOptions = {},\n): SWRegistration {\n const registered = signal(false);\n const updateAvailable = signal(false);\n const offline = signal(!navigator.onLine);\n\n let registration: ServiceWorkerRegistration | null = null;\n\n // Track online/offline\n window.addEventListener('online', () => offline.set(false));\n window.addEventListener('offline', () => offline.set(true));\n\n const ready = new Promise<ServiceWorkerRegistration>((resolve, reject) => {\n if (!('serviceWorker' in navigator)) {\n reject(new Error('Service workers not supported'));\n return;\n }\n\n navigator.serviceWorker\n .register(swUrl, { scope: options.scope })\n .then((reg) => {\n registration = reg;\n registered.set(true);\n options.onReady?.(reg);\n resolve(reg);\n\n // Listen for updates\n reg.addEventListener('updatefound', () => {\n const newWorker = reg.installing;\n if (!newWorker) return;\n\n newWorker.addEventListener('statechange', () => {\n if (newWorker.state === 'installed' && navigator.serviceWorker.controller) {\n updateAvailable.set(true);\n options.onUpdate?.(reg);\n\n if (options.autoReload) {\n newWorker.postMessage({ type: 'SKIP_WAITING' });\n window.location.reload();\n }\n }\n });\n });\n })\n .catch((err) => {\n options.onError?.(err);\n reject(err);\n });\n });\n\n return {\n registered: () => registered(),\n updateAvailable: () => updateAvailable(),\n offline: () => offline(),\n ready,\n async update() {\n if (registration) {\n await registration.update();\n }\n },\n skipWaiting() {\n if (registration?.waiting) {\n registration.waiting.postMessage({ type: 'SKIP_WAITING' });\n window.location.reload();\n }\n },\n async unregister() {\n if (registration) {\n return registration.unregister();\n }\n return false;\n },\n };\n}\n\n// =========================================================================\n// Caching strategies (for SW scripts)\n// =========================================================================\n\nexport type CacheStrategy = 'cache-first' | 'network-first' | 'stale-while-revalidate' | 'network-only' | 'cache-only';\n\nexport interface CacheRoute {\n /** URL pattern to match (string or regex) */\n match: string | RegExp;\n /** Caching strategy */\n strategy: CacheStrategy;\n /** Cache name */\n cacheName?: string;\n /** Max entries in cache */\n maxEntries?: number;\n /** Max age in seconds */\n maxAgeSeconds?: number;\n}\n\n/**\n * Generate a service worker script from cache route configs.\n *\n * ```ts\n * const swScript = generateSWScript([\n * { match: /\\.(?:js|css)$/, strategy: 'cache-first', cacheName: 'assets' },\n * { match: '/api/', strategy: 'network-first', maxAgeSeconds: 300 },\n * { match: /\\.(?:png|jpg|svg)$/, strategy: 'cache-first', cacheName: 'images' },\n * ]);\n * ```\n */\nexport function generateSWScript(routesOrConfig: CacheRoute[] | { cacheName?: string; precache?: string[]; runtimeCache?: CacheRoute[] }): string {\n // Accept both array of routes and config object\n const routes: CacheRoute[] = Array.isArray(routesOrConfig)\n ? routesOrConfig\n : routesOrConfig.runtimeCache ?? [];\n const precache = Array.isArray(routesOrConfig) ? [] : routesOrConfig.precache ?? [];\n const globalCacheName = Array.isArray(routesOrConfig) ? 'akash-cache-v1' : routesOrConfig.cacheName ?? 'akash-cache-v1';\n let script = `// Auto-generated service worker by AkashJS\nconst CACHE_NAME = '${globalCacheName}';\nconst PRECACHE_URLS = ${JSON.stringify(precache)};\n\nself.addEventListener('install', (event) => {\n ${precache.length > 0 ? `event.waitUntil(\n caches.open(CACHE_NAME).then(cache => cache.addAll(PRECACHE_URLS))\n );` : ''}\n self.skipWaiting();\n});\n\nself.addEventListener('activate', (event) => {\n event.waitUntil(clients.claim());\n});\n\nself.addEventListener('message', (event) => {\n if (event.data?.type === 'SKIP_WAITING') {\n self.skipWaiting();\n }\n});\n\nself.addEventListener('fetch', (event) => {\n const url = new URL(event.request.url);\n`;\n\n for (const route of routes) {\n // Support both 'match' and 'urlPattern' property names\n const matchValue = route.match ?? (route as any).urlPattern;\n if (!matchValue) continue;\n\n const pattern = matchValue instanceof RegExp\n ? matchValue.toString()\n : `new RegExp(${JSON.stringify(matchValue.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))})`;\n\n const cacheName = route.cacheName ?? globalCacheName;\n\n script += `\n if (${pattern}.test(url.pathname)) {\n event.respondWith(${generateStrategyCode(route.strategy, cacheName)});\n return;\n }\n`;\n }\n\n script += `\n // Default: network-first\n event.respondWith(\n fetch(event.request).catch(() => caches.match(event.request))\n );\n});\n`;\n\n return script;\n}\n\nfunction generateStrategyCode(strategy: CacheStrategy, cacheName: string): string {\n switch (strategy) {\n case 'cache-first':\n return `caches.match(event.request).then(cached => cached || fetch(event.request).then(response => { const clone = response.clone(); caches.open('${cacheName}').then(cache => cache.put(event.request, clone)); return response; }))`;\n case 'network-first':\n return `fetch(event.request).then(response => { const clone = response.clone(); caches.open('${cacheName}').then(cache => cache.put(event.request, clone)); return response; }).catch(() => caches.match(event.request))`;\n case 'stale-while-revalidate':\n return `caches.match(event.request).then(cached => { const fetchPromise = fetch(event.request).then(response => { caches.open('${cacheName}').then(cache => cache.put(event.request, response.clone())); return response; }); return cached || fetchPromise; })`;\n case 'network-only':\n return `fetch(event.request)`;\n case 'cache-only':\n return `caches.match(event.request)`;\n }\n}\n\n// =========================================================================\n// Push notifications\n// =========================================================================\n\n/**\n * Request push notification permission and subscribe.\n */\nexport async function subscribePush(\n registration: ServiceWorkerRegistration,\n vapidPublicKey: string,\n): Promise<PushSubscription | null> {\n const permission = await Notification.requestPermission();\n if (permission !== 'granted') return null;\n\n const subscription = await registration.pushManager.subscribe({\n userVisibleOnly: true,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n applicationServerKey: urlBase64ToUint8Array(vapidPublicKey) as any,\n });\n\n return subscription;\n}\n\nfunction urlBase64ToUint8Array(base64String: string): Uint8Array {\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\n const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');\n const rawData = atob(base64);\n return Uint8Array.from(rawData, (char) => char.charCodeAt(0));\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/pwa.ts"],"names":["registerServiceWorker","swUrl","options","registered","signal","updateAvailable","offline","registration","ready","resolve","reject","reg","newWorker","err","generateSWScript","routesOrConfig","routes","precache","globalCacheName","script","route","matchValue","pattern","cacheName","generateStrategyCode","strategy","subscribePush","vapidPublicKey","urlBase64ToUint8Array","base64String","padding","base64","rawData","char"],"mappings":"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","file":"chunk-F2F5OXCK.cjs","sourcesContent":["/**\n * PWA / Service Worker support.\n *\n * Register service workers, configure caching strategies,\n * handle updates, and manage push notifications.\n *\n * ```ts\n * const sw = registerServiceWorker('/sw.js', {\n * onUpdate: () => toast.info('New version available!'),\n * });\n * sw.ready; // Promise<ServiceWorkerRegistration>\n * sw.update(); // check for updates\n * ```\n */\n\nimport { signal } from './signals.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport interface SWOptions {\n /** Callback when a new version is available */\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n /** Callback when the SW is ready */\n onReady?: (registration: ServiceWorkerRegistration) => void;\n /** Callback on registration error */\n onError?: (error: Error) => void;\n /** Auto-reload on update (default: false) */\n autoReload?: boolean;\n /** Scope of the service worker */\n scope?: string;\n}\n\nexport interface SWRegistration {\n /** Whether the SW is registered */\n registered: ReadonlySignal<boolean>;\n /** Whether an update is available */\n updateAvailable: ReadonlySignal<boolean>;\n /** Whether the app is running offline */\n offline: ReadonlySignal<boolean>;\n /** The raw SW registration (available after ready) */\n ready: Promise<ServiceWorkerRegistration>;\n /** Check for updates */\n update(): Promise<void>;\n /** Skip waiting and activate new SW */\n skipWaiting(): void;\n /** Unregister the service worker */\n unregister(): Promise<boolean>;\n}\n\n// =========================================================================\n// Service Worker registration\n// =========================================================================\n\n/**\n * Register a service worker with update detection.\n */\nexport function registerServiceWorker(\n swUrl: string,\n options: SWOptions = {},\n): SWRegistration {\n const registered = signal(false);\n const updateAvailable = signal(false);\n const offline = signal(!navigator.onLine);\n\n let registration: ServiceWorkerRegistration | null = null;\n\n // Track online/offline\n window.addEventListener('online', () => offline.set(false));\n window.addEventListener('offline', () => offline.set(true));\n\n const ready = new Promise<ServiceWorkerRegistration>((resolve, reject) => {\n if (!('serviceWorker' in navigator)) {\n reject(new Error('Service workers not supported'));\n return;\n }\n\n navigator.serviceWorker\n .register(swUrl, { scope: options.scope })\n .then((reg) => {\n registration = reg;\n registered.set(true);\n options.onReady?.(reg);\n resolve(reg);\n\n // Listen for updates\n reg.addEventListener('updatefound', () => {\n const newWorker = reg.installing;\n if (!newWorker) return;\n\n newWorker.addEventListener('statechange', () => {\n if (newWorker.state === 'installed' && navigator.serviceWorker.controller) {\n updateAvailable.set(true);\n options.onUpdate?.(reg);\n\n if (options.autoReload) {\n newWorker.postMessage({ type: 'SKIP_WAITING' });\n window.location.reload();\n }\n }\n });\n });\n })\n .catch((err) => {\n options.onError?.(err);\n reject(err);\n });\n });\n\n return {\n registered: () => registered(),\n updateAvailable: () => updateAvailable(),\n offline: () => offline(),\n ready,\n async update() {\n if (registration) {\n await registration.update();\n }\n },\n skipWaiting() {\n if (registration?.waiting) {\n registration.waiting.postMessage({ type: 'SKIP_WAITING' });\n window.location.reload();\n }\n },\n async unregister() {\n if (registration) {\n return registration.unregister();\n }\n return false;\n },\n };\n}\n\n// =========================================================================\n// Caching strategies (for SW scripts)\n// =========================================================================\n\nexport type CacheStrategy = 'cache-first' | 'network-first' | 'stale-while-revalidate' | 'network-only' | 'cache-only';\n\nexport interface CacheRoute {\n /** URL pattern to match (string or regex) */\n match: string | RegExp;\n /** Caching strategy */\n strategy: CacheStrategy;\n /** Cache name */\n cacheName?: string;\n /** Max entries in cache */\n maxEntries?: number;\n /** Max age in seconds */\n maxAgeSeconds?: number;\n}\n\n/**\n * Generate a service worker script from cache route configs.\n *\n * ```ts\n * const swScript = generateSWScript([\n * { match: /\\.(?:js|css)$/, strategy: 'cache-first', cacheName: 'assets' },\n * { match: '/api/', strategy: 'network-first', maxAgeSeconds: 300 },\n * { match: /\\.(?:png|jpg|svg)$/, strategy: 'cache-first', cacheName: 'images' },\n * ]);\n * ```\n */\nexport function generateSWScript(routesOrConfig: CacheRoute[] | { cacheName?: string; precache?: string[]; runtimeCache?: CacheRoute[] }): string {\n // Accept both array of routes and config object\n const routes: CacheRoute[] = Array.isArray(routesOrConfig)\n ? routesOrConfig\n : routesOrConfig.runtimeCache ?? [];\n const precache = Array.isArray(routesOrConfig) ? [] : routesOrConfig.precache ?? [];\n const globalCacheName = Array.isArray(routesOrConfig) ? 'akash-cache-v1' : routesOrConfig.cacheName ?? 'akash-cache-v1';\n let script = `// Auto-generated service worker by AkashJS\nconst CACHE_NAME = '${globalCacheName}';\nconst PRECACHE_URLS = ${JSON.stringify(precache)};\n\nself.addEventListener('install', (event) => {\n ${precache.length > 0 ? `event.waitUntil(\n caches.open(CACHE_NAME).then(cache => cache.addAll(PRECACHE_URLS))\n );` : ''}\n self.skipWaiting();\n});\n\nself.addEventListener('activate', (event) => {\n event.waitUntil(clients.claim());\n});\n\nself.addEventListener('message', (event) => {\n if (event.data?.type === 'SKIP_WAITING') {\n self.skipWaiting();\n }\n});\n\nself.addEventListener('fetch', (event) => {\n const url = new URL(event.request.url);\n`;\n\n for (const route of routes) {\n // Support both 'match' and 'urlPattern' property names\n const matchValue = route.match ?? (route as any).urlPattern;\n if (!matchValue) continue;\n\n const pattern = matchValue instanceof RegExp\n ? matchValue.toString()\n : `new RegExp(${JSON.stringify(matchValue.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))})`;\n\n const cacheName = route.cacheName ?? globalCacheName;\n\n script += `\n if (${pattern}.test(url.pathname)) {\n event.respondWith(${generateStrategyCode(route.strategy, cacheName)});\n return;\n }\n`;\n }\n\n script += `\n // Default: network-first\n event.respondWith(\n fetch(event.request).catch(() => caches.match(event.request))\n );\n});\n`;\n\n return script;\n}\n\nfunction generateStrategyCode(strategy: CacheStrategy, cacheName: string): string {\n switch (strategy) {\n case 'cache-first':\n return `caches.match(event.request).then(cached => cached || fetch(event.request).then(response => { const clone = response.clone(); caches.open('${cacheName}').then(cache => cache.put(event.request, clone)); return response; }))`;\n case 'network-first':\n return `fetch(event.request).then(response => { const clone = response.clone(); caches.open('${cacheName}').then(cache => cache.put(event.request, clone)); return response; }).catch(() => caches.match(event.request))`;\n case 'stale-while-revalidate':\n return `caches.match(event.request).then(cached => { const fetchPromise = fetch(event.request).then(response => { caches.open('${cacheName}').then(cache => cache.put(event.request, response.clone())); return response; }); return cached || fetchPromise; })`;\n case 'network-only':\n return `fetch(event.request)`;\n case 'cache-only':\n return `caches.match(event.request)`;\n }\n}\n\n// =========================================================================\n// Push notifications\n// =========================================================================\n\n/**\n * Request push notification permission and subscribe.\n */\nexport async function subscribePush(\n registration: ServiceWorkerRegistration,\n vapidPublicKey: string,\n): Promise<PushSubscription | null> {\n const permission = await Notification.requestPermission();\n if (permission !== 'granted') return null;\n\n const subscription = await registration.pushManager.subscribe({\n userVisibleOnly: true,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n applicationServerKey: urlBase64ToUint8Array(vapidPublicKey) as any,\n });\n\n return subscription;\n}\n\nfunction urlBase64ToUint8Array(base64String: string): Uint8Array {\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\n const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');\n const rawData = atob(base64);\n return Uint8Array.from(rawData, (char) => char.charCodeAt(0));\n}\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {e,c}from'./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import {e,c}from'./chunk-2UATNCKC.js';function v(i){return i}function E(...i){let d={},e$1=[];for(let n of i)typeof n=="function"?e$1.push(n):typeof n=="object"&&n!==null&&(d=n);let{label:l="inspect",level:m="log",logger:c,when:u}=d,s={dispose:null,get values(){return e$1.map(n=>n())},get value(){return e$1.length===1?e$1[0]():e$1.map(n=>n())},label:l,sources:e$1.length};return s.dispose=e(()=>{if(u&&!u())return;let n=e$1.map(r=>r());c?c(l,...n):console[m](`[${l}]`,...n);}),s}function b(i,d={}){let{method:e="POST",headers:l={},onSuccess:m,onError:c$1,fetch:u=globalThis.fetch.bind(globalThis)}=d,s=c(false),n=c(null),r=c(null);async function f(a){s.set(true),r.set(null);try{let o=await u(i,{method:e,headers:{"Content-Type":"application/json",...l},body:JSON.stringify(a)});if(!o.ok)throw new Error(`Form action failed: ${o.status}`);let t=await o.json();return n.set(t),s.set(!1),m?.(t),t}catch(o){let t=o instanceof Error?o:new Error(String(o));throw r.set(t),s.set(false),c$1?.(t),t}}return {url:i,method:e,submitting:()=>s(),result:()=>n(),error:()=>r(),handle(a){return o=>{o.preventDefault();let t=o.target,p=new FormData(t),h={...a};p.forEach((T,y)=>{h[y]=T;}),f(h);}},submit:f}}function k(i={}){if(typeof window>"u")return ()=>{};let{keyPrefix:d="akash-snapshot",capture:e=["scroll","forms"]}=i;function l(){let n={scrollX:window.scrollX,scrollY:window.scrollY,forms:{},timestamp:Date.now()};return e.includes("forms")&&document.querySelectorAll("form[id]").forEach(r=>{let f=r,a={};new FormData(f).forEach((o,t)=>{a[t]=String(o);}),n.forms[f.id]=a;}),n}function m(n){if(e.includes("scroll")&&requestAnimationFrame(()=>{window.scrollTo(n.scrollX,n.scrollY);}),e.includes("forms"))for(let[r,f]of Object.entries(n.forms)){let a=document.getElementById(r);if(a)for(let[o,t]of Object.entries(f)){let p=a.elements.namedItem(o);p&&(p.value=t);}}}let c=()=>`${d}-${window.location.pathname}`;function u(){try{let n=l();sessionStorage.setItem(c(),JSON.stringify(n));}catch{}}function s(){try{let n=sessionStorage.getItem(c());if(n){let r=JSON.parse(n);Date.now()-r.timestamp<1800*1e3&&m(r);}}catch{}}return window.addEventListener("beforeunload",u),window.addEventListener("popstate",()=>{requestAnimationFrame(s);}),performance.getEntriesByType("navigation")[0]?.type==="back_forward"&&requestAnimationFrame(s),()=>{window.removeEventListener("beforeunload",u);}}export{v as a,E as b,b as c,k as d};//# sourceMappingURL=chunk-GAAO2KXN.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-GAAO2KXN.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/snippets.ts"],"names":["defineSnippet","render","inspect","args","options","sources","arg","label","level","logger","when","result","s","effect","values","defineFormAction","url","method","headers","onSuccess","onError","customFetch","submitting","signal","error","submit","data","response","res","err","e","extraData","form","formData","value","key","enableSnapshots","config","keyPrefix","capture","captureSnapshot","snapshot","formEl","restoreSnapshot","formId","input","saveKey","save","restore","raw"],"mappings":"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","file":"chunk-7VBH4F3P.js","sourcesContent":["/**\n * Snippets, $inspect, form actions, and navigation snapshots.\n */\n\nimport { signal, effect } from './signals.js';\nimport type { AkashNode } from './types.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// =========================================================================\n// Snippets — reusable template fragments\n// =========================================================================\n\nexport type Snippet<TArgs extends unknown[] = []> = (...args: TArgs) => AkashNode;\n\n/**\n * Define a reusable template snippet.\n *\n * ```ts\n * const UserBadge = defineSnippet((name: string, role: string) => {\n * const el = document.createElement('span');\n * el.textContent = `${name} (${role})`;\n * el.className = 'badge';\n * return el;\n * });\n *\n * // Reuse anywhere:\n * container.appendChild(nodeToDOM(UserBadge('Alice', 'admin')));\n * container.appendChild(nodeToDOM(UserBadge('Bob', 'user')));\n * ```\n */\nexport function defineSnippet<TArgs extends unknown[]>(\n render: (...args: TArgs) => AkashNode,\n): Snippet<TArgs> {\n return render;\n}\n\n// =========================================================================\n// $inspect — debug reactive values\n// =========================================================================\n\nexport interface InspectOptions {\n /** Label prefix for console output */\n label?: string;\n /** Log level (default: 'log') */\n level?: 'log' | 'warn' | 'debug' | 'trace';\n /** Custom logger */\n logger?: (label: string, ...values: unknown[]) => void;\n /** Only log when a condition is true */\n when?: () => boolean;\n}\n\n/**\n * Debug helper — logs when reactive values change.\n *\n * ```ts\n * const count = signal(0);\n * const name = signal('Alice');\n *\n * inspect(count, name); // logs: [inspect] 0, 'Alice'\n * count.set(1); // logs: [inspect] 1, 'Alice'\n *\n * // With label:\n * inspect(count, { label: 'counter' });\n * // logs: [counter] 1\n * ```\n */\nexport function inspect(\n ...args: Array<(() => unknown) | InspectOptions>\n): () => void {\n let options: InspectOptions = {};\n const sources: Array<() => unknown> = [];\n\n for (const arg of args) {\n if (typeof arg === 'function') {\n sources.push(arg);\n } else if (typeof arg === 'object' && arg !== null) {\n options = arg as InspectOptions;\n }\n }\n\n const {\n label = 'inspect',\n level = 'log',\n logger,\n when,\n } = options;\n\n const result = {\n dispose: null as unknown as () => void,\n get values() { return sources.map(s => s()); },\n get value() { return sources.length === 1 ? sources[0]() : sources.map(s => s()); },\n label,\n sources: sources.length,\n };\n\n result.dispose = effect(() => {\n if (when && !when()) return;\n\n const values = sources.map((s) => s());\n\n if (logger) {\n logger(label, ...values);\n } else {\n (console as any)[level](`[${label}]`, ...values);\n }\n });\n\n return result as any;\n}\n\n// =========================================================================\n// Form actions — server-side form handling\n// =========================================================================\n\nexport interface FormAction<T = unknown> {\n /** The action URL */\n url: string;\n /** Submit method */\n method: 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n /** Whether a submission is in progress */\n submitting: ReadonlySignal<boolean>;\n /** The last result */\n result: ReadonlySignal<T | null>;\n /** The last error */\n error: ReadonlySignal<Error | null>;\n /** Create an onSubmit handler for a <form> */\n handle(formData?: Record<string, unknown>): (e: Event) => void;\n /** Submit programmatically */\n submit(data: Record<string, unknown>): Promise<T>;\n}\n\n/**\n * Define a server-side form action with progressive enhancement.\n *\n * ```ts\n * const createPost = defineFormAction<Post>('/api/posts', {\n * method: 'POST',\n * onSuccess: (post) => navigate(`/posts/${post.id}`),\n * onError: (err) => toast.error(err.message),\n * });\n *\n * // In template:\n * <form onSubmit={createPost.handle()}>\n * <input name=\"title\" />\n * <button disabled={createPost.submitting()}>Create</button>\n * </form>\n * ```\n */\nexport function defineFormAction<T = unknown>(\n url: string,\n options: {\n method?: 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n headers?: Record<string, string>;\n onSuccess?: (result: T) => void;\n onError?: (error: Error) => void;\n fetch?: typeof globalThis.fetch;\n } = {},\n): FormAction<T> {\n const {\n method = 'POST',\n headers = {},\n onSuccess,\n onError,\n fetch: customFetch = globalThis.fetch.bind(globalThis),\n } = options;\n\n const submitting = signal(false);\n const result = signal<T | null>(null);\n const error = signal<Error | null>(null);\n\n async function submit(data: Record<string, unknown>): Promise<T> {\n submitting.set(true);\n error.set(null);\n\n try {\n const response = await customFetch(url, {\n method,\n headers: { 'Content-Type': 'application/json', ...headers },\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n throw new Error(`Form action failed: ${response.status}`);\n }\n\n const res = await response.json() as T;\n result.set(res);\n submitting.set(false);\n onSuccess?.(res);\n return res;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n error.set(e);\n submitting.set(false);\n onError?.(e);\n throw e;\n }\n }\n\n return {\n url,\n method,\n submitting: () => submitting(),\n result: () => result(),\n error: () => error(),\n handle(extraData?: Record<string, unknown>) {\n return (e: Event) => {\n e.preventDefault();\n const form = e.target as HTMLFormElement;\n const formData = new FormData(form);\n const data: Record<string, unknown> = { ...extraData };\n formData.forEach((value, key) => { data[key] = value; });\n submit(data);\n };\n },\n submit,\n };\n}\n\n// =========================================================================\n// Navigation snapshots — preserve scroll & form state\n// =========================================================================\n\nexport interface SnapshotConfig {\n /** Storage key prefix (default: 'akash-snapshot') */\n keyPrefix?: string;\n /** What to capture */\n capture?: ('scroll' | 'forms')[];\n}\n\ninterface PageSnapshot {\n scrollX: number;\n scrollY: number;\n forms: Record<string, Record<string, string>>;\n timestamp: number;\n}\n\n/**\n * Enable navigation snapshots — preserves scroll position and form\n * state when navigating with back/forward.\n *\n * ```ts\n * enableSnapshots();\n * // Now back/forward restores scroll position and form inputs\n * ```\n */\nexport function enableSnapshots(config: SnapshotConfig = {}): () => void {\n if (typeof window === 'undefined') return () => {};\n\n const { keyPrefix = 'akash-snapshot', capture = ['scroll', 'forms'] } = config;\n\n function captureSnapshot(): PageSnapshot {\n const snapshot: PageSnapshot = {\n scrollX: window.scrollX,\n scrollY: window.scrollY,\n forms: {},\n timestamp: Date.now(),\n };\n\n if (capture.includes('forms')) {\n document.querySelectorAll('form[id]').forEach((form) => {\n const formEl = form as HTMLFormElement;\n const data: Record<string, string> = {};\n new FormData(formEl).forEach((value, key) => {\n data[key] = String(value);\n });\n snapshot.forms[formEl.id] = data;\n });\n }\n\n return snapshot;\n }\n\n function restoreSnapshot(snapshot: PageSnapshot): void {\n if (capture.includes('scroll')) {\n requestAnimationFrame(() => {\n window.scrollTo(snapshot.scrollX, snapshot.scrollY);\n });\n }\n\n if (capture.includes('forms')) {\n for (const [formId, data] of Object.entries(snapshot.forms)) {\n const form = document.getElementById(formId) as HTMLFormElement | null;\n if (!form) continue;\n for (const [key, value] of Object.entries(data)) {\n const input = form.elements.namedItem(key) as HTMLInputElement | null;\n if (input) input.value = value;\n }\n }\n }\n }\n\n // Save snapshot before navigation\n const saveKey = () => `${keyPrefix}-${window.location.pathname}`;\n\n function save(): void {\n try {\n const snapshot = captureSnapshot();\n sessionStorage.setItem(saveKey(), JSON.stringify(snapshot));\n } catch { /* storage full */ }\n }\n\n function restore(): void {\n try {\n const raw = sessionStorage.getItem(saveKey());\n if (raw) {\n const snapshot = JSON.parse(raw) as PageSnapshot;\n // Only restore if recent (within 30 minutes)\n if (Date.now() - snapshot.timestamp < 30 * 60 * 1000) {\n restoreSnapshot(snapshot);\n }\n }\n } catch { /* */ }\n }\n\n // Listen for navigation\n window.addEventListener('beforeunload', save);\n window.addEventListener('popstate', () => {\n requestAnimationFrame(restore);\n });\n\n // Restore on initial load if coming from back/forward\n if ((performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming | undefined)?.type === 'back_forward') {\n requestAnimationFrame(restore);\n }\n\n return () => {\n window.removeEventListener('beforeunload', save);\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/snippets.ts"],"names":["defineSnippet","render","inspect","args","options","sources","arg","label","level","logger","when","result","s","effect","values","defineFormAction","url","method","headers","onSuccess","onError","customFetch","submitting","signal","error","submit","data","response","res","err","e","extraData","form","formData","value","key","enableSnapshots","config","keyPrefix","capture","captureSnapshot","snapshot","formEl","restoreSnapshot","formId","input","saveKey","save","restore","raw"],"mappings":"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","file":"chunk-GAAO2KXN.js","sourcesContent":["/**\n * Snippets, $inspect, form actions, and navigation snapshots.\n */\n\nimport { signal, effect } from './signals.js';\nimport type { AkashNode } from './types.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// =========================================================================\n// Snippets — reusable template fragments\n// =========================================================================\n\nexport type Snippet<TArgs extends unknown[] = []> = (...args: TArgs) => AkashNode;\n\n/**\n * Define a reusable template snippet.\n *\n * ```ts\n * const UserBadge = defineSnippet((name: string, role: string) => {\n * const el = document.createElement('span');\n * el.textContent = `${name} (${role})`;\n * el.className = 'badge';\n * return el;\n * });\n *\n * // Reuse anywhere:\n * container.appendChild(nodeToDOM(UserBadge('Alice', 'admin')));\n * container.appendChild(nodeToDOM(UserBadge('Bob', 'user')));\n * ```\n */\nexport function defineSnippet<TArgs extends unknown[]>(\n render: (...args: TArgs) => AkashNode,\n): Snippet<TArgs> {\n return render;\n}\n\n// =========================================================================\n// $inspect — debug reactive values\n// =========================================================================\n\nexport interface InspectOptions {\n /** Label prefix for console output */\n label?: string;\n /** Log level (default: 'log') */\n level?: 'log' | 'warn' | 'debug' | 'trace';\n /** Custom logger */\n logger?: (label: string, ...values: unknown[]) => void;\n /** Only log when a condition is true */\n when?: () => boolean;\n}\n\n/**\n * Debug helper — logs when reactive values change.\n *\n * ```ts\n * const count = signal(0);\n * const name = signal('Alice');\n *\n * inspect(count, name); // logs: [inspect] 0, 'Alice'\n * count.set(1); // logs: [inspect] 1, 'Alice'\n *\n * // With label:\n * inspect(count, { label: 'counter' });\n * // logs: [counter] 1\n * ```\n */\nexport function inspect(\n ...args: Array<(() => unknown) | InspectOptions>\n): () => void {\n let options: InspectOptions = {};\n const sources: Array<() => unknown> = [];\n\n for (const arg of args) {\n if (typeof arg === 'function') {\n sources.push(arg);\n } else if (typeof arg === 'object' && arg !== null) {\n options = arg as InspectOptions;\n }\n }\n\n const {\n label = 'inspect',\n level = 'log',\n logger,\n when,\n } = options;\n\n const result = {\n dispose: null as unknown as () => void,\n get values() { return sources.map(s => s()); },\n get value() { return sources.length === 1 ? sources[0]() : sources.map(s => s()); },\n label,\n sources: sources.length,\n };\n\n result.dispose = effect(() => {\n if (when && !when()) return;\n\n const values = sources.map((s) => s());\n\n if (logger) {\n logger(label, ...values);\n } else {\n (console as any)[level](`[${label}]`, ...values);\n }\n });\n\n return result as any;\n}\n\n// =========================================================================\n// Form actions — server-side form handling\n// =========================================================================\n\nexport interface FormAction<T = unknown> {\n /** The action URL */\n url: string;\n /** Submit method */\n method: 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n /** Whether a submission is in progress */\n submitting: ReadonlySignal<boolean>;\n /** The last result */\n result: ReadonlySignal<T | null>;\n /** The last error */\n error: ReadonlySignal<Error | null>;\n /** Create an onSubmit handler for a <form> */\n handle(formData?: Record<string, unknown>): (e: Event) => void;\n /** Submit programmatically */\n submit(data: Record<string, unknown>): Promise<T>;\n}\n\n/**\n * Define a server-side form action with progressive enhancement.\n *\n * ```ts\n * const createPost = defineFormAction<Post>('/api/posts', {\n * method: 'POST',\n * onSuccess: (post) => navigate(`/posts/${post.id}`),\n * onError: (err) => toast.error(err.message),\n * });\n *\n * // In template:\n * <form onSubmit={createPost.handle()}>\n * <input name=\"title\" />\n * <button disabled={createPost.submitting()}>Create</button>\n * </form>\n * ```\n */\nexport function defineFormAction<T = unknown>(\n url: string,\n options: {\n method?: 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n headers?: Record<string, string>;\n onSuccess?: (result: T) => void;\n onError?: (error: Error) => void;\n fetch?: typeof globalThis.fetch;\n } = {},\n): FormAction<T> {\n const {\n method = 'POST',\n headers = {},\n onSuccess,\n onError,\n fetch: customFetch = globalThis.fetch.bind(globalThis),\n } = options;\n\n const submitting = signal(false);\n const result = signal<T | null>(null);\n const error = signal<Error | null>(null);\n\n async function submit(data: Record<string, unknown>): Promise<T> {\n submitting.set(true);\n error.set(null);\n\n try {\n const response = await customFetch(url, {\n method,\n headers: { 'Content-Type': 'application/json', ...headers },\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n throw new Error(`Form action failed: ${response.status}`);\n }\n\n const res = await response.json() as T;\n result.set(res);\n submitting.set(false);\n onSuccess?.(res);\n return res;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n error.set(e);\n submitting.set(false);\n onError?.(e);\n throw e;\n }\n }\n\n return {\n url,\n method,\n submitting: () => submitting(),\n result: () => result(),\n error: () => error(),\n handle(extraData?: Record<string, unknown>) {\n return (e: Event) => {\n e.preventDefault();\n const form = e.target as HTMLFormElement;\n const formData = new FormData(form);\n const data: Record<string, unknown> = { ...extraData };\n formData.forEach((value, key) => { data[key] = value; });\n submit(data);\n };\n },\n submit,\n };\n}\n\n// =========================================================================\n// Navigation snapshots — preserve scroll & form state\n// =========================================================================\n\nexport interface SnapshotConfig {\n /** Storage key prefix (default: 'akash-snapshot') */\n keyPrefix?: string;\n /** What to capture */\n capture?: ('scroll' | 'forms')[];\n}\n\ninterface PageSnapshot {\n scrollX: number;\n scrollY: number;\n forms: Record<string, Record<string, string>>;\n timestamp: number;\n}\n\n/**\n * Enable navigation snapshots — preserves scroll position and form\n * state when navigating with back/forward.\n *\n * ```ts\n * enableSnapshots();\n * // Now back/forward restores scroll position and form inputs\n * ```\n */\nexport function enableSnapshots(config: SnapshotConfig = {}): () => void {\n if (typeof window === 'undefined') return () => {};\n\n const { keyPrefix = 'akash-snapshot', capture = ['scroll', 'forms'] } = config;\n\n function captureSnapshot(): PageSnapshot {\n const snapshot: PageSnapshot = {\n scrollX: window.scrollX,\n scrollY: window.scrollY,\n forms: {},\n timestamp: Date.now(),\n };\n\n if (capture.includes('forms')) {\n document.querySelectorAll('form[id]').forEach((form) => {\n const formEl = form as HTMLFormElement;\n const data: Record<string, string> = {};\n new FormData(formEl).forEach((value, key) => {\n data[key] = String(value);\n });\n snapshot.forms[formEl.id] = data;\n });\n }\n\n return snapshot;\n }\n\n function restoreSnapshot(snapshot: PageSnapshot): void {\n if (capture.includes('scroll')) {\n requestAnimationFrame(() => {\n window.scrollTo(snapshot.scrollX, snapshot.scrollY);\n });\n }\n\n if (capture.includes('forms')) {\n for (const [formId, data] of Object.entries(snapshot.forms)) {\n const form = document.getElementById(formId) as HTMLFormElement | null;\n if (!form) continue;\n for (const [key, value] of Object.entries(data)) {\n const input = form.elements.namedItem(key) as HTMLInputElement | null;\n if (input) input.value = value;\n }\n }\n }\n }\n\n // Save snapshot before navigation\n const saveKey = () => `${keyPrefix}-${window.location.pathname}`;\n\n function save(): void {\n try {\n const snapshot = captureSnapshot();\n sessionStorage.setItem(saveKey(), JSON.stringify(snapshot));\n } catch { /* storage full */ }\n }\n\n function restore(): void {\n try {\n const raw = sessionStorage.getItem(saveKey());\n if (raw) {\n const snapshot = JSON.parse(raw) as PageSnapshot;\n // Only restore if recent (within 30 minutes)\n if (Date.now() - snapshot.timestamp < 30 * 60 * 1000) {\n restoreSnapshot(snapshot);\n }\n }\n } catch { /* */ }\n }\n\n // Listen for navigation\n window.addEventListener('beforeunload', save);\n window.addEventListener('popstate', () => {\n requestAnimationFrame(restore);\n });\n\n // Restore on initial load if coming from back/forward\n if ((performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming | undefined)?.type === 'back_forward') {\n requestAnimationFrame(restore);\n }\n\n return () => {\n window.removeEventListener('beforeunload', save);\n };\n}\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {c,a}from'./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import {c,a}from'./chunk-2UATNCKC.js';function Q(e){return Array.isArray(e)?e.join(","):typeof e=="boolean"?e?"true":"false":String(e)}function b(e,t){return typeof t=="number"?Number(e):typeof t=="boolean"?e==="true"||e==="1":Array.isArray(t)?e?e.split(","):[]:e}function u(){return typeof window>"u"?new URLSearchParams:new URLSearchParams(window.location.search)}function x(e,t){if(typeof window>"u")return;let n=e.toString(),r=n?`${window.location.pathname}?${n}${window.location.hash}`:`${window.location.pathname}${window.location.hash}`;t==="push"?window.history.pushState(null,"",r):window.history.replaceState(null,"",r);}var s=new Map,h=false;function R(){h||typeof window>"u"||(h=true,window.addEventListener("popstate",()=>{let e=u();a(()=>{for(let[t,n]of s){let r=e.get(t),a=r!==null?n.deserialize(r):n.defaultValue;n.signal.set(a);}});}));}function v(e,t,n={}){let{serialize:r=i=>Q(i),deserialize:a=i=>b(i,t),history:w="replace",debounce:d=0,removeDefault:m=true}=n,p=u().get(e),S=p!==null?a(p):t,o=c(S);s.set(e,{signal:o,deserialize:a,defaultValue:t}),R();let l=null,T=false,z=o.set;o.set=i=>{if(z(i),T);let y=()=>{let c=u();m&&i===t?c.delete(e):c.set(e,r(i)),x(c,w);};d>0?(l&&clearTimeout(l),l=setTimeout(y,d)):y();};o.update;return o.update=i=>{o.set(i(o()));},o}function j(e,t){let n={};for(let[r,a]of Object.entries(e))n[r]=v(r,a.default,{serialize:a.serialize,deserialize:a.deserialize,history:t?.history});return n}function D(){if(typeof window>"u")return;let e=`${window.location.pathname}${window.location.hash}`;window.history.replaceState(null,"",e),a(()=>{for(let[,t]of s)t.signal.set(t.defaultValue);});}function M(){let e=u(),t={};return e.forEach((n,r)=>{t[r]=n;}),t}function O(e){s.delete(e);}function k(){s.clear();}export{v as a,j as b,D as c,M as d,O as e,k as f};//# sourceMappingURL=chunk-GB7IUC6E.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-GB7IUC6E.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/query-state.ts"],"names":["defaultSerialize","value","defaultDeserialize","raw","defaultValue","getSearchParams","updateURL","params","mode","search","url","activeStates","popstateListening","ensurePopstateListener","batch","key","state","useQueryState","options","serialize","v","deserialize","historyMode","debounceMs","removeDefault","initialValue","signal","debounceTimer","isInternalUpdate","originalSet","doUpdate","currentParams","fn","useQueryStates","schema","result","config","clearQueryState","getQueryParams","removeQueryState","resetQueryState"],"mappings":"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","file":"chunk-F6VSSM2P.js","sourcesContent":["/**\n * URL-synced reactive state.\n *\n * Automatically sync signal values to URL query parameters.\n * Users can share links, use browser back/forward, and state\n * persists across page reloads — all with zero boilerplate.\n *\n * ```ts\n * const search = useQueryState('q', '');\n * const page = useQueryState('page', 1);\n * const tags = useQueryState('tags', ['js']);\n *\n * search.set('akashjs'); // URL → ?q=akashjs&page=1&tags=js\n * // User hits back → signals update automatically\n * ```\n */\n\nimport { signal, effect } from './signals.js';\nimport { batch } from './scheduler.js';\nimport type { Signal } from './signals.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport interface QueryStateOptions<T> {\n /** Custom serializer (default: auto-detect from type) */\n serialize?: (value: T) => string;\n /** Custom deserializer (default: auto-detect from type) */\n deserialize?: (raw: string) => T;\n /** Whether to push or replace history entry (default: 'replace') */\n history?: 'push' | 'replace';\n /** Debounce URL updates in ms (default: 0) */\n debounce?: number;\n /** Remove param from URL when value equals default */\n removeDefault?: boolean;\n}\n\n// =========================================================================\n// Serializers\n// =========================================================================\n\nfunction defaultSerialize(value: unknown): string {\n if (Array.isArray(value)) return value.join(',');\n if (typeof value === 'boolean') return value ? 'true' : 'false';\n return String(value);\n}\n\nfunction defaultDeserialize<T>(raw: string, defaultValue: T): T {\n if (typeof defaultValue === 'number') return Number(raw) as T;\n if (typeof defaultValue === 'boolean') return (raw === 'true' || raw === '1') as T;\n if (Array.isArray(defaultValue)) {\n return (raw ? raw.split(',') : []) as T;\n }\n return raw as T;\n}\n\n// =========================================================================\n// URL helpers\n// =========================================================================\n\nfunction getSearchParams(): URLSearchParams {\n if (typeof window === 'undefined') return new URLSearchParams();\n return new URLSearchParams(window.location.search);\n}\n\nfunction updateURL(params: URLSearchParams, mode: 'push' | 'replace'): void {\n if (typeof window === 'undefined') return;\n\n const search = params.toString();\n const url = search ? `${window.location.pathname}?${search}${window.location.hash}` : `${window.location.pathname}${window.location.hash}`;\n\n if (mode === 'push') {\n window.history.pushState(null, '', url);\n } else {\n window.history.replaceState(null, '', url);\n }\n}\n\n// =========================================================================\n// useQueryState — single value\n// =========================================================================\n\n/** Track active query state signals for popstate sync */\nconst activeStates = new Map<string, { signal: Signal<any>; deserialize: (raw: string) => any; defaultValue: any }>();\nlet popstateListening = false;\n\nfunction ensurePopstateListener(): void {\n if (popstateListening || typeof window === 'undefined') return;\n popstateListening = true;\n\n window.addEventListener('popstate', () => {\n const params = getSearchParams();\n batch(() => {\n for (const [key, state] of activeStates) {\n const raw = params.get(key);\n const value = raw !== null\n ? state.deserialize(raw)\n : state.defaultValue;\n state.signal.set(value);\n }\n });\n });\n}\n\n/**\n * Create a signal synced to a URL query parameter.\n *\n * ```ts\n * const search = useQueryState('q', '');\n * search(); // reads from URL or default\n * search.set('hello'); // updates URL to ?q=hello\n * ```\n */\nexport function useQueryState<T>(\n key: string,\n defaultValue: T,\n options: QueryStateOptions<T> = {},\n): Signal<T> {\n const {\n serialize = (v: T) => defaultSerialize(v),\n deserialize = (raw: string) => defaultDeserialize(raw, defaultValue),\n history: historyMode = 'replace',\n debounce: debounceMs = 0,\n removeDefault = true,\n } = options;\n\n // Read initial value from URL\n const params = getSearchParams();\n const raw = params.get(key);\n const initialValue = raw !== null ? deserialize(raw) : defaultValue;\n\n const state = signal<T>(initialValue);\n\n // Register for popstate sync\n activeStates.set(key, { signal: state, deserialize, defaultValue });\n ensurePopstateListener();\n\n // Sync signal → URL\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n let isInternalUpdate = false;\n\n const originalSet = state.set;\n state.set = (value: T) => {\n originalSet(value);\n\n if (isInternalUpdate) return;\n\n const doUpdate = () => {\n const currentParams = getSearchParams();\n\n if (removeDefault && value === defaultValue) {\n currentParams.delete(key);\n } else {\n currentParams.set(key, serialize(value));\n }\n\n updateURL(currentParams, historyMode);\n };\n\n if (debounceMs > 0) {\n if (debounceTimer) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(doUpdate, debounceMs);\n } else {\n doUpdate();\n }\n };\n\n const originalUpdate = state.update;\n state.update = (fn: (prev: T) => T) => {\n state.set(fn(state()));\n };\n\n return state;\n}\n\n// =========================================================================\n// useQueryStates — multiple values at once\n// =========================================================================\n\ntype QueryStateSchema = Record<string, {\n default: unknown;\n serialize?: (value: any) => string;\n deserialize?: (raw: string) => any;\n}>;\n\ntype QueryStates<T extends QueryStateSchema> = {\n [K in keyof T]: Signal<T[K]['default']>;\n};\n\n/**\n * Create multiple URL-synced signals at once.\n * All updates within a batch result in a single URL change.\n *\n * ```ts\n * const { q, page, sort } = useQueryStates({\n * q: { default: '' },\n * page: { default: 1 },\n * sort: { default: 'name' },\n * });\n * ```\n */\nexport function useQueryStates<T extends QueryStateSchema>(\n schema: T,\n options?: { history?: 'push' | 'replace' },\n): QueryStates<T> {\n const result = {} as any;\n for (const [key, config] of Object.entries(schema)) {\n result[key] = useQueryState(key, config.default, {\n serialize: config.serialize,\n deserialize: config.deserialize,\n history: options?.history,\n });\n }\n return result;\n}\n\n// =========================================================================\n// Utilities\n// =========================================================================\n\n/**\n * Remove all query state params from the URL.\n */\nexport function clearQueryState(): void {\n if (typeof window === 'undefined') return;\n const url = `${window.location.pathname}${window.location.hash}`;\n window.history.replaceState(null, '', url);\n\n batch(() => {\n for (const [, state] of activeStates) {\n state.signal.set(state.defaultValue);\n }\n });\n}\n\n/**\n * Get all current query params as a plain object.\n */\nexport function getQueryParams(): Record<string, string> {\n const params = getSearchParams();\n const result: Record<string, string> = {};\n params.forEach((value, key) => { result[key] = value; });\n return result;\n}\n\n/**\n * Cleanup: remove a specific query state binding.\n */\nexport function removeQueryState(key: string): void {\n activeStates.delete(key);\n}\n\n/**\n * Cleanup all query state bindings (useful for testing).\n */\nexport function resetQueryState(): void {\n activeStates.clear();\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/query-state.ts"],"names":["defaultSerialize","value","defaultDeserialize","raw","defaultValue","getSearchParams","updateURL","params","mode","search","url","activeStates","popstateListening","ensurePopstateListener","batch","key","state","useQueryState","options","serialize","v","deserialize","historyMode","debounceMs","removeDefault","initialValue","signal","debounceTimer","isInternalUpdate","originalSet","doUpdate","currentParams","fn","useQueryStates","schema","result","config","clearQueryState","getQueryParams","removeQueryState","resetQueryState"],"mappings":"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","file":"chunk-GB7IUC6E.js","sourcesContent":["/**\n * URL-synced reactive state.\n *\n * Automatically sync signal values to URL query parameters.\n * Users can share links, use browser back/forward, and state\n * persists across page reloads — all with zero boilerplate.\n *\n * ```ts\n * const search = useQueryState('q', '');\n * const page = useQueryState('page', 1);\n * const tags = useQueryState('tags', ['js']);\n *\n * search.set('akashjs'); // URL → ?q=akashjs&page=1&tags=js\n * // User hits back → signals update automatically\n * ```\n */\n\nimport { signal, effect } from './signals.js';\nimport { batch } from './scheduler.js';\nimport type { Signal } from './signals.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport interface QueryStateOptions<T> {\n /** Custom serializer (default: auto-detect from type) */\n serialize?: (value: T) => string;\n /** Custom deserializer (default: auto-detect from type) */\n deserialize?: (raw: string) => T;\n /** Whether to push or replace history entry (default: 'replace') */\n history?: 'push' | 'replace';\n /** Debounce URL updates in ms (default: 0) */\n debounce?: number;\n /** Remove param from URL when value equals default */\n removeDefault?: boolean;\n}\n\n// =========================================================================\n// Serializers\n// =========================================================================\n\nfunction defaultSerialize(value: unknown): string {\n if (Array.isArray(value)) return value.join(',');\n if (typeof value === 'boolean') return value ? 'true' : 'false';\n return String(value);\n}\n\nfunction defaultDeserialize<T>(raw: string, defaultValue: T): T {\n if (typeof defaultValue === 'number') return Number(raw) as T;\n if (typeof defaultValue === 'boolean') return (raw === 'true' || raw === '1') as T;\n if (Array.isArray(defaultValue)) {\n return (raw ? raw.split(',') : []) as T;\n }\n return raw as T;\n}\n\n// =========================================================================\n// URL helpers\n// =========================================================================\n\nfunction getSearchParams(): URLSearchParams {\n if (typeof window === 'undefined') return new URLSearchParams();\n return new URLSearchParams(window.location.search);\n}\n\nfunction updateURL(params: URLSearchParams, mode: 'push' | 'replace'): void {\n if (typeof window === 'undefined') return;\n\n const search = params.toString();\n const url = search ? `${window.location.pathname}?${search}${window.location.hash}` : `${window.location.pathname}${window.location.hash}`;\n\n if (mode === 'push') {\n window.history.pushState(null, '', url);\n } else {\n window.history.replaceState(null, '', url);\n }\n}\n\n// =========================================================================\n// useQueryState — single value\n// =========================================================================\n\n/** Track active query state signals for popstate sync */\nconst activeStates = new Map<string, { signal: Signal<any>; deserialize: (raw: string) => any; defaultValue: any }>();\nlet popstateListening = false;\n\nfunction ensurePopstateListener(): void {\n if (popstateListening || typeof window === 'undefined') return;\n popstateListening = true;\n\n window.addEventListener('popstate', () => {\n const params = getSearchParams();\n batch(() => {\n for (const [key, state] of activeStates) {\n const raw = params.get(key);\n const value = raw !== null\n ? state.deserialize(raw)\n : state.defaultValue;\n state.signal.set(value);\n }\n });\n });\n}\n\n/**\n * Create a signal synced to a URL query parameter.\n *\n * ```ts\n * const search = useQueryState('q', '');\n * search(); // reads from URL or default\n * search.set('hello'); // updates URL to ?q=hello\n * ```\n */\nexport function useQueryState<T>(\n key: string,\n defaultValue: T,\n options: QueryStateOptions<T> = {},\n): Signal<T> {\n const {\n serialize = (v: T) => defaultSerialize(v),\n deserialize = (raw: string) => defaultDeserialize(raw, defaultValue),\n history: historyMode = 'replace',\n debounce: debounceMs = 0,\n removeDefault = true,\n } = options;\n\n // Read initial value from URL\n const params = getSearchParams();\n const raw = params.get(key);\n const initialValue = raw !== null ? deserialize(raw) : defaultValue;\n\n const state = signal<T>(initialValue);\n\n // Register for popstate sync\n activeStates.set(key, { signal: state, deserialize, defaultValue });\n ensurePopstateListener();\n\n // Sync signal → URL\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n let isInternalUpdate = false;\n\n const originalSet = state.set;\n state.set = (value: T) => {\n originalSet(value);\n\n if (isInternalUpdate) return;\n\n const doUpdate = () => {\n const currentParams = getSearchParams();\n\n if (removeDefault && value === defaultValue) {\n currentParams.delete(key);\n } else {\n currentParams.set(key, serialize(value));\n }\n\n updateURL(currentParams, historyMode);\n };\n\n if (debounceMs > 0) {\n if (debounceTimer) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(doUpdate, debounceMs);\n } else {\n doUpdate();\n }\n };\n\n const originalUpdate = state.update;\n state.update = (fn: (prev: T) => T) => {\n state.set(fn(state()));\n };\n\n return state;\n}\n\n// =========================================================================\n// useQueryStates — multiple values at once\n// =========================================================================\n\ntype QueryStateSchema = Record<string, {\n default: unknown;\n serialize?: (value: any) => string;\n deserialize?: (raw: string) => any;\n}>;\n\ntype QueryStates<T extends QueryStateSchema> = {\n [K in keyof T]: Signal<T[K]['default']>;\n};\n\n/**\n * Create multiple URL-synced signals at once.\n * All updates within a batch result in a single URL change.\n *\n * ```ts\n * const { q, page, sort } = useQueryStates({\n * q: { default: '' },\n * page: { default: 1 },\n * sort: { default: 'name' },\n * });\n * ```\n */\nexport function useQueryStates<T extends QueryStateSchema>(\n schema: T,\n options?: { history?: 'push' | 'replace' },\n): QueryStates<T> {\n const result = {} as any;\n for (const [key, config] of Object.entries(schema)) {\n result[key] = useQueryState(key, config.default, {\n serialize: config.serialize,\n deserialize: config.deserialize,\n history: options?.history,\n });\n }\n return result;\n}\n\n// =========================================================================\n// Utilities\n// =========================================================================\n\n/**\n * Remove all query state params from the URL.\n */\nexport function clearQueryState(): void {\n if (typeof window === 'undefined') return;\n const url = `${window.location.pathname}${window.location.hash}`;\n window.history.replaceState(null, '', url);\n\n batch(() => {\n for (const [, state] of activeStates) {\n state.signal.set(state.defaultValue);\n }\n });\n}\n\n/**\n * Get all current query params as a plain object.\n */\nexport function getQueryParams(): Record<string, string> {\n const params = getSearchParams();\n const result: Record<string, string> = {};\n params.forEach((value, key) => { result[key] = value; });\n return result;\n}\n\n/**\n * Cleanup: remove a specific query state binding.\n */\nexport function removeQueryState(key: string): void {\n activeStates.delete(key);\n}\n\n/**\n * Cleanup all query state bindings (useful for testing).\n */\nexport function resetQueryState(): void {\n activeStates.clear();\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {c as c$1}from'./chunk-
|
|
1
|
+
import {c as c$1}from'./chunk-SVNS64LE.js';function o(t){let r=Array.isArray(t)?t:[t];for(let e of r){let n={"@context":"https://schema.org",...e};c$1({script:[{type:"application/ld+json",innerHTML:JSON.stringify(n)}]});}}function s(t){let r=[{property:"og:title",content:t.title}];t.description&&r.push({property:"og:description",content:t.description}),t.image&&r.push({property:"og:image",content:t.image}),t.url&&r.push({property:"og:url",content:t.url}),t.type&&r.push({property:"og:type",content:t.type}),t.siteName&&r.push({property:"og:site_name",content:t.siteName}),t.locale&&r.push({property:"og:locale",content:t.locale}),c$1({meta:r});}function p(t){let r=[{name:"twitter:title",content:t.title}];t.card&&r.push({name:"twitter:card",content:t.card}),t.description&&r.push({name:"twitter:description",content:t.description}),t.image&&r.push({name:"twitter:image",content:t.image}),t.site&&r.push({name:"twitter:site",content:t.site}),t.creator&&r.push({name:"twitter:creator",content:t.creator}),c$1({meta:r});}function c(t){let r=[];t.description&&r.push({name:"description",content:t.description}),t.robots&&r.push({name:"robots",content:t.robots});let e=[];t.canonical&&e.push({rel:"canonical",href:t.canonical}),c$1({title:t.title,meta:r,link:e}),t.openGraph&&s(t.openGraph),t.twitter&&p(t.twitter),t.structuredData&&o(t.structuredData);}function u(t,r){let e=`<?xml version="1.0" encoding="UTF-8"?>
|
|
2
2
|
`;e+=`<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
|
3
3
|
`;for(let n of r)e+=` <url>
|
|
4
4
|
`,e+=` <loc>${t}${n.url}</loc>
|
|
@@ -7,5 +7,5 @@ import {c as c$1}from'./chunk-N3ITIHHM.js';function o(t){let r=Array.isArray(t)?
|
|
|
7
7
|
`),n.priority!=null&&(e+=` <priority>${n.priority}</priority>
|
|
8
8
|
`),e+=` </url>
|
|
9
9
|
`;return e+=`</urlset>
|
|
10
|
-
`,e}export{o as a,s as b,p as c,c as d,u as e};//# sourceMappingURL=chunk-
|
|
11
|
-
//# sourceMappingURL=chunk-
|
|
10
|
+
`,e}export{o as a,s as b,p as c,c as d,u as e};//# sourceMappingURL=chunk-GHSJ4B55.js.map
|
|
11
|
+
//# sourceMappingURL=chunk-GHSJ4B55.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/seo.ts"],"names":["useStructuredData","data","items","item","ld","useHead","useOpenGraph","meta","useTwitterCard","useSEO","config","link","generateSitemap","baseUrl","entries","xml","entry"],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/seo.ts"],"names":["useStructuredData","data","items","item","ld","useHead","useOpenGraph","meta","useTwitterCard","useSEO","config","link","generateSitemap","baseUrl","entries","xml","entry"],"mappings":"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","file":"chunk-GHSJ4B55.js","sourcesContent":["/**\n * SEO utilities.\n *\n * Structured data (JSON-LD), Open Graph helpers, and canonical URL management.\n * Works with useHead() for SSR-compatible head tag management.\n *\n * ```ts\n * useStructuredData({\n * '@type': 'Article',\n * headline: 'My Post',\n * author: { '@type': 'Person', name: 'Alice' },\n * });\n * ```\n */\n\nimport { useHead } from './head.js';\n\n// --- Types ---\n\nexport interface StructuredData {\n '@context'?: string;\n '@type': string;\n [key: string]: unknown;\n}\n\nexport interface OpenGraphData {\n title: string;\n description?: string;\n image?: string;\n url?: string;\n type?: string;\n siteName?: string;\n locale?: string;\n}\n\nexport interface TwitterCardData {\n card?: 'summary' | 'summary_large_image' | 'player' | 'app';\n title: string;\n description?: string;\n image?: string;\n site?: string;\n creator?: string;\n}\n\nexport interface SEOConfig {\n title: string;\n description?: string;\n canonical?: string;\n robots?: string;\n openGraph?: OpenGraphData;\n twitter?: TwitterCardData;\n structuredData?: StructuredData | StructuredData[];\n}\n\n// --- useStructuredData ---\n\n/**\n * Inject JSON-LD structured data into the document head.\n * Data is automatically wrapped with @context.\n *\n * ```ts\n * useStructuredData({\n * '@type': 'WebSite',\n * name: 'AkashJS',\n * url: 'https://akashjs.dev',\n * });\n * ```\n */\nexport function useStructuredData(data: StructuredData | StructuredData[]): void {\n const items = Array.isArray(data) ? data : [data];\n\n for (const item of items) {\n const ld = { '@context': 'https://schema.org', ...item };\n useHead({\n script: [\n { type: 'application/ld+json', innerHTML: JSON.stringify(ld) },\n ],\n });\n }\n}\n\n// --- useOpenGraph ---\n\n/**\n * Set Open Graph meta tags.\n *\n * ```ts\n * useOpenGraph({\n * title: 'My Page',\n * description: 'Page description',\n * image: '/og-image.jpg',\n * type: 'article',\n * });\n * ```\n */\nexport function useOpenGraph(data: OpenGraphData): void {\n const meta: Array<{ property: string; content: string }> = [\n { property: 'og:title', content: data.title },\n ];\n\n if (data.description) meta.push({ property: 'og:description', content: data.description });\n if (data.image) meta.push({ property: 'og:image', content: data.image });\n if (data.url) meta.push({ property: 'og:url', content: data.url });\n if (data.type) meta.push({ property: 'og:type', content: data.type });\n if (data.siteName) meta.push({ property: 'og:site_name', content: data.siteName });\n if (data.locale) meta.push({ property: 'og:locale', content: data.locale });\n\n useHead({ meta });\n}\n\n// --- useTwitterCard ---\n\n/**\n * Set Twitter Card meta tags.\n *\n * ```ts\n * useTwitterCard({\n * card: 'summary_large_image',\n * title: 'My Page',\n * image: '/twitter-card.jpg',\n * });\n * ```\n */\nexport function useTwitterCard(data: TwitterCardData): void {\n const meta: Array<{ name: string; content: string }> = [\n { name: 'twitter:title', content: data.title },\n ];\n\n if (data.card) meta.push({ name: 'twitter:card', content: data.card });\n if (data.description) meta.push({ name: 'twitter:description', content: data.description });\n if (data.image) meta.push({ name: 'twitter:image', content: data.image });\n if (data.site) meta.push({ name: 'twitter:site', content: data.site });\n if (data.creator) meta.push({ name: 'twitter:creator', content: data.creator });\n\n useHead({ meta });\n}\n\n// --- useSEO (all-in-one) ---\n\n/**\n * Set all SEO-related head tags at once.\n *\n * ```ts\n * useSEO({\n * title: 'My Page | MySite',\n * description: 'Page description',\n * canonical: 'https://mysite.com/page',\n * openGraph: { title: 'My Page', image: '/og.jpg' },\n * twitter: { card: 'summary_large_image', title: 'My Page' },\n * structuredData: { '@type': 'WebPage', name: 'My Page' },\n * });\n * ```\n */\nexport function useSEO(config: SEOConfig): void {\n const meta: Array<{ name?: string; property?: string; content: string }> = [];\n\n if (config.description) {\n meta.push({ name: 'description', content: config.description });\n }\n if (config.robots) {\n meta.push({ name: 'robots', content: config.robots });\n }\n\n const link: Array<{ rel: string; href: string }> = [];\n if (config.canonical) {\n link.push({ rel: 'canonical', href: config.canonical });\n }\n\n useHead({ title: config.title, meta, link });\n\n if (config.openGraph) useOpenGraph(config.openGraph);\n if (config.twitter) useTwitterCard(config.twitter);\n if (config.structuredData) useStructuredData(config.structuredData);\n}\n\n// --- Sitemap generation (for CLI/build) ---\n\nexport interface SitemapEntry {\n url: string;\n lastmod?: string;\n changefreq?: 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never';\n priority?: number;\n}\n\n/**\n * Generate a sitemap.xml string from route entries.\n *\n * ```ts\n * const xml = generateSitemap('https://mysite.com', [\n * { url: '/', priority: 1.0 },\n * { url: '/about', changefreq: 'monthly' },\n * { url: '/blog/hello', lastmod: '2026-03-29' },\n * ]);\n * ```\n */\nexport function generateSitemap(baseUrl: string, entries: SitemapEntry[]): string {\n let xml = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n';\n xml += '<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\\n';\n\n for (const entry of entries) {\n xml += ' <url>\\n';\n xml += ` <loc>${baseUrl}${entry.url}</loc>\\n`;\n if (entry.lastmod) xml += ` <lastmod>${entry.lastmod}</lastmod>\\n`;\n if (entry.changefreq) xml += ` <changefreq>${entry.changefreq}</changefreq>\\n`;\n if (entry.priority != null) xml += ` <priority>${entry.priority}</priority>\\n`;\n xml += ' </url>\\n';\n }\n\n xml += '</urlset>\\n';\n return xml;\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {c}from'./chunk-
|
|
1
|
+
import {c}from'./chunk-2UATNCKC.js';function v(e,t={}){let s=c(false),i=c(false),n=c(!navigator.onLine),r=null;window.addEventListener("online",()=>n.set(false)),window.addEventListener("offline",()=>n.set(true));let c$1=new Promise((u,o)=>{if(!("serviceWorker"in navigator)){o(new Error("Service workers not supported"));return}navigator.serviceWorker.register(e,{scope:t.scope}).then(a=>{r=a,s.set(true),t.onReady?.(a),u(a),a.addEventListener("updatefound",()=>{let l=a.installing;l&&l.addEventListener("statechange",()=>{l.state==="installed"&&navigator.serviceWorker.controller&&(i.set(true),t.onUpdate?.(a),t.autoReload&&(l.postMessage({type:"SKIP_WAITING"}),window.location.reload()));});});}).catch(a=>{t.onError?.(a),o(a);});});return {registered:()=>s(),updateAvailable:()=>i(),offline:()=>n(),ready:c$1,async update(){r&&await r.update();},skipWaiting(){r?.waiting&&(r.waiting.postMessage({type:"SKIP_WAITING"}),window.location.reload());},async unregister(){return r?r.unregister():false}}}function f(e){let t=Array.isArray(e)?e:e.runtimeCache??[],s=Array.isArray(e)?[]:e.precache??[],i=Array.isArray(e)?"akash-cache-v1":e.cacheName??"akash-cache-v1",n=`// Auto-generated service worker by AkashJS
|
|
2
2
|
const CACHE_NAME = '${i}';
|
|
3
3
|
const PRECACHE_URLS = ${JSON.stringify(s)};
|
|
4
4
|
|
|
@@ -32,5 +32,5 @@ self.addEventListener('fetch', (event) => {
|
|
|
32
32
|
fetch(event.request).catch(() => caches.match(event.request))
|
|
33
33
|
);
|
|
34
34
|
});
|
|
35
|
-
`,n}function p(e,t){switch(e){case "cache-first":return `caches.match(event.request).then(cached => cached || fetch(event.request).then(response => { const clone = response.clone(); caches.open('${t}').then(cache => cache.put(event.request, clone)); return response; }))`;case "network-first":return `fetch(event.request).then(response => { const clone = response.clone(); caches.open('${t}').then(cache => cache.put(event.request, clone)); return response; }).catch(() => caches.match(event.request))`;case "stale-while-revalidate":return `caches.match(event.request).then(cached => { const fetchPromise = fetch(event.request).then(response => { caches.open('${t}').then(cache => cache.put(event.request, response.clone())); return response; }); return cached || fetchPromise; })`;case "network-only":return "fetch(event.request)";case "cache-only":return "caches.match(event.request)"}}async function y(e,t){return await Notification.requestPermission()!=="granted"?null:await e.pushManager.subscribe({userVisibleOnly:true,applicationServerKey:d(t)})}function d(e){let t="=".repeat((4-e.length%4)%4),s=(e+t).replace(/-/g,"+").replace(/_/g,"/"),i=atob(s);return Uint8Array.from(i,n=>n.charCodeAt(0))}export{v as a,f as b,y as c};//# sourceMappingURL=chunk-
|
|
36
|
-
//# sourceMappingURL=chunk-
|
|
35
|
+
`,n}function p(e,t){switch(e){case "cache-first":return `caches.match(event.request).then(cached => cached || fetch(event.request).then(response => { const clone = response.clone(); caches.open('${t}').then(cache => cache.put(event.request, clone)); return response; }))`;case "network-first":return `fetch(event.request).then(response => { const clone = response.clone(); caches.open('${t}').then(cache => cache.put(event.request, clone)); return response; }).catch(() => caches.match(event.request))`;case "stale-while-revalidate":return `caches.match(event.request).then(cached => { const fetchPromise = fetch(event.request).then(response => { caches.open('${t}').then(cache => cache.put(event.request, response.clone())); return response; }); return cached || fetchPromise; })`;case "network-only":return "fetch(event.request)";case "cache-only":return "caches.match(event.request)"}}async function y(e,t){return await Notification.requestPermission()!=="granted"?null:await e.pushManager.subscribe({userVisibleOnly:true,applicationServerKey:d(t)})}function d(e){let t="=".repeat((4-e.length%4)%4),s=(e+t).replace(/-/g,"+").replace(/_/g,"/"),i=atob(s);return Uint8Array.from(i,n=>n.charCodeAt(0))}export{v as a,f as b,y as c};//# sourceMappingURL=chunk-GRXHWCFR.js.map
|
|
36
|
+
//# sourceMappingURL=chunk-GRXHWCFR.js.map
|