@buoy-gg/storage 7.0.32 → 7.0.34

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.
@@ -25,7 +25,8 @@
25
25
  * ```
26
26
  */
27
27
 
28
- import { useState, useEffect, useCallback } from "react";
28
+ import { useMemo } from "react";
29
+ import { useEventStoreEvents } from "@buoy-gg/shared-ui";
29
30
  import { storageEventStore } from "../stores/storageEventStore";
30
31
 
31
32
  // Re-export StorageEvent for convenience
@@ -36,60 +37,22 @@ export function useStorageEvents(options = {}) {
36
37
  maxEvents = 500,
37
38
  enabled = true
38
39
  } = options;
39
- const [events, setEvents] = useState([]);
40
- // Track capturing state locally so it updates reactively with the subscription
41
- const [isCapturing, setIsCapturing] = useState(enabled);
42
-
43
- // Subscribe to store - this automatically starts/stops the storage listener
44
- // based on subscriber count (Subscribable pattern from TanStack Query)
45
- // Only subscribe when enabled is true
46
- useEffect(() => {
47
- if (!enabled) {
48
- setIsCapturing(false);
49
- return;
50
- }
51
-
52
- // Frame-coalesced (same pattern as network's useNetworkEventList):
53
- // bursts of storage writes land as ONE commit per frame instead of
54
- // one per emission — the dominant live-churn cost measured on the
55
- // network tool (tool-bench 2026-07-06).
56
- let rafId = null;
57
- let pending = null;
58
- const unsubscribe = storageEventStore.subscribeToEvents(allEvents => {
59
- pending = allEvents;
60
- if (rafId != null) return;
61
- rafId = requestAnimationFrame(() => {
62
- rafId = null;
63
- if (!pending) return;
64
- // Filter by storage type if specified
65
- let filtered = pending;
66
- pending = null;
67
- if (storageType !== "all") {
68
- filtered = filtered.filter(e => e.storageType === storageType);
69
- }
70
- // Limit events
71
- if (filtered.length > maxEvents) {
72
- filtered = filtered.slice(0, maxEvents);
73
- }
74
- setEvents(filtered);
75
- });
76
- });
77
-
78
- // Mark as capturing after successful subscription
79
- setIsCapturing(true);
80
- return () => {
81
- unsubscribe();
82
- if (rafId != null) cancelAnimationFrame(rafId);
83
- // Note: Don't set isCapturing=false here because we might be
84
- // re-subscribing due to dependency change, not actually stopping
85
- };
86
- }, [storageType, maxEvents, enabled]);
87
- const clearEvents = useCallback(() => {
88
- storageEventStore.clearEvents();
89
- }, []);
40
+ // Stable per storageType so the shared hook doesn't resubscribe every render.
41
+ const select = useMemo(() => storageType === "all" ? undefined : events => events.filter(e => e.storageType === storageType), [storageType]);
42
+ // Subscribing auto-starts the storage listener (Subscribable pattern), and
43
+ // the shared hook frame-coalesces write bursts into one commit.
44
+ const {
45
+ events,
46
+ clearEvents,
47
+ isActive
48
+ } = useEventStoreEvents(storageEventStore, {
49
+ maxEvents,
50
+ enabled,
51
+ select
52
+ });
90
53
  return {
91
54
  events,
92
55
  clearEvents,
93
- isCapturing
56
+ isCapturing: isActive
94
57
  };
95
58
  }
@@ -18,7 +18,7 @@
18
18
  * - SecureStore keys outside the registered descriptor list are invisible.
19
19
  */
20
20
  import AsyncStorage from "@react-native-async-storage/async-storage";
21
- import { isDevToolsStorageKey, registerStateSnapshotProvider } from "@buoy-gg/shared-ui";
21
+ import { classifyPreviewItem, createRestoreScope, emptyRestoreResult, failedRestore, isDevToolsStorageKey, registerStateSnapshotProvider, unionKeys, wontApply } from "@buoy-gg/shared-ui";
22
22
  import { readMany, writeMany, removeMany } from "./asyncStorageCompat";
23
23
  import { clearAllAppStorage } from "./clearAllStorage";
24
24
  import { mmkvInstanceRegistry } from "./MMKVInstanceRegistry";
@@ -106,24 +106,12 @@ async function capture() {
106
106
  }
107
107
  async function restore(data, options) {
108
108
  const snapshot = data;
109
- const excludedSet = new Set(options?.excludeKeys ?? []);
110
- const includedSet = options?.includeKeys ? new Set(options.includeKeys) : null;
109
+ const scope = createRestoreScope(options);
111
110
  /** True when this item may be touched (scope + exclusions agree). */
112
- const touch = key => !excludedSet.has(key) && (!includedSet || includedSet.has(key));
113
- let excludedHits = 0;
114
- const result = {
115
- ok: true,
116
- applied: 0,
117
- skipped: [],
118
- warnings: []
119
- };
111
+ const touch = scope.touch;
112
+ const result = emptyRestoreResult();
120
113
  if (!snapshot) {
121
- return {
122
- ok: false,
123
- applied: 0,
124
- skipped: [],
125
- warnings: ["empty storage snapshot"]
126
- };
114
+ return failedRestore("empty storage snapshot");
127
115
  }
128
116
 
129
117
  // ── AsyncStorage: delete app keys missing from the snapshot, write the rest ──
@@ -132,7 +120,7 @@ async function restore(data, options) {
132
120
  const snapKeys = new Set(snapPairs.map(([k]) => k));
133
121
  const liveKeys = (await AsyncStorage.getAllKeys()).filter(k => !isDevToolsStorageKey(k));
134
122
  const toRemove = liveKeys.filter(k => !snapKeys.has(k) && touch(`async:${k}`));
135
- excludedHits += (snapshot.async ?? []).length - snapPairs.length;
123
+ scope.countExcluded((snapshot.async ?? []).length - snapPairs.length);
136
124
  if (toRemove.length > 0) await removeMany(toRemove);
137
125
  if (snapPairs.length > 0) await writeMany(snapPairs);
138
126
  result.applied += snapPairs.length + toRemove.length;
@@ -165,10 +153,7 @@ async function restore(data, options) {
165
153
  const snapKeys = new Set(entries.map(e => e.key));
166
154
  const liveKeys = instance.getAllKeys().filter(key => !isDevToolsStorageKey(key));
167
155
  for (const key of liveKeys) {
168
- if (!touch(`mmkv:${id}/${key}`)) {
169
- excludedHits += 1;
170
- continue;
171
- }
156
+ if (!scope.allows(`mmkv:${id}/${key}`)) continue;
172
157
  if (!snapKeys.has(key)) {
173
158
  deleteMMKVKey(instance, key);
174
159
  result.applied += 1;
@@ -199,10 +184,7 @@ async function restore(data, options) {
199
184
  key,
200
185
  options
201
186
  } of secureStoreRegistry.getAll()) {
202
- if (!touch(`secure:${key}`)) {
203
- excludedHits += 1;
204
- continue;
205
- }
187
+ if (!scope.allows(`secure:${key}`)) continue;
206
188
  if (options.requireAuthentication) {
207
189
  if (key in secureSnap) {
208
190
  result.skipped.push({
@@ -235,20 +217,14 @@ async function restore(data, options) {
235
217
  });
236
218
  }
237
219
  }
238
- if (excludedHits > 0) {
239
- result.warnings.push(`${excludedHits} item(s) excluded by you`);
240
- }
220
+ const excludedWarning = scope.excludedWarning("item(s)");
221
+ if (excludedWarning) result.warnings.push(excludedWarning);
241
222
  return result;
242
223
  }
243
224
 
244
225
  /** Wipe to fresh-install state (Buoy keys preserved). Used by baseline restore. */
245
226
  async function clear() {
246
- const result = {
247
- ok: true,
248
- applied: 0,
249
- skipped: [],
250
- warnings: []
251
- };
227
+ const result = emptyRestoreResult();
252
228
  try {
253
229
  await clearAllAppStorage();
254
230
  result.applied += 1;
@@ -299,40 +275,24 @@ async function clear() {
299
275
  return result;
300
276
  }
301
277
  const ITEM_RENDER_CHAR_LIMIT = 256 * 1024;
278
+
279
+ /**
280
+ * Storage values are strings (or MMKV primitives): identity equality and a
281
+ * character-length size gate are the right tests, not a deep walk.
282
+ */
302
283
  function classifyValue(key, label, oldValue, newValue, inOld, inNew) {
303
- if (!inNew) return {
284
+ return classifyPreviewItem({
304
285
  key,
305
286
  label,
306
- verdict: "removed",
307
- oldValue
308
- };
309
- if (!inOld) return {
310
- key,
311
- label,
312
- verdict: "added",
313
- newValue
314
- };
315
- if (Object.is(oldValue, newValue)) return {
316
- key,
317
- label,
318
- verdict: "unchanged"
319
- };
320
- const tooLarge = typeof oldValue === "string" && oldValue.length > ITEM_RENDER_CHAR_LIMIT || typeof newValue === "string" && newValue.length > ITEM_RENDER_CHAR_LIMIT;
321
- if (tooLarge) {
322
- return {
323
- key,
324
- label,
325
- verdict: "too-large",
326
- reason: "value too large to render a diff — restore still applies it"
327
- };
328
- }
329
- return {
330
- key,
331
- label,
332
- verdict: "changed",
333
287
  oldValue,
334
- newValue
335
- };
288
+ newValue,
289
+ inOld,
290
+ inNew
291
+ }, {
292
+ equal: Object.is,
293
+ tooLarge: value => typeof value === "string" && value.length > ITEM_RENDER_CHAR_LIMIT,
294
+ tooLargeReason: "value too large to render a diff — restore still applies it"
295
+ });
336
296
  }
337
297
 
338
298
  /** Per-key restore preview across all three backends. */
@@ -354,46 +314,31 @@ async function previewItems(target, base) {
354
314
  // ── AsyncStorage ──
355
315
  const oldAsync = new Map(baseData.async ?? []);
356
316
  const newAsync = new Map(targetData.async ?? []);
357
- for (const key of new Set([...oldAsync.keys(), ...newAsync.keys()])) {
317
+ for (const key of unionKeys(oldAsync, newAsync)) {
358
318
  if (isDevToolsStorageKey(key)) continue;
359
319
  items.push(classifyValue(`async:${key}`, key, oldAsync.get(key), newAsync.get(key), oldAsync.has(key), newAsync.has(key)));
360
320
  }
361
321
 
362
322
  // ── MMKV ──
363
- const instanceIds = new Set([...Object.keys(baseData.mmkv ?? {}), ...Object.keys(targetData.mmkv ?? {})]);
364
- for (const id of instanceIds) {
323
+ for (const id of unionKeys(baseData.mmkv, targetData.mmkv)) {
365
324
  const registered = liveMode ? mmkvInstanceRegistry.get(id) : null;
366
325
  const instanceUnavailable = liveMode && !registered;
367
326
  const readOnly = liveMode && registered?.instance.isReadOnly === true;
368
327
  const oldEntries = new Map((baseData.mmkv?.[id] ?? []).map(e => [e.key, e]));
369
328
  const newEntries = new Map((targetData.mmkv?.[id] ?? []).map(e => [e.key, e]));
370
- for (const key of new Set([...oldEntries.keys(), ...newEntries.keys()])) {
329
+ for (const key of unionKeys(oldEntries, newEntries)) {
371
330
  if (isDevToolsStorageKey(key)) continue;
372
331
  const itemKey = `mmkv:${id}/${key}`;
373
332
  const label = `${id} · ${key}`;
374
333
  const oldE = oldEntries.get(key);
375
334
  const newE = newEntries.get(key);
376
335
  let item = classifyValue(itemKey, label, oldE?.value, newE?.value, oldEntries.has(key), newEntries.has(key));
377
- if (item.verdict !== "unchanged") {
378
- if (instanceUnavailable) {
379
- item = {
380
- ...item,
381
- verdict: "wont-apply",
382
- reason: "MMKV instance not registered"
383
- };
384
- } else if (readOnly) {
385
- item = {
386
- ...item,
387
- verdict: "wont-apply",
388
- reason: "MMKV instance registered read-only"
389
- };
390
- } else if (newE?.valueType === "buffer" || oldE?.valueType === "buffer") {
391
- item = {
392
- ...item,
393
- verdict: "wont-apply",
394
- reason: "ArrayBuffer values cannot be restored"
395
- };
396
- }
336
+ if (instanceUnavailable) {
337
+ item = wontApply(item, "MMKV instance not registered");
338
+ } else if (readOnly) {
339
+ item = wontApply(item, "MMKV instance registered read-only");
340
+ } else if (newE?.valueType === "buffer" || oldE?.valueType === "buffer") {
341
+ item = wontApply(item, "ArrayBuffer values cannot be restored");
397
342
  }
398
343
  items.push(item);
399
344
  }
@@ -403,22 +348,14 @@ async function previewItems(target, base) {
403
348
  const oldSecure = baseData.secure ?? {};
404
349
  const newSecure = targetData.secure ?? {};
405
350
  const registeredSecure = liveMode ? new Map(secureStoreRegistry.getAll().map(e => [e.key, e])) : null;
406
- for (const key of new Set([...Object.keys(oldSecure), ...Object.keys(newSecure)])) {
351
+ for (const key of unionKeys(oldSecure, newSecure)) {
407
352
  let item = classifyValue(`secure:${key}`, key, oldSecure[key], newSecure[key], key in oldSecure, key in newSecure);
408
- if (liveMode && item.verdict !== "unchanged") {
353
+ if (liveMode) {
409
354
  const entry = registeredSecure?.get(key);
410
355
  if (!entry) {
411
- item = {
412
- ...item,
413
- verdict: "wont-apply",
414
- reason: "key no longer registered with registerSecureStoreKeys"
415
- };
356
+ item = wontApply(item, "key no longer registered with registerSecureStoreKeys");
416
357
  } else if (entry.options.requireAuthentication) {
417
- item = {
418
- ...item,
419
- verdict: "wont-apply",
420
- reason: "biometric-protected keys are never written"
421
- };
358
+ item = wontApply(item, "biometric-protected keys are never written");
422
359
  }
423
360
  }
424
361
  items.push(item);
@@ -62,18 +62,12 @@ export declare const storageToolPreset: {
62
62
  * });
63
63
  * ```
64
64
  */
65
- export declare function createStorageTool(options?: {
66
- /** Tool name (default: "STORAGE") */
67
- name?: string;
68
- /** Tool description */
69
- description?: string;
70
- /** Custom tool ID (default: "storage") */
71
- id?: string;
65
+ export declare const createStorageTool: (options?: ({
72
66
  /** Array of required storage keys to validate */
73
67
  requiredStorageKeys?: RequiredStorageKey[];
74
68
  /** Enable shared modal dimensions */
75
69
  enableSharedModalDimensions?: boolean;
76
- }): {
70
+ } & import("@buoy-gg/shared-ui").ToolPresetOverrides) | undefined) => {
77
71
  id: string;
78
72
  name: string;
79
73
  description: string;
@@ -1 +1 @@
1
- {"version":3,"file":"preset.d.ts","sourceRoot":"","sources":["../../src/preset.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1D;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB;;;;;qBAKX;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE;;;6BAGJ,kBAAkB,EAAE;;;CAGlD,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE;IAC1C,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,iDAAiD;IACjD,mBAAmB,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC3C,qCAAqC;IACrC,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACvC;;;;;qBAMoB;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE;;;;;;EAUpC"}
1
+ {"version":3,"file":"preset.d.ts","sourceRoot":"","sources":["../../src/preset.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1D;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB;;;;;qBAKX;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE;;;6BAGJ,kBAAkB,EAAE;;;CAGjD,CAAC;AAEH;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,iBAAiB;IAG1B,iDAAiD;0BAC3B,kBAAkB,EAAE;IAC1C,qCAAqC;kCACP,OAAO;;;;;;qBAtCtB;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE;;;6BAGJ,kBAAkB,EAAE;;;CAwClD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"GameUIStorageBrowser.d.ts","sourceRoot":"","sources":["../../../../src/storage/components/GameUIStorageBrowser.tsx"],"names":[],"mappings":"AAAA,OAAO,EAML,gBAAgB,EACjB,MAAM,OAAO,CAAC;AAWf,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAmB,MAAM,UAAU,CAAC;AAK/E,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACvB,MAAM,sBAAsB,CAAC;AA4C9B;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,QAAmC,CAAC;AAEpE,UAAU,yBAAyB;IACjC,mBAAmB,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC3C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,gBAAgB,CAAC,GAAG,EAAE,CAAC,CAAC;IACzC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,mBAAmB,CAAC,EAAE,GAAG,CAAC,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC,CAAC;IACvD;;;;OAIG;IACH,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,oBAAoB,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC3D,mFAAmF;IACnF,oBAAoB,CAAC,EAAE,CAAC,MAAM,EAAE;QAC9B,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;KACrB,KAAK,IAAI,CAAC;IACX,yCAAyC;IACzC,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,kCAAkC;IAClC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,6EAA6E;IAC7E,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,yBAAyB,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC9D,yEAAyE;IACzE,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IAClC,2DAA2D;IAC3D,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,cAAc,KAAK,IAAI,CAAC;IACjD,kEAAkE;IAClE,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED,wBAAgB,oBAAoB,CAAC,EACnC,mBAAwB,EACxB,WAAmB,EACnB,eAA0C,EAC1C,eAAe,EACf,YAAY,EACZ,WAAgB,EAChB,cAAc,EACd,eAAe,EACf,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,EACpB,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,yBAAyB,EACzB,kBAAkB,EAClB,SAAgB,EAChB,SAAS,EACT,aAAa,GACd,EAAE,yBAAyB,+BA8lC3B"}
1
+ {"version":3,"file":"GameUIStorageBrowser.d.ts","sourceRoot":"","sources":["../../../../src/storage/components/GameUIStorageBrowser.tsx"],"names":[],"mappings":"AAAA,OAAO,EAML,gBAAgB,EACjB,MAAM,OAAO,CAAC;AAmBf,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAmB,MAAM,UAAU,CAAC;AAK/E,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACvB,MAAM,sBAAsB,CAAC;AA4C9B;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,QAAmC,CAAC;AAEpE,UAAU,yBAAyB;IACjC,mBAAmB,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC3C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,gBAAgB,CAAC,GAAG,EAAE,CAAC,CAAC;IACzC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,mBAAmB,CAAC,EAAE,GAAG,CAAC,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC,CAAC;IACvD;;;;OAIG;IACH,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,oBAAoB,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC3D,mFAAmF;IACnF,oBAAoB,CAAC,EAAE,CAAC,MAAM,EAAE;QAC9B,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;KACrB,KAAK,IAAI,CAAC;IACX,yCAAyC;IACzC,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,kCAAkC;IAClC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,6EAA6E;IAC7E,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,yBAAyB,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC9D,yEAAyE;IACzE,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IAClC,2DAA2D;IAC3D,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,cAAc,KAAK,IAAI,CAAC;IACjD,kEAAkE;IAClE,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED,wBAAgB,oBAAoB,CAAC,EACnC,mBAAwB,EACxB,WAAmB,EACnB,eAA0C,EAC1C,eAAe,EACf,YAAY,EACZ,WAAgB,EAChB,cAAc,EACd,eAAe,EACf,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,EACpB,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,yBAAyB,EACzB,kBAAkB,EAClB,SAAgB,EAChB,SAAS,EACT,aAAa,GACd,EAAE,yBAAyB,+BA2nC3B"}
@@ -1 +1 @@
1
- {"version":3,"file":"StorageModalWithTabs.d.ts","sourceRoot":"","sources":["../../../../src/storage/components/StorageModalWithTabs.tsx"],"names":[],"mappings":"AAkCA,OAAO,EAAE,kBAAkB,EAAkB,MAAM,UAAU,CAAC;AAY9D,OAAO,EAAoB,KAAK,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAchF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,QAAqC,CAAC;AAExE,UAAU,yBAAyB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,KAAK,IAAI,CAAC;IACvC,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,mBAAmB,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC3C;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,GAAG,QAAQ,KAAK,IAAI,CAAC;IAClD;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;CAC/C;AAqBD,wBAAgB,oBAAoB,CAAC,EACnC,OAAO,EACP,OAAO,EACP,MAAM,EACN,UAAU,EACV,2BAAmC,EACnC,mBAAwB,EACxB,MAAc,EACd,WAAW,EACX,SAAS,EACT,aAAa,GACd,EAAE,yBAAyB,sCA8hC3B;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,KAAK,GAAE,IAAI,CAAC,yBAAyB,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAM,+BAG9E"}
1
+ {"version":3,"file":"StorageModalWithTabs.d.ts","sourceRoot":"","sources":["../../../../src/storage/components/StorageModalWithTabs.tsx"],"names":[],"mappings":"AAmCA,OAAO,EAAE,kBAAkB,EAAkB,MAAM,UAAU,CAAC;AAY9D,OAAO,EAAoB,KAAK,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAchF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,QAAqC,CAAC;AAExE,UAAU,yBAAyB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,KAAK,IAAI,CAAC;IACvC,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,mBAAmB,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC3C;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,GAAG,QAAQ,KAAK,IAAI,CAAC;IAClD;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;CAC/C;AA0DD,wBAAgB,oBAAoB,CAAC,EACnC,OAAO,EACP,OAAO,EACP,MAAM,EACN,UAAU,EACV,2BAAmC,EACnC,mBAAwB,EACxB,MAAc,EACd,WAAW,EACX,SAAS,EACT,aAAa,GACd,EAAE,yBAAyB,sCA24B3B;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,KAAK,GAAE,IAAI,CAAC,yBAAyB,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAM,+BAG9E"}
@@ -1 +1 @@
1
- {"version":3,"file":"useStorageEvents.d.ts","sourceRoot":"","sources":["../../../../src/storage/hooks/useStorageEvents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,OAAO,EAEL,KAAK,YAAY,EAClB,MAAM,6BAA6B,CAAC;AAGrC,YAAY,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,MAAM,WAAW,uBAAuB;IACtC,6BAA6B;IAC7B,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;IACvC,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mFAAmF;IACnF,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,wCAAwC;IACxC,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,uBAAuB;IACvB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,0DAA0D;IAC1D,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,GAAE,uBAA4B,GACpC,sBAAsB,CA8DxB"}
1
+ {"version":3,"file":"useStorageEvents.d.ts","sourceRoot":"","sources":["../../../../src/storage/hooks/useStorageEvents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH,OAAO,EAEL,KAAK,YAAY,EAClB,MAAM,6BAA6B,CAAC;AAGrC,YAAY,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,MAAM,WAAW,uBAAuB;IACtC,6BAA6B;IAC7B,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;IACvC,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mFAAmF;IACnF,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,wCAAwC;IACxC,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,uBAAuB;IACvB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,0DAA0D;IAC1D,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,GAAE,uBAA4B,GACpC,sBAAsB,CAkBxB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@buoy-gg/storage",
3
- "version": "7.0.32",
3
+ "version": "7.0.34",
4
4
  "description": "Browse & edit AsyncStorage, MMKV & SecureStore inside your React Native app, with change history. Part of Buoy devtools.",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",
@@ -29,11 +29,11 @@
29
29
  "**/snapshotProvider.ts"
30
30
  ],
31
31
  "dependencies": {
32
- "@buoy-gg/floating-tools-core": "^7.0.32",
33
- "@buoy-gg/shared-ui": "^7.0.32"
32
+ "@buoy-gg/floating-tools-core": "^7.0.34",
33
+ "@buoy-gg/shared-ui": "^7.0.34"
34
34
  },
35
35
  "peerDependencies": {
36
- "@buoy-gg/license": "7.0.32",
36
+ "@buoy-gg/license": "7.0.34",
37
37
  "@react-native-async-storage/async-storage": "^2.0.0 || ^3.1.0",
38
38
  "react": "*",
39
39
  "react-native": "*"
@@ -43,7 +43,7 @@
43
43
  "@types/react": "^19.1.0",
44
44
  "@types/react-native": "^0.73.0",
45
45
  "typescript": "~5.8.3",
46
- "@buoy-gg/license": "^7.0.32"
46
+ "@buoy-gg/license": "^7.0.34"
47
47
  },
48
48
  "react-native-builder-bob": {
49
49
  "source": "src",