@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,362 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useMMKVKeys = useMMKVKeys;
7
+ exports.useMultiMMKVKeys = useMultiMMKVKeys;
8
+ var _react = require("react");
9
+ var _mmkvAvailability = require("../utils/mmkvAvailability");
10
+ /**
11
+ * useMMKVKeys Hook
12
+ *
13
+ * Fetch and validate MMKV keys from a specific MMKV instance.
14
+ * Equivalent to useAsyncStorageKeys but for MMKV storage.
15
+ *
16
+ * Key Differences from AsyncStorage:
17
+ * - Synchronous API (getAllKeys(), getString(), etc.)
18
+ * - Native types (string, number, boolean, buffer) vs string-only
19
+ * - Multi-instance support (requires instanceId parameter)
20
+ * - No multiGet - must fetch keys individually
21
+ */
22
+
23
+ // Conditionally import MMKV types
24
+ // Use 'any' to avoid hard dependency on react-native-mmkv
25
+
26
+ // Conditionally import utilities only if MMKV is available
27
+ let detectMMKVType;
28
+ let isTypeMatch;
29
+ if ((0, _mmkvAvailability.isMMKVAvailable)()) {
30
+ const typeDetection = require('../utils/mmkvTypeDetection');
31
+ detectMMKVType = typeDetection.detectMMKVType;
32
+ isTypeMatch = typeDetection.isTypeMatch;
33
+ }
34
+ /**
35
+ * Hook to fetch and monitor keys from an MMKV instance
36
+ *
37
+ * @param instance - MMKV instance to monitor
38
+ * @param instanceId - Unique identifier for this instance (e.g., "mmkv.default", "secure")
39
+ * @param requiredStorageKeys - Optional array of required keys for validation
40
+ *
41
+ * @example
42
+ * ```typescript
43
+ * import { MMKV } from 'react-native-mmkv';
44
+ * import { useMMKVKeys } from '@buoy-gg/storage';
45
+ *
46
+ * const storage = new MMKV();
47
+ *
48
+ * function MyComponent() {
49
+ * const { storageKeys, isLoading, error, refresh } = useMMKVKeys(
50
+ * storage,
51
+ * 'mmkv.default',
52
+ * [
53
+ * 'user.token',
54
+ * { key: 'user.id', expectedType: 'number' },
55
+ * { key: 'app.theme', expectedValue: 'dark' }
56
+ * ]
57
+ * );
58
+ *
59
+ * if (isLoading) return <LoadingSpinner />;
60
+ * if (error) return <ErrorMessage error={error} />;
61
+ *
62
+ * return (
63
+ * <View>
64
+ * {storageKeys.map(keyInfo => (
65
+ * <StorageKeyCard key={keyInfo.key} keyInfo={keyInfo} />
66
+ * ))}
67
+ * <Button onPress={refresh}>Refresh</Button>
68
+ * </View>
69
+ * );
70
+ * }
71
+ * ```
72
+ */
73
+ function useMMKVKeys(instance, instanceId, requiredStorageKeys = []) {
74
+ // State management
75
+ const [storageKeys, setStorageKeys] = (0, _react.useState)([]);
76
+ const [isLoading, setIsLoading] = (0, _react.useState)(true);
77
+ const [error, setError] = (0, _react.useState)(null);
78
+
79
+ // Fetch all keys and values from MMKV instance
80
+ const fetchStorageData = (0, _react.useCallback)(() => {
81
+ setIsLoading(true);
82
+ setError(null);
83
+ try {
84
+ // Guard: Check if MMKV is available
85
+ if (!(0, _mmkvAvailability.isMMKVAvailable)()) {
86
+ setStorageKeys([]);
87
+ setIsLoading(false);
88
+ return; // Silently return empty when MMKV not available
89
+ }
90
+
91
+ // Guard: Check if instance is provided
92
+ if (!instance) {
93
+ setStorageKeys([]);
94
+ setIsLoading(false);
95
+ return; // Silently return empty when no instance
96
+ }
97
+
98
+ // 1. Get all keys from MMKV (synchronous)
99
+ const allKeys = instance.getAllKeys();
100
+ if (!allKeys || allKeys.length === 0) {
101
+ // Still need to check for missing required keys
102
+ const missingRequiredKeys = requiredStorageKeys.map(req => {
103
+ const key = typeof req === 'string' ? req : req.key;
104
+ const description = typeof req === 'object' && 'description' in req ? req.description : undefined;
105
+ const expectedValue = typeof req === 'object' && 'expectedValue' in req ? req.expectedValue : undefined;
106
+ const expectedType = typeof req === 'object' && 'expectedType' in req ? req.expectedType : undefined;
107
+ return {
108
+ key,
109
+ value: undefined,
110
+ valueType: undefined,
111
+ storageType: 'mmkv',
112
+ instanceId,
113
+ status: 'required_missing',
114
+ category: 'required',
115
+ description,
116
+ expectedValue,
117
+ expectedType
118
+ };
119
+ });
120
+ setStorageKeys(missingRequiredKeys);
121
+ setIsLoading(false);
122
+ return;
123
+ }
124
+
125
+ // 2. Process each key to get value and type
126
+ const allStorageKeys = [];
127
+ allKeys.forEach(key => {
128
+ // Detect value and type using type detection utility
129
+ const {
130
+ value,
131
+ type
132
+ } = detectMMKVType(instance, key);
133
+
134
+ // Check if this is a required key
135
+ const requiredConfig = requiredStorageKeys.find(req => {
136
+ if (typeof req === 'string') return req === key;
137
+ return req.key === key;
138
+ });
139
+
140
+ // Determine status based on validation rules
141
+ let status = 'optional_present';
142
+ if (requiredConfig) {
143
+ if (value === undefined) {
144
+ status = 'required_missing';
145
+ } else if (typeof requiredConfig === 'object' && 'expectedValue' in requiredConfig) {
146
+ // Value validation
147
+ status = String(value) === String(requiredConfig.expectedValue) ? 'required_present' : 'required_wrong_value';
148
+ } else if (typeof requiredConfig === 'object' && 'expectedType' in requiredConfig) {
149
+ // Type validation
150
+ status = isTypeMatch(type, requiredConfig.expectedType) ? 'required_present' : 'required_wrong_type';
151
+ } else {
152
+ // Key exists and is required (no specific validation)
153
+ status = 'required_present';
154
+ }
155
+ }
156
+
157
+ // Build StorageKeyInfo object
158
+ const keyInfo = {
159
+ key,
160
+ value,
161
+ valueType: type !== 'unknown' ? type : undefined,
162
+ storageType: 'mmkv',
163
+ instanceId,
164
+ status,
165
+ category: requiredConfig ? 'required' : 'optional',
166
+ lastUpdated: new Date(),
167
+ ...(typeof requiredConfig === 'object' && 'expectedValue' in requiredConfig && {
168
+ expectedValue: requiredConfig.expectedValue
169
+ }),
170
+ ...(typeof requiredConfig === 'object' && 'expectedType' in requiredConfig && {
171
+ expectedType: requiredConfig.expectedType
172
+ }),
173
+ ...(typeof requiredConfig === 'object' && 'description' in requiredConfig && {
174
+ description: requiredConfig.description
175
+ })
176
+ };
177
+ allStorageKeys.push(keyInfo);
178
+ });
179
+
180
+ // 3. Add missing required keys that weren't found in storage
181
+ requiredStorageKeys.forEach(req => {
182
+ const key = typeof req === 'string' ? req : req.key;
183
+ const exists = allStorageKeys.some(k => k.key === key);
184
+ if (!exists) {
185
+ allStorageKeys.push({
186
+ key,
187
+ value: undefined,
188
+ valueType: undefined,
189
+ storageType: 'mmkv',
190
+ instanceId,
191
+ status: 'required_missing',
192
+ category: 'required',
193
+ ...(typeof req === 'object' && 'expectedValue' in req && {
194
+ expectedValue: req.expectedValue
195
+ }),
196
+ ...(typeof req === 'object' && 'expectedType' in req && {
197
+ expectedType: req.expectedType
198
+ }),
199
+ ...(typeof req === 'object' && 'description' in req && {
200
+ description: req.description
201
+ })
202
+ });
203
+ }
204
+ });
205
+ setStorageKeys(allStorageKeys);
206
+ } catch (err) {
207
+ setError(err instanceof Error ? err : new Error('Failed to fetch MMKV storage data'));
208
+ setStorageKeys([]);
209
+ } finally {
210
+ setIsLoading(false);
211
+ }
212
+ }, [instance, instanceId, requiredStorageKeys]);
213
+
214
+ // Initial fetch
215
+ (0, _react.useEffect)(() => {
216
+ fetchStorageData();
217
+ }, [fetchStorageData]);
218
+ return {
219
+ storageKeys,
220
+ isLoading,
221
+ error,
222
+ refresh: fetchStorageData
223
+ };
224
+ }
225
+
226
+ /**
227
+ * Hook to fetch keys from multiple MMKV instances
228
+ *
229
+ * @param instances - Array of MMKV instances with their IDs
230
+ * @param requiredStorageKeys - Optional array of required keys for validation
231
+ *
232
+ * @example
233
+ * ```typescript
234
+ * import { MMKV } from 'react-native-mmkv';
235
+ * import { useMultiMMKVKeys } from '@buoy-gg/storage';
236
+ *
237
+ * const defaultStorage = new MMKV();
238
+ * const secureStorage = new MMKV({ id: 'secure', encryptionKey: key });
239
+ *
240
+ * function MyComponent() {
241
+ * const { storageKeys, isLoading, error } = useMultiMMKVKeys(
242
+ * [
243
+ * { instance: defaultStorage, id: 'mmkv.default' },
244
+ * { instance: secureStorage, id: 'secure' }
245
+ * ],
246
+ * ['user.token', 'app.theme']
247
+ * );
248
+ *
249
+ * // storageKeys will contain keys from both instances
250
+ * // with instanceId field to identify which instance each key belongs to
251
+ * }
252
+ * ```
253
+ */
254
+ function useMultiMMKVKeys(instances, requiredStorageKeys = []) {
255
+ const [storageKeys, setStorageKeys] = (0, _react.useState)([]);
256
+ const [isLoading, setIsLoading] = (0, _react.useState)(true);
257
+ const [error, setError] = (0, _react.useState)(null);
258
+ const fetchStorageData = (0, _react.useCallback)(() => {
259
+ setIsLoading(true);
260
+ setError(null);
261
+ try {
262
+ const allStorageKeys = [];
263
+
264
+ // Fetch keys from each instance
265
+ instances.forEach(({
266
+ instance,
267
+ id
268
+ }) => {
269
+ const allKeys = instance.getAllKeys();
270
+ if (!allKeys || allKeys.length === 0) {
271
+ return;
272
+ }
273
+ allKeys.forEach(key => {
274
+ const {
275
+ value,
276
+ type
277
+ } = detectMMKVType(instance, key);
278
+ const requiredConfig = requiredStorageKeys.find(req => {
279
+ if (typeof req === 'string') return req === key;
280
+ return req.key === key;
281
+ });
282
+ let status = 'optional_present';
283
+ if (requiredConfig) {
284
+ if (value === undefined) {
285
+ status = 'required_missing';
286
+ } else if (typeof requiredConfig === 'object' && 'expectedValue' in requiredConfig) {
287
+ status = String(value) === String(requiredConfig.expectedValue) ? 'required_present' : 'required_wrong_value';
288
+ } else if (typeof requiredConfig === 'object' && 'expectedType' in requiredConfig) {
289
+ status = isTypeMatch(type, requiredConfig.expectedType) ? 'required_present' : 'required_wrong_type';
290
+ } else {
291
+ status = 'required_present';
292
+ }
293
+ }
294
+ const keyInfo = {
295
+ key,
296
+ value,
297
+ valueType: type !== 'unknown' ? type : undefined,
298
+ storageType: 'mmkv',
299
+ instanceId: id,
300
+ status,
301
+ category: requiredConfig ? 'required' : 'optional',
302
+ lastUpdated: new Date(),
303
+ ...(typeof requiredConfig === 'object' && 'expectedValue' in requiredConfig && {
304
+ expectedValue: requiredConfig.expectedValue
305
+ }),
306
+ ...(typeof requiredConfig === 'object' && 'expectedType' in requiredConfig && {
307
+ expectedType: requiredConfig.expectedType
308
+ }),
309
+ ...(typeof requiredConfig === 'object' && 'description' in requiredConfig && {
310
+ description: requiredConfig.description
311
+ })
312
+ };
313
+ allStorageKeys.push(keyInfo);
314
+ });
315
+ });
316
+
317
+ // Add missing required keys
318
+ requiredStorageKeys.forEach(req => {
319
+ const key = typeof req === 'string' ? req : req.key;
320
+ const exists = allStorageKeys.some(k => k.key === key);
321
+ if (!exists) {
322
+ // Add missing key for first instance (or all instances?)
323
+ // For now, add to first instance
324
+ const firstInstanceId = instances[0]?.id || 'mmkv.default';
325
+ allStorageKeys.push({
326
+ key,
327
+ value: undefined,
328
+ valueType: undefined,
329
+ storageType: 'mmkv',
330
+ instanceId: firstInstanceId,
331
+ status: 'required_missing',
332
+ category: 'required',
333
+ ...(typeof req === 'object' && 'expectedValue' in req && {
334
+ expectedValue: req.expectedValue
335
+ }),
336
+ ...(typeof req === 'object' && 'expectedType' in req && {
337
+ expectedType: req.expectedType
338
+ }),
339
+ ...(typeof req === 'object' && 'description' in req && {
340
+ description: req.description
341
+ })
342
+ });
343
+ }
344
+ });
345
+ setStorageKeys(allStorageKeys);
346
+ } catch (err) {
347
+ setError(err instanceof Error ? err : new Error('Failed to fetch multi-MMKV storage data'));
348
+ setStorageKeys([]);
349
+ } finally {
350
+ setIsLoading(false);
351
+ }
352
+ }, [instances, requiredStorageKeys]);
353
+ (0, _react.useEffect)(() => {
354
+ fetchStorageData();
355
+ }, [fetchStorageData]);
356
+ return {
357
+ storageKeys,
358
+ isLoading,
359
+ error,
360
+ refresh: fetchStorageData
361
+ };
362
+ }
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useTickEverySecond = useTickEverySecond;
7
+ var _react = require("react");
8
+ /**
9
+ * Hook that forces a re-render every second
10
+ * Used to update relative timestamps (e.g., "2s ago", "1m ago")
11
+ */
12
+ function useTickEverySecond(enabled = true) {
13
+ const [, setTick] = (0, _react.useState)(0);
14
+ (0, _react.useEffect)(() => {
15
+ if (!enabled) return;
16
+ const interval = setInterval(() => {
17
+ setTick(prev => prev + 1);
18
+ }, 1000);
19
+ return () => clearInterval(interval);
20
+ }, [enabled]);
21
+ }
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ var _exportNames = {
7
+ StorageSection: true,
8
+ StorageModalWithTabs: true,
9
+ StorageKeyCard: true,
10
+ StorageKeyStatsSection: true,
11
+ StorageKeySection: true,
12
+ StorageBrowserMode: true,
13
+ StorageEventsSection: true,
14
+ useAsyncStorageKeys: true,
15
+ useMMKVKeys: true,
16
+ useMultiMMKVKeys: true,
17
+ useMMKVInstances: true,
18
+ useMMKVInstance: true,
19
+ useMMKVInstanceExists: true,
20
+ MMKVInstanceSelector: true,
21
+ MMKVInstanceInfoPanel: true
22
+ };
23
+ Object.defineProperty(exports, "MMKVInstanceInfoPanel", {
24
+ enumerable: true,
25
+ get: function () {
26
+ return _MMKVInstanceInfoPanel.MMKVInstanceInfoPanel;
27
+ }
28
+ });
29
+ Object.defineProperty(exports, "MMKVInstanceSelector", {
30
+ enumerable: true,
31
+ get: function () {
32
+ return _MMKVInstanceSelector.MMKVInstanceSelector;
33
+ }
34
+ });
35
+ Object.defineProperty(exports, "StorageBrowserMode", {
36
+ enumerable: true,
37
+ get: function () {
38
+ return _StorageBrowserMode.StorageBrowserMode;
39
+ }
40
+ });
41
+ Object.defineProperty(exports, "StorageEventsSection", {
42
+ enumerable: true,
43
+ get: function () {
44
+ return _StorageEventsSection.StorageEventsSection;
45
+ }
46
+ });
47
+ Object.defineProperty(exports, "StorageKeyCard", {
48
+ enumerable: true,
49
+ get: function () {
50
+ return _StorageKeyCard.StorageKeyCard;
51
+ }
52
+ });
53
+ Object.defineProperty(exports, "StorageKeySection", {
54
+ enumerable: true,
55
+ get: function () {
56
+ return _StorageKeySection.StorageKeySection;
57
+ }
58
+ });
59
+ Object.defineProperty(exports, "StorageKeyStatsSection", {
60
+ enumerable: true,
61
+ get: function () {
62
+ return _StorageKeyStats.StorageKeyStatsSection;
63
+ }
64
+ });
65
+ Object.defineProperty(exports, "StorageModalWithTabs", {
66
+ enumerable: true,
67
+ get: function () {
68
+ return _StorageModalWithTabs.StorageModalWithTabs;
69
+ }
70
+ });
71
+ Object.defineProperty(exports, "StorageSection", {
72
+ enumerable: true,
73
+ get: function () {
74
+ return _StorageSection.StorageSection;
75
+ }
76
+ });
77
+ Object.defineProperty(exports, "useAsyncStorageKeys", {
78
+ enumerable: true,
79
+ get: function () {
80
+ return _useAsyncStorageKeys.useAsyncStorageKeys;
81
+ }
82
+ });
83
+ Object.defineProperty(exports, "useMMKVInstance", {
84
+ enumerable: true,
85
+ get: function () {
86
+ return _useMMKVInstances.useMMKVInstance;
87
+ }
88
+ });
89
+ Object.defineProperty(exports, "useMMKVInstanceExists", {
90
+ enumerable: true,
91
+ get: function () {
92
+ return _useMMKVInstances.useMMKVInstanceExists;
93
+ }
94
+ });
95
+ Object.defineProperty(exports, "useMMKVInstances", {
96
+ enumerable: true,
97
+ get: function () {
98
+ return _useMMKVInstances.useMMKVInstances;
99
+ }
100
+ });
101
+ Object.defineProperty(exports, "useMMKVKeys", {
102
+ enumerable: true,
103
+ get: function () {
104
+ return _useMMKVKeys.useMMKVKeys;
105
+ }
106
+ });
107
+ Object.defineProperty(exports, "useMultiMMKVKeys", {
108
+ enumerable: true,
109
+ get: function () {
110
+ return _useMMKVKeys.useMultiMMKVKeys;
111
+ }
112
+ });
113
+ var _StorageSection = require("./components/StorageSection");
114
+ var _StorageModalWithTabs = require("./components/StorageModalWithTabs");
115
+ var _StorageKeyCard = require("./components/StorageKeyCard");
116
+ var _StorageKeyStats = require("./components/StorageKeyStats");
117
+ var _StorageKeySection = require("./components/StorageKeySection");
118
+ var _StorageBrowserMode = require("./components/StorageBrowserMode");
119
+ var _StorageEventsSection = require("./components/StorageEventsSection");
120
+ var _useAsyncStorageKeys = require("./hooks/useAsyncStorageKeys");
121
+ var _useMMKVKeys = require("./hooks/useMMKVKeys");
122
+ var _useMMKVInstances = require("./hooks/useMMKVInstances");
123
+ var _MMKVInstanceSelector = require("./components/MMKVInstanceSelector");
124
+ var _MMKVInstanceInfoPanel = require("./components/MMKVInstanceInfoPanel");
125
+ var _types = require("./types");
126
+ Object.keys(_types).forEach(function (key) {
127
+ if (key === "default" || key === "__esModule") return;
128
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
129
+ if (key in exports && exports[key] === _types[key]) return;
130
+ Object.defineProperty(exports, key, {
131
+ enumerable: true,
132
+ get: function () {
133
+ return _types[key];
134
+ }
135
+ });
136
+ });
137
+ var _utils = require("./utils");
138
+ Object.keys(_utils).forEach(function (key) {
139
+ if (key === "default" || key === "__esModule") return;
140
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
141
+ if (key in exports && exports[key] === _utils[key]) return;
142
+ Object.defineProperty(exports, key, {
143
+ enumerable: true,
144
+ get: function () {
145
+ return _utils[key];
146
+ }
147
+ });
148
+ });
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });