@vladstudio/kstate 0.1.0

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.
Files changed (74) hide show
  1. package/README.md +488 -0
  2. package/dist/adapters/api.d.ts +18 -0
  3. package/dist/adapters/api.d.ts.map +1 -0
  4. package/dist/adapters/api.js +31 -0
  5. package/dist/adapters/api.js.map +1 -0
  6. package/dist/adapters/index.d.ts +5 -0
  7. package/dist/adapters/index.d.ts.map +1 -0
  8. package/dist/adapters/index.js +5 -0
  9. package/dist/adapters/index.js.map +1 -0
  10. package/dist/adapters/local.d.ts +20 -0
  11. package/dist/adapters/local.d.ts.map +1 -0
  12. package/dist/adapters/local.js +48 -0
  13. package/dist/adapters/local.js.map +1 -0
  14. package/dist/adapters/queuedApi.d.ts +18 -0
  15. package/dist/adapters/queuedApi.d.ts.map +1 -0
  16. package/dist/adapters/queuedApi.js +41 -0
  17. package/dist/adapters/queuedApi.js.map +1 -0
  18. package/dist/adapters/sse.d.ts +15 -0
  19. package/dist/adapters/sse.d.ts.map +1 -0
  20. package/dist/adapters/sse.js +50 -0
  21. package/dist/adapters/sse.js.map +1 -0
  22. package/dist/config.d.ts +4 -0
  23. package/dist/config.d.ts.map +1 -0
  24. package/dist/config.js +8 -0
  25. package/dist/config.js.map +1 -0
  26. package/dist/core/cache.d.ts +8 -0
  27. package/dist/core/cache.d.ts.map +1 -0
  28. package/dist/core/cache.js +27 -0
  29. package/dist/core/cache.js.map +1 -0
  30. package/dist/core/network.d.ts +16 -0
  31. package/dist/core/network.d.ts.map +1 -0
  32. package/dist/core/network.js +51 -0
  33. package/dist/core/network.js.map +1 -0
  34. package/dist/core/proxy.d.ts +11 -0
  35. package/dist/core/proxy.d.ts.map +1 -0
  36. package/dist/core/proxy.js +146 -0
  37. package/dist/core/proxy.js.map +1 -0
  38. package/dist/core/subscribers.d.ts +3 -0
  39. package/dist/core/subscribers.d.ts.map +1 -0
  40. package/dist/core/subscribers.js +50 -0
  41. package/dist/core/subscribers.js.map +1 -0
  42. package/dist/hooks/useStore.d.ts +2 -0
  43. package/dist/hooks/useStore.d.ts.map +1 -0
  44. package/dist/hooks/useStore.js +64 -0
  45. package/dist/hooks/useStore.js.map +1 -0
  46. package/dist/hooks/useStoreStatus.d.ts +8 -0
  47. package/dist/hooks/useStoreStatus.d.ts.map +1 -0
  48. package/dist/hooks/useStoreStatus.js +13 -0
  49. package/dist/hooks/useStoreStatus.js.map +1 -0
  50. package/dist/index.d.ts +9 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +12 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/stores/computed.d.ts +14 -0
  55. package/dist/stores/computed.d.ts.map +1 -0
  56. package/dist/stores/computed.js +39 -0
  57. package/dist/stores/computed.js.map +1 -0
  58. package/dist/stores/createSetStore.d.ts +5 -0
  59. package/dist/stores/createSetStore.d.ts.map +1 -0
  60. package/dist/stores/createSetStore.js +130 -0
  61. package/dist/stores/createSetStore.js.map +1 -0
  62. package/dist/stores/createStore.d.ts +3 -0
  63. package/dist/stores/createStore.d.ts.map +1 -0
  64. package/dist/stores/createStore.js +98 -0
  65. package/dist/stores/createStore.js.map +1 -0
  66. package/dist/sync/api.d.ts +16 -0
  67. package/dist/sync/api.d.ts.map +1 -0
  68. package/dist/sync/api.js +106 -0
  69. package/dist/sync/api.js.map +1 -0
  70. package/dist/types.d.ts +116 -0
  71. package/dist/types.d.ts.map +1 -0
  72. package/dist/types.js +5 -0
  73. package/dist/types.js.map +1 -0
  74. package/package.json +55 -0
@@ -0,0 +1,41 @@
1
+ import { api } from './api';
2
+ const queue = [];
3
+ let running = false;
4
+ async function processQueue() {
5
+ if (running)
6
+ return;
7
+ running = true;
8
+ while (queue.length > 0) {
9
+ const task = queue.shift();
10
+ try {
11
+ await task();
12
+ }
13
+ catch { /* continue on error */ }
14
+ }
15
+ running = false;
16
+ }
17
+ function enqueue(task) {
18
+ return new Promise((resolve, reject) => {
19
+ queue.push(async () => {
20
+ try {
21
+ resolve(await task());
22
+ }
23
+ catch (e) {
24
+ reject(e);
25
+ }
26
+ });
27
+ processQueue();
28
+ });
29
+ }
30
+ export function queuedApi(config) {
31
+ const base = api(config);
32
+ return {
33
+ get: (params) => enqueue(() => base.get(params)),
34
+ getOne: (params) => enqueue(() => base.getOne(params)),
35
+ create: (body) => enqueue(() => base.create(body)),
36
+ set: (body) => enqueue(() => base.set(body)),
37
+ patch: (body) => enqueue(() => base.patch(body)),
38
+ delete: (params) => enqueue(() => base.delete(params)),
39
+ };
40
+ }
41
+ //# sourceMappingURL=queuedApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queuedApi.js","sourceRoot":"","sources":["../../src/adapters/queuedApi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAK3B,MAAM,KAAK,GAAiB,EAAE,CAAA;AAC9B,IAAI,OAAO,GAAG,KAAK,CAAA;AAEnB,KAAK,UAAU,YAAY;IACzB,IAAI,OAAO;QAAE,OAAM;IACnB,OAAO,GAAG,IAAI,CAAA;IACd,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAG,CAAA;QAC3B,IAAI,CAAC;YAAC,MAAM,IAAI,EAAE,CAAA;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,uBAAuB,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,GAAG,KAAK,CAAA;AACjB,CAAC;AAED,SAAS,OAAO,CAAI,IAAsB;IACxC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YACpB,IAAI,CAAC;gBAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAA;YAAC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBAAC,MAAM,CAAC,CAAC,CAAC,CAAA;YAAC,CAAC;QACvD,CAAC,CAAC,CAAA;QACF,YAAY,EAAE,CAAA;IAChB,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAA2B,MAAwB;IAC1E,MAAM,IAAI,GAAG,GAAG,CAAI,MAAM,CAAC,CAAA;IAC3B,OAAO;QACL,GAAG,EAAE,CAAC,MAAgC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1E,MAAM,EAAE,CAAC,MAAgD,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAChG,MAAM,EAAE,CAAC,IAAuB,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrE,GAAG,EAAE,CAAC,IAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/C,KAAK,EAAE,CAAC,IAAiC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7E,MAAM,EAAE,CAAC,MAAsB,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;KACvE,CAAA;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ interface SseOpts<T> {
2
+ mode?: 'replace' | 'append' | 'upsert';
3
+ eventName?: string;
4
+ dataKey?: string;
5
+ withCredentials?: boolean;
6
+ dedupe?: (item: T) => string;
7
+ maxItems?: number;
8
+ }
9
+ export declare function sse<T extends {
10
+ id: string;
11
+ }>(url: string, opts?: SseOpts<T>): {
12
+ subscribe: (cb: (items: T[]) => void) => () => void;
13
+ };
14
+ export {};
15
+ //# sourceMappingURL=sse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../src/adapters/sse.ts"],"names":[],"mappings":"AAEA,UAAU,OAAO,CAAC,CAAC;IACjB,IAAI,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAA;IACtC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAA;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,wBAAgB,GAAG,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,OAAO,CAAC,CAAC,CAAM;oBAI5D,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,IAAI;EA+BvC"}
@@ -0,0 +1,50 @@
1
+ import { getConfig } from '../config';
2
+ export function sse(url, opts = {}) {
3
+ const { mode = 'replace', eventName = 'message', dataKey, withCredentials = true, dedupe = (i) => i.id, maxItems } = opts;
4
+ return {
5
+ subscribe: (cb) => {
6
+ const config = getConfig();
7
+ const fullUrl = url.startsWith('http') ? url : `${config.baseUrl}${url}`;
8
+ const es = new EventSource(fullUrl, { withCredentials });
9
+ const seen = new Set();
10
+ let items = [];
11
+ const handler = (e) => {
12
+ let parsed;
13
+ try {
14
+ parsed = JSON.parse(e.data);
15
+ }
16
+ catch {
17
+ return;
18
+ }
19
+ let data = dataKey ? parsed[dataKey] : parsed;
20
+ if (!Array.isArray(data))
21
+ data = [data];
22
+ if (mode === 'replace') {
23
+ items = data;
24
+ seen.clear();
25
+ }
26
+ else if (mode === 'append') {
27
+ const newItems = data.filter(i => { const k = dedupe(i); if (seen.has(k))
28
+ return false; seen.add(k); return true; });
29
+ items = maxItems ? [...items, ...newItems].slice(-maxItems) : [...items, ...newItems];
30
+ if (maxItems && seen.size > maxItems * 2) {
31
+ seen.clear();
32
+ items.forEach(i => seen.add(dedupe(i)));
33
+ }
34
+ }
35
+ else {
36
+ const map = new Map(items.map(i => [i.id, i]));
37
+ data.forEach(i => map.set(i.id, { ...map.get(i.id), ...i }));
38
+ items = [...map.values()];
39
+ }
40
+ cb(items);
41
+ };
42
+ if (eventName === 'message')
43
+ es.onmessage = handler;
44
+ else
45
+ es.addEventListener(eventName, handler);
46
+ return () => es.close();
47
+ },
48
+ };
49
+ }
50
+ //# sourceMappingURL=sse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/adapters/sse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { KStateConfig } from './types';
2
+ export declare function configureKState(config: KStateConfig): void;
3
+ export declare function getConfig(): KStateConfig;
4
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAI3C,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAE1D;AAED,wBAAgB,SAAS,IAAI,YAAY,CAExC"}
package/dist/config.js ADDED
@@ -0,0 +1,8 @@
1
+ let globalConfig = { baseUrl: '', getHeaders: () => ({}) };
2
+ export function configureKState(config) {
3
+ globalConfig = { ...globalConfig, ...config };
4
+ }
5
+ export function getConfig() {
6
+ return globalConfig;
7
+ }
8
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,IAAI,YAAY,GAAiB,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;AAExE,MAAM,UAAU,eAAe,CAAC,MAAoB;IAClD,YAAY,GAAG,EAAE,GAAG,YAAY,EAAE,GAAG,MAAM,EAAE,CAAA;AAC/C,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,YAAY,CAAA;AACrB,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare function getCached<T>(key: string, ttl: number): {
2
+ data: T;
3
+ stale: boolean;
4
+ } | null;
5
+ export declare function setCache<T>(key: string, data: T): void;
6
+ export declare function clearCache(key: string): void;
7
+ export declare function clearCachePrefix(prefix: string): void;
8
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/core/cache.ts"],"names":[],"mappings":"AAIA,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,CAAC,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAMzF;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAGtD;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE5C;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAGrD"}
@@ -0,0 +1,27 @@
1
+ const cache = new Map();
2
+ const MAX_SIZE = 100;
3
+ export function getCached(key, ttl) {
4
+ const entry = cache.get(key);
5
+ if (!entry)
6
+ return null;
7
+ const age = Date.now() - entry.timestamp;
8
+ if (age >= ttl)
9
+ return null;
10
+ return { data: entry.data, stale: age > ttl / 2 };
11
+ }
12
+ export function setCache(key, data) {
13
+ if (cache.size >= MAX_SIZE)
14
+ cache.delete(cache.keys().next().value);
15
+ cache.set(key, { data, timestamp: Date.now() });
16
+ }
17
+ export function clearCache(key) {
18
+ cache.delete(key);
19
+ }
20
+ export function clearCachePrefix(prefix) {
21
+ if (!prefix)
22
+ return;
23
+ for (const key of cache.keys())
24
+ if (key.startsWith(prefix))
25
+ cache.delete(key);
26
+ }
27
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/core/cache.ts"],"names":[],"mappings":"AACA,MAAM,KAAK,GAAG,IAAI,GAAG,EAA+B,CAAA;AACpD,MAAM,QAAQ,GAAG,GAAG,CAAA;AAEpB,MAAM,UAAU,SAAS,CAAI,GAAW,EAAE,GAAW;IACnD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC5B,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA;IACvB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,CAAA;IACxC,IAAI,GAAG,IAAI,GAAG;QAAE,OAAO,IAAI,CAAA;IAC3B,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAS,EAAE,KAAK,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,CAAA;AACxD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAI,GAAW,EAAE,IAAO;IAC9C,IAAI,KAAK,CAAC,IAAI,IAAI,QAAQ;QAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAM,CAAC,CAAA;IACpE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;AACjD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;AACnB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,IAAI,CAAC,MAAM;QAAE,OAAM;IACnB,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE;QAAE,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;AAC/E,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { StoreStatus, Listener } from '../types';
2
+ export interface NetworkManager {
3
+ setStatus: (updates: Partial<StoreStatus>) => void;
4
+ getStatus: () => StoreStatus;
5
+ subscribeToStatus: (listener: Listener) => () => void;
6
+ dispose: () => void;
7
+ }
8
+ interface NetworkConfig {
9
+ reloadOnFocus: boolean;
10
+ reloadOnReconnect: boolean;
11
+ reloadInterval: number;
12
+ onReload: () => void;
13
+ }
14
+ export declare function createNetworkManager(config: NetworkConfig): NetworkManager;
15
+ export {};
16
+ //# sourceMappingURL=network.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../src/core/network.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAErD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK,IAAI,CAAA;IAClD,SAAS,EAAE,MAAM,WAAW,CAAA;IAC5B,iBAAiB,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,MAAM,IAAI,CAAA;IACrD,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAED,UAAU,aAAa;IACrB,aAAa,EAAE,OAAO,CAAA;IACtB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAA;CACrB;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,cAAc,CAsD1E"}
@@ -0,0 +1,51 @@
1
+ export function createNetworkManager(config) {
2
+ const statusSubscribers = new Set();
3
+ const cleanups = [];
4
+ let status = {
5
+ isLoading: false,
6
+ isRevalidating: false,
7
+ isOffline: typeof navigator !== 'undefined' ? !navigator.onLine : false,
8
+ error: null,
9
+ lastUpdated: 0,
10
+ };
11
+ function setStatus(updates) {
12
+ const prev = status;
13
+ status = { ...status, ...updates };
14
+ if (prev.isLoading !== status.isLoading || prev.isRevalidating !== status.isRevalidating ||
15
+ prev.isOffline !== status.isOffline || prev.error !== status.error)
16
+ statusSubscribers.forEach(l => l());
17
+ }
18
+ if (typeof window !== 'undefined') {
19
+ const onOnline = () => {
20
+ setStatus({ isOffline: false });
21
+ if (config.reloadOnReconnect)
22
+ config.onReload();
23
+ };
24
+ const onOffline = () => setStatus({ isOffline: true });
25
+ window.addEventListener('online', onOnline);
26
+ window.addEventListener('offline', onOffline);
27
+ cleanups.push(() => {
28
+ window.removeEventListener('online', onOnline);
29
+ window.removeEventListener('offline', onOffline);
30
+ });
31
+ if (config.reloadOnFocus) {
32
+ const onFocus = () => config.onReload();
33
+ window.addEventListener('focus', onFocus);
34
+ cleanups.push(() => window.removeEventListener('focus', onFocus));
35
+ }
36
+ if (config.reloadInterval > 0) {
37
+ const id = setInterval(config.onReload, config.reloadInterval);
38
+ cleanups.push(() => clearInterval(id));
39
+ }
40
+ }
41
+ return {
42
+ setStatus,
43
+ getStatus: () => status,
44
+ subscribeToStatus: (listener) => {
45
+ statusSubscribers.add(listener);
46
+ return () => statusSubscribers.delete(listener);
47
+ },
48
+ dispose: () => cleanups.forEach(fn => fn()),
49
+ };
50
+ }
51
+ //# sourceMappingURL=network.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/core/network.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Path, Listener, SubscriberManager } from '../types';
2
+ export interface StoreInternals {
3
+ getValue: () => unknown;
4
+ subscribers: SubscriberManager;
5
+ }
6
+ export declare function wrapStoreWithProxy<T>(store: StoreInternals): T;
7
+ export declare function isKStateProxy(value: unknown): boolean;
8
+ export declare function getProxyPath(proxy: unknown): Path;
9
+ export declare function getProxySubscribe(proxy: unknown): ((path: Path, listener: Listener) => () => void) | null;
10
+ export declare function getProxyGetData(proxy: unknown): (() => unknown) | null;
11
+ //# sourceMappingURL=proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/core/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,iBAAiB,EAAgB,MAAM,UAAU,CAAA;AA+H/E,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,OAAO,CAAA;IACvB,WAAW,EAAE,iBAAiB,CAAA;CAC/B;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,GAAG,CAAC,CAM9D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAErD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAGjD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,KAAK,MAAM,IAAI,CAAC,GAAG,IAAI,CAGzG;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,IAAI,CAGtE"}
@@ -0,0 +1,146 @@
1
+ import { KSTATE_PROXY, KSTATE_PATH, KSTATE_SUBSCRIBE, KSTATE_GET_DATA } from '../types';
2
+ // Store method names that should be retrieved from target, not data
3
+ const STORE_METHODS = new Set([
4
+ 'get', 'set', 'patch', 'update', 'delete', 'clear', 'dispose',
5
+ 'add', 'create', 'getOne', 'subscribeToStatus', 'status', 'meta'
6
+ ]);
7
+ // Create a proxy wrapper for primitive values that supports subscription
8
+ function createPrimitiveProxy(context) {
9
+ const wrapper = {
10
+ [KSTATE_PROXY]: true,
11
+ [KSTATE_PATH]: context.path,
12
+ [KSTATE_SUBSCRIBE]: context.subscribe,
13
+ [KSTATE_GET_DATA]: context.getData,
14
+ valueOf() { return context.getData(); },
15
+ toString() { return String(context.getData()); },
16
+ [Symbol.toPrimitive](hint) {
17
+ const value = context.getData();
18
+ if (hint === 'number')
19
+ return Number(value);
20
+ if (hint === 'string')
21
+ return String(value);
22
+ return value;
23
+ },
24
+ };
25
+ return wrapper;
26
+ }
27
+ function createReactiveProxy(context) {
28
+ const handler = {
29
+ get(target, prop) {
30
+ // Handle special symbol properties
31
+ if (prop === KSTATE_PROXY)
32
+ return true;
33
+ if (prop === KSTATE_PATH)
34
+ return context.path;
35
+ if (prop === KSTATE_SUBSCRIBE)
36
+ return context.subscribe;
37
+ if (prop === KSTATE_GET_DATA)
38
+ return context.getData;
39
+ // Handle 'value' property - returns the entire data
40
+ if (prop === 'value') {
41
+ return context.getData();
42
+ }
43
+ // Check for store methods on target (not array built-ins)
44
+ if (typeof prop === 'string' && STORE_METHODS.has(prop)) {
45
+ const targetValue = target[prop];
46
+ if (targetValue !== undefined) {
47
+ return targetValue;
48
+ }
49
+ }
50
+ const data = context.getData();
51
+ if (data === null || data === undefined) {
52
+ return undefined;
53
+ }
54
+ // Handle array length property
55
+ if (prop === 'length' && Array.isArray(data)) {
56
+ return data.length;
57
+ }
58
+ // Handle Symbol.iterator for arrays
59
+ if (prop === Symbol.iterator && Array.isArray(data)) {
60
+ return function* () {
61
+ for (let i = 0; i < data.length; i++) {
62
+ const item = data[i];
63
+ // For primitive values, yield directly
64
+ if (item === null || typeof item !== 'object') {
65
+ yield item;
66
+ }
67
+ else {
68
+ // For objects, yield a proxy
69
+ const newPath = [...context.path, i];
70
+ yield createReactiveProxy({
71
+ getData: () => {
72
+ const d = context.getData();
73
+ return Array.isArray(d) ? d[i] : undefined;
74
+ },
75
+ subscribe: context.subscribe,
76
+ path: newPath,
77
+ });
78
+ }
79
+ }
80
+ };
81
+ }
82
+ // Handle array methods
83
+ if (Array.isArray(data) && typeof prop === 'string') {
84
+ const arrayMethods = ['map', 'filter', 'find', 'findIndex', 'some', 'every', 'forEach', 'reduce', 'indexOf', 'includes'];
85
+ if (arrayMethods.includes(prop)) {
86
+ const method = data[prop];
87
+ if (typeof method === 'function') {
88
+ return method.bind(data);
89
+ }
90
+ }
91
+ }
92
+ const value = data[prop];
93
+ const pathKey = typeof prop === 'string' && /^\d+$/.test(prop) ? Number(prop) : prop;
94
+ const newPath = [...context.path, pathKey];
95
+ const newGetData = () => {
96
+ const d = context.getData();
97
+ if (d === null || d === undefined)
98
+ return undefined;
99
+ return d[prop];
100
+ };
101
+ // For primitive values, return a subscribable primitive wrapper
102
+ if (value === null || typeof value !== 'object') {
103
+ return createPrimitiveProxy({
104
+ getData: newGetData,
105
+ subscribe: context.subscribe,
106
+ path: newPath,
107
+ });
108
+ }
109
+ // For objects/arrays, return nested proxy
110
+ return createReactiveProxy({
111
+ getData: newGetData,
112
+ subscribe: context.subscribe,
113
+ path: newPath,
114
+ });
115
+ },
116
+ };
117
+ const data = context.getData();
118
+ const target = (Array.isArray(data) ? [] : {});
119
+ return new Proxy(target, handler);
120
+ }
121
+ export function wrapStoreWithProxy(store) {
122
+ return createReactiveProxy({
123
+ getData: store.getValue,
124
+ subscribe: (path, listener) => store.subscribers.subscribe(path, listener),
125
+ path: [],
126
+ });
127
+ }
128
+ export function isKStateProxy(value) {
129
+ return typeof value === 'object' && value !== null && value[KSTATE_PROXY] === true;
130
+ }
131
+ export function getProxyPath(proxy) {
132
+ if (!isKStateProxy(proxy))
133
+ return [];
134
+ return proxy[KSTATE_PATH];
135
+ }
136
+ export function getProxySubscribe(proxy) {
137
+ if (!isKStateProxy(proxy))
138
+ return null;
139
+ return proxy[KSTATE_SUBSCRIBE];
140
+ }
141
+ export function getProxyGetData(proxy) {
142
+ if (!isKStateProxy(proxy))
143
+ return null;
144
+ return proxy[KSTATE_GET_DATA];
145
+ }
146
+ //# sourceMappingURL=proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/core/proxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { SubscriberManager } from '../types';
2
+ export declare function createSubscriberManager(onFirstSubscribe?: () => void): SubscriberManager;
3
+ //# sourceMappingURL=subscribers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscribers.d.ts","sourceRoot":"","sources":["../../src/core/subscribers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAOjE,wBAAgB,uBAAuB,CAAC,gBAAgB,CAAC,EAAE,MAAM,IAAI,GAAG,iBAAiB,CAiDxF"}
@@ -0,0 +1,50 @@
1
+ export function createSubscriberManager(onFirstSubscribe) {
2
+ const subscriptions = new Set();
3
+ let hadSubscribers = false;
4
+ function subscribe(path, listener) {
5
+ const subscription = { path, listener };
6
+ subscriptions.add(subscription);
7
+ if (!hadSubscribers && onFirstSubscribe) {
8
+ hadSubscribers = true;
9
+ onFirstSubscribe();
10
+ }
11
+ return () => { subscriptions.delete(subscription); };
12
+ }
13
+ function notify(changedPaths) {
14
+ if (subscriptions.size === 0)
15
+ return;
16
+ const toCall = new Set();
17
+ for (const sub of subscriptions) {
18
+ if (shouldNotify(sub.path, changedPaths))
19
+ toCall.add(sub.listener);
20
+ }
21
+ toCall.forEach(fn => fn());
22
+ }
23
+ function shouldNotify(subscribedPath, changedPaths) {
24
+ for (const changedPath of changedPaths) {
25
+ if (pathMatches(subscribedPath, changedPath)) {
26
+ return true;
27
+ }
28
+ }
29
+ return false;
30
+ }
31
+ function pathMatches(subscribed, changed) {
32
+ // Subscribed to root → always notify
33
+ if (subscribed.length === 0)
34
+ return true;
35
+ // Changed at root → notify everyone
36
+ if (changed.length === 0)
37
+ return true;
38
+ // Check if paths overlap
39
+ const minLen = Math.min(subscribed.length, changed.length);
40
+ for (let i = 0; i < minLen; i++) {
41
+ if (subscribed[i] !== changed[i]) {
42
+ return false;
43
+ }
44
+ }
45
+ // Paths overlap: either subscribed is ancestor or descendant of changed
46
+ return true;
47
+ }
48
+ return { subscribe, notify };
49
+ }
50
+ //# sourceMappingURL=subscribers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscribers.js","sourceRoot":"","sources":["../../src/core/subscribers.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,uBAAuB,CAAC,gBAA6B;IACnE,MAAM,aAAa,GAAG,IAAI,GAAG,EAAgB,CAAA;IAC7C,IAAI,cAAc,GAAG,KAAK,CAAA;IAE1B,SAAS,SAAS,CAAC,IAAU,EAAE,QAAkB;QAC/C,MAAM,YAAY,GAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;QACrD,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;QAC/B,IAAI,CAAC,cAAc,IAAI,gBAAgB,EAAE,CAAC;YACxC,cAAc,GAAG,IAAI,CAAA;YACrB,gBAAgB,EAAE,CAAA;QACpB,CAAC;QACD,OAAO,GAAG,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA,CAAC,CAAC,CAAA;IACrD,CAAC;IAED,SAAS,MAAM,CAAC,YAAoB;QAClC,IAAI,aAAa,CAAC,IAAI,KAAK,CAAC;YAAE,OAAM;QACpC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAY,CAAA;QAClC,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;YAChC,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,YAAY,CAAC;gBAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACpE,CAAC;QACD,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IAC5B,CAAC;IAED,SAAS,YAAY,CAAC,cAAoB,EAAE,YAAoB;QAC9D,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;YACvC,IAAI,WAAW,CAAC,cAAc,EAAE,WAAW,CAAC,EAAE,CAAC;gBAC7C,OAAO,IAAI,CAAA;YACb,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,SAAS,WAAW,CAAC,UAAgB,EAAE,OAAa;QAClD,qCAAqC;QACrC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QACxC,oCAAoC;QACpC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QACrC,yBAAyB;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;QAC1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjC,OAAO,KAAK,CAAA;YACd,CAAC;QACH,CAAC;QACD,wEAAwE;QACxE,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAA;AAC9B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function useStore<T>(proxyOrStore: unknown): T;
2
+ //# sourceMappingURL=useStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStore.d.ts","sourceRoot":"","sources":["../../src/hooks/useStore.ts"],"names":[],"mappings":"AAMA,wBAAgB,QAAQ,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,GAAG,CAAC,CAmEpD"}
@@ -0,0 +1,64 @@
1
+ import { useSyncExternalStore, useCallback, useRef } from 'react';
2
+ import { isKStateProxy, getProxyPath, getProxySubscribe, getProxyGetData } from '../core/proxy';
3
+ const UNINITIALIZED = Symbol('uninitialized');
4
+ export function useStore(proxyOrStore) {
5
+ const proxyRef = useRef(proxyOrStore);
6
+ proxyRef.current = proxyOrStore;
7
+ const subscribe = useCallback((onStoreChange) => {
8
+ const current = proxyRef.current;
9
+ if (isKStateProxy(current)) {
10
+ const path = getProxyPath(current);
11
+ const subscribeFn = getProxySubscribe(current);
12
+ if (subscribeFn) {
13
+ return subscribeFn(path, onStoreChange);
14
+ }
15
+ }
16
+ // Fallback: try to access subscribers directly on the store
17
+ const store = current;
18
+ if (store.subscribers?.subscribe) {
19
+ return store.subscribers.subscribe([], onStoreChange);
20
+ }
21
+ return (console.warn?.('useStore: no subscription available'), () => { });
22
+ }, []);
23
+ const getSnapshot = useCallback(() => {
24
+ const current = proxyRef.current;
25
+ if (isKStateProxy(current)) {
26
+ const getData = getProxyGetData(current);
27
+ if (getData) {
28
+ return getData();
29
+ }
30
+ }
31
+ // Fallback: try to access value directly
32
+ const store = current;
33
+ return store.value;
34
+ }, []);
35
+ const snapshotRef = useRef(UNINITIALIZED);
36
+ const getStableSnapshot = useCallback(() => {
37
+ const next = getSnapshot();
38
+ const prev = snapshotRef.current;
39
+ // First call - always store the snapshot
40
+ if (prev === UNINITIALIZED) {
41
+ snapshotRef.current = next;
42
+ return next;
43
+ }
44
+ if (typeof next !== 'object' || next === null) {
45
+ if (prev !== next)
46
+ snapshotRef.current = next;
47
+ }
48
+ else if (prev === null || typeof prev !== 'object') {
49
+ snapshotRef.current = next;
50
+ }
51
+ else if (Array.isArray(next)) {
52
+ if (!Array.isArray(prev) || next.length !== prev.length || next.some((v, i) => v !== prev[i]))
53
+ snapshotRef.current = next;
54
+ }
55
+ else {
56
+ const keys = Object.keys(next);
57
+ if (keys.length !== Object.keys(prev).length || keys.some(k => next[k] !== prev[k]))
58
+ snapshotRef.current = next;
59
+ }
60
+ return snapshotRef.current;
61
+ }, [getSnapshot]);
62
+ return useSyncExternalStore(subscribe, getStableSnapshot, getStableSnapshot);
63
+ }
64
+ //# sourceMappingURL=useStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStore.js","sourceRoot":"","sources":["../../src/hooks/useStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { StoreStatus, Listener } from '../types';
2
+ interface StoreWithStatus {
3
+ status: StoreStatus;
4
+ subscribeToStatus: (listener: Listener) => () => void;
5
+ }
6
+ export declare function useStoreStatus(store: StoreWithStatus): StoreStatus;
7
+ export {};
8
+ //# sourceMappingURL=useStoreStatus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStoreStatus.d.ts","sourceRoot":"","sources":["../../src/hooks/useStoreStatus.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAErD,UAAU,eAAe;IACvB,MAAM,EAAE,WAAW,CAAA;IACnB,iBAAiB,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,MAAM,IAAI,CAAA;CACtD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,WAAW,CAalE"}
@@ -0,0 +1,13 @@
1
+ import { useSyncExternalStore, useCallback, useRef } from 'react';
2
+ export function useStoreStatus(store) {
3
+ const storeRef = useRef(store);
4
+ storeRef.current = store;
5
+ const subscribe = useCallback((onStoreChange) => {
6
+ return storeRef.current.subscribeToStatus(onStoreChange);
7
+ }, []);
8
+ const getSnapshot = useCallback(() => {
9
+ return storeRef.current.status;
10
+ }, []);
11
+ return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
12
+ }
13
+ //# sourceMappingURL=useStoreStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStoreStatus.js","sourceRoot":"","sources":["../../src/hooks/useStoreStatus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAQjE,MAAM,UAAU,cAAc,CAAC,KAAsB;IACnD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAC9B,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAA;IAExB,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,aAAuB,EAAE,EAAE;QACxD,OAAO,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAA;IAC1D,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE;QACnC,OAAO,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAA;IAChC,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,oBAAoB,CAAC,SAAS,EAAE,WAAW,EAAE,WAAW,CAAC,CAAA;AAClE,CAAC"}
@@ -0,0 +1,9 @@
1
+ export { configureKState } from './config';
2
+ export { createStore } from './stores/createStore';
3
+ export { createSetStore } from './stores/createSetStore';
4
+ export { computed } from './stores/computed';
5
+ export { api, queuedApi, local, sse } from './adapters';
6
+ export { useStore } from './hooks/useStore';
7
+ export { useStoreStatus } from './hooks/useStoreStatus';
8
+ export type { StoreOps, SetStoreOps, NewStore, SetStore, ComputedStore, StoreStatus, ResponseMeta, ErrorMeta, Operation, KStateConfig, } from './types';
9
+ //# sourceMappingURL=index.d.ts.map