react-browser-cache 1.0.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 (162) hide show
  1. package/README.md +129 -0
  2. package/dist/cjs/core/broadcast.js +47 -0
  3. package/dist/cjs/core/broadcast.js.map +1 -0
  4. package/dist/cjs/core/cache-manager.js +101 -0
  5. package/dist/cjs/core/cache-manager.js.map +1 -0
  6. package/dist/cjs/core/serializer.js +22 -0
  7. package/dist/cjs/core/serializer.js.map +1 -0
  8. package/dist/cjs/hooks/useBrowserCache.js +91 -0
  9. package/dist/cjs/hooks/useBrowserCache.js.map +1 -0
  10. package/dist/cjs/hooks/useCacheInvalidate.js +24 -0
  11. package/dist/cjs/hooks/useCacheInvalidate.js.map +1 -0
  12. package/dist/cjs/hooks/useCacheState.js +54 -0
  13. package/dist/cjs/hooks/useCacheState.js.map +1 -0
  14. package/dist/cjs/hooks/useCacheValue.js +32 -0
  15. package/dist/cjs/hooks/useCacheValue.js.map +1 -0
  16. package/dist/cjs/index.js +26 -0
  17. package/dist/cjs/index.js.map +1 -0
  18. package/dist/cjs/provider/BrowserCacheProvider.js +32 -0
  19. package/dist/cjs/provider/BrowserCacheProvider.js.map +1 -0
  20. package/dist/cjs/storages/indexeddb.js +68 -0
  21. package/dist/cjs/storages/indexeddb.js.map +1 -0
  22. package/dist/cjs/storages/local-storage.js +40 -0
  23. package/dist/cjs/storages/local-storage.js.map +1 -0
  24. package/dist/cjs/storages/memory.js +28 -0
  25. package/dist/cjs/storages/memory.js.map +1 -0
  26. package/dist/cjs/storages/session-storage.js +40 -0
  27. package/dist/cjs/storages/session-storage.js.map +1 -0
  28. package/dist/cjs/types/index.js +3 -0
  29. package/dist/cjs/types/index.js.map +1 -0
  30. package/dist/cjs/utils/hydrate.js +8 -0
  31. package/dist/cjs/utils/hydrate.js.map +1 -0
  32. package/dist/cjs/utils/prefetch.js +14 -0
  33. package/dist/cjs/utils/prefetch.js.map +1 -0
  34. package/dist/core/broadcast.d.ts +14 -0
  35. package/dist/core/broadcast.d.ts.map +1 -0
  36. package/dist/core/broadcast.js +43 -0
  37. package/dist/core/broadcast.js.map +1 -0
  38. package/dist/core/cache-manager.d.ts +17 -0
  39. package/dist/core/cache-manager.d.ts.map +1 -0
  40. package/dist/core/cache-manager.js +97 -0
  41. package/dist/core/cache-manager.js.map +1 -0
  42. package/dist/core/serializer.d.ts +3 -0
  43. package/dist/core/serializer.d.ts.map +1 -0
  44. package/dist/core/serializer.js +17 -0
  45. package/dist/core/serializer.js.map +1 -0
  46. package/dist/hooks/useBrowserCache.d.ts +16 -0
  47. package/dist/hooks/useBrowserCache.d.ts.map +1 -0
  48. package/dist/hooks/useBrowserCache.js +87 -0
  49. package/dist/hooks/useBrowserCache.js.map +1 -0
  50. package/dist/hooks/useCacheInvalidate.d.ts +9 -0
  51. package/dist/hooks/useCacheInvalidate.d.ts.map +1 -0
  52. package/dist/hooks/useCacheInvalidate.js +20 -0
  53. package/dist/hooks/useCacheInvalidate.js.map +1 -0
  54. package/dist/hooks/useCacheState.d.ts +7 -0
  55. package/dist/hooks/useCacheState.d.ts.map +1 -0
  56. package/dist/hooks/useCacheState.js +50 -0
  57. package/dist/hooks/useCacheState.js.map +1 -0
  58. package/dist/hooks/useCacheValue.d.ts +3 -0
  59. package/dist/hooks/useCacheValue.d.ts.map +1 -0
  60. package/dist/hooks/useCacheValue.js +28 -0
  61. package/dist/hooks/useCacheValue.js.map +1 -0
  62. package/dist/index.d.ts +10 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +10 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/provider/BrowserCacheProvider.d.ts +16 -0
  67. package/dist/provider/BrowserCacheProvider.d.ts.map +1 -0
  68. package/dist/provider/BrowserCacheProvider.js +27 -0
  69. package/dist/provider/BrowserCacheProvider.js.map +1 -0
  70. package/dist/src/core/broadcast.d.ts +14 -0
  71. package/dist/src/core/broadcast.d.ts.map +1 -0
  72. package/dist/src/core/broadcast.js +43 -0
  73. package/dist/src/core/broadcast.js.map +1 -0
  74. package/dist/src/core/cache-manager.d.ts +17 -0
  75. package/dist/src/core/cache-manager.d.ts.map +1 -0
  76. package/dist/src/core/cache-manager.js +97 -0
  77. package/dist/src/core/cache-manager.js.map +1 -0
  78. package/dist/src/core/serializer.d.ts +3 -0
  79. package/dist/src/core/serializer.d.ts.map +1 -0
  80. package/dist/src/core/serializer.js +17 -0
  81. package/dist/src/core/serializer.js.map +1 -0
  82. package/dist/src/hooks/useBrowserCache.d.ts +16 -0
  83. package/dist/src/hooks/useBrowserCache.d.ts.map +1 -0
  84. package/dist/src/hooks/useBrowserCache.js +87 -0
  85. package/dist/src/hooks/useBrowserCache.js.map +1 -0
  86. package/dist/src/hooks/useCacheInvalidate.d.ts +9 -0
  87. package/dist/src/hooks/useCacheInvalidate.d.ts.map +1 -0
  88. package/dist/src/hooks/useCacheInvalidate.js +20 -0
  89. package/dist/src/hooks/useCacheInvalidate.js.map +1 -0
  90. package/dist/src/hooks/useCacheState.d.ts +7 -0
  91. package/dist/src/hooks/useCacheState.d.ts.map +1 -0
  92. package/dist/src/hooks/useCacheState.js +50 -0
  93. package/dist/src/hooks/useCacheState.js.map +1 -0
  94. package/dist/src/hooks/useCacheValue.d.ts +3 -0
  95. package/dist/src/hooks/useCacheValue.d.ts.map +1 -0
  96. package/dist/src/hooks/useCacheValue.js +28 -0
  97. package/dist/src/hooks/useCacheValue.js.map +1 -0
  98. package/dist/src/index.d.ts +10 -0
  99. package/dist/src/index.d.ts.map +1 -0
  100. package/dist/src/index.js +10 -0
  101. package/dist/src/index.js.map +1 -0
  102. package/dist/src/provider/BrowserCacheProvider.d.ts +16 -0
  103. package/dist/src/provider/BrowserCacheProvider.d.ts.map +1 -0
  104. package/dist/src/provider/BrowserCacheProvider.js +27 -0
  105. package/dist/src/provider/BrowserCacheProvider.js.map +1 -0
  106. package/dist/src/storages/indexeddb.d.ts +13 -0
  107. package/dist/src/storages/indexeddb.d.ts.map +1 -0
  108. package/dist/src/storages/indexeddb.js +64 -0
  109. package/dist/src/storages/indexeddb.js.map +1 -0
  110. package/dist/src/storages/local-storage.d.ts +11 -0
  111. package/dist/src/storages/local-storage.d.ts.map +1 -0
  112. package/dist/src/storages/local-storage.js +36 -0
  113. package/dist/src/storages/local-storage.js.map +1 -0
  114. package/dist/src/storages/memory.d.ts +9 -0
  115. package/dist/src/storages/memory.d.ts.map +1 -0
  116. package/dist/src/storages/memory.js +24 -0
  117. package/dist/src/storages/memory.js.map +1 -0
  118. package/dist/src/storages/session-storage.d.ts +11 -0
  119. package/dist/src/storages/session-storage.d.ts.map +1 -0
  120. package/dist/src/storages/session-storage.js +36 -0
  121. package/dist/src/storages/session-storage.js.map +1 -0
  122. package/dist/src/types/index.d.ts +31 -0
  123. package/dist/src/types/index.d.ts.map +1 -0
  124. package/dist/src/types/index.js +2 -0
  125. package/dist/src/types/index.js.map +1 -0
  126. package/dist/src/utils/hydrate.d.ts +9 -0
  127. package/dist/src/utils/hydrate.d.ts.map +1 -0
  128. package/dist/src/utils/hydrate.js +4 -0
  129. package/dist/src/utils/hydrate.js.map +1 -0
  130. package/dist/src/utils/prefetch.d.ts +4 -0
  131. package/dist/src/utils/prefetch.d.ts.map +1 -0
  132. package/dist/src/utils/prefetch.js +10 -0
  133. package/dist/src/utils/prefetch.js.map +1 -0
  134. package/dist/storages/indexeddb.d.ts +13 -0
  135. package/dist/storages/indexeddb.d.ts.map +1 -0
  136. package/dist/storages/indexeddb.js +64 -0
  137. package/dist/storages/indexeddb.js.map +1 -0
  138. package/dist/storages/local-storage.d.ts +11 -0
  139. package/dist/storages/local-storage.d.ts.map +1 -0
  140. package/dist/storages/local-storage.js +36 -0
  141. package/dist/storages/local-storage.js.map +1 -0
  142. package/dist/storages/memory.d.ts +9 -0
  143. package/dist/storages/memory.d.ts.map +1 -0
  144. package/dist/storages/memory.js +24 -0
  145. package/dist/storages/memory.js.map +1 -0
  146. package/dist/storages/session-storage.d.ts +11 -0
  147. package/dist/storages/session-storage.d.ts.map +1 -0
  148. package/dist/storages/session-storage.js +36 -0
  149. package/dist/storages/session-storage.js.map +1 -0
  150. package/dist/types/index.d.ts +31 -0
  151. package/dist/types/index.d.ts.map +1 -0
  152. package/dist/types/index.js +2 -0
  153. package/dist/types/index.js.map +1 -0
  154. package/dist/utils/hydrate.d.ts +9 -0
  155. package/dist/utils/hydrate.d.ts.map +1 -0
  156. package/dist/utils/hydrate.js +4 -0
  157. package/dist/utils/hydrate.js.map +1 -0
  158. package/dist/utils/prefetch.d.ts +4 -0
  159. package/dist/utils/prefetch.d.ts.map +1 -0
  160. package/dist/utils/prefetch.js +10 -0
  161. package/dist/utils/prefetch.js.map +1 -0
  162. package/package.json +55 -0
package/README.md ADDED
@@ -0,0 +1,129 @@
1
+ # react-browser-cache
2
+
3
+ A production-ready, hook-based browser caching system for React with TTL, stale-while-revalidate, and cross-tab synchronization.
4
+
5
+ ## 🚀 Features
6
+
7
+ - **Multi-Storage Support**: localStorage, sessionStorage, IndexedDB, and Memory.
8
+ - **TTL & Expiration**: Automatic cache invalidation based on time-to-live.
9
+ - **Stale-While-Revalidate**: Return cached data immediately while fetching fresh data in the background.
10
+ - **Cross-Tab Sync**: Real-time synchronization across browser tabs using `BroadcastChannel`.
11
+ - **TypeScript First**: Fully type-safe API.
12
+ - **Lightweight**: Zero heavy dependencies, optimized for bundle size.
13
+ - **JSON Safe**: Built-in support for `Date` objects in serialization.
14
+
15
+ ## 📦 Installation
16
+
17
+ ```bash
18
+ npm install react-browser-cache
19
+ ```
20
+
21
+ ## 🛠️ Usage
22
+
23
+ ### 1. Wrap your app with `BrowserCacheProvider`
24
+
25
+ ```tsx
26
+ import { BrowserCacheProvider } from 'react-browser-cache';
27
+
28
+ function App() {
29
+ return (
30
+ <BrowserCacheProvider config={{ defaultStorage: 'local', defaultTTL: 1000 * 60 * 5 }}>
31
+ <MyComponent />
32
+ </BrowserCacheProvider>
33
+ );
34
+ }
35
+ ```
36
+
37
+ ### 2. Use `useBrowserCache` for async data
38
+
39
+ ```tsx
40
+ import { useBrowserCache } from 'react-browser-cache';
41
+
42
+ const fetchUser = async () => {
43
+ const resp = await fetch('/api/user');
44
+ return resp.json();
45
+ };
46
+
47
+ function MyComponent() {
48
+ const { data, isLoading, error, refresh } = useBrowserCache({
49
+ key: 'user_profile',
50
+ fetcher: fetchUser,
51
+ storage: 'indexeddb',
52
+ ttl: 1000 * 60 * 60, // 1 hour
53
+ staleWhileRevalidate: true
54
+ });
55
+
56
+ if (isLoading) return <div>Loading...</div>;
57
+ if (error) return <div>Error: {error.message}</div>;
58
+
59
+ return (
60
+ <div>
61
+ <h1>{data.name}</h1>
62
+ <button onClick={() => refresh()}>Refresh</button>
63
+ </div>
64
+ );
65
+ }
66
+ ```
67
+
68
+ ### 3. Use `useCacheState` for persistent state
69
+
70
+ ```tsx
71
+ import { useCacheState } from 'react-browser-cache';
72
+
73
+ function Counter() {
74
+ const [count, setCount] = useCacheState('counter_key', 0, { storage: 'local' });
75
+
76
+ return (
77
+ <button onClick={() => setCount(c => c + 1)}>
78
+ Count is {count}
79
+ </button>
80
+ );
81
+ }
82
+ ```
83
+
84
+ ### 4. Read-only access with `useCacheValue`
85
+
86
+ ```tsx
87
+ const value = useCacheValue('my_key');
88
+ ```
89
+
90
+ ### 5. Manual Invalidation
91
+
92
+ ```tsx
93
+ const { invalidate, clearAll } = useCacheInvalidate();
94
+
95
+ // Invalidate specific key
96
+ invalidate('user_profile');
97
+
98
+ // Clear entire storage
99
+ clearAll('indexeddb');
100
+ ```
101
+
102
+ ## 📖 API Reference
103
+
104
+ ### `BrowserCacheProvider` Props
105
+ | Prop | Type | Default | Description |
106
+ | --- | --- | --- | --- |
107
+ | `config` | `GlobalCacheConfig` | - | Global configuration for the cache. |
108
+
109
+ ### `useBrowserCache` Options
110
+ | Option | Type | Default | Description |
111
+ | --- | --- | --- | --- |
112
+ | `key` | `string` | **Required** | Unique key for the cache entry. |
113
+ | `fetcher` | `() => Promise<T>` | **Required** | Async function to fetch data. |
114
+ | `storage` | `StorageType` | `'memory'` | Storage adapter to use. |
115
+ | `ttl` | `number` | `300000` | Time to live in milliseconds. |
116
+ | `staleWhileRevalidate` | `boolean` | `false` | Fallback to stale data while revalidating. |
117
+ | `syncTabs` | `boolean` | `true` | Sync updates across tabs. |
118
+
119
+ ## 🤝 Comparison with SWR/React Query
120
+
121
+ While SWR and React Query are excellent for server state, `react-browser-cache` focuses specifically on **browser storage abstraction**.
122
+
123
+ - **Persistence**: Unlike SWR which is primarily in-memory, this library is built to live in `localStorage` or `IndexedDB`.
124
+ - **Offline First**: Optimized for scenarios where you want data to persist across sessions and survive page reloads naturally.
125
+ - **Cross-Tab Sync**: Native support for keeping state in sync across multiple open tabs.
126
+
127
+ ## 📄 License
128
+
129
+ MIT © Kloudz Computing
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BroadcastManager = void 0;
4
+ class BroadcastManager {
5
+ channel = null;
6
+ onMessage;
7
+ constructor(channelName, onMessage) {
8
+ this.onMessage = onMessage;
9
+ if (typeof window !== 'undefined' && window.BroadcastChannel) {
10
+ this.channel = new BroadcastChannel(channelName);
11
+ this.channel.onmessage = (event) => {
12
+ this.onMessage(event.data);
13
+ };
14
+ }
15
+ else if (typeof window !== 'undefined') {
16
+ // Fallback to storage event
17
+ window.addEventListener('storage', (event) => {
18
+ if (event.key === channelName && event.newValue) {
19
+ try {
20
+ const data = JSON.parse(event.newValue);
21
+ this.onMessage(data);
22
+ }
23
+ catch {
24
+ // Ignore malformed data
25
+ }
26
+ }
27
+ });
28
+ }
29
+ }
30
+ postMessage(message) {
31
+ if (this.channel) {
32
+ this.channel.postMessage(message);
33
+ }
34
+ else if (typeof window !== 'undefined') {
35
+ // Fallback: use localStorage for cross-tab communication
36
+ // We set a temporary key and then remove it to trigger storage event
37
+ const channelName = 'rbc_sync'; // Use a consistent name for manual fallback
38
+ localStorage.setItem(channelName, JSON.stringify(message));
39
+ localStorage.removeItem(channelName);
40
+ }
41
+ }
42
+ close() {
43
+ this.channel?.close();
44
+ }
45
+ }
46
+ exports.BroadcastManager = BroadcastManager;
47
+ //# sourceMappingURL=broadcast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broadcast.js","sourceRoot":"","sources":["../../../src/core/broadcast.ts"],"names":[],"mappings":";;;AAMA,MAAa,gBAAgB;IACnB,OAAO,GAA4B,IAAI,CAAC;IACxC,SAAS,CAAsC;IAEvD,YAAY,WAAmB,EAAE,SAA8C;QAC7E,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAC7D,IAAI,CAAC,OAAO,GAAG,IAAI,gBAAgB,CAAC,WAAW,CAAC,CAAC;YACjD,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,CAAC,KAAK,EAAE,EAAE;gBACjC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC,CAAC;QACJ,CAAC;aAAM,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YACzC,4BAA4B;YAC5B,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC3C,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;oBAChD,IAAI,CAAC;wBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;wBACxC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;oBACvB,CAAC;oBAAC,MAAM,CAAC;wBACP,wBAAwB;oBAC1B,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,WAAW,CAAC,OAAyB;QACnC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;aAAM,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YACzC,yDAAyD;YACzD,qEAAqE;YACrE,MAAM,WAAW,GAAG,UAAU,CAAC,CAAC,4CAA4C;YAC5E,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YAC3D,YAAY,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;IACxB,CAAC;CACF;AAzCD,4CAyCC"}
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CacheManager = void 0;
4
+ const memory_1 = require("../storages/memory");
5
+ const local_storage_1 = require("../storages/local-storage");
6
+ const session_storage_1 = require("../storages/session-storage");
7
+ const indexeddb_1 = require("../storages/indexeddb");
8
+ const broadcast_1 = require("./broadcast");
9
+ class CacheManager {
10
+ storages;
11
+ config;
12
+ broadcaster = null;
13
+ listeners = new Set();
14
+ constructor(config) {
15
+ this.config = config;
16
+ this.storages = {
17
+ memory: new memory_1.MemoryStorage(),
18
+ local: new local_storage_1.LocalStorageAdapter(config.prefix),
19
+ session: new session_storage_1.SessionStorageAdapter(config.prefix),
20
+ indexeddb: new indexeddb_1.IndexedDBAdapter()
21
+ };
22
+ if (typeof window !== 'undefined') {
23
+ this.broadcaster = new broadcast_1.BroadcastManager('rbc_sync', (msg) => {
24
+ if (msg.type === 'invalidate') {
25
+ this.notify(msg.key, null);
26
+ }
27
+ else if (msg.type === 'update') {
28
+ this.notify(msg.key, msg.payload);
29
+ }
30
+ });
31
+ }
32
+ }
33
+ getStorage(type) {
34
+ return this.storages[type || this.config.defaultStorage];
35
+ }
36
+ async get(key, options) {
37
+ const storage = this.getStorage(options?.storage);
38
+ const entry = await storage.get(key);
39
+ if (!entry)
40
+ return null;
41
+ const now = Date.now();
42
+ const isExpired = entry.expiresAt !== null && now > entry.expiresAt;
43
+ if (isExpired) {
44
+ if (options?.staleWhileRevalidate) {
45
+ return { ...entry.value, __isStale: true };
46
+ }
47
+ await this.remove(key, options);
48
+ return null;
49
+ }
50
+ return entry.value;
51
+ }
52
+ async set(key, value, options) {
53
+ const storage = this.getStorage(options?.storage);
54
+ const now = Date.now();
55
+ const ttl = options?.ttl ?? this.config.defaultTTL;
56
+ const entry = {
57
+ value,
58
+ createdAt: now,
59
+ expiresAt: ttl > 0 ? now + ttl : null,
60
+ tags: options?.tags,
61
+ version: options?.version ?? 1
62
+ };
63
+ await storage.set(key, entry);
64
+ if (options?.syncTabs && this.broadcaster) {
65
+ this.broadcaster.postMessage({ type: 'update', key, payload: value });
66
+ }
67
+ this.notify(key, value);
68
+ }
69
+ async remove(key, options) {
70
+ const storage = this.getStorage(options?.storage);
71
+ await storage.remove(key);
72
+ if (options?.syncTabs && this.broadcaster) {
73
+ this.broadcaster.postMessage({ type: 'invalidate', key });
74
+ }
75
+ this.notify(key, null);
76
+ }
77
+ async clear(type) {
78
+ const storage = this.getStorage(type);
79
+ await storage.clear();
80
+ }
81
+ async invalidateTag(tag) {
82
+ // This is expensive as it requires scanning or a separate index.
83
+ // For simplicity, we clear and notify.
84
+ // In a more complex implementation, we'd have a tag-to-key index.
85
+ // For now, we'll notify that 'tag invalidation' occurred.
86
+ if (this.broadcaster) {
87
+ this.broadcaster.postMessage({ type: 'invalidate', key: `tag:${tag}` });
88
+ }
89
+ }
90
+ subscribe(listener) {
91
+ this.listeners.add(listener);
92
+ return () => {
93
+ this.listeners.delete(listener);
94
+ };
95
+ }
96
+ notify(key, value) {
97
+ this.listeners.forEach(l => l(key, value));
98
+ }
99
+ }
100
+ exports.CacheManager = CacheManager;
101
+ //# sourceMappingURL=cache-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-manager.js","sourceRoot":"","sources":["../../../src/core/cache-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deserialize = exports.serialize = void 0;
4
+ const serialize = (value) => {
5
+ return JSON.stringify(value, function (_key, val) {
6
+ if (this[_key] instanceof Date) {
7
+ return { __type: 'Date', value: this[_key].toISOString() };
8
+ }
9
+ return val;
10
+ });
11
+ };
12
+ exports.serialize = serialize;
13
+ const deserialize = (value) => {
14
+ return JSON.parse(value, (_key, val) => {
15
+ if (val && typeof val === 'object' && val.__type === 'Date') {
16
+ return new Date(val.value);
17
+ }
18
+ return val;
19
+ });
20
+ };
21
+ exports.deserialize = deserialize;
22
+ //# sourceMappingURL=serializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serializer.js","sourceRoot":"","sources":["../../../src/core/serializer.ts"],"names":[],"mappings":";;;AAAO,MAAM,SAAS,GAAG,CAAC,KAAU,EAAU,EAAE;IAC9C,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,UAAS,IAAI,EAAE,GAAG;QAC7C,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;YAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QAC7D,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAPW,QAAA,SAAS,aAOpB;AAEK,MAAM,WAAW,GAAG,CAAC,KAAa,EAAO,EAAE;IAChD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACrC,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC5D,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAPW,QAAA,WAAW,eAOtB"}
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useBrowserCache = void 0;
4
+ const react_1 = require("react");
5
+ const BrowserCacheProvider_1 = require("../provider/BrowserCacheProvider");
6
+ const useBrowserCache = ({ key, fetcher, enabled = true, ...options }) => {
7
+ const { cacheManager } = (0, BrowserCacheProvider_1.useCacheManager)();
8
+ const [data, setData] = (0, react_1.useState)(null);
9
+ const [error, setError] = (0, react_1.useState)(null);
10
+ const [isLoading, setIsLoading] = (0, react_1.useState)(enabled);
11
+ const [isStale, setIsStale] = (0, react_1.useState)(false);
12
+ const isFetching = (0, react_1.useRef)(false);
13
+ const refresh = (0, react_1.useCallback)(async (isManual = true) => {
14
+ if (isFetching.current)
15
+ return;
16
+ isFetching.current = true;
17
+ if (isManual)
18
+ setIsLoading(true);
19
+ try {
20
+ const result = await fetcher();
21
+ await cacheManager.set(key, result, options);
22
+ setData(result);
23
+ setError(null);
24
+ setIsStale(false);
25
+ }
26
+ catch (err) {
27
+ setError(err instanceof Error ? err : new Error(String(err)));
28
+ }
29
+ finally {
30
+ setIsLoading(false);
31
+ isFetching.current = false;
32
+ }
33
+ }, [key, fetcher, cacheManager, options]);
34
+ (0, react_1.useEffect)(() => {
35
+ let mounted = true;
36
+ const load = async () => {
37
+ const cached = await cacheManager.get(key, options);
38
+ if (!mounted)
39
+ return;
40
+ if (cached !== null) {
41
+ if (cached.__isStale) {
42
+ setData(cached);
43
+ setIsStale(true);
44
+ // Revalidate in background
45
+ refresh(false);
46
+ }
47
+ else {
48
+ setData(cached);
49
+ setIsLoading(false);
50
+ }
51
+ }
52
+ else if (enabled) {
53
+ refresh();
54
+ }
55
+ };
56
+ if (enabled) {
57
+ load();
58
+ }
59
+ return () => {
60
+ mounted = false;
61
+ };
62
+ }, [key, enabled, cacheManager, options, refresh]);
63
+ // Subscribe to external updates (cross-tab sync)
64
+ (0, react_1.useEffect)(() => {
65
+ const unsubscribe = cacheManager.subscribe((updatedKey, newValue) => {
66
+ if (updatedKey === key) {
67
+ setData(newValue);
68
+ if (newValue === null) {
69
+ setIsStale(false);
70
+ }
71
+ }
72
+ });
73
+ return () => unsubscribe();
74
+ }, [key, cacheManager]);
75
+ const mutate = (newValue) => {
76
+ const value = typeof newValue === 'function' ? newValue(data) : newValue;
77
+ cacheManager.set(key, value, options);
78
+ };
79
+ const clear = () => cacheManager.remove(key, options);
80
+ return {
81
+ data,
82
+ error,
83
+ isLoading,
84
+ isStale,
85
+ refresh,
86
+ mutate,
87
+ clear
88
+ };
89
+ };
90
+ exports.useBrowserCache = useBrowserCache;
91
+ //# sourceMappingURL=useBrowserCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBrowserCache.js","sourceRoot":"","sources":["../../../src/hooks/useBrowserCache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useCacheInvalidate = void 0;
4
+ const react_1 = require("react");
5
+ const BrowserCacheProvider_1 = require("../provider/BrowserCacheProvider");
6
+ const useCacheInvalidate = () => {
7
+ const { cacheManager } = (0, BrowserCacheProvider_1.useCacheManager)();
8
+ const invalidate = (0, react_1.useCallback)((key, options) => {
9
+ return cacheManager.remove(key, options);
10
+ }, [cacheManager]);
11
+ const invalidateTag = (0, react_1.useCallback)((tag) => {
12
+ return cacheManager.invalidateTag(tag);
13
+ }, [cacheManager]);
14
+ const clearAll = (0, react_1.useCallback)((storage) => {
15
+ return cacheManager.clear(storage);
16
+ }, [cacheManager]);
17
+ return {
18
+ invalidate,
19
+ invalidateTag,
20
+ clearAll
21
+ };
22
+ };
23
+ exports.useCacheInvalidate = useCacheInvalidate;
24
+ //# sourceMappingURL=useCacheInvalidate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCacheInvalidate.js","sourceRoot":"","sources":["../../../src/hooks/useCacheInvalidate.ts"],"names":[],"mappings":";;;AAAA,iCAAoC;AACpC,2EAAmE;AAG5D,MAAM,kBAAkB,GAAG,GAAG,EAAE;IACrC,MAAM,EAAE,YAAY,EAAE,GAAG,IAAA,sCAAe,GAAE,CAAC;IAE3C,MAAM,UAAU,GAAG,IAAA,mBAAW,EAAC,CAAC,GAAW,EAAE,OAAmC,EAAE,EAAE;QAClF,OAAO,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,MAAM,aAAa,GAAG,IAAA,mBAAW,EAAC,CAAC,GAAW,EAAE,EAAE;QAChD,OAAO,YAAY,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACzC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,MAAM,QAAQ,GAAG,IAAA,mBAAW,EAAC,CAAC,OAAqB,EAAE,EAAE;QACrD,OAAO,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,OAAO;QACL,UAAU;QACV,aAAa;QACb,QAAQ;KACT,CAAC;AACJ,CAAC,CAAC;AApBW,QAAA,kBAAkB,sBAoB7B"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useCacheState = void 0;
4
+ const react_1 = require("react");
5
+ const BrowserCacheProvider_1 = require("../provider/BrowserCacheProvider");
6
+ const useCacheState = (key, initialValue, options) => {
7
+ const { cacheManager } = (0, BrowserCacheProvider_1.useCacheManager)();
8
+ const [value, setValueState] = (0, react_1.useState)(initialValue);
9
+ const [isExpired, setIsExpired] = (0, react_1.useState)(false);
10
+ (0, react_1.useEffect)(() => {
11
+ let mounted = true;
12
+ const load = async () => {
13
+ const cached = await cacheManager.get(key, options);
14
+ if (mounted) {
15
+ if (cached !== null) {
16
+ setValueState(cached);
17
+ setIsExpired(false);
18
+ }
19
+ else if (initialValue !== undefined) {
20
+ await cacheManager.set(key, initialValue, options);
21
+ }
22
+ }
23
+ };
24
+ load();
25
+ return () => {
26
+ mounted = false;
27
+ };
28
+ }, [key, initialValue, cacheManager, options]);
29
+ // Subscribe to changes
30
+ (0, react_1.useEffect)(() => {
31
+ const unsubscribe = cacheManager.subscribe((updatedKey, newValue) => {
32
+ if (updatedKey === key) {
33
+ setValueState(newValue);
34
+ if (newValue === null)
35
+ setIsExpired(true);
36
+ }
37
+ });
38
+ return () => unsubscribe();
39
+ }, [key, cacheManager]);
40
+ const setValue = (0, react_1.useCallback)(async (newValue) => {
41
+ const val = typeof newValue === 'function' ? newValue(value) : newValue;
42
+ await cacheManager.set(key, val, options);
43
+ setValueState(val);
44
+ }, [key, value, cacheManager, options]);
45
+ const clear = (0, react_1.useCallback)(() => cacheManager.remove(key, options), [key, cacheManager, options]);
46
+ const reset = (0, react_1.useCallback)(() => setValue(initialValue), [setValue, initialValue]);
47
+ return [
48
+ value,
49
+ setValue,
50
+ { clear, reset, isExpired }
51
+ ];
52
+ };
53
+ exports.useCacheState = useCacheState;
54
+ //# sourceMappingURL=useCacheState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCacheState.js","sourceRoot":"","sources":["../../../src/hooks/useCacheState.ts"],"names":[],"mappings":";;;AAAA,iCAAyD;AACzD,2EAAmE;AAG5D,MAAM,aAAa,GAAG,CAC3B,GAAW,EACX,YAAgB,EAChB,OAAsB,EACtB,EAAE;IACF,MAAM,EAAE,YAAY,EAAE,GAAG,IAAA,sCAAe,GAAE,CAAC;IAC3C,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,GAAG,IAAA,gBAAQ,EAAI,YAAiB,CAAC,CAAC;IAC9D,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAC;IAElD,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,OAAO,GAAG,IAAI,CAAC;QAEnB,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;YACtB,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,CAAI,GAAG,EAAE,OAAO,CAAC,CAAC;YACvD,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;oBACpB,aAAa,CAAC,MAAM,CAAC,CAAC;oBACtB,YAAY,CAAC,KAAK,CAAC,CAAC;gBACtB,CAAC;qBAAM,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;oBACtC,MAAM,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;gBACrD,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,EAAE,CAAC;QAEP,OAAO,GAAG,EAAE;YACV,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IAE/C,uBAAuB;IACvB,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,MAAM,WAAW,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE;YAClE,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;gBACvB,aAAa,CAAC,QAAQ,CAAC,CAAC;gBACxB,IAAI,QAAQ,KAAK,IAAI;oBAAE,YAAY,CAAC,IAAI,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;IAExB,MAAM,QAAQ,GAAG,IAAA,mBAAW,EAAC,KAAK,EAAE,QAA8B,EAAE,EAAE;QACpE,MAAM,GAAG,GAAG,OAAO,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAE,QAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACtF,MAAM,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QAC1C,aAAa,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IAExC,MAAM,KAAK,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IACjG,MAAM,KAAK,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,YAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IAEvF,OAAO;QACL,KAAK;QACL,QAAQ;QACR,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE;KACnB,CAAC;AACb,CAAC,CAAC;AAxDW,QAAA,aAAa,iBAwDxB"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useCacheValue = void 0;
4
+ const react_1 = require("react");
5
+ const BrowserCacheProvider_1 = require("../provider/BrowserCacheProvider");
6
+ const useCacheValue = (key, options) => {
7
+ const { cacheManager } = (0, BrowserCacheProvider_1.useCacheManager)();
8
+ const [value, setValue] = (0, react_1.useState)(null);
9
+ (0, react_1.useEffect)(() => {
10
+ let mounted = true;
11
+ const load = async () => {
12
+ const cached = await cacheManager.get(key, options);
13
+ if (mounted)
14
+ setValue(cached);
15
+ };
16
+ load();
17
+ return () => {
18
+ mounted = false;
19
+ };
20
+ }, [key, cacheManager, options]);
21
+ (0, react_1.useEffect)(() => {
22
+ const unsubscribe = cacheManager.subscribe((updatedKey, newValue) => {
23
+ if (updatedKey === key) {
24
+ setValue(newValue);
25
+ }
26
+ });
27
+ return () => unsubscribe();
28
+ }, [key, cacheManager]);
29
+ return value;
30
+ };
31
+ exports.useCacheValue = useCacheValue;
32
+ //# sourceMappingURL=useCacheValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCacheValue.js","sourceRoot":"","sources":["../../../src/hooks/useCacheValue.ts"],"names":[],"mappings":";;;AAAA,iCAA4C;AAC5C,2EAAmE;AAG5D,MAAM,aAAa,GAAG,CAAI,GAAW,EAAE,OAAsB,EAAE,EAAE;IACtE,MAAM,EAAE,YAAY,EAAE,GAAG,IAAA,sCAAe,GAAE,CAAC;IAC3C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAA,gBAAQ,EAAW,IAAI,CAAC,CAAC;IAEnD,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,OAAO,GAAG,IAAI,CAAC;QAEnB,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;YACtB,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,CAAI,GAAG,EAAE,OAAO,CAAC,CAAC;YACvD,IAAI,OAAO;gBAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC,CAAC;QAEF,IAAI,EAAE,CAAC;QAEP,OAAO,GAAG,EAAE;YACV,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IAEjC,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,MAAM,WAAW,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE;YAClE,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;gBACvB,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACrB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;IAExB,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AA7BW,QAAA,aAAa,iBA6BxB"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./types"), exports);
18
+ __exportStar(require("./core/cache-manager"), exports);
19
+ __exportStar(require("./provider/BrowserCacheProvider"), exports);
20
+ __exportStar(require("./hooks/useBrowserCache"), exports);
21
+ __exportStar(require("./hooks/useCacheState"), exports);
22
+ __exportStar(require("./hooks/useCacheValue"), exports);
23
+ __exportStar(require("./hooks/useCacheInvalidate"), exports);
24
+ __exportStar(require("./utils/prefetch"), exports);
25
+ __exportStar(require("./utils/hydrate"), exports);
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,uDAAqC;AACrC,kEAAgD;AAChD,0DAAwC;AACxC,wDAAsC;AACtC,wDAAsC;AACtC,6DAA2C;AAC3C,mDAAiC;AACjC,kDAAgC"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useCacheManager = exports.BrowserCacheProvider = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const cache_manager_1 = require("../core/cache-manager");
7
+ const BrowserCacheContext = (0, react_1.createContext)(null);
8
+ const BrowserCacheProvider = ({ children, config = {} }) => {
9
+ const mergedConfig = {
10
+ defaultStorage: config.defaultStorage || 'memory',
11
+ defaultTTL: config.defaultTTL || 1000 * 60 * 5, // 5 minutes
12
+ prefix: config.prefix || 'rbc_',
13
+ ...config
14
+ };
15
+ const cacheManager = (0, react_1.useMemo)(() => new cache_manager_1.CacheManager(mergedConfig), [mergedConfig]);
16
+ const value = {
17
+ cacheManager,
18
+ defaultTTL: mergedConfig.defaultTTL,
19
+ defaultStorage: mergedConfig.defaultStorage
20
+ };
21
+ return ((0, jsx_runtime_1.jsx)(BrowserCacheContext.Provider, { value: value, children: children }));
22
+ };
23
+ exports.BrowserCacheProvider = BrowserCacheProvider;
24
+ const useCacheManager = () => {
25
+ const context = (0, react_1.useContext)(BrowserCacheContext);
26
+ if (!context) {
27
+ throw new Error('useCacheManager must be used within a BrowserCacheProvider');
28
+ }
29
+ return context;
30
+ };
31
+ exports.useCacheManager = useCacheManager;
32
+ //# sourceMappingURL=BrowserCacheProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrowserCacheProvider.js","sourceRoot":"","sources":["../../../src/provider/BrowserCacheProvider.tsx"],"names":[],"mappings":";;;;AAAA,iCAA6E;AAC7E,yDAAqD;AASrD,MAAM,mBAAmB,GAAG,IAAA,qBAAa,EAAkC,IAAI,CAAC,CAAC;AAO1E,MAAM,oBAAoB,GAAwC,CAAC,EACxE,QAAQ,EACR,MAAM,GAAG,EAAE,EACZ,EAAE,EAAE;IACH,MAAM,YAAY,GAAsB;QACtC,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,QAAQ;QACjD,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI,GAAG,EAAE,GAAG,CAAC,EAAE,YAAY;QAC5D,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,MAAM;QAC/B,GAAG,MAAM;KACV,CAAC;IAEF,MAAM,YAAY,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE,CAAC,IAAI,4BAAY,CAAC,YAAY,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnF,MAAM,KAAK,GAA6B;QACtC,YAAY;QACZ,UAAU,EAAE,YAAY,CAAC,UAAU;QACnC,cAAc,EAAE,YAAY,CAAC,cAAc;KAC5C,CAAC;IAEF,OAAO,CACL,uBAAC,mBAAmB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YACvC,QAAQ,GACoB,CAChC,CAAC;AACJ,CAAC,CAAC;AAxBW,QAAA,oBAAoB,wBAwB/B;AAEK,MAAM,eAAe,GAAG,GAAG,EAAE;IAClC,MAAM,OAAO,GAAG,IAAA,kBAAU,EAAC,mBAAmB,CAAC,CAAC;IAChD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AANW,QAAA,eAAe,mBAM1B"}