@buoy-gg/storage 1.7.2

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 (187) hide show
  1. package/README.md +607 -0
  2. package/lib/commonjs/index.js +34 -0
  3. package/lib/commonjs/package.json +1 -0
  4. package/lib/commonjs/preset.js +94 -0
  5. package/lib/commonjs/storage/components/DiffViewer/DiffOptionsPanel.js +356 -0
  6. package/lib/commonjs/storage/components/DiffViewer/TreeDiffViewer.js +29 -0
  7. package/lib/commonjs/storage/components/DiffViewer/components/DiffSummary.js +121 -0
  8. package/lib/commonjs/storage/components/DiffViewer/modes/ThemedSplitView.js +419 -0
  9. package/lib/commonjs/storage/components/DiffViewer/themes/diffThemes.js +122 -0
  10. package/lib/commonjs/storage/components/GameUIStorageBrowser.js +924 -0
  11. package/lib/commonjs/storage/components/GameUIStorageStats.js +746 -0
  12. package/lib/commonjs/storage/components/MMKVInstanceInfoPanel.js +257 -0
  13. package/lib/commonjs/storage/components/MMKVInstanceSelector.js +418 -0
  14. package/lib/commonjs/storage/components/SelectionActionBar.js +224 -0
  15. package/lib/commonjs/storage/components/StorageActionButtons.js +239 -0
  16. package/lib/commonjs/storage/components/StorageActions.js +192 -0
  17. package/lib/commonjs/storage/components/StorageBrowserMode.js +31 -0
  18. package/lib/commonjs/storage/components/StorageEventDetailContent.js +1025 -0
  19. package/lib/commonjs/storage/components/StorageEventFilterView.js +141 -0
  20. package/lib/commonjs/storage/components/StorageEventListener.js +357 -0
  21. package/lib/commonjs/storage/components/StorageEventsSection.js +24 -0
  22. package/lib/commonjs/storage/components/StorageFilterCards.js +345 -0
  23. package/lib/commonjs/storage/components/StorageFilterViewV2.js +42 -0
  24. package/lib/commonjs/storage/components/StorageKeyCard.js +516 -0
  25. package/lib/commonjs/storage/components/StorageKeyRow.js +356 -0
  26. package/lib/commonjs/storage/components/StorageKeySection.js +105 -0
  27. package/lib/commonjs/storage/components/StorageKeyStats.js +344 -0
  28. package/lib/commonjs/storage/components/StorageModalWithTabs.js +871 -0
  29. package/lib/commonjs/storage/components/StorageSection.js +43 -0
  30. package/lib/commonjs/storage/hooks/useAsyncStorageKeys.js +126 -0
  31. package/lib/commonjs/storage/hooks/useMMKVInstances.js +221 -0
  32. package/lib/commonjs/storage/hooks/useMMKVKeys.js +362 -0
  33. package/lib/commonjs/storage/hooks/useTickEverySecond.js +21 -0
  34. package/lib/commonjs/storage/index.js +148 -0
  35. package/lib/commonjs/storage/types.js +5 -0
  36. package/lib/commonjs/storage/utils/AsyncStorageListener.js +510 -0
  37. package/lib/commonjs/storage/utils/MMKVInstanceRegistry.js +202 -0
  38. package/lib/commonjs/storage/utils/MMKVListener.js +380 -0
  39. package/lib/commonjs/storage/utils/clearAllStorage.js +47 -0
  40. package/lib/commonjs/storage/utils/index.js +180 -0
  41. package/lib/commonjs/storage/utils/lineDiff.js +363 -0
  42. package/lib/commonjs/storage/utils/mmkvAvailability.js +62 -0
  43. package/lib/commonjs/storage/utils/mmkvTypeDetection.js +139 -0
  44. package/lib/commonjs/storage/utils/objectDiff.js +157 -0
  45. package/lib/commonjs/storage/utils/safeAsyncStorage.js +140 -0
  46. package/lib/commonjs/storage/utils/storageActionHelpers.js +46 -0
  47. package/lib/commonjs/storage/utils/storageQueryUtils.js +35 -0
  48. package/lib/commonjs/storage/utils/valueType.js +18 -0
  49. package/lib/module/index.js +7 -0
  50. package/lib/module/preset.js +89 -0
  51. package/lib/module/storage/components/DiffViewer/DiffOptionsPanel.js +352 -0
  52. package/lib/module/storage/components/DiffViewer/TreeDiffViewer.js +25 -0
  53. package/lib/module/storage/components/DiffViewer/components/DiffSummary.js +117 -0
  54. package/lib/module/storage/components/DiffViewer/modes/ThemedSplitView.js +415 -0
  55. package/lib/module/storage/components/DiffViewer/themes/diffThemes.js +118 -0
  56. package/lib/module/storage/components/GameUIStorageBrowser.js +922 -0
  57. package/lib/module/storage/components/GameUIStorageStats.js +742 -0
  58. package/lib/module/storage/components/MMKVInstanceInfoPanel.js +253 -0
  59. package/lib/module/storage/components/MMKVInstanceSelector.js +414 -0
  60. package/lib/module/storage/components/SelectionActionBar.js +221 -0
  61. package/lib/module/storage/components/StorageActionButtons.js +236 -0
  62. package/lib/module/storage/components/StorageActions.js +189 -0
  63. package/lib/module/storage/components/StorageBrowserMode.js +27 -0
  64. package/lib/module/storage/components/StorageEventDetailContent.js +1020 -0
  65. package/lib/module/storage/components/StorageEventFilterView.js +137 -0
  66. package/lib/module/storage/components/StorageEventListener.js +354 -0
  67. package/lib/module/storage/components/StorageEventsSection.js +20 -0
  68. package/lib/module/storage/components/StorageFilterCards.js +341 -0
  69. package/lib/module/storage/components/StorageFilterViewV2.js +38 -0
  70. package/lib/module/storage/components/StorageKeyCard.js +513 -0
  71. package/lib/module/storage/components/StorageKeyRow.js +353 -0
  72. package/lib/module/storage/components/StorageKeySection.js +101 -0
  73. package/lib/module/storage/components/StorageKeyStats.js +340 -0
  74. package/lib/module/storage/components/StorageModalWithTabs.js +867 -0
  75. package/lib/module/storage/components/StorageSection.js +40 -0
  76. package/lib/module/storage/hooks/useAsyncStorageKeys.js +121 -0
  77. package/lib/module/storage/hooks/useMMKVInstances.js +216 -0
  78. package/lib/module/storage/hooks/useMMKVKeys.js +359 -0
  79. package/lib/module/storage/hooks/useTickEverySecond.js +18 -0
  80. package/lib/module/storage/index.js +25 -0
  81. package/lib/module/storage/types.js +3 -0
  82. package/lib/module/storage/utils/AsyncStorageListener.js +500 -0
  83. package/lib/module/storage/utils/MMKVInstanceRegistry.js +196 -0
  84. package/lib/module/storage/utils/MMKVListener.js +367 -0
  85. package/lib/module/storage/utils/clearAllStorage.js +42 -0
  86. package/lib/module/storage/utils/index.js +22 -0
  87. package/lib/module/storage/utils/lineDiff.js +359 -0
  88. package/lib/module/storage/utils/mmkvAvailability.js +56 -0
  89. package/lib/module/storage/utils/mmkvTypeDetection.js +133 -0
  90. package/lib/module/storage/utils/objectDiff.js +153 -0
  91. package/lib/module/storage/utils/safeAsyncStorage.js +134 -0
  92. package/lib/module/storage/utils/storageActionHelpers.js +42 -0
  93. package/lib/module/storage/utils/storageQueryUtils.js +30 -0
  94. package/lib/module/storage/utils/valueType.js +14 -0
  95. package/lib/typescript/index.d.ts +3 -0
  96. package/lib/typescript/index.d.ts.map +1 -0
  97. package/lib/typescript/preset.d.ts +90 -0
  98. package/lib/typescript/preset.d.ts.map +1 -0
  99. package/lib/typescript/storage/components/DiffViewer/DiffOptionsPanel.d.ts +18 -0
  100. package/lib/typescript/storage/components/DiffViewer/DiffOptionsPanel.d.ts.map +1 -0
  101. package/lib/typescript/storage/components/DiffViewer/TreeDiffViewer.d.ts +7 -0
  102. package/lib/typescript/storage/components/DiffViewer/TreeDiffViewer.d.ts.map +1 -0
  103. package/lib/typescript/storage/components/DiffViewer/components/DiffSummary.d.ts +12 -0
  104. package/lib/typescript/storage/components/DiffViewer/components/DiffSummary.d.ts.map +1 -0
  105. package/lib/typescript/storage/components/DiffViewer/modes/ThemedSplitView.d.ts +13 -0
  106. package/lib/typescript/storage/components/DiffViewer/modes/ThemedSplitView.d.ts.map +1 -0
  107. package/lib/typescript/storage/components/DiffViewer/themes/diffThemes.d.ts +64 -0
  108. package/lib/typescript/storage/components/DiffViewer/themes/diffThemes.d.ts.map +1 -0
  109. package/lib/typescript/storage/components/GameUIStorageBrowser.d.ts +16 -0
  110. package/lib/typescript/storage/components/GameUIStorageBrowser.d.ts.map +1 -0
  111. package/lib/typescript/storage/components/GameUIStorageStats.d.ts +7 -0
  112. package/lib/typescript/storage/components/GameUIStorageStats.d.ts.map +1 -0
  113. package/lib/typescript/storage/components/MMKVInstanceInfoPanel.d.ts +42 -0
  114. package/lib/typescript/storage/components/MMKVInstanceInfoPanel.d.ts.map +1 -0
  115. package/lib/typescript/storage/components/MMKVInstanceSelector.d.ts +35 -0
  116. package/lib/typescript/storage/components/MMKVInstanceSelector.d.ts.map +1 -0
  117. package/lib/typescript/storage/components/SelectionActionBar.d.ts +21 -0
  118. package/lib/typescript/storage/components/SelectionActionBar.d.ts.map +1 -0
  119. package/lib/typescript/storage/components/StorageActionButtons.d.ts +21 -0
  120. package/lib/typescript/storage/components/StorageActionButtons.d.ts.map +1 -0
  121. package/lib/typescript/storage/components/StorageActions.d.ts +10 -0
  122. package/lib/typescript/storage/components/StorageActions.d.ts.map +1 -0
  123. package/lib/typescript/storage/components/StorageBrowserMode.d.ts +18 -0
  124. package/lib/typescript/storage/components/StorageBrowserMode.d.ts.map +1 -0
  125. package/lib/typescript/storage/components/StorageEventDetailContent.d.ts +40 -0
  126. package/lib/typescript/storage/components/StorageEventDetailContent.d.ts.map +1 -0
  127. package/lib/typescript/storage/components/StorageEventFilterView.d.ts +11 -0
  128. package/lib/typescript/storage/components/StorageEventFilterView.d.ts.map +1 -0
  129. package/lib/typescript/storage/components/StorageEventListener.d.ts +6 -0
  130. package/lib/typescript/storage/components/StorageEventListener.d.ts.map +1 -0
  131. package/lib/typescript/storage/components/StorageEventsSection.d.ts +7 -0
  132. package/lib/typescript/storage/components/StorageEventsSection.d.ts.map +1 -0
  133. package/lib/typescript/storage/components/StorageFilterCards.d.ts +36 -0
  134. package/lib/typescript/storage/components/StorageFilterCards.d.ts.map +1 -0
  135. package/lib/typescript/storage/components/StorageFilterViewV2.d.ts +9 -0
  136. package/lib/typescript/storage/components/StorageFilterViewV2.d.ts.map +1 -0
  137. package/lib/typescript/storage/components/StorageKeyCard.d.ts +17 -0
  138. package/lib/typescript/storage/components/StorageKeyCard.d.ts.map +1 -0
  139. package/lib/typescript/storage/components/StorageKeyRow.d.ts +15 -0
  140. package/lib/typescript/storage/components/StorageKeyRow.d.ts.map +1 -0
  141. package/lib/typescript/storage/components/StorageKeySection.d.ts +25 -0
  142. package/lib/typescript/storage/components/StorageKeySection.d.ts.map +1 -0
  143. package/lib/typescript/storage/components/StorageKeyStats.d.ts +15 -0
  144. package/lib/typescript/storage/components/StorageKeyStats.d.ts.map +1 -0
  145. package/lib/typescript/storage/components/StorageModalWithTabs.d.ts +13 -0
  146. package/lib/typescript/storage/components/StorageModalWithTabs.d.ts.map +1 -0
  147. package/lib/typescript/storage/components/StorageSection.d.ts +10 -0
  148. package/lib/typescript/storage/components/StorageSection.d.ts.map +1 -0
  149. package/lib/typescript/storage/hooks/useAsyncStorageKeys.d.ts +10 -0
  150. package/lib/typescript/storage/hooks/useAsyncStorageKeys.d.ts.map +1 -0
  151. package/lib/typescript/storage/hooks/useMMKVInstances.d.ts +114 -0
  152. package/lib/typescript/storage/hooks/useMMKVInstances.d.ts.map +1 -0
  153. package/lib/typescript/storage/hooks/useMMKVKeys.d.ts +94 -0
  154. package/lib/typescript/storage/hooks/useMMKVKeys.d.ts.map +1 -0
  155. package/lib/typescript/storage/hooks/useTickEverySecond.d.ts +6 -0
  156. package/lib/typescript/storage/hooks/useTickEverySecond.d.ts.map +1 -0
  157. package/lib/typescript/storage/index.d.ts +15 -0
  158. package/lib/typescript/storage/index.d.ts.map +1 -0
  159. package/lib/typescript/storage/types.d.ts +41 -0
  160. package/lib/typescript/storage/types.d.ts.map +1 -0
  161. package/lib/typescript/storage/utils/AsyncStorageListener.d.ts +195 -0
  162. package/lib/typescript/storage/utils/AsyncStorageListener.d.ts.map +1 -0
  163. package/lib/typescript/storage/utils/MMKVInstanceRegistry.d.ts +224 -0
  164. package/lib/typescript/storage/utils/MMKVInstanceRegistry.d.ts.map +1 -0
  165. package/lib/typescript/storage/utils/MMKVListener.d.ts +218 -0
  166. package/lib/typescript/storage/utils/MMKVListener.d.ts.map +1 -0
  167. package/lib/typescript/storage/utils/clearAllStorage.d.ts +11 -0
  168. package/lib/typescript/storage/utils/clearAllStorage.d.ts.map +1 -0
  169. package/lib/typescript/storage/utils/index.d.ts +8 -0
  170. package/lib/typescript/storage/utils/index.d.ts.map +1 -0
  171. package/lib/typescript/storage/utils/lineDiff.d.ts +34 -0
  172. package/lib/typescript/storage/utils/lineDiff.d.ts.map +1 -0
  173. package/lib/typescript/storage/utils/mmkvAvailability.d.ts +23 -0
  174. package/lib/typescript/storage/utils/mmkvAvailability.d.ts.map +1 -0
  175. package/lib/typescript/storage/utils/mmkvTypeDetection.d.ts +71 -0
  176. package/lib/typescript/storage/utils/mmkvTypeDetection.d.ts.map +1 -0
  177. package/lib/typescript/storage/utils/objectDiff.d.ts +35 -0
  178. package/lib/typescript/storage/utils/objectDiff.d.ts.map +1 -0
  179. package/lib/typescript/storage/utils/safeAsyncStorage.d.ts +56 -0
  180. package/lib/typescript/storage/utils/safeAsyncStorage.d.ts.map +1 -0
  181. package/lib/typescript/storage/utils/storageActionHelpers.d.ts +5 -0
  182. package/lib/typescript/storage/utils/storageActionHelpers.d.ts.map +1 -0
  183. package/lib/typescript/storage/utils/storageQueryUtils.d.ts +6 -0
  184. package/lib/typescript/storage/utils/storageQueryUtils.d.ts.map +1 -0
  185. package/lib/typescript/storage/utils/valueType.d.ts +3 -0
  186. package/lib/typescript/storage/utils/valueType.d.ts.map +1 -0
  187. package/package.json +68 -0
@@ -0,0 +1,380 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.removeMMKVInstance = exports.removeAllMMKVListeners = exports.removeAllMMKVInstances = exports.mmkvListener = exports.isMMKVListening = exports.isMMKVInstanceMonitored = exports.getMonitoredMMKVInstances = exports.getMMKVListenerCount = exports.getMMKVInstanceCount = exports.default = exports.addMMKVListener = exports.addMMKVInstance = void 0;
7
+ var _mmkvTypeDetection = require("./mmkvTypeDetection");
8
+ /**
9
+ * MMKVListener - Hybrid Monitoring Strategy
10
+ *
11
+ * This module provides comprehensive monitoring for MMKV storage instances using
12
+ * a hybrid approach that combines:
13
+ *
14
+ * 1. MMKV's built-in addOnValueChangedListener() - for write operations
15
+ * 2. Method wrapping - for read operations and type detection
16
+ *
17
+ * Why Hybrid Strategy?
18
+ * - MMKV listeners only fire on writes (set/delete), not reads
19
+ * - MMKV listeners don't provide value type information
20
+ * - Method wrapping captures ALL operations with full context
21
+ * - Combining both gives complete observability
22
+ *
23
+ * Key Differences from AsyncStorage:
24
+ * - Synchronous API (no async/await needed)
25
+ * - Multi-instance support (track multiple MMKV instances)
26
+ * - Native types (string, number, boolean, buffer)
27
+ * - Built-in listener support (MMKV.addOnValueChangedListener)
28
+ *
29
+ * @see AsyncStorageListener.ts for AsyncStorage equivalent
30
+ */
31
+
32
+ // Use 'any' type for MMKV to avoid hard dependency on react-native-mmkv
33
+
34
+ // MMKV method signatures
35
+
36
+ /**
37
+ * Event types for MMKV operations
38
+ */
39
+
40
+ /**
41
+ * Instance tracking for MMKV monitoring
42
+ */
43
+
44
+ /**
45
+ * Singleton class for monitoring MMKV operations across multiple instances
46
+ *
47
+ * Uses a hybrid monitoring strategy:
48
+ * 1. MMKV's built-in listener API for write notifications
49
+ * 2. Method wrapping for read operations and type information
50
+ *
51
+ * @example
52
+ * ```typescript
53
+ * import { MMKV } from 'react-native-mmkv';
54
+ * import { mmkvListener } from './MMKVListener';
55
+ *
56
+ * const storage = new MMKV();
57
+ *
58
+ * // Start monitoring this instance
59
+ * mmkvListener.addInstance(storage, 'mmkv.default');
60
+ *
61
+ * // Add listener for all MMKV events
62
+ * const unsubscribe = mmkvListener.addListener((event) => {
63
+ * console.log(`[${event.instanceId}] ${event.action}:`, event.data);
64
+ * });
65
+ *
66
+ * // Cleanup
67
+ * unsubscribe();
68
+ * mmkvListener.removeInstance('mmkv.default');
69
+ * ```
70
+ */
71
+ class MMKVListener {
72
+ listeners = [];
73
+ instances = new Map();
74
+
75
+ // Keys to ignore to prevent dev tools from triggering self-events
76
+ ignoredKeys = new Set(["@react_buoy_storage_event_filters", "@react_buoy_storage_key_filters", "@react_buoy_storage_is_monitoring", "REACT_QUERY_OFFLINE_CACHE"]);
77
+
78
+ /**
79
+ * Determines if a storage key should be ignored
80
+ */
81
+ shouldIgnoreKey(key) {
82
+ if (this.ignoredKeys.has(key)) return true;
83
+ for (const ignoredKey of this.ignoredKeys) {
84
+ if (key.startsWith(ignoredKey)) return true;
85
+ }
86
+ return false;
87
+ }
88
+
89
+ /**
90
+ * Emit an MMKV event to all registered listeners
91
+ */
92
+ emit(event) {
93
+ if (this.listeners.length === 0) return;
94
+ this.listeners.forEach(listener => {
95
+ try {
96
+ listener(event);
97
+ } catch (error) {
98
+ // Error in MMKV event listener - continuing with others
99
+ }
100
+ });
101
+ }
102
+
103
+ /**
104
+ * Add an MMKV instance for monitoring
105
+ *
106
+ * This method sets up both native MMKV listeners and method wrapping
107
+ * to provide complete observability.
108
+ *
109
+ * @param instance - MMKV instance to monitor
110
+ * @param instanceId - Unique identifier for this instance
111
+ *
112
+ * @example
113
+ * ```typescript
114
+ * const storage = new MMKV();
115
+ * mmkvListener.addInstance(storage, 'mmkv.default');
116
+ *
117
+ * const secureStorage = new MMKV({ id: 'secure', encryptionKey: key });
118
+ * mmkvListener.addInstance(secureStorage, 'secure');
119
+ * ```
120
+ */
121
+ addInstance(instance, instanceId) {
122
+ // Check if already monitoring this instance
123
+ if (this.instances.has(instanceId)) {
124
+ return;
125
+ }
126
+
127
+ // v4 COMPATIBILITY: Use ONLY native listener (no method wrapping)
128
+ // react-native-mmkv v4 instances have frozen/read-only methods that cannot be wrapped
129
+ // The native listener (addOnValueChangedListener) is sufficient for monitoring writes
130
+
131
+ let nativeListenerUnsubscribe;
132
+ if (typeof instance.addOnValueChangedListener === "function") {
133
+ try {
134
+ nativeListenerUnsubscribe = instance.addOnValueChangedListener(key => {
135
+ // Ignore dev tools keys
136
+ if (this.shouldIgnoreKey(key)) return;
137
+
138
+ // Detect the value type
139
+ const {
140
+ value,
141
+ type
142
+ } = (0, _mmkvTypeDetection.detectMMKVType)(instance, key);
143
+
144
+ // Determine action: if value is undefined/unknown, it was deleted
145
+ const isDelete = type === "unknown" || value === undefined;
146
+ if (isDelete) {
147
+ // Key was deleted
148
+ const event = {
149
+ action: "delete",
150
+ timestamp: new Date(),
151
+ instanceId,
152
+ data: {
153
+ key,
154
+ success: true
155
+ }
156
+ };
157
+ this.emit(event);
158
+ } else {
159
+ // Key was set/updated
160
+ const action = type === "string" ? "set.string" : type === "number" ? "set.number" : type === "boolean" ? "set.boolean" : type === "buffer" ? "set.buffer" : "set.string"; // fallback
161
+
162
+ const event = {
163
+ action,
164
+ timestamp: new Date(),
165
+ instanceId,
166
+ data: {
167
+ key,
168
+ value,
169
+ valueType: type,
170
+ success: true
171
+ }
172
+ };
173
+ this.emit(event);
174
+ }
175
+ });
176
+ } catch (error) {
177
+ // Could not add native listener
178
+ }
179
+ }
180
+
181
+ // Store instance tracking (no originalMethods needed for v4)
182
+ this.instances.set(instanceId, {
183
+ instance,
184
+ instanceId,
185
+ originalMethods: {},
186
+ // Not used in v4
187
+ nativeListenerUnsubscribe
188
+ });
189
+ }
190
+
191
+ /**
192
+ * Remove an MMKV instance from monitoring
193
+ *
194
+ * Restores original methods and removes native listener.
195
+ *
196
+ * @param instanceId - Identifier of instance to stop monitoring
197
+ */
198
+ removeInstance(instanceId) {
199
+ const tracked = this.instances.get(instanceId);
200
+ if (!tracked) {
201
+ return;
202
+ }
203
+ const {
204
+ nativeListenerUnsubscribe
205
+ } = tracked;
206
+
207
+ // Remove native listener
208
+ if (nativeListenerUnsubscribe) {
209
+ nativeListenerUnsubscribe();
210
+ }
211
+
212
+ // Remove from tracking
213
+ this.instances.delete(instanceId);
214
+ }
215
+
216
+ /**
217
+ * Remove all monitored instances
218
+ */
219
+ removeAllInstances() {
220
+ const instanceIds = Array.from(this.instances.keys());
221
+ instanceIds.forEach(id => this.removeInstance(id));
222
+ }
223
+
224
+ /**
225
+ * Add a listener for MMKV events across all monitored instances
226
+ *
227
+ * @param listener - Callback function to handle MMKV events
228
+ * @returns Unsubscribe function to remove the listener
229
+ *
230
+ * @example
231
+ * ```typescript
232
+ * const unsubscribe = mmkvListener.addListener((event) => {
233
+ * console.log(`[${event.instanceId}] ${event.action}:`, event.data);
234
+ * });
235
+ *
236
+ * // Later, remove the listener
237
+ * unsubscribe();
238
+ * ```
239
+ */
240
+ addListener(listener) {
241
+ this.listeners.push(listener);
242
+
243
+ // Return unsubscribe function
244
+ return () => {
245
+ const index = this.listeners.indexOf(listener);
246
+ if (index > -1) {
247
+ this.listeners.splice(index, 1);
248
+ }
249
+ };
250
+ }
251
+
252
+ /**
253
+ * Remove all registered event listeners
254
+ */
255
+ removeAllListeners() {
256
+ this.listeners = [];
257
+ }
258
+
259
+ /**
260
+ * Check if an instance is currently being monitored
261
+ */
262
+ hasInstance(instanceId) {
263
+ return this.instances.has(instanceId);
264
+ }
265
+
266
+ /**
267
+ * Get list of all monitored instance IDs
268
+ */
269
+ getMonitoredInstances() {
270
+ return Array.from(this.instances.keys());
271
+ }
272
+
273
+ /**
274
+ * Get the number of currently monitored instances
275
+ */
276
+ get instanceCount() {
277
+ return this.instances.size;
278
+ }
279
+
280
+ /**
281
+ * Get the number of currently registered event listeners
282
+ */
283
+ get listenerCount() {
284
+ return this.listeners.length;
285
+ }
286
+
287
+ /**
288
+ * Check if any instances are being monitored
289
+ */
290
+ get isActive() {
291
+ return this.instances.size > 0;
292
+ }
293
+ }
294
+
295
+ /**
296
+ * Singleton instance of MMKVListener
297
+ *
298
+ * This ensures only one listener manager exists across the entire application.
299
+ */
300
+ const mmkvListener = exports.mmkvListener = new MMKVListener();
301
+
302
+ /**
303
+ * Add an MMKV instance for monitoring
304
+ *
305
+ * @param instance - MMKV instance to monitor
306
+ * @param instanceId - Unique identifier for this instance
307
+ *
308
+ * @example
309
+ * ```typescript
310
+ * import { MMKV } from 'react-native-mmkv';
311
+ * import { addMMKVInstance } from '@buoy-gg/storage';
312
+ *
313
+ * const storage = new MMKV();
314
+ * addMMKVInstance(storage, 'mmkv.default');
315
+ * ```
316
+ */
317
+ const addMMKVInstance = (instance, instanceId) => mmkvListener.addInstance(instance, instanceId);
318
+
319
+ /**
320
+ * Remove an MMKV instance from monitoring
321
+ */
322
+ exports.addMMKVInstance = addMMKVInstance;
323
+ const removeMMKVInstance = instanceId => mmkvListener.removeInstance(instanceId);
324
+
325
+ /**
326
+ * Remove all monitored MMKV instances
327
+ */
328
+ exports.removeMMKVInstance = removeMMKVInstance;
329
+ const removeAllMMKVInstances = () => mmkvListener.removeAllInstances();
330
+
331
+ /**
332
+ * Add an event listener for MMKV operations
333
+ *
334
+ * @param listener - Callback function to handle events
335
+ * @returns Unsubscribe function to remove the listener
336
+ */
337
+ exports.removeAllMMKVInstances = removeAllMMKVInstances;
338
+ const addMMKVListener = listener => mmkvListener.addListener(listener);
339
+
340
+ /**
341
+ * Remove all registered event listeners
342
+ */
343
+ exports.addMMKVListener = addMMKVListener;
344
+ const removeAllMMKVListeners = () => mmkvListener.removeAllListeners();
345
+
346
+ /**
347
+ * Check if an MMKV instance is currently being monitored
348
+ */
349
+ exports.removeAllMMKVListeners = removeAllMMKVListeners;
350
+ const isMMKVInstanceMonitored = instanceId => mmkvListener.hasInstance(instanceId);
351
+
352
+ /**
353
+ * Get list of all monitored MMKV instance IDs
354
+ */
355
+ exports.isMMKVInstanceMonitored = isMMKVInstanceMonitored;
356
+ const getMonitoredMMKVInstances = () => mmkvListener.getMonitoredInstances();
357
+
358
+ /**
359
+ * Get the current number of monitored MMKV instances
360
+ */
361
+ exports.getMonitoredMMKVInstances = getMonitoredMMKVInstances;
362
+ const getMMKVInstanceCount = () => mmkvListener.instanceCount;
363
+
364
+ /**
365
+ * Get the current number of registered event listeners
366
+ */
367
+ exports.getMMKVInstanceCount = getMMKVInstanceCount;
368
+ const getMMKVListenerCount = () => mmkvListener.listenerCount;
369
+
370
+ /**
371
+ * Check if any MMKV instances are being monitored
372
+ */
373
+ exports.getMMKVListenerCount = getMMKVListenerCount;
374
+ const isMMKVListening = () => mmkvListener.isActive;
375
+
376
+ /**
377
+ * Export the singleton instance for advanced usage
378
+ */
379
+ exports.isMMKVListening = isMMKVListening;
380
+ var _default = exports.default = mmkvListener;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.clearAllAppStorage = clearAllAppStorage;
7
+ exports.clearAllStorageIncludingDevTools = clearAllStorageIncludingDevTools;
8
+ var _asyncStorage = _interopRequireDefault(require("@react-native-async-storage/async-storage"));
9
+ var _sharedUi = require("@buoy-gg/shared-ui");
10
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
+ /**
12
+ * Clear all storage data except dev tools keys
13
+ * This preserves dev tool settings while clearing app data
14
+ */
15
+ async function clearAllAppStorage() {
16
+ // Get all keys
17
+ const allKeys = await _asyncStorage.default.getAllKeys();
18
+ if (!allKeys || allKeys.length === 0) {
19
+ // No keys to clear
20
+ return;
21
+ }
22
+
23
+ // Filter out dev tool keys - we don't want to clear those
24
+ const keysToRemove = allKeys.filter(key => !(0, _sharedUi.isDevToolsStorageKey)(key));
25
+ if (keysToRemove.length === 0) {
26
+ // No app keys to clear (only dev tool keys found)
27
+ return;
28
+ }
29
+
30
+ // Clearing ${keysToRemove.length} app storage keys
31
+
32
+ // Remove all non-dev-tool keys
33
+ await _asyncStorage.default.multiRemove(keysToRemove);
34
+
35
+ // Successfully cleared app storage
36
+ }
37
+
38
+ /**
39
+ * Clear absolutely all storage data including dev tools
40
+ * Use with caution - this will reset all dev tool settings
41
+ */
42
+ async function clearAllStorageIncludingDevTools() {
43
+ // Clear everything
44
+ await _asyncStorage.default.clear();
45
+
46
+ // Successfully cleared all storage including dev tools
47
+ }
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "addListener", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _AsyncStorageListener.addListener;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "addMMKVInstance", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _MMKVListener.addMMKVInstance;
16
+ }
17
+ });
18
+ Object.defineProperty(exports, "addMMKVListener", {
19
+ enumerable: true,
20
+ get: function () {
21
+ return _MMKVListener.addMMKVListener;
22
+ }
23
+ });
24
+ Object.defineProperty(exports, "asyncStorageListener", {
25
+ enumerable: true,
26
+ get: function () {
27
+ return _AsyncStorageListener.default;
28
+ }
29
+ });
30
+ Object.defineProperty(exports, "clearAllAppStorage", {
31
+ enumerable: true,
32
+ get: function () {
33
+ return _clearAllStorage.clearAllAppStorage;
34
+ }
35
+ });
36
+ Object.defineProperty(exports, "detectMMKVType", {
37
+ enumerable: true,
38
+ get: function () {
39
+ return _mmkvTypeDetection.detectMMKVType;
40
+ }
41
+ });
42
+ Object.defineProperty(exports, "formatMMKVValue", {
43
+ enumerable: true,
44
+ get: function () {
45
+ return _mmkvTypeDetection.formatMMKVValue;
46
+ }
47
+ });
48
+ Object.defineProperty(exports, "getListenerCount", {
49
+ enumerable: true,
50
+ get: function () {
51
+ return _AsyncStorageListener.getListenerCount;
52
+ }
53
+ });
54
+ Object.defineProperty(exports, "getMMKVClass", {
55
+ enumerable: true,
56
+ get: function () {
57
+ return _mmkvAvailability.getMMKVClass;
58
+ }
59
+ });
60
+ Object.defineProperty(exports, "getMMKVInstanceCount", {
61
+ enumerable: true,
62
+ get: function () {
63
+ return _MMKVListener.getMMKVInstanceCount;
64
+ }
65
+ });
66
+ Object.defineProperty(exports, "getMMKVListenerCount", {
67
+ enumerable: true,
68
+ get: function () {
69
+ return _MMKVListener.getMMKVListenerCount;
70
+ }
71
+ });
72
+ Object.defineProperty(exports, "getMMKVUnavailableMessage", {
73
+ enumerable: true,
74
+ get: function () {
75
+ return _mmkvAvailability.getMMKVUnavailableMessage;
76
+ }
77
+ });
78
+ Object.defineProperty(exports, "getMonitoredMMKVInstances", {
79
+ enumerable: true,
80
+ get: function () {
81
+ return _MMKVListener.getMonitoredMMKVInstances;
82
+ }
83
+ });
84
+ Object.defineProperty(exports, "isListening", {
85
+ enumerable: true,
86
+ get: function () {
87
+ return _AsyncStorageListener.isListening;
88
+ }
89
+ });
90
+ Object.defineProperty(exports, "isMMKVAvailable", {
91
+ enumerable: true,
92
+ get: function () {
93
+ return _mmkvAvailability.isMMKVAvailable;
94
+ }
95
+ });
96
+ Object.defineProperty(exports, "isMMKVInstanceMonitored", {
97
+ enumerable: true,
98
+ get: function () {
99
+ return _MMKVListener.isMMKVInstanceMonitored;
100
+ }
101
+ });
102
+ Object.defineProperty(exports, "isMMKVListening", {
103
+ enumerable: true,
104
+ get: function () {
105
+ return _MMKVListener.isMMKVListening;
106
+ }
107
+ });
108
+ Object.defineProperty(exports, "isTypeMatch", {
109
+ enumerable: true,
110
+ get: function () {
111
+ return _mmkvTypeDetection.isTypeMatch;
112
+ }
113
+ });
114
+ Object.defineProperty(exports, "mmkvInstanceRegistry", {
115
+ enumerable: true,
116
+ get: function () {
117
+ return _MMKVInstanceRegistry.mmkvInstanceRegistry;
118
+ }
119
+ });
120
+ Object.defineProperty(exports, "mmkvListener", {
121
+ enumerable: true,
122
+ get: function () {
123
+ return _MMKVListener.mmkvListener;
124
+ }
125
+ });
126
+ Object.defineProperty(exports, "registerMMKVInstance", {
127
+ enumerable: true,
128
+ get: function () {
129
+ return _MMKVInstanceRegistry.registerMMKVInstance;
130
+ }
131
+ });
132
+ Object.defineProperty(exports, "removeAllListeners", {
133
+ enumerable: true,
134
+ get: function () {
135
+ return _AsyncStorageListener.removeAllListeners;
136
+ }
137
+ });
138
+ Object.defineProperty(exports, "removeAllMMKVInstances", {
139
+ enumerable: true,
140
+ get: function () {
141
+ return _MMKVListener.removeAllMMKVInstances;
142
+ }
143
+ });
144
+ Object.defineProperty(exports, "removeAllMMKVListeners", {
145
+ enumerable: true,
146
+ get: function () {
147
+ return _MMKVListener.removeAllMMKVListeners;
148
+ }
149
+ });
150
+ Object.defineProperty(exports, "removeMMKVInstance", {
151
+ enumerable: true,
152
+ get: function () {
153
+ return _MMKVListener.removeMMKVInstance;
154
+ }
155
+ });
156
+ Object.defineProperty(exports, "startListening", {
157
+ enumerable: true,
158
+ get: function () {
159
+ return _AsyncStorageListener.startListening;
160
+ }
161
+ });
162
+ Object.defineProperty(exports, "stopListening", {
163
+ enumerable: true,
164
+ get: function () {
165
+ return _AsyncStorageListener.stopListening;
166
+ }
167
+ });
168
+ Object.defineProperty(exports, "unregisterMMKVInstance", {
169
+ enumerable: true,
170
+ get: function () {
171
+ return _MMKVInstanceRegistry.unregisterMMKVInstance;
172
+ }
173
+ });
174
+ var _clearAllStorage = require("./clearAllStorage");
175
+ var _mmkvAvailability = require("./mmkvAvailability");
176
+ var _AsyncStorageListener = _interopRequireWildcard(require("./AsyncStorageListener"));
177
+ var _MMKVInstanceRegistry = require("./MMKVInstanceRegistry");
178
+ var _MMKVListener = require("./MMKVListener");
179
+ var _mmkvTypeDetection = require("./mmkvTypeDetection");
180
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }