@buoy-gg/storage 7.0.41 → 7.0.43

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 (180) hide show
  1. package/README.md +11 -90
  2. package/lib/commonjs/index.js +1 -353
  3. package/lib/commonjs/preset.js +1 -85
  4. package/lib/commonjs/storage/components/DiffViewer/TreeDiffViewer.js +1 -36
  5. package/lib/commonjs/storage/components/DiffViewer/modes/ThemedSplitView.js +1 -12
  6. package/lib/commonjs/storage/components/DiffViewer/themes/diffThemes.js +1 -24
  7. package/lib/commonjs/storage/components/GameUIStorageBrowser.js +3 -1259
  8. package/lib/commonjs/storage/components/MMKVInstanceInfoPanel.js +1 -257
  9. package/lib/commonjs/storage/components/MMKVInstanceSelector.js +1 -419
  10. package/lib/commonjs/storage/components/SelectionActionBar.js +1 -207
  11. package/lib/commonjs/storage/components/StorageActionButtons.js +1 -242
  12. package/lib/commonjs/storage/components/StorageBrowserMode.js +1 -61
  13. package/lib/commonjs/storage/components/StorageEventActionButton.js +1 -121
  14. package/lib/commonjs/storage/components/StorageEventCard.js +1 -118
  15. package/lib/commonjs/storage/components/StorageEventDetailContent.js +1 -494
  16. package/lib/commonjs/storage/components/StorageEventFilterView.js +1 -160
  17. package/lib/commonjs/storage/components/StorageEventsSection.js +1 -24
  18. package/lib/commonjs/storage/components/StorageFilterCards.js +1 -231
  19. package/lib/commonjs/storage/components/StorageKeyCard.js +1 -520
  20. package/lib/commonjs/storage/components/StorageKeyDetailScreen.js +1 -579
  21. package/lib/commonjs/storage/components/StorageKeyRow.js +1 -559
  22. package/lib/commonjs/storage/components/StorageKeySection.js +1 -160
  23. package/lib/commonjs/storage/components/StorageKeyStats.js +1 -345
  24. package/lib/commonjs/storage/components/StorageModalWithTabs.js +1 -954
  25. package/lib/commonjs/storage/components/StorageSaveNotice.js +1 -171
  26. package/lib/commonjs/storage/components/StorageSection.js +1 -43
  27. package/lib/commonjs/storage/components/StorageTypeFilterBar.js +1 -144
  28. package/lib/commonjs/storage/hooks/useAsyncStorageKeys.js +1 -141
  29. package/lib/commonjs/storage/hooks/useMMKVInstances.js +1 -210
  30. package/lib/commonjs/storage/hooks/useMMKVKeys.js +1 -376
  31. package/lib/commonjs/storage/hooks/useSecureStoreKeys.js +1 -202
  32. package/lib/commonjs/storage/hooks/useStorageEvents.js +1 -61
  33. package/lib/commonjs/storage/stores/storageEventStore.js +1 -312
  34. package/lib/commonjs/storage/sync/storageSyncAdapter.js +1 -492
  35. package/lib/commonjs/storage/types.js +1 -5
  36. package/lib/commonjs/storage/utils/AsyncStorageListener.js +1 -691
  37. package/lib/commonjs/storage/utils/AsyncStorageListener.web.js +1 -89
  38. package/lib/commonjs/storage/utils/MMKVInstanceRegistry.js +1 -203
  39. package/lib/commonjs/storage/utils/MMKVListener.js +1 -416
  40. package/lib/commonjs/storage/utils/SecureStoreRegistry.js +1 -200
  41. package/lib/commonjs/storage/utils/asyncStorageCompat.js +1 -89
  42. package/lib/commonjs/storage/utils/browserStorageLifecycle.js +1 -10
  43. package/lib/commonjs/storage/utils/browserStorageLifecycle.web.js +1 -70
  44. package/lib/commonjs/storage/utils/clearAllStorage.js +1 -48
  45. package/lib/commonjs/storage/utils/deleteStorageKeys.js +1 -82
  46. package/lib/commonjs/storage/utils/lineDiff.js +1 -30
  47. package/lib/commonjs/storage/utils/mmkvAvailability.js +1 -62
  48. package/lib/commonjs/storage/utils/mmkvAvailability.web.js +1 -21
  49. package/lib/commonjs/storage/utils/mmkvTypeDetection.js +1 -154
  50. package/lib/commonjs/storage/utils/requiredStorageKeyScope.js +1 -17
  51. package/lib/commonjs/storage/utils/setStorageValue.js +1 -218
  52. package/lib/commonjs/storage/utils/snapshotProvider.js +1 -382
  53. package/lib/commonjs/storage/utils/storageActionHelpers.js +1 -46
  54. package/lib/commonjs/storage/utils/storageBrowserRefresh.js +1 -49
  55. package/lib/commonjs/storage/utils/storageLabels.js +1 -13
  56. package/lib/commonjs/storage/utils/storageLabels.web.js +1 -13
  57. package/lib/commonjs/storage/utils/storageOps.js +1 -53
  58. package/lib/commonjs/storage/utils/storageQueryUtils.js +1 -35
  59. package/lib/commonjs/storage/utils/storageTimeTravelUtils.js +1 -288
  60. package/lib/commonjs/storage/utils/valueType.js +1 -83
  61. package/lib/module/index.js +1 -114
  62. package/lib/module/preset.js +1 -82
  63. package/lib/module/storage/components/DiffViewer/TreeDiffViewer.js +1 -32
  64. package/lib/module/storage/components/DiffViewer/modes/ThemedSplitView.js +1 -9
  65. package/lib/module/storage/components/DiffViewer/themes/diffThemes.js +1 -10
  66. package/lib/module/storage/components/GameUIStorageBrowser.js +3 -1257
  67. package/lib/module/storage/components/MMKVInstanceInfoPanel.js +1 -253
  68. package/lib/module/storage/components/MMKVInstanceSelector.js +1 -415
  69. package/lib/module/storage/components/SelectionActionBar.js +1 -204
  70. package/lib/module/storage/components/StorageActionButtons.js +1 -238
  71. package/lib/module/storage/components/StorageBrowserMode.js +1 -57
  72. package/lib/module/storage/components/StorageEventActionButton.js +1 -118
  73. package/lib/module/storage/components/StorageEventCard.js +1 -113
  74. package/lib/module/storage/components/StorageEventDetailContent.js +1 -490
  75. package/lib/module/storage/components/StorageEventFilterView.js +1 -156
  76. package/lib/module/storage/components/StorageEventsSection.js +1 -20
  77. package/lib/module/storage/components/StorageFilterCards.js +1 -227
  78. package/lib/module/storage/components/StorageKeyCard.js +1 -517
  79. package/lib/module/storage/components/StorageKeyDetailScreen.js +1 -577
  80. package/lib/module/storage/components/StorageKeyRow.js +1 -554
  81. package/lib/module/storage/components/StorageKeySection.js +1 -155
  82. package/lib/module/storage/components/StorageKeyStats.js +1 -342
  83. package/lib/module/storage/components/StorageModalWithTabs.js +1 -949
  84. package/lib/module/storage/components/StorageSaveNotice.js +1 -168
  85. package/lib/module/storage/components/StorageSection.js +1 -40
  86. package/lib/module/storage/components/StorageTypeFilterBar.js +1 -139
  87. package/lib/module/storage/hooks/useAsyncStorageKeys.js +1 -136
  88. package/lib/module/storage/hooks/useMMKVInstances.js +1 -204
  89. package/lib/module/storage/hooks/useMMKVKeys.js +1 -371
  90. package/lib/module/storage/hooks/useSecureStoreKeys.js +1 -199
  91. package/lib/module/storage/hooks/useStorageEvents.js +1 -58
  92. package/lib/module/storage/stores/storageEventStore.js +1 -301
  93. package/lib/module/storage/sync/storageSyncAdapter.js +1 -486
  94. package/lib/module/storage/types.js +1 -3
  95. package/lib/module/storage/utils/AsyncStorageListener.js +1 -679
  96. package/lib/module/storage/utils/AsyncStorageListener.web.js +1 -76
  97. package/lib/module/storage/utils/MMKVInstanceRegistry.js +1 -197
  98. package/lib/module/storage/utils/MMKVListener.js +1 -403
  99. package/lib/module/storage/utils/SecureStoreRegistry.js +1 -194
  100. package/lib/module/storage/utils/asyncStorageCompat.js +1 -81
  101. package/lib/module/storage/utils/browserStorageLifecycle.js +1 -6
  102. package/lib/module/storage/utils/browserStorageLifecycle.web.js +1 -66
  103. package/lib/module/storage/utils/clearAllStorage.js +1 -43
  104. package/lib/module/storage/utils/deleteStorageKeys.js +1 -78
  105. package/lib/module/storage/utils/lineDiff.js +1 -12
  106. package/lib/module/storage/utils/mmkvAvailability.js +1 -56
  107. package/lib/module/storage/utils/mmkvAvailability.web.js +1 -15
  108. package/lib/module/storage/utils/mmkvTypeDetection.js +1 -148
  109. package/lib/module/storage/utils/requiredStorageKeyScope.js +1 -13
  110. package/lib/module/storage/utils/setStorageValue.js +1 -209
  111. package/lib/module/storage/utils/snapshotProvider.js +1 -380
  112. package/lib/module/storage/utils/storageActionHelpers.js +1 -42
  113. package/lib/module/storage/utils/storageBrowserRefresh.js +1 -44
  114. package/lib/module/storage/utils/storageLabels.js +1 -9
  115. package/lib/module/storage/utils/storageLabels.web.js +1 -9
  116. package/lib/module/storage/utils/storageOps.js +1 -46
  117. package/lib/module/storage/utils/storageQueryUtils.js +1 -30
  118. package/lib/module/storage/utils/storageTimeTravelUtils.js +1 -281
  119. package/lib/module/storage/utils/valueType.js +1 -76
  120. package/lib/web/index.mjs +2 -3
  121. package/package.json +6 -10
  122. package/lib/typescript/index.d.ts.map +0 -1
  123. package/lib/typescript/preset.d.ts.map +0 -1
  124. package/lib/typescript/storage/components/DiffViewer/TreeDiffViewer.d.ts.map +0 -1
  125. package/lib/typescript/storage/components/DiffViewer/modes/ThemedSplitView.d.ts.map +0 -1
  126. package/lib/typescript/storage/components/DiffViewer/themes/diffThemes.d.ts.map +0 -1
  127. package/lib/typescript/storage/components/GameUIStorageBrowser.d.ts.map +0 -1
  128. package/lib/typescript/storage/components/MMKVInstanceInfoPanel.d.ts.map +0 -1
  129. package/lib/typescript/storage/components/MMKVInstanceSelector.d.ts.map +0 -1
  130. package/lib/typescript/storage/components/SelectionActionBar.d.ts.map +0 -1
  131. package/lib/typescript/storage/components/StorageActionButtons.d.ts.map +0 -1
  132. package/lib/typescript/storage/components/StorageBrowserMode.d.ts.map +0 -1
  133. package/lib/typescript/storage/components/StorageEventActionButton.d.ts.map +0 -1
  134. package/lib/typescript/storage/components/StorageEventCard.d.ts.map +0 -1
  135. package/lib/typescript/storage/components/StorageEventDetailContent.d.ts.map +0 -1
  136. package/lib/typescript/storage/components/StorageEventFilterView.d.ts.map +0 -1
  137. package/lib/typescript/storage/components/StorageEventsSection.d.ts.map +0 -1
  138. package/lib/typescript/storage/components/StorageFilterCards.d.ts.map +0 -1
  139. package/lib/typescript/storage/components/StorageKeyCard.d.ts.map +0 -1
  140. package/lib/typescript/storage/components/StorageKeyDetailScreen.d.ts.map +0 -1
  141. package/lib/typescript/storage/components/StorageKeyRow.d.ts.map +0 -1
  142. package/lib/typescript/storage/components/StorageKeySection.d.ts.map +0 -1
  143. package/lib/typescript/storage/components/StorageKeyStats.d.ts.map +0 -1
  144. package/lib/typescript/storage/components/StorageModalWithTabs.d.ts.map +0 -1
  145. package/lib/typescript/storage/components/StorageSaveNotice.d.ts.map +0 -1
  146. package/lib/typescript/storage/components/StorageSection.d.ts.map +0 -1
  147. package/lib/typescript/storage/components/StorageTypeFilterBar.d.ts.map +0 -1
  148. package/lib/typescript/storage/hooks/useAsyncStorageKeys.d.ts.map +0 -1
  149. package/lib/typescript/storage/hooks/useMMKVInstances.d.ts.map +0 -1
  150. package/lib/typescript/storage/hooks/useMMKVKeys.d.ts.map +0 -1
  151. package/lib/typescript/storage/hooks/useSecureStoreKeys.d.ts.map +0 -1
  152. package/lib/typescript/storage/hooks/useStorageEvents.d.ts.map +0 -1
  153. package/lib/typescript/storage/stores/storageEventStore.d.ts.map +0 -1
  154. package/lib/typescript/storage/sync/storageSyncAdapter.d.ts.map +0 -1
  155. package/lib/typescript/storage/types.d.ts.map +0 -1
  156. package/lib/typescript/storage/utils/AsyncStorageListener.d.ts.map +0 -1
  157. package/lib/typescript/storage/utils/AsyncStorageListener.web.d.ts.map +0 -1
  158. package/lib/typescript/storage/utils/MMKVInstanceRegistry.d.ts.map +0 -1
  159. package/lib/typescript/storage/utils/MMKVListener.d.ts.map +0 -1
  160. package/lib/typescript/storage/utils/SecureStoreRegistry.d.ts.map +0 -1
  161. package/lib/typescript/storage/utils/asyncStorageCompat.d.ts.map +0 -1
  162. package/lib/typescript/storage/utils/browserStorageLifecycle.d.ts.map +0 -1
  163. package/lib/typescript/storage/utils/browserStorageLifecycle.web.d.ts.map +0 -1
  164. package/lib/typescript/storage/utils/clearAllStorage.d.ts.map +0 -1
  165. package/lib/typescript/storage/utils/deleteStorageKeys.d.ts.map +0 -1
  166. package/lib/typescript/storage/utils/lineDiff.d.ts.map +0 -1
  167. package/lib/typescript/storage/utils/mmkvAvailability.d.ts.map +0 -1
  168. package/lib/typescript/storage/utils/mmkvAvailability.web.d.ts.map +0 -1
  169. package/lib/typescript/storage/utils/mmkvTypeDetection.d.ts.map +0 -1
  170. package/lib/typescript/storage/utils/requiredStorageKeyScope.d.ts.map +0 -1
  171. package/lib/typescript/storage/utils/setStorageValue.d.ts.map +0 -1
  172. package/lib/typescript/storage/utils/snapshotProvider.d.ts.map +0 -1
  173. package/lib/typescript/storage/utils/storageActionHelpers.d.ts.map +0 -1
  174. package/lib/typescript/storage/utils/storageBrowserRefresh.d.ts.map +0 -1
  175. package/lib/typescript/storage/utils/storageLabels.d.ts.map +0 -1
  176. package/lib/typescript/storage/utils/storageLabels.web.d.ts.map +0 -1
  177. package/lib/typescript/storage/utils/storageOps.d.ts.map +0 -1
  178. package/lib/typescript/storage/utils/storageQueryUtils.d.ts.map +0 -1
  179. package/lib/typescript/storage/utils/storageTimeTravelUtils.d.ts.map +0 -1
  180. package/lib/typescript/storage/utils/valueType.d.ts.map +0 -1
@@ -1,210 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.useMMKVInstance = useMMKVInstance;
7
- exports.useMMKVInstanceExists = useMMKVInstanceExists;
8
- exports.useMMKVInstances = useMMKVInstances;
9
- var _react = require("react");
10
- var _MMKVInstanceRegistry = require("../utils/MMKVInstanceRegistry");
11
- /**
12
- * useMMKVInstances Hook
13
- *
14
- * React hook to monitor all registered MMKV instances and their metadata.
15
- * Works with MMKVInstanceRegistry to provide UI components with instance information.
16
- *
17
- * This hook enables:
18
- * - Multi-instance dropdown/selector UI
19
- * - Instance metadata display (encrypted, readOnly, key count)
20
- * - Dynamic updates when instances are added/removed
21
- *
22
- * @see MMKVInstanceRegistry.ts for instance registration
23
- */
24
-
25
- // The registry is pure JS (no react-native-mmkv dependency) — import it
26
- // unconditionally so registered instances show up even without the native
27
- // module (e.g. remote-backed wrappers on the desktop dashboard).
28
-
29
- /**
30
- * Metadata about an MMKV instance with additional runtime information
31
- */
32
-
33
- /**
34
- * Hook to monitor all registered MMKV instances
35
- *
36
- * @param autoRefresh - If true, refreshes every 1 second to detect new instances
37
- *
38
- * @returns Object containing instances array, count, and refresh function
39
- *
40
- * @example
41
- * ```typescript
42
- * import { useMMKVInstances } from '@buoy-gg/storage';
43
- *
44
- * function MMKVInstanceSelector() {
45
- * const { instances, instanceCount, refresh } = useMMKVInstances();
46
- *
47
- * return (
48
- * <View>
49
- * <Text>Found {instanceCount} MMKV instances</Text>
50
- * {instances.map(inst => (
51
- * <TouchableOpacity key={inst.id} onPress={() => selectInstance(inst)}>
52
- * <Text>{inst.id}</Text>
53
- * <Text>{inst.keyCount} keys</Text>
54
- * {inst.encrypted && <Text>🔒 Encrypted</Text>}
55
- * {inst.readOnly && <Text>👁️ Read-only</Text>}
56
- * </TouchableOpacity>
57
- * ))}
58
- * <Button onPress={refresh}>Refresh</Button>
59
- * </View>
60
- * );
61
- * }
62
- * ```
63
- */
64
- function useMMKVInstances(autoRefresh = false) {
65
- const [instances, setInstances] = (0, _react.useState)([]);
66
- const [isLoading, setIsLoading] = (0, _react.useState)(true);
67
-
68
- // Fetch all instances and their metadata
69
- const fetchInstances = () => {
70
- setIsLoading(true);
71
- try {
72
- const allInstances = _MMKVInstanceRegistry.mmkvInstanceRegistry.getAll();
73
-
74
- // Enhance with metadata
75
- const instancesWithMetadata = allInstances.map(instanceInfo => {
76
- const {
77
- instance,
78
- id,
79
- encrypted,
80
- readOnly
81
- } = instanceInfo;
82
-
83
- // Get key count
84
- const keys = instance.getAllKeys();
85
- const keyCount = keys?.length || 0;
86
-
87
- // Get size if available (MMKV might not expose this directly)
88
- // For now, we don't have a direct way to get size
89
- const size = undefined;
90
- return {
91
- id,
92
- instance,
93
- encrypted,
94
- readOnly,
95
- keyCount,
96
- size
97
- };
98
- });
99
- setInstances(instancesWithMetadata);
100
- } catch (error) {
101
- setInstances([]);
102
- } finally {
103
- setIsLoading(false);
104
- }
105
- };
106
-
107
- // Initial fetch
108
- (0, _react.useEffect)(() => {
109
- fetchInstances();
110
- }, []);
111
-
112
- // Auto-refresh if enabled
113
- (0, _react.useEffect)(() => {
114
- if (!autoRefresh) return;
115
- const interval = setInterval(() => {
116
- fetchInstances();
117
- }, 1000); // Refresh every second
118
-
119
- return () => clearInterval(interval);
120
- }, [autoRefresh]);
121
- return {
122
- instances,
123
- instanceCount: instances.length,
124
- isLoading,
125
- refresh: fetchInstances
126
- };
127
- }
128
-
129
- /**
130
- * Hook to monitor a single MMKV instance by ID
131
- *
132
- * @param instanceId - ID of the instance to monitor
133
- *
134
- * @returns Instance metadata or null if not found
135
- *
136
- * @example
137
- * ```typescript
138
- * function MMKVInstanceDetail({ instanceId }: { instanceId: string }) {
139
- * const instance = useMMKVInstance(instanceId);
140
- *
141
- * if (!instance) {
142
- * return <Text>Instance not found</Text>;
143
- * }
144
- *
145
- * return (
146
- * <View>
147
- * <Text>ID: {instance.id}</Text>
148
- * <Text>Keys: {instance.keyCount}</Text>
149
- * <Text>Encrypted: {instance.encrypted ? 'Yes' : 'No'}</Text>
150
- * <Text>Read-only: {instance.readOnly ? 'Yes' : 'No'}</Text>
151
- * </View>
152
- * );
153
- * }
154
- * ```
155
- */
156
- function useMMKVInstance(instanceId) {
157
- const [instance, setInstance] = (0, _react.useState)(null);
158
- (0, _react.useEffect)(() => {
159
- if (!_MMKVInstanceRegistry.mmkvInstanceRegistry) {
160
- setInstance(null);
161
- return;
162
- }
163
- const instanceInfo = _MMKVInstanceRegistry.mmkvInstanceRegistry.get(instanceId);
164
- if (!instanceInfo) {
165
- setInstance(null);
166
- return;
167
- }
168
- const keys = instanceInfo.instance.getAllKeys();
169
- const keyCount = keys?.length || 0;
170
- setInstance({
171
- ...instanceInfo,
172
- keyCount,
173
- size: undefined
174
- });
175
- }, [instanceId]);
176
- return instance;
177
- }
178
-
179
- /**
180
- * Hook to check if a specific instance ID is registered
181
- *
182
- * @param instanceId - ID to check
183
- *
184
- * @returns True if instance is registered
185
- *
186
- * @example
187
- * ```typescript
188
- * function MMKVStatus({ instanceId }: { instanceId: string }) {
189
- * const isRegistered = useMMKVInstanceExists(instanceId);
190
- *
191
- * return (
192
- * <View>
193
- * <Text>{instanceId}</Text>
194
- * <Text>{isRegistered ? '✅ Registered' : '❌ Not registered'}</Text>
195
- * </View>
196
- * );
197
- * }
198
- * ```
199
- */
200
- function useMMKVInstanceExists(instanceId) {
201
- const [exists, setExists] = (0, _react.useState)(false);
202
- (0, _react.useEffect)(() => {
203
- if (!_MMKVInstanceRegistry.mmkvInstanceRegistry) {
204
- setExists(false);
205
- return;
206
- }
207
- setExists(_MMKVInstanceRegistry.mmkvInstanceRegistry.has(instanceId));
208
- }, [instanceId]);
209
- return exists;
210
- }
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.useMMKVInstance=useMMKVInstance;exports.useMMKVInstanceExists=useMMKVInstanceExists;exports.useMMKVInstances=useMMKVInstances;var _react=require("react");var _MMKVInstanceRegistry=require("../utils/MMKVInstanceRegistry");function useMMKVInstances(t=false){const[s,e]=(0,_react.useState)([]);const[n,c]=(0,_react.useState)(true);const r=()=>{c(true);try{const a=_MMKVInstanceRegistry.mmkvInstanceRegistry.getAll();const i=a.map(l=>{const{instance:u,id:o,encrypted:f,readOnly:I}=l;const y=u.getAllKeys();const M=y?.length||0;const g=void 0;return{id:o,instance:u,encrypted:f,readOnly:I,keyCount:M,size:g}});e(i)}catch(a){e([])}finally{c(false)}};(0,_react.useEffect)(()=>{r()},[]);(0,_react.useEffect)(()=>{if(!t)return;const a=setInterval(()=>{r()},1e3);return()=>clearInterval(a)},[t]);return{instances:s,instanceCount:s.length,isLoading:n,refresh:r}}function useMMKVInstance(t){const[s,e]=(0,_react.useState)(null);(0,_react.useEffect)(()=>{if(!_MMKVInstanceRegistry.mmkvInstanceRegistry){e(null);return}const n=_MMKVInstanceRegistry.mmkvInstanceRegistry.get(t);if(!n){e(null);return}const c=n.instance.getAllKeys();const r=c?.length||0;e({...n,keyCount:r,size:void 0})},[t]);return s}function useMMKVInstanceExists(t){const[s,e]=(0,_react.useState)(false);(0,_react.useEffect)(()=>{if(!_MMKVInstanceRegistry.mmkvInstanceRegistry){e(false);return}e(_MMKVInstanceRegistry.mmkvInstanceRegistry.has(t))},[t]);return s}
@@ -1,376 +1 @@
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 _requiredStorageKeyScope = require("../utils/requiredStorageKeyScope");
10
- var _mmkvTypeDetection = require("../utils/mmkvTypeDetection");
11
- /**
12
- * useMMKVKeys Hook
13
- *
14
- * Fetch and validate MMKV keys from a specific MMKV instance.
15
- * Equivalent to useAsyncStorageKeys but for MMKV storage.
16
- *
17
- * Key Differences from AsyncStorage:
18
- * - Synchronous API (getAllKeys(), getString(), etc.)
19
- * - Native types (string, number, boolean, buffer) vs string-only
20
- * - Multi-instance support (requires instanceId parameter)
21
- * - No multiGet - must fetch keys individually
22
- */
23
-
24
- // Pure-JS utilities (no react-native-mmkv dependency) — safe to import
25
- // unconditionally. They operate on whatever instance objects are registered,
26
- // including remote-backed wrappers on the desktop dashboard.
27
-
28
- // Conditionally import MMKV types
29
- // Use 'any' to avoid hard dependency on react-native-mmkv
30
-
31
- /**
32
- * Hook to fetch and monitor keys from an MMKV instance
33
- *
34
- * @param instance - MMKV instance to monitor
35
- * @param instanceId - Unique identifier for this instance (e.g., "mmkv.default", "secure")
36
- * @param requiredStorageKeys - Optional array of required keys for validation
37
- *
38
- * @example
39
- * ```typescript
40
- * import { MMKV } from 'react-native-mmkv';
41
- * import { useMMKVKeys } from '@buoy-gg/storage';
42
- *
43
- * const storage = new MMKV();
44
- *
45
- * function MyComponent() {
46
- * const { storageKeys, isLoading, error, refresh } = useMMKVKeys(
47
- * storage,
48
- * 'mmkv.default',
49
- * [
50
- * 'user.token',
51
- * { key: 'user.id', expectedType: 'number' },
52
- * { key: 'app.theme', expectedValue: 'dark' }
53
- * ]
54
- * );
55
- *
56
- * if (isLoading) return <LoadingSpinner />;
57
- * if (error) return <ErrorMessage error={error} />;
58
- *
59
- * return (
60
- * <View>
61
- * {storageKeys.map(keyInfo => (
62
- * <StorageKeyCard key={keyInfo.key} keyInfo={keyInfo} />
63
- * ))}
64
- * <Button onPress={refresh}>Refresh</Button>
65
- * </View>
66
- * );
67
- * }
68
- * ```
69
- */
70
- function useMMKVKeys(instance, instanceId, requiredStorageKeys = []) {
71
- // State management
72
- const [storageKeys, setStorageKeys] = (0, _react.useState)([]);
73
- const [isLoading, setIsLoading] = (0, _react.useState)(true);
74
- const [error, setError] = (0, _react.useState)(null);
75
-
76
- // Depend on a stable content signature rather than the array identity — a
77
- // fresh `requiredStorageKeys` literal each render would otherwise loop the
78
- // fetch effect. Read the latest array via ref inside the fetch.
79
- const requiredSignature = JSON.stringify(requiredStorageKeys);
80
- const requiredRef = (0, _react.useRef)(requiredStorageKeys);
81
- requiredRef.current = requiredStorageKeys;
82
-
83
- // Fetch all keys and values from MMKV instance
84
- const fetchStorageData = (0, _react.useCallback)(() => {
85
- const requiredStorageKeys = requiredRef.current;
86
- setIsLoading(true);
87
- setError(null);
88
- try {
89
- // Guard: Check if instance is provided. (No isMMKVAvailable() gate —
90
- // registered instances may be remote-backed wrappers with no native
91
- // module, e.g. on the desktop dashboard.)
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 scoped to MMKV
102
- const missingRequiredKeys = requiredStorageKeys.filter(req => (0, _requiredStorageKeyScope.requiredKeyAppliesTo)(req, 'mmkv')).map(req => {
103
- const key = typeof req === 'string' ? req : req.key;
104
- const description = typeof req === 'object' ? req.description : undefined;
105
- const expectedValue = typeof req === 'object' ? req.expectedValue : undefined;
106
- const expectedType = typeof req === 'object' ? 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
- } = (0, _mmkvTypeDetection.detectMMKVType)(instance, key);
133
-
134
- // Check if this is a required key scoped to MMKV
135
- const requiredConfig = requiredStorageKeys.find(req => {
136
- if (!(0, _requiredStorageKeyScope.requiredKeyAppliesTo)(req, 'mmkv')) return false;
137
- if (typeof req === 'string') return req === key;
138
- return req.key === key;
139
- });
140
-
141
- // Determine status based on validation rules
142
- let status = 'optional_present';
143
- if (requiredConfig) {
144
- if (value === undefined) {
145
- status = 'required_missing';
146
- } else if (typeof requiredConfig === 'object' && requiredConfig.expectedValue !== undefined) {
147
- // Value validation
148
- status = String(value) === String(requiredConfig.expectedValue) ? 'required_present' : 'required_wrong_value';
149
- } else if (typeof requiredConfig === 'object' && requiredConfig.expectedType !== undefined) {
150
- // Type validation
151
- status = (0, _mmkvTypeDetection.isTypeMatch)(type, requiredConfig.expectedType) ? 'required_present' : 'required_wrong_type';
152
- } else {
153
- // Key exists and is required (no specific validation)
154
- status = 'required_present';
155
- }
156
- }
157
-
158
- // Build StorageKeyInfo object
159
- const keyInfo = {
160
- key,
161
- value,
162
- valueType: type !== 'unknown' ? type : undefined,
163
- storageType: 'mmkv',
164
- instanceId,
165
- status,
166
- category: requiredConfig ? 'required' : 'optional',
167
- lastUpdated: new Date(),
168
- ...(typeof requiredConfig === 'object' && requiredConfig.expectedValue !== undefined && {
169
- expectedValue: requiredConfig.expectedValue
170
- }),
171
- ...(typeof requiredConfig === 'object' && requiredConfig.expectedType !== undefined && {
172
- expectedType: requiredConfig.expectedType
173
- }),
174
- ...(typeof requiredConfig === 'object' && requiredConfig.description !== undefined && {
175
- description: requiredConfig.description
176
- })
177
- };
178
- allStorageKeys.push(keyInfo);
179
- });
180
-
181
- // 3. Add missing required keys that weren't found in storage
182
- requiredStorageKeys.forEach(req => {
183
- if (!(0, _requiredStorageKeyScope.requiredKeyAppliesTo)(req, 'mmkv')) return;
184
- const key = typeof req === 'string' ? req : req.key;
185
- const exists = allStorageKeys.some(k => k.key === key);
186
- if (!exists) {
187
- allStorageKeys.push({
188
- key,
189
- value: undefined,
190
- valueType: undefined,
191
- storageType: 'mmkv',
192
- instanceId,
193
- status: 'required_missing',
194
- category: 'required',
195
- ...(typeof req === 'object' && req.expectedValue !== undefined && {
196
- expectedValue: req.expectedValue
197
- }),
198
- ...(typeof req === 'object' && req.expectedType !== undefined && {
199
- expectedType: req.expectedType
200
- }),
201
- ...(typeof req === 'object' && req.description !== undefined && {
202
- description: req.description
203
- })
204
- });
205
- }
206
- });
207
- setStorageKeys(allStorageKeys);
208
- } catch (err) {
209
- setError(err instanceof Error ? err : new Error('Failed to fetch MMKV storage data'));
210
- setStorageKeys([]);
211
- } finally {
212
- setIsLoading(false);
213
- }
214
- // eslint-disable-next-line react-hooks/exhaustive-deps
215
- }, [instance, instanceId, requiredSignature]);
216
-
217
- // Initial fetch
218
- (0, _react.useEffect)(() => {
219
- fetchStorageData();
220
- }, [fetchStorageData]);
221
- return {
222
- storageKeys,
223
- isLoading,
224
- error,
225
- refresh: fetchStorageData
226
- };
227
- }
228
-
229
- /**
230
- * Hook to fetch keys from multiple MMKV instances
231
- *
232
- * @param instances - Array of MMKV instances with their IDs
233
- * @param requiredStorageKeys - Optional array of required keys for validation
234
- *
235
- * @example
236
- * ```typescript
237
- * import { MMKV } from 'react-native-mmkv';
238
- * import { useMultiMMKVKeys } from '@buoy-gg/storage';
239
- *
240
- * const defaultStorage = new MMKV();
241
- * const secureStorage = new MMKV({ id: 'secure', encryptionKey: key });
242
- *
243
- * function MyComponent() {
244
- * const { storageKeys, isLoading, error } = useMultiMMKVKeys(
245
- * [
246
- * { instance: defaultStorage, id: 'mmkv.default' },
247
- * { instance: secureStorage, id: 'secure' }
248
- * ],
249
- * ['user.token', 'app.theme']
250
- * );
251
- *
252
- * // storageKeys will contain keys from both instances
253
- * // with instanceId field to identify which instance each key belongs to
254
- * }
255
- * ```
256
- */
257
- function useMultiMMKVKeys(instances, requiredStorageKeys = []) {
258
- const [storageKeys, setStorageKeys] = (0, _react.useState)([]);
259
- const [isLoading, setIsLoading] = (0, _react.useState)(true);
260
- const [error, setError] = (0, _react.useState)(null);
261
-
262
- // Depend on a stable content signature rather than the array identity — a
263
- // fresh `requiredStorageKeys` literal each render would otherwise loop the
264
- // fetch effect. Read the latest array via ref inside the fetch.
265
- const requiredSignature = JSON.stringify(requiredStorageKeys);
266
- const requiredRef = (0, _react.useRef)(requiredStorageKeys);
267
- requiredRef.current = requiredStorageKeys;
268
- const fetchStorageData = (0, _react.useCallback)(() => {
269
- const requiredStorageKeys = requiredRef.current;
270
- setIsLoading(true);
271
- setError(null);
272
- try {
273
- const allStorageKeys = [];
274
-
275
- // Fetch keys from each instance
276
- instances.forEach(({
277
- instance,
278
- id
279
- }) => {
280
- const allKeys = instance.getAllKeys();
281
- if (!allKeys || allKeys.length === 0) {
282
- return;
283
- }
284
- allKeys.forEach(key => {
285
- const {
286
- value,
287
- type
288
- } = (0, _mmkvTypeDetection.detectMMKVType)(instance, key);
289
- const requiredConfig = requiredStorageKeys.find(req => {
290
- if (!(0, _requiredStorageKeyScope.requiredKeyAppliesTo)(req, 'mmkv')) return false;
291
- if (typeof req === 'string') return req === key;
292
- return req.key === key;
293
- });
294
- let status = 'optional_present';
295
- if (requiredConfig) {
296
- if (value === undefined) {
297
- status = 'required_missing';
298
- } else if (typeof requiredConfig === 'object' && requiredConfig.expectedValue !== undefined) {
299
- status = String(value) === String(requiredConfig.expectedValue) ? 'required_present' : 'required_wrong_value';
300
- } else if (typeof requiredConfig === 'object' && requiredConfig.expectedType !== undefined) {
301
- status = (0, _mmkvTypeDetection.isTypeMatch)(type, requiredConfig.expectedType) ? 'required_present' : 'required_wrong_type';
302
- } else {
303
- status = 'required_present';
304
- }
305
- }
306
- const keyInfo = {
307
- key,
308
- value,
309
- valueType: type !== 'unknown' ? type : undefined,
310
- storageType: 'mmkv',
311
- instanceId: id,
312
- status,
313
- category: requiredConfig ? 'required' : 'optional',
314
- lastUpdated: new Date(),
315
- ...(typeof requiredConfig === 'object' && requiredConfig.expectedValue !== undefined && {
316
- expectedValue: requiredConfig.expectedValue
317
- }),
318
- ...(typeof requiredConfig === 'object' && requiredConfig.expectedType !== undefined && {
319
- expectedType: requiredConfig.expectedType
320
- }),
321
- ...(typeof requiredConfig === 'object' && requiredConfig.description !== undefined && {
322
- description: requiredConfig.description
323
- })
324
- };
325
- allStorageKeys.push(keyInfo);
326
- });
327
- });
328
-
329
- // Add missing required keys scoped to MMKV
330
- requiredStorageKeys.forEach(req => {
331
- if (!(0, _requiredStorageKeyScope.requiredKeyAppliesTo)(req, 'mmkv')) return;
332
- const key = typeof req === 'string' ? req : req.key;
333
- const exists = allStorageKeys.some(k => k.key === key);
334
- if (!exists) {
335
- // Add missing key for first instance (or all instances?)
336
- // For now, add to first instance
337
- const firstInstanceId = instances[0]?.id || 'mmkv.default';
338
- allStorageKeys.push({
339
- key,
340
- value: undefined,
341
- valueType: undefined,
342
- storageType: 'mmkv',
343
- instanceId: firstInstanceId,
344
- status: 'required_missing',
345
- category: 'required',
346
- ...(typeof req === 'object' && req.expectedValue !== undefined && {
347
- expectedValue: req.expectedValue
348
- }),
349
- ...(typeof req === 'object' && req.expectedType !== undefined && {
350
- expectedType: req.expectedType
351
- }),
352
- ...(typeof req === 'object' && req.description !== undefined && {
353
- description: req.description
354
- })
355
- });
356
- }
357
- });
358
- setStorageKeys(allStorageKeys);
359
- } catch (err) {
360
- setError(err instanceof Error ? err : new Error('Failed to fetch multi-MMKV storage data'));
361
- setStorageKeys([]);
362
- } finally {
363
- setIsLoading(false);
364
- }
365
- // eslint-disable-next-line react-hooks/exhaustive-deps
366
- }, [instances, requiredSignature]);
367
- (0, _react.useEffect)(() => {
368
- fetchStorageData();
369
- }, [fetchStorageData]);
370
- return {
371
- storageKeys,
372
- isLoading,
373
- error,
374
- refresh: fetchStorageData
375
- };
376
- }
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.useMMKVKeys=useMMKVKeys;exports.useMultiMMKVKeys=useMultiMMKVKeys;var _react=require("react");var _requiredStorageKeyScope=require("../utils/requiredStorageKeyScope");var _mmkvTypeDetection=require("../utils/mmkvTypeDetection");function useMMKVKeys(p,c,x=[]){const[T,a]=(0,_react.useState)([]);const[m,f]=(0,_react.useState)(true);const[v,K]=(0,_react.useState)(null);const V=JSON.stringify(x);const y=(0,_react.useRef)(x);y.current=x;const l=(0,_react.useCallback)(()=>{const s=y.current;f(true);K(null);try{if(!p){a([]);f(false);return}const i=p.getAllKeys();if(!i||i.length===0){const t=s.filter(e=>(0,_requiredStorageKeyScope.requiredKeyAppliesTo)(e,"mmkv")).map(e=>{const o=typeof e==="string"?e:e.key;const n=typeof e==="object"?e.description:void 0;const r=typeof e==="object"?e.expectedValue:void 0;const d=typeof e==="object"?e.expectedType:void 0;return{key:o,value:void 0,valueType:void 0,storageType:"mmkv",instanceId:c,status:"required_missing",category:"required",description:n,expectedValue:r,expectedType:d}});a(t);f(false);return}const u=[];i.forEach(t=>{const{value:e,type:o}=(0,_mmkvTypeDetection.detectMMKVType)(p,t);const n=s.find(g=>{if(!(0,_requiredStorageKeyScope.requiredKeyAppliesTo)(g,"mmkv"))return false;if(typeof g==="string")return g===t;return g.key===t});let r="optional_present";if(n){if(e===void 0){r="required_missing"}else if(typeof n==="object"&&n.expectedValue!==void 0){r=String(e)===String(n.expectedValue)?"required_present":"required_wrong_value"}else if(typeof n==="object"&&n.expectedType!==void 0){r=(0,_mmkvTypeDetection.isTypeMatch)(o,n.expectedType)?"required_present":"required_wrong_type"}else{r="required_present"}}const d={key:t,value:e,valueType:o!=="unknown"?o:void 0,storageType:"mmkv",instanceId:c,status:r,category:n?"required":"optional",lastUpdated:new Date,...typeof n==="object"&&n.expectedValue!==void 0&&{expectedValue:n.expectedValue},...typeof n==="object"&&n.expectedType!==void 0&&{expectedType:n.expectedType},...typeof n==="object"&&n.description!==void 0&&{description:n.description}};u.push(d)});s.forEach(t=>{if(!(0,_requiredStorageKeyScope.requiredKeyAppliesTo)(t,"mmkv"))return;const e=typeof t==="string"?t:t.key;const o=u.some(n=>n.key===e);if(!o){u.push({key:e,value:void 0,valueType:void 0,storageType:"mmkv",instanceId:c,status:"required_missing",category:"required",...typeof t==="object"&&t.expectedValue!==void 0&&{expectedValue:t.expectedValue},...typeof t==="object"&&t.expectedType!==void 0&&{expectedType:t.expectedType},...typeof t==="object"&&t.description!==void 0&&{description:t.description}})}});a(u)}catch(i){K(i instanceof Error?i:new Error("Failed to fetch MMKV storage data"));a([])}finally{f(false)}},[p,c,V]);(0,_react.useEffect)(()=>{l()},[l]);return{storageKeys:T,isLoading:m,error:v,refresh:l}}function useMultiMMKVKeys(p,c=[]){const[x,T]=(0,_react.useState)([]);const[a,m]=(0,_react.useState)(true);const[f,v]=(0,_react.useState)(null);const K=JSON.stringify(c);const V=(0,_react.useRef)(c);V.current=c;const y=(0,_react.useCallback)(()=>{const l=V.current;m(true);v(null);try{const s=[];p.forEach(({instance:i,id:u})=>{const t=i.getAllKeys();if(!t||t.length===0){return}t.forEach(e=>{const{value:o,type:n}=(0,_mmkvTypeDetection.detectMMKVType)(i,e);const r=l.find(_=>{if(!(0,_requiredStorageKeyScope.requiredKeyAppliesTo)(_,"mmkv"))return false;if(typeof _==="string")return _===e;return _.key===e});let d="optional_present";if(r){if(o===void 0){d="required_missing"}else if(typeof r==="object"&&r.expectedValue!==void 0){d=String(o)===String(r.expectedValue)?"required_present":"required_wrong_value"}else if(typeof r==="object"&&r.expectedType!==void 0){d=(0,_mmkvTypeDetection.isTypeMatch)(n,r.expectedType)?"required_present":"required_wrong_type"}else{d="required_present"}}const g={key:e,value:o,valueType:n!=="unknown"?n:void 0,storageType:"mmkv",instanceId:u,status:d,category:r?"required":"optional",lastUpdated:new Date,...typeof r==="object"&&r.expectedValue!==void 0&&{expectedValue:r.expectedValue},...typeof r==="object"&&r.expectedType!==void 0&&{expectedType:r.expectedType},...typeof r==="object"&&r.description!==void 0&&{description:r.description}};s.push(g)})});l.forEach(i=>{if(!(0,_requiredStorageKeyScope.requiredKeyAppliesTo)(i,"mmkv"))return;const u=typeof i==="string"?i:i.key;const t=s.some(e=>e.key===u);if(!t){const e=p[0]?.id||"mmkv.default";s.push({key:u,value:void 0,valueType:void 0,storageType:"mmkv",instanceId:e,status:"required_missing",category:"required",...typeof i==="object"&&i.expectedValue!==void 0&&{expectedValue:i.expectedValue},...typeof i==="object"&&i.expectedType!==void 0&&{expectedType:i.expectedType},...typeof i==="object"&&i.description!==void 0&&{description:i.description}})}});T(s)}catch(s){v(s instanceof Error?s:new Error("Failed to fetch multi-MMKV storage data"));T([])}finally{m(false)}},[p,K]);(0,_react.useEffect)(()=>{y()},[y]);return{storageKeys:x,isLoading:a,error:f,refresh:y}}