@buoy-gg/storage 7.0.63 → 7.0.65
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.
- package/README.md +2 -0
- package/lib/commonjs/storage/components/GameUIStorageBrowser.js +2 -2
- package/lib/commonjs/storage/hooks/useAsyncStorageKeys.js +1 -1
- package/lib/commonjs/storage/hooks/useMMKVInstances.js +1 -1
- package/lib/commonjs/storage/hooks/useMMKVKeys.js +1 -1
- package/lib/commonjs/storage/hooks/useSecureStoreKeys.js +1 -1
- package/lib/commonjs/storage/stores/storageEventStore.js +1 -1
- package/lib/commonjs/storage/sync/storageSyncAdapter.js +1 -1
- package/lib/commonjs/storage/utils/AsyncStorageListener.js +1 -1
- package/lib/commonjs/storage/utils/AsyncStorageListener.web.js +1 -1
- package/lib/commonjs/storage/utils/MMKVListener.js +1 -1
- package/lib/commonjs/storage/utils/browserStorageLifecycle.web.js +1 -1
- package/lib/commonjs/storage/utils/snapshotProvider.js +1 -1
- package/lib/module/storage/components/GameUIStorageBrowser.js +2 -2
- package/lib/module/storage/hooks/useAsyncStorageKeys.js +1 -1
- package/lib/module/storage/hooks/useMMKVInstances.js +1 -1
- package/lib/module/storage/hooks/useMMKVKeys.js +1 -1
- package/lib/module/storage/hooks/useSecureStoreKeys.js +1 -1
- package/lib/module/storage/stores/storageEventStore.js +1 -1
- package/lib/module/storage/sync/storageSyncAdapter.js +1 -1
- package/lib/module/storage/utils/AsyncStorageListener.js +1 -1
- package/lib/module/storage/utils/AsyncStorageListener.web.js +1 -1
- package/lib/module/storage/utils/MMKVListener.js +1 -1
- package/lib/module/storage/utils/browserStorageLifecycle.web.js +1 -1
- package/lib/module/storage/utils/snapshotProvider.js +1 -1
- package/lib/typescript/storage/hooks/useMMKVInstances.d.ts +0 -13
- package/lib/typescript/storage/hooks/useMMKVKeys.d.ts +0 -12
- package/lib/typescript/storage/stores/storageEventStore.d.ts +1 -0
- package/lib/typescript/storage/sync/storageSyncAdapter.d.ts +1 -1
- package/lib/web/index.mjs +2 -2
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -25,3 +25,5 @@ The [Storage guide](https://buoy.gg/buoy/latest/docs/tools/storage) covers setup
|
|
|
25
25
|
---
|
|
26
26
|
|
|
27
27
|
<sub>Part of <a href="https://buoy.gg">Buoy</a>, developer tools that live inside your app. Proprietary software. © Buoy LLC. <a href="https://buoy.gg/terms">Terms</a></sub>
|
|
28
|
+
|
|
29
|
+
Buoy keeps its own keys out of this view. Counts and saved app state leave them out too.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.FREE_TIER_KEY_LIMIT=void 0;exports.GameUIStorageBrowser=GameUIStorageBrowser;var _storageLabels=require("../utils/storageLabels");var _react=require("react");var _reactNative=require("react-native");var _sharedUi=require("@buoy-gg/shared-ui");var _StorageKeySection=require("./StorageKeySection");var _StorageKeyDetailScreen=require("./StorageKeyDetailScreen");var _StorageFilterCards=require("./StorageFilterCards");var _useAsyncStorageKeys=require("../hooks/useAsyncStorageKeys");var _AsyncStorageListener=require("../utils/AsyncStorageListener");var _useMMKVKeys=require("../hooks/useMMKVKeys");var _useSecureStoreKeys=require("../hooks/useSecureStoreKeys");var _useMMKVInstances=require("../hooks/useMMKVInstances");var _StorageSaveNotice=require("./StorageSaveNotice");var _StorageActionButtons=require("./StorageActionButtons");var _SelectionActionBar=require("./SelectionActionBar");var _MMKVListener=require("../utils/MMKVListener");var _storageBrowserRefresh=require("../utils/storageBrowserRefresh");var _deleteStorageKeys=require("../utils/deleteStorageKeys");var _setStorageValue=require("../utils/setStorageValue");var _license=require("@buoy-gg/license");var _jsxRuntime=require("react/jsx-runtime");const INSTANCE_COLORS=[_sharedUi.macOSColors.semantic.info,_sharedUi.macOSColors.semantic.success,_sharedUi.macOSColors.semantic.warning,_sharedUi.macOSColors.semantic.debug,"#FF6B9D","#00D9FF"];function getInstanceColor(M){const U=M.split("").reduce((K,P)=>K+P.charCodeAt(0),0);return INSTANCE_COLORS[U%INSTANCE_COLORS.length]}const FREE_TIER_KEY_LIMIT=exports.FREE_TIER_KEY_LIMIT=_sharedUi.TIER_LIMITS["storage.keys"].free;function GameUIStorageBrowser({requiredStorageKeys:M=[],showFilters:U=false,ignoredPatterns:K=new Set(["@react_buoy"]),onTogglePattern:P,onAddPattern:$,searchQuery:m="",storageDataRef:R,eventCountByKey:G,lastWriteByKey:Ze,onViewHistory:A,enabledStorageTypes:I,statusFilter:Y,onStatusFilterChange:J,onStatusCountsChange:X,pinnedKeys:S,onTogglePin:Z,storageTypeFilter:Q,onStorageTypeFilterChange:ee,applySafeAreaInset:fe,detailKey:q=null,onOpenKey:Se,onCloseDetail:te}){const p=(0,_license.useIsPro)();const B=(0,_sharedUi.useLimit)("storage.keys");const re=(0,_sharedUi.useLimit)("storage.mmkvInstances");const[D,T]=(0,_react.useState)(false);(0,_react.useEffect)(()=>{if(D&&p){T(false)}},[D,p]);const[pe,be]=(0,_react.useState)("all");const L=Y!=null&&J!=null;const y=L?Y:pe;const ve=L?J:be;const[Ce,Te]=(0,_react.useState)("all");const oe=Q!=null&&ee!=null;const d=oe?Q:Ce;const xe=oe?ee:Te;const[l,se]=(0,_react.useState)(null);const we=(0,_react.useRef)(null);const Me=(0,_react.useRef)(0);const ne=(0,_react.useRef)(new Map);const _e=(0,_react.useCallback)((e,t)=>{if(t)ne.current.set(e,t);else ne.current.delete(e)},[]);const[ae,ie]=(0,_react.useState)(0);const[F,z]=(0,_react.useState)(false);const[V,x]=(0,_react.useState)(new Set);const{instances:c}=(0,_useMMKVInstances.useMMKVInstances)(false);const{storageKeys:le,isLoading:ke,error:Ke,refresh:j}=(0,_useAsyncStorageKeys.useAsyncStorageKeys)(M);const Ie=(0,_react.useMemo)(()=>c.map(e=>({instance:e.instance,id:e.id})),[c]);const{storageKeys:O,isLoading:qe,error:Be,refresh:N}=(0,_useMMKVKeys.useMultiMMKVKeys)(Ie,M);const ce=(0,_react.useMemo)(()=>{if(!l){return O}return O.filter(e=>e.instanceId===l)},[O,l]);const{storageKeys:ue,isLoading:Ve,error:je,refresh:de}=(0,_useSecureStoreKeys.useSecureStoreKeys)(M);const a=(0,_react.useMemo)(()=>{return[...le,...ce,...ue]},[le,ce,ue]);const b=(0,_react.useMemo)(()=>{if(!q)return null;const e=(0,_StorageKeySection.storageRowId)(q);return a.find(t=>(0,_StorageKeySection.storageRowId)(t)===e)??q},[q,a]);const Ne=ke||qe||Ve;const ge=Ke||Be||je;const h=(0,_react.useCallback)(()=>{j();N();de()},[j,N,de]);const w=(0,_react.useCallback)(e=>{return e.instanceId?`${e.storageType}-${e.instanceId}-${e.key}`:`${e.storageType}-${e.key}`},[]);const Ee=(0,_react.useCallback)(()=>{z(e=>{if(e){x(new Set)}return!e})},[]);const Re=(0,_react.useCallback)((e,t)=>{const r=w(e);x(u=>{const s=new Set(u);if(t){s.add(r)}else{s.delete(r)}return s})},[w]);const Ae=(0,_react.useCallback)(()=>{x(new Set);z(false);h()},[h]);const W=(0,_react.useCallback)(e=>{e.forEach(t=>$?.(t.key));x(new Set);z(false)},[$]);const H=(0,_react.useCallback)(async(e,t)=>{if(!p){T(true);throw new Error("Editing storage values is a Pro feature.")}await(0,_setStorageValue.setStorageValue)(e,t,c);h();ie(r=>r+1)},[p,c,h]);const De=(0,_react.useCallback)(e=>{void H(e,JSON.stringify(!e.value)).catch(t=>{_reactNative.Alert.alert("Couldn't save",t instanceof Error?t.message:String(t))})},[H]);const ye=(0,_react.useCallback)((e,t)=>{if(!p){T(true);return}_reactNative.Alert.alert("Delete key",`Delete "${e.key}"? This cannot be undone.`,[{text:"Cancel",style:"cancel"},{text:"Delete",style:"destructive",onPress:async()=>{try{await(0,_deleteStorageKeys.deleteStorageKeys)([e],c.map(r=>({id:r.id,instance:r.instance})));h();t?.()}catch(r){_reactNative.Alert.alert("Error",`Failed to delete key: ${r}`)}}}])},[p,c,h]);const he=(0,_react.useCallback)(e=>(0,_setStorageValue.storageEditBlockedReason)(e,c),[c]);const Le=(0,_react.useMemo)(()=>{const e=a;const t={valid:e.filter(n=>n.status==="required_present"||n.status==="optional_present").length,missing:e.filter(n=>n.status==="required_missing").length,issues:e.filter(n=>n.status==="required_wrong_value"||n.status==="required_wrong_type").length,total:e.length};const r=e.filter(n=>n.storageType==="async");const u=e.filter(n=>n.storageType==="mmkv");const s=e.filter(n=>n.storageType==="secure");return{summary:{valid:t.valid,missing:t.missing,issues:t.issues,total:t.total,timestamp:new Date().toISOString()},asyncStorage:r.reduce((n,i)=>{n[i.key]=i.value;return n},{}),mmkv:u.reduce((n,i)=>{const f=i.instanceId||"default";if(!n[f])n[f]={};n[f][i.key]=i.value;return n},{}),secure:s.reduce((n,i)=>{n[i.key]=i.value;return n},{})}},[a]);(0,_react.useEffect)(()=>{if(R){R.current=a}},[a,R]);(0,_react.useEffect)(()=>{let e;const t=(0,_AsyncStorageListener.addListener)(r=>{clearTimeout(e);e=setTimeout(()=>{j()},100)});return()=>{clearTimeout(e);t()}},[j]);(0,_react.useEffect)(()=>{let e;const t=(0,_storageBrowserRefresh.onStorageBrowserRefresh)(()=>{clearTimeout(e);e=setTimeout(h,100)});return()=>{clearTimeout(e);t()}},[h]);(0,_react.useEffect)(()=>{let e;const t=(0,_MMKVListener.addMMKVListener)(r=>{const u=l===null||r.instanceId===l;if(u){clearTimeout(e);e=setTimeout(()=>{N()},100)}});return()=>{clearTimeout(e);t()}},[N,l]);const _=(0,_react.useMemo)(()=>{const e=a;const t=e.filter(s=>!(0,_sharedUi.isDevToolsStorageKey)(s.key));const r=e.filter(s=>(0,_sharedUi.isDevToolsStorageKey)(s.key));const u={totalCount:e.length,requiredCount:t.filter(s=>s.category==="required").length,missingCount:t.filter(s=>s.status==="required_missing").length,wrongValueCount:t.filter(s=>s.status==="required_wrong_value").length,wrongTypeCount:t.filter(s=>s.status==="required_wrong_type").length,presentRequiredCount:t.filter(s=>s.status==="required_present").length,optionalCount:t.filter(s=>s.category==="optional").length,mmkvCount:e.filter(s=>s.storageType==="mmkv").length,asyncCount:e.filter(s=>s.storageType==="async").length,secureCount:e.filter(s=>s.storageType==="secure").length,devToolsCount:r.length};return u},[a]);const v=(0,_react.useMemo)(()=>{let e=a.filter(o=>!(0,_sharedUi.isDevToolsStorageKey)(o.key));if(d!=="all"){e=e.filter(o=>o.storageType===d)}const t=e.filter(o=>o.status==="required_present"||o.status==="optional_present").length;const r=e.filter(o=>o.status==="required_missing").length;const u=e.filter(o=>o.status==="required_wrong_type"||o.status==="required_wrong_value").length;let s=0;let n=0;let i=0;let f=0;if(y==="all"){s=a.filter(o=>!(0,_sharedUi.isDevToolsStorageKey)(o.key)&&o.storageType==="async"&&(o.status==="required_present"||o.status==="optional_present")).length;n=a.filter(o=>!(0,_sharedUi.isDevToolsStorageKey)(o.key)&&o.storageType==="mmkv"&&(o.status==="required_present"||o.status==="optional_present")).length;i=a.filter(o=>!(0,_sharedUi.isDevToolsStorageKey)(o.key)&&o.storageType==="secure"&&(o.status==="required_present"||o.status==="optional_present")).length;f=s+n+i}else if(y==="missing"){s=a.filter(o=>!(0,_sharedUi.isDevToolsStorageKey)(o.key)&&o.storageType==="async"&&o.status==="required_missing").length;n=a.filter(o=>!(0,_sharedUi.isDevToolsStorageKey)(o.key)&&o.storageType==="mmkv"&&o.status==="required_missing").length;i=a.filter(o=>!(0,_sharedUi.isDevToolsStorageKey)(o.key)&&o.storageType==="secure"&&o.status==="required_missing").length;f=s+n+i}else if(y==="issues"){s=a.filter(o=>!(0,_sharedUi.isDevToolsStorageKey)(o.key)&&o.storageType==="async"&&(o.status==="required_wrong_type"||o.status==="required_wrong_value")).length;n=a.filter(o=>!(0,_sharedUi.isDevToolsStorageKey)(o.key)&&o.storageType==="mmkv"&&(o.status==="required_wrong_type"||o.status==="required_wrong_value")).length;i=a.filter(o=>!(0,_sharedUi.isDevToolsStorageKey)(o.key)&&o.storageType==="secure"&&(o.status==="required_wrong_type"||o.status==="required_wrong_value")).length;f=s+n+i}return{validCount:t,missingCount:r,issuesCount:u,asyncCount:s,mmkvCount:n,secureCount:i,totalCount:f}},[a,y,d]);(0,_react.useEffect)(()=>{X?.({validCount:v.validCount,missingCount:v.missingCount,issuesCount:v.issuesCount})},[X,v.validCount,v.missingCount,v.issuesCount]);const me=(0,_react.useMemo)(()=>{return[...a].sort((e,t)=>{const r={required_missing:1,required_wrong_type:2,required_wrong_value:3,required_present:4,optional_present:5};return(r[e.status]||999)-(r[t.status]||999)})},[a]);const Qe=(0,_react.useMemo)(()=>{return Array.from(new Set(a.map(e=>e.key))).sort()},[a]);const g=(0,_react.useMemo)(()=>{let e=me;if(I&&I.size>0){e=e.filter(t=>I.has(t.storageType))}e=e.filter(t=>{const r=Array.from(K).some(u=>t.key.includes(u));return!r});if(m){const t=m.toLowerCase();e=e.filter(r=>r.key.toLowerCase().includes(t))}switch(y){case"all":e=e.filter(t=>t.status==="required_present"||t.status==="optional_present");break;case"missing":e=e.filter(t=>t.status==="required_missing");break;case"issues":e=e.filter(t=>t.status==="required_wrong_type"||t.status==="required_wrong_value");break}if(d!=="all"){e=e.filter(t=>t.storageType===d)}if(S&&S.size>0){const t=e.filter(u=>S.has(u.key));const r=e.filter(u=>!S.has(u.key));e=[...t,...r]}return e},[me,y,d,K,m,l,I,S]);const C=(0,_react.useMemo)(()=>g.slice(0,B),[g,B]);const E=(0,_react.useMemo)(()=>{return Math.max(0,g.length-B)},[g.length,B]);const Fe=E>0;const et=(0,_react.useMemo)(()=>{const e=g.filter(r=>!(0,_sharedUi.isDevToolsStorageKey)(r.key));const t={totalCount:g.length,requiredCount:e.filter(r=>r.category==="required").length,missingCount:e.filter(r=>r.status==="required_missing").length,wrongValueCount:e.filter(r=>r.status==="required_wrong_value").length,wrongTypeCount:e.filter(r=>r.status==="required_wrong_type").length,presentRequiredCount:e.filter(r=>r.status==="required_present").length,optionalCount:e.filter(r=>r.category==="optional").length,mmkvCount:g.filter(r=>r.storageType==="mmkv").length,asyncCount:g.filter(r=>r.storageType==="async").length,secureCount:g.filter(r=>r.storageType==="secure").length,devToolsCount:g.filter(r=>(0,_sharedUi.isDevToolsStorageKey)(r.key)).length};return t},[g]);const ze=(0,_react.useMemo)(()=>{return C.filter(e=>V.has(w(e)))},[C,V,w]);const Oe=(0,_react.useCallback)(()=>{const e=new Set(C.map(w));x(e)},[C,w]);const We=(0,_react.useCallback)(()=>{x(new Set)},[]);const k=_.requiredCount>0?Math.round(_.presentRequiredCount/_.requiredCount*100):_.totalCount>0?100:0;const He=k>=90?"OPTIMAL":k>=70?"WARNING":"CRITICAL";const Ue=k>=90?_sharedUi.gameUIColors.success:k>=70?_sharedUi.gameUIColors.warning:_sharedUi.gameUIColors.error;if(b){return(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.root,children:(0,_jsxRuntime.jsx)(_StorageKeyDetailScreen.StorageKeyDetailScreen,{storageKey:b,editBlockedReason:he(b),eventCount:G?.[b.key],onSave:e=>H(b,e),onViewHistory:A?()=>A(b.key):void 0,onDeleteKey:e=>ye(e,()=>te?.()),onHideKey:e=>{W([e]);te?.()},isPinned:S?.has(b.key)??false,onTogglePin:Z,applySafeAreaInset:fe})})}if(Ne&&a.length===0){return(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.emptyState,children:[(0,_jsxRuntime.jsx)(_sharedUi.Database,{size:48,color:_sharedUi.night.color.textTertiary}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.emptyTitle,children:"Loading storage keys..."})]})}if(ge){return(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.emptyState,children:[(0,_jsxRuntime.jsx)(_sharedUi.Database,{size:48,color:_sharedUi.gameUIColors.error}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.emptyTitle,{color:_sharedUi.gameUIColors.error}],children:"Error loading storage"}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.emptySubtitle,children:ge.message})]})}const Pe=(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[d==="mmkv"&&c.length===0&&(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.emptyMMKVState,children:[(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.emptyMMKVTitle,children:"No MMKV Instances Detected"}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.emptyMMKVSubtitle,children:"MMKV instances must be registered with registerMMKVInstance()"}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.emptyMMKVCode,children:`import { registerMMKVInstance } from '@buoy-gg/storage';
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.FREE_TIER_KEY_LIMIT=void 0;exports.GameUIStorageBrowser=GameUIStorageBrowser;var _storageLabels=require("../utils/storageLabels");var _react=require("react");var _reactNative=require("react-native");var _sharedUi=require("@buoy-gg/shared-ui");var _StorageKeySection=require("./StorageKeySection");var _StorageKeyDetailScreen=require("./StorageKeyDetailScreen");var _StorageFilterCards=require("./StorageFilterCards");var _useAsyncStorageKeys=require("../hooks/useAsyncStorageKeys");var _AsyncStorageListener=require("../utils/AsyncStorageListener");var _useMMKVKeys=require("../hooks/useMMKVKeys");var _useSecureStoreKeys=require("../hooks/useSecureStoreKeys");var _useMMKVInstances=require("../hooks/useMMKVInstances");var _StorageSaveNotice=require("./StorageSaveNotice");var _StorageActionButtons=require("./StorageActionButtons");var _SelectionActionBar=require("./SelectionActionBar");var _MMKVListener=require("../utils/MMKVListener");var _storageBrowserRefresh=require("../utils/storageBrowserRefresh");var _deleteStorageKeys=require("../utils/deleteStorageKeys");var _setStorageValue=require("../utils/setStorageValue");var _license=require("@buoy-gg/license");var _jsxRuntime=require("react/jsx-runtime");const INSTANCE_COLORS=[_sharedUi.macOSColors.semantic.info,_sharedUi.macOSColors.semantic.success,_sharedUi.macOSColors.semantic.warning,_sharedUi.macOSColors.semantic.debug,"#FF6B9D","#00D9FF"];function getInstanceColor(M){const U=M.split("").reduce((_,P)=>_+P.charCodeAt(0),0);return INSTANCE_COLORS[U%INSTANCE_COLORS.length]}const FREE_TIER_KEY_LIMIT=exports.FREE_TIER_KEY_LIMIT=_sharedUi.TIER_LIMITS["storage.keys"].free;function GameUIStorageBrowser({requiredStorageKeys:M=[],showFilters:U=false,ignoredPatterns:_=new Set(["@react_buoy"]),onTogglePattern:P,onAddPattern:$,searchQuery:m="",storageDataRef:R,eventCountByKey:G,lastWriteByKey:Ze,onViewHistory:A,enabledStorageTypes:I,statusFilter:Y,onStatusFilterChange:J,onStatusCountsChange:X,pinnedKeys:S,onTogglePin:Z,storageTypeFilter:Q,onStorageTypeFilterChange:ee,applySafeAreaInset:fe,detailKey:q=null,onOpenKey:Se,onCloseDetail:te}){const p=(0,_license.useIsPro)();const B=(0,_sharedUi.useLimit)("storage.keys");const re=(0,_sharedUi.useLimit)("storage.mmkvInstances");const[D,T]=(0,_react.useState)(false);(0,_react.useEffect)(()=>{if(D&&p){T(false)}},[D,p]);const[pe,ve]=(0,_react.useState)("all");const L=Y!=null&&J!=null;const y=L?Y:pe;const be=L?J:ve;const[Ce,Te]=(0,_react.useState)("all");const oe=Q!=null&&ee!=null;const d=oe?Q:Ce;const xe=oe?ee:Te;const[l,se]=(0,_react.useState)(null);const we=(0,_react.useRef)(null);const Me=(0,_react.useRef)(0);const ne=(0,_react.useRef)(new Map);const ke=(0,_react.useCallback)((e,t)=>{if(t)ne.current.set(e,t);else ne.current.delete(e)},[]);const[ae,ie]=(0,_react.useState)(0);const[F,z]=(0,_react.useState)(false);const[V,x]=(0,_react.useState)(new Set);const{instances:c}=(0,_useMMKVInstances.useMMKVInstances)(false);const{storageKeys:le,isLoading:Ke,error:_e,refresh:j}=(0,_useAsyncStorageKeys.useAsyncStorageKeys)(M);const Ie=(0,_react.useMemo)(()=>c.map(e=>({instance:e.instance,id:e.id})),[c]);const{storageKeys:O,isLoading:qe,error:Be,refresh:N}=(0,_useMMKVKeys.useMultiMMKVKeys)(Ie,M);const ce=(0,_react.useMemo)(()=>{if(!l){return O}return O.filter(e=>e.instanceId===l)},[O,l]);const{storageKeys:ue,isLoading:Ve,error:je,refresh:de}=(0,_useSecureStoreKeys.useSecureStoreKeys)(M);const a=(0,_react.useMemo)(()=>{return[...le,...ce,...ue].filter(e=>!(0,_sharedUi.isDevToolsStorageKey)(e.key))},[le,ce,ue]);const v=(0,_react.useMemo)(()=>{if(!q)return null;const e=(0,_StorageKeySection.storageRowId)(q);return a.find(t=>(0,_StorageKeySection.storageRowId)(t)===e)??q},[q,a]);const Ne=Ke||qe||Ve;const ge=_e||Be||je;const h=(0,_react.useCallback)(()=>{j();N();de()},[j,N,de]);const w=(0,_react.useCallback)(e=>{return e.instanceId?`${e.storageType}-${e.instanceId}-${e.key}`:`${e.storageType}-${e.key}`},[]);const Ee=(0,_react.useCallback)(()=>{z(e=>{if(e){x(new Set)}return!e})},[]);const Re=(0,_react.useCallback)((e,t)=>{const r=w(e);x(u=>{const s=new Set(u);if(t){s.add(r)}else{s.delete(r)}return s})},[w]);const Ae=(0,_react.useCallback)(()=>{x(new Set);z(false);h()},[h]);const W=(0,_react.useCallback)(e=>{e.forEach(t=>$?.(t.key));x(new Set);z(false)},[$]);const H=(0,_react.useCallback)(async(e,t)=>{if(!p){T(true);throw new Error("Editing storage values is a Pro feature.")}await(0,_setStorageValue.setStorageValue)(e,t,c);h();ie(r=>r+1)},[p,c,h]);const De=(0,_react.useCallback)(e=>{void H(e,JSON.stringify(!e.value)).catch(t=>{_reactNative.Alert.alert("Couldn't save",t instanceof Error?t.message:String(t))})},[H]);const ye=(0,_react.useCallback)((e,t)=>{if(!p){T(true);return}_reactNative.Alert.alert("Delete key",`Delete "${e.key}"? This cannot be undone.`,[{text:"Cancel",style:"cancel"},{text:"Delete",style:"destructive",onPress:async()=>{try{await(0,_deleteStorageKeys.deleteStorageKeys)([e],c.map(r=>({id:r.id,instance:r.instance})));h();t?.()}catch(r){_reactNative.Alert.alert("Error",`Failed to delete key: ${r}`)}}}])},[p,c,h]);const he=(0,_react.useCallback)(e=>(0,_setStorageValue.storageEditBlockedReason)(e,c),[c]);const Le=(0,_react.useMemo)(()=>{const e=a;const t={valid:e.filter(n=>n.status==="required_present"||n.status==="optional_present").length,missing:e.filter(n=>n.status==="required_missing").length,issues:e.filter(n=>n.status==="required_wrong_value"||n.status==="required_wrong_type").length,total:e.length};const r=e.filter(n=>n.storageType==="async");const u=e.filter(n=>n.storageType==="mmkv");const s=e.filter(n=>n.storageType==="secure");return{summary:{valid:t.valid,missing:t.missing,issues:t.issues,total:t.total,timestamp:new Date().toISOString()},asyncStorage:r.reduce((n,i)=>{n[i.key]=i.value;return n},{}),mmkv:u.reduce((n,i)=>{const f=i.instanceId||"default";if(!n[f])n[f]={};n[f][i.key]=i.value;return n},{}),secure:s.reduce((n,i)=>{n[i.key]=i.value;return n},{})}},[a]);(0,_react.useEffect)(()=>{if(R){R.current=a}},[a,R]);(0,_react.useEffect)(()=>{let e;const t=(0,_AsyncStorageListener.addListener)(r=>{clearTimeout(e);e=setTimeout(()=>{j()},100)});return()=>{clearTimeout(e);t()}},[j]);(0,_react.useEffect)(()=>{let e;const t=(0,_storageBrowserRefresh.onStorageBrowserRefresh)(()=>{clearTimeout(e);e=setTimeout(h,100)});return()=>{clearTimeout(e);t()}},[h]);(0,_react.useEffect)(()=>{let e;const t=(0,_MMKVListener.addMMKVListener)(r=>{const u=l===null||r.instanceId===l;if(u){clearTimeout(e);e=setTimeout(()=>{N()},100)}});return()=>{clearTimeout(e);t()}},[N,l]);const k=(0,_react.useMemo)(()=>{const e=a;const t=e.filter(s=>!(0,_sharedUi.isDevToolsStorageKey)(s.key));const r=e.filter(s=>(0,_sharedUi.isDevToolsStorageKey)(s.key));const u={totalCount:e.length,requiredCount:t.filter(s=>s.category==="required").length,missingCount:t.filter(s=>s.status==="required_missing").length,wrongValueCount:t.filter(s=>s.status==="required_wrong_value").length,wrongTypeCount:t.filter(s=>s.status==="required_wrong_type").length,presentRequiredCount:t.filter(s=>s.status==="required_present").length,optionalCount:t.filter(s=>s.category==="optional").length,mmkvCount:e.filter(s=>s.storageType==="mmkv").length,asyncCount:e.filter(s=>s.storageType==="async").length,secureCount:e.filter(s=>s.storageType==="secure").length,devToolsCount:r.length};return u},[a]);const b=(0,_react.useMemo)(()=>{let e=a.filter(o=>!(0,_sharedUi.isDevToolsStorageKey)(o.key));if(d!=="all"){e=e.filter(o=>o.storageType===d)}const t=e.filter(o=>o.status==="required_present"||o.status==="optional_present").length;const r=e.filter(o=>o.status==="required_missing").length;const u=e.filter(o=>o.status==="required_wrong_type"||o.status==="required_wrong_value").length;let s=0;let n=0;let i=0;let f=0;if(y==="all"){s=a.filter(o=>!(0,_sharedUi.isDevToolsStorageKey)(o.key)&&o.storageType==="async"&&(o.status==="required_present"||o.status==="optional_present")).length;n=a.filter(o=>!(0,_sharedUi.isDevToolsStorageKey)(o.key)&&o.storageType==="mmkv"&&(o.status==="required_present"||o.status==="optional_present")).length;i=a.filter(o=>!(0,_sharedUi.isDevToolsStorageKey)(o.key)&&o.storageType==="secure"&&(o.status==="required_present"||o.status==="optional_present")).length;f=s+n+i}else if(y==="missing"){s=a.filter(o=>!(0,_sharedUi.isDevToolsStorageKey)(o.key)&&o.storageType==="async"&&o.status==="required_missing").length;n=a.filter(o=>!(0,_sharedUi.isDevToolsStorageKey)(o.key)&&o.storageType==="mmkv"&&o.status==="required_missing").length;i=a.filter(o=>!(0,_sharedUi.isDevToolsStorageKey)(o.key)&&o.storageType==="secure"&&o.status==="required_missing").length;f=s+n+i}else if(y==="issues"){s=a.filter(o=>!(0,_sharedUi.isDevToolsStorageKey)(o.key)&&o.storageType==="async"&&(o.status==="required_wrong_type"||o.status==="required_wrong_value")).length;n=a.filter(o=>!(0,_sharedUi.isDevToolsStorageKey)(o.key)&&o.storageType==="mmkv"&&(o.status==="required_wrong_type"||o.status==="required_wrong_value")).length;i=a.filter(o=>!(0,_sharedUi.isDevToolsStorageKey)(o.key)&&o.storageType==="secure"&&(o.status==="required_wrong_type"||o.status==="required_wrong_value")).length;f=s+n+i}return{validCount:t,missingCount:r,issuesCount:u,asyncCount:s,mmkvCount:n,secureCount:i,totalCount:f}},[a,y,d]);(0,_react.useEffect)(()=>{X?.({validCount:b.validCount,missingCount:b.missingCount,issuesCount:b.issuesCount})},[X,b.validCount,b.missingCount,b.issuesCount]);const me=(0,_react.useMemo)(()=>{return[...a].sort((e,t)=>{const r={required_missing:1,required_wrong_type:2,required_wrong_value:3,required_present:4,optional_present:5};return(r[e.status]||999)-(r[t.status]||999)})},[a]);const Qe=(0,_react.useMemo)(()=>{return Array.from(new Set(a.map(e=>e.key))).sort()},[a]);const g=(0,_react.useMemo)(()=>{let e=me;if(I&&I.size>0){e=e.filter(t=>I.has(t.storageType))}e=e.filter(t=>{const r=Array.from(_).some(u=>t.key.includes(u));return!r});if(m){const t=m.toLowerCase();e=e.filter(r=>r.key.toLowerCase().includes(t))}switch(y){case"all":e=e.filter(t=>t.status==="required_present"||t.status==="optional_present");break;case"missing":e=e.filter(t=>t.status==="required_missing");break;case"issues":e=e.filter(t=>t.status==="required_wrong_type"||t.status==="required_wrong_value");break}if(d!=="all"){e=e.filter(t=>t.storageType===d)}if(S&&S.size>0){const t=e.filter(u=>S.has(u.key));const r=e.filter(u=>!S.has(u.key));e=[...t,...r]}return e},[me,y,d,_,m,l,I,S]);const C=(0,_react.useMemo)(()=>g.slice(0,B),[g,B]);const E=(0,_react.useMemo)(()=>{return Math.max(0,g.length-B)},[g.length,B]);const Fe=E>0;const et=(0,_react.useMemo)(()=>{const e=g.filter(r=>!(0,_sharedUi.isDevToolsStorageKey)(r.key));const t={totalCount:g.length,requiredCount:e.filter(r=>r.category==="required").length,missingCount:e.filter(r=>r.status==="required_missing").length,wrongValueCount:e.filter(r=>r.status==="required_wrong_value").length,wrongTypeCount:e.filter(r=>r.status==="required_wrong_type").length,presentRequiredCount:e.filter(r=>r.status==="required_present").length,optionalCount:e.filter(r=>r.category==="optional").length,mmkvCount:g.filter(r=>r.storageType==="mmkv").length,asyncCount:g.filter(r=>r.storageType==="async").length,secureCount:g.filter(r=>r.storageType==="secure").length,devToolsCount:g.filter(r=>(0,_sharedUi.isDevToolsStorageKey)(r.key)).length};return t},[g]);const ze=(0,_react.useMemo)(()=>{return C.filter(e=>V.has(w(e)))},[C,V,w]);const Oe=(0,_react.useCallback)(()=>{const e=new Set(C.map(w));x(e)},[C,w]);const We=(0,_react.useCallback)(()=>{x(new Set)},[]);const K=k.requiredCount>0?Math.round(k.presentRequiredCount/k.requiredCount*100):k.totalCount>0?100:0;const He=K>=90?"OPTIMAL":K>=70?"WARNING":"CRITICAL";const Ue=K>=90?_sharedUi.gameUIColors.success:K>=70?_sharedUi.gameUIColors.warning:_sharedUi.gameUIColors.error;if(v){return(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.root,children:(0,_jsxRuntime.jsx)(_StorageKeyDetailScreen.StorageKeyDetailScreen,{storageKey:v,editBlockedReason:he(v),eventCount:G?.[v.key],onSave:e=>H(v,e),onViewHistory:A?()=>A(v.key):void 0,onDeleteKey:e=>ye(e,()=>te?.()),onHideKey:e=>{W([e]);te?.()},isPinned:S?.has(v.key)??false,onTogglePin:Z,applySafeAreaInset:fe})})}if(Ne&&a.length===0){return(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.emptyState,children:[(0,_jsxRuntime.jsx)(_sharedUi.Database,{size:48,color:_sharedUi.night.color.textTertiary}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.emptyTitle,children:"Loading storage keys..."})]})}if(ge){return(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.emptyState,children:[(0,_jsxRuntime.jsx)(_sharedUi.Database,{size:48,color:_sharedUi.gameUIColors.error}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.emptyTitle,{color:_sharedUi.gameUIColors.error}],children:"Error loading storage"}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.emptySubtitle,children:ge.message})]})}const Pe=(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[d==="mmkv"&&c.length===0&&(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.emptyMMKVState,children:[(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.emptyMMKVTitle,children:"No MMKV Instances Detected"}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.emptyMMKVSubtitle,children:"MMKV instances must be registered with registerMMKVInstance()"}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.emptyMMKVCode,children:`import { registerMMKVInstance } from '@buoy-gg/storage';
|
|
2
2
|
|
|
3
3
|
const storage = createMMKV();
|
|
4
|
-
registerMMKVInstance('mmkv.default', storage);`})]}),d==="mmkv"&&c.length>0&&(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.instanceNavbar,children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.instanceNavbarHeader,children:[(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.instanceNavbarLabel,children:"INSTANCES"}),c.length>re&&(0,_jsxRuntime.jsx)(_sharedUi.ProBadge,{style:{transform:[{scale:.85}]}})]}),(0,_jsxRuntime.jsxs)(_reactNative.ScrollView,{horizontal:true,showsHorizontalScrollIndicator:false,contentContainerStyle:styles.instanceNavbarScroll,children:[(p||c.length===1)&&(0,_jsxRuntime.jsxs)(_reactNative.TouchableOpacity,{onPress:()=>se(null),testID:"buoy-storage-instance-all",accessibilityRole:"button",accessibilityLabel:`All ${_storageLabels.storageLabels.mmkv} instances`,style:[styles.instanceNavbarButton,l===null&&styles.instanceNavbarButtonActive],children:[(0,_jsxRuntime.jsx)(_sharedUi.HardDrive,{size:12,color:l===null?_sharedUi.night.color.text:_sharedUi.night.color.textSecondary}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.instanceNavbarButtonText,l===null&&styles.instanceNavbarButtonTextActive],children:"All"}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.instanceNavbarBadge,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.instanceNavbarBadgeText,children:c.reduce((e,t)=>e+t.keyCount,0)})})]}),c.map((e,t)=>{const r=t>=re;return(0,_jsxRuntime.jsxs)(_reactNative.TouchableOpacity,{testID:`buoy-storage-instance-${e.id}`,accessibilityRole:"button",accessibilityLabel:`MMKV instance ${e.id}`,onPress:()=>{if(r){T(true)}else{se(e.id)}},style:[styles.instanceNavbarButton,e.id===l&&styles.instanceNavbarButtonActive,{borderColor:r?_sharedUi.night.color.border:getInstanceColor(e.id)+"40",backgroundColor:e.id===l?getInstanceColor(e.id)+"20":_sharedUi.night.color.surfaceElevated,opacity:r?.5:1}],children:[(0,_jsxRuntime.jsx)(_sharedUi.HardDrive,{size:12,color:e.id===l?getInstanceColor(e.id):_sharedUi.night.color.textSecondary}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.instanceNavbarButtonText,e.id===l&&{color:getInstanceColor(e.id),fontWeight:"700"}],children:e.id}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:[styles.instanceNavbarBadge,e.id===l&&{backgroundColor:getInstanceColor(e.id)+"30"}],children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.instanceNavbarBadgeText,e.id===l&&{color:getInstanceColor(e.id)}],children:e.keyCount})})]},e.id)})]})]})]});const $e=(0,_jsxRuntime.jsx)(_StorageActionButtons.StorageActionButtons,{copyValue:Le,mmkvInstances:c.map(e=>({id:e.id,instance:e.instance})),activeStorageType:d,onClearComplete:h,isSelectMode:F,onToggleSelectMode:Ee,selectedCount:V.size});const Ge=F?(0,_jsxRuntime.jsx)(_SelectionActionBar.SelectionActionBar,{selectedKeys:ze,mmkvInstances:c.map(e=>({id:e.id,instance:e.instance})),onDeleteComplete:Ae,onHideKeys:W,onSelectAll:Oe,onClearSelection:We,totalVisibleKeys:C.length}):null;const Ye=Fe?(0,_jsxRuntime.jsxs)(_reactNative.TouchableOpacity,{style:styles.limitBanner,onPress:()=>T(true),activeOpacity:.8,testID:"buoy-storage-locked-banner",accessibilityRole:"button",children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.limitBannerContent,children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.limitBannerLeft,children:[(0,_jsxRuntime.jsx)(_sharedUi.Zap,{size:16,color:_sharedUi.night.color.accent}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.limitBannerText,children:m?`${E} matching ${E===1?"key":"keys"} in locked storage`:`${E} keys locked`})]}),(0,_jsxRuntime.jsx)(_sharedUi.ProBadge,{})]}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.limitBannerSubtext,children:m?"Upgrade to Pro to search your full storage":"Upgrade to Pro to unlock full storage access"})]}):null;const Je=(()=>{const e=a.some(r=>!(0,_sharedUi.isDevToolsStorageKey)(r.key));let t;if(m||!e){t=(0,_sharedUi.resolveListEmptyState)({subject:"keys",verb:"registered",search:m,total:e?1:0,waiting:{otto:"empty",title:"No storage keys",message:"Nothing is registered for this tool to read."}});if(m&&e){t={...t,message:"No keys match. Clear the search to see them."}}}else if(y==="missing"){t={otto:"thumbsup",title:"No missing keys",message:"All required keys are present"}}else if(y==="issues"){t={otto:"cool",title:"No issues found",message:"All storage keys are correctly configured"}}else{t={otto:"broken",title:"No valid keys found",message:"All keys have issues or are missing"}}return(0,_jsxRuntime.jsx)(_sharedUi.ToolEmptyState,{...t,testID:"buoy-storage-keys-empty"})})();const Xe=(0,_jsxRuntime.jsx)(_sharedUi.ProUpgradeModal,{visible:D,onClose:()=>T(false),featureName:"Storage Keys"});return(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.root,children:[ae>0?(0,_jsxRuntime.jsx)(_StorageSaveNotice.StorageSaveNotice,{onDone:()=>ie(0)},ae):null,(0,_jsxRuntime.jsxs)(_reactNative.ScrollView,{testID:"buoy-storage-scroll",ref:we,onScroll:e=>{Me.current=e.nativeEvent.contentOffset.y},scrollEventThrottle:32,style:styles.scrollContainer,contentContainerStyle:styles.container,showsVerticalScrollIndicator:false,children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.backgroundGrid}),(0,_jsxRuntime.jsx)(_StorageFilterCards.StorageFilterCards,{stats:_,tabStats:v,healthPercentage:k,healthStatus:He,healthColor:Ue,activeFilter:y,onFilterChange:ve,activeStorageType:d,onStorageTypeChange:xe,showStatus:!L}),Pe,g.length>0?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.keysSection,children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.sectionHeader,children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.sectionHeaderLeft,children:[(0,_jsxRuntime.jsxs)(_reactNative.Text,{style:styles.sectionTitle,children:[y==="all"?"KEYS":y==="missing"?"MISSING KEYS":"ISSUES TO FIX",d!=="all"&&` (${d.toUpperCase()})`]}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.countBadge,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.countText,children:C.length})})]}),$e]}),Ge,(0,_jsxRuntime.jsx)(_StorageKeySection.StorageKeySection,{title:"",count:-1,keys:C,emptyMessage:"",isSelectMode:F,selectedKeys:V,onSelectionChange:Re,eventCountByKey:G,onViewHistory:A,onHideKey:e=>W([e]),onToggleKey:De,onDeleteKey:ye,editBlockedFor:he,pinnedKeys:S,onTogglePin:Z,onRowRef:_e,onOpenKey:Se}),Ye]}):Je,(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.techFooter,children:"ASYNC STORAGE | MMKV | SECURE STORAGE BACKENDS"}),Xe]})]})}const styles=_reactNative.StyleSheet.create({root:{flex:1,minHeight:0},editorOverlay:{..._sharedUi.absoluteFill,zIndex:10},scrollContainer:{flex:1,backgroundColor:"transparent"},container:{padding:12,paddingBottom:120},backgroundGrid:{..._sharedUi.absoluteFill,opacity:.006,backgroundColor:_sharedUi.gameUIColors.info},techFooter:{fontSize:8,color:_sharedUi.night.color.textTertiary,fontFamily:_sharedUi.monoFont,textAlign:"center",marginTop:20,letterSpacing:1,opacity:.5},keysSection:{marginTop:8,backgroundColor:_sharedUi.night.color.bg,borderRadius:12,padding:12,borderWidth:1,borderColor:_sharedUi.night.color.border},sectionHeader:{flexDirection:"row",justifyContent:"space-between",alignItems:"center",marginBottom:10,paddingBottom:6,borderBottomWidth:1,borderBottomColor:_sharedUi.night.color.separator},sectionHeaderLeft:{flexDirection:"row",alignItems:"center",gap:8},sectionTitle:{fontSize:12,fontWeight:"600",color:_sharedUi.night.color.textSecondary,letterSpacing:.4,textTransform:"uppercase"},countBadge:{backgroundColor:_sharedUi.night.color.surfaceElevated,paddingHorizontal:8,paddingVertical:3,borderRadius:6,borderWidth:1,borderColor:_sharedUi.night.color.border},countText:{fontSize:11,fontWeight:"600",color:_sharedUi.night.color.text,fontFamily:_sharedUi.monoFont},emptyState:{alignItems:"center",justifyContent:"center",paddingVertical:48},emptyTitle:{fontSize:16,fontWeight:"600",color:_sharedUi.night.color.text,marginTop:12,marginBottom:8},emptySubtitle:{fontSize:13,color:_sharedUi.night.color.textSecondary,textAlign:"center"},emptyMMKVState:{backgroundColor:_sharedUi.night.color.surface,borderRadius:12,padding:20,borderWidth:1,borderColor:_sharedUi.night.color.border,marginTop:8,alignItems:"center"},emptyMMKVTitle:{fontSize:14,fontWeight:"600",color:_sharedUi.night.color.text,marginBottom:6},emptyMMKVSubtitle:{fontSize:12,color:_sharedUi.night.color.textSecondary,textAlign:"center",marginBottom:12},emptyMMKVCode:{fontSize:10,fontFamily:_sharedUi.monoFont,color:_sharedUi.night.color.accent,backgroundColor:_sharedUi.night.color.bg,padding:12,borderRadius:8,borderWidth:1,borderColor:_sharedUi.night.color.border,alignSelf:"stretch"},instanceNavbar:{marginTop:12,marginBottom:8,backgroundColor:_sharedUi.night.color.surface,borderRadius:10,borderWidth:1,borderColor:_sharedUi.night.color.border,padding:10,shadowColor:"#000",shadowOpacity:.08,shadowRadius:6,shadowOffset:{width:0,height:2}},instanceNavbarHeader:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",marginBottom:8,paddingLeft:2},instanceNavbarLabel:{fontSize:9,fontWeight:"700",color:_sharedUi.night.color.textTertiary,textTransform:"uppercase",letterSpacing:1},instanceNavbarScroll:{gap:8,paddingRight:8},instanceNavbarButton:{flexDirection:"row",alignItems:"center",gap:6,paddingHorizontal:12,paddingVertical:8,backgroundColor:_sharedUi.night.color.surfaceElevated,borderRadius:8,borderWidth:1,borderColor:_sharedUi.night.color.border,minWidth:90},instanceNavbarButtonActive:{borderWidth:1.5,shadowColor:"#000",shadowOpacity:.1,shadowRadius:4,shadowOffset:{width:0,height:1}},instanceNavbarButtonText:{fontSize:11,fontWeight:"600",color:_sharedUi.night.color.textSecondary,fontFamily:_sharedUi.monoFont,flex:1},instanceNavbarButtonTextActive:{fontWeight:"700",color:_sharedUi.night.color.text},instanceNavbarBadge:{backgroundColor:_sharedUi.night.color.bg,paddingHorizontal:6,paddingVertical:2,borderRadius:6,minWidth:24,alignItems:"center"},instanceNavbarBadgeText:{fontSize:10,fontWeight:"700",color:_sharedUi.night.color.textSecondary,fontFamily:_sharedUi.monoFont},clearSearchButton:{marginTop:16,paddingHorizontal:16,paddingVertical:8,backgroundColor:_sharedUi.night.color.surfaceElevated,borderRadius:6,borderWidth:1,borderColor:_sharedUi.night.color.border},clearSearchText:{fontSize:13,color:_sharedUi.night.color.text,fontWeight:"500"},limitBanner:{backgroundColor:_sharedUi.night.color.surface,borderRadius:10,borderWidth:1,borderColor:_sharedUi.night.color.accentBorderStrong,padding:12,marginTop:12},limitBannerContent:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",marginBottom:4},limitBannerLeft:{flexDirection:"row",alignItems:"center",gap:8},limitBannerText:{color:_sharedUi.night.color.text,fontSize:13,fontWeight:"600"},limitBannerSubtext:{color:_sharedUi.night.color.textTertiary,fontSize:11}});
|
|
4
|
+
registerMMKVInstance('mmkv.default', storage);`})]}),d==="mmkv"&&c.length>0&&(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.instanceNavbar,children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.instanceNavbarHeader,children:[(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.instanceNavbarLabel,children:"INSTANCES"}),c.length>re&&(0,_jsxRuntime.jsx)(_sharedUi.ProBadge,{style:{transform:[{scale:.85}]}})]}),(0,_jsxRuntime.jsxs)(_reactNative.ScrollView,{horizontal:true,showsHorizontalScrollIndicator:false,contentContainerStyle:styles.instanceNavbarScroll,children:[(p||c.length===1)&&(0,_jsxRuntime.jsxs)(_reactNative.TouchableOpacity,{onPress:()=>se(null),testID:"buoy-storage-instance-all",accessibilityRole:"button",accessibilityLabel:`All ${_storageLabels.storageLabels.mmkv} instances`,style:[styles.instanceNavbarButton,l===null&&styles.instanceNavbarButtonActive],children:[(0,_jsxRuntime.jsx)(_sharedUi.HardDrive,{size:12,color:l===null?_sharedUi.night.color.text:_sharedUi.night.color.textSecondary}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.instanceNavbarButtonText,l===null&&styles.instanceNavbarButtonTextActive],children:"All"}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.instanceNavbarBadge,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.instanceNavbarBadgeText,children:c.reduce((e,t)=>e+t.keyCount,0)})})]}),c.map((e,t)=>{const r=t>=re;return(0,_jsxRuntime.jsxs)(_reactNative.TouchableOpacity,{testID:`buoy-storage-instance-${e.id}`,accessibilityRole:"button",accessibilityLabel:`MMKV instance ${e.id}`,onPress:()=>{if(r){T(true)}else{se(e.id)}},style:[styles.instanceNavbarButton,e.id===l&&styles.instanceNavbarButtonActive,{borderColor:r?_sharedUi.night.color.border:getInstanceColor(e.id)+"40",backgroundColor:e.id===l?getInstanceColor(e.id)+"20":_sharedUi.night.color.surfaceElevated,opacity:r?.5:1}],children:[(0,_jsxRuntime.jsx)(_sharedUi.HardDrive,{size:12,color:e.id===l?getInstanceColor(e.id):_sharedUi.night.color.textSecondary}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.instanceNavbarButtonText,e.id===l&&{color:getInstanceColor(e.id),fontWeight:"700"}],children:e.id}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:[styles.instanceNavbarBadge,e.id===l&&{backgroundColor:getInstanceColor(e.id)+"30"}],children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.instanceNavbarBadgeText,e.id===l&&{color:getInstanceColor(e.id)}],children:e.keyCount})})]},e.id)})]})]})]});const $e=(0,_jsxRuntime.jsx)(_StorageActionButtons.StorageActionButtons,{copyValue:Le,mmkvInstances:c.map(e=>({id:e.id,instance:e.instance})),activeStorageType:d,onClearComplete:h,isSelectMode:F,onToggleSelectMode:Ee,selectedCount:V.size});const Ge=F?(0,_jsxRuntime.jsx)(_SelectionActionBar.SelectionActionBar,{selectedKeys:ze,mmkvInstances:c.map(e=>({id:e.id,instance:e.instance})),onDeleteComplete:Ae,onHideKeys:W,onSelectAll:Oe,onClearSelection:We,totalVisibleKeys:C.length}):null;const Ye=Fe?(0,_jsxRuntime.jsxs)(_reactNative.TouchableOpacity,{style:styles.limitBanner,onPress:()=>T(true),activeOpacity:.8,testID:"buoy-storage-locked-banner",accessibilityRole:"button",children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.limitBannerContent,children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.limitBannerLeft,children:[(0,_jsxRuntime.jsx)(_sharedUi.Zap,{size:16,color:_sharedUi.night.color.accent}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.limitBannerText,children:m?`${E} matching ${E===1?"key":"keys"} in locked storage`:`${E} keys locked`})]}),(0,_jsxRuntime.jsx)(_sharedUi.ProBadge,{})]}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.limitBannerSubtext,children:m?"Upgrade to Pro to search your full storage":"Upgrade to Pro to unlock full storage access"})]}):null;const Je=(()=>{const e=a.some(r=>!(0,_sharedUi.isDevToolsStorageKey)(r.key));let t;if(m||!e){t=(0,_sharedUi.resolveListEmptyState)({subject:"keys",verb:"registered",search:m,total:e?1:0,waiting:{otto:"empty",title:"No storage keys",message:"Nothing is registered for this tool to read."}});if(m&&e){t={...t,message:"No keys match. Clear the search to see them."}}}else if(y==="missing"){t={otto:"thumbsup",title:"No missing keys",message:"All required keys are present"}}else if(y==="issues"){t={otto:"cool",title:"No issues found",message:"All storage keys are correctly configured"}}else{t={otto:"broken",title:"No valid keys found",message:"All keys have issues or are missing"}}return(0,_jsxRuntime.jsx)(_sharedUi.ToolEmptyState,{...t,testID:"buoy-storage-keys-empty"})})();const Xe=(0,_jsxRuntime.jsx)(_sharedUi.ProUpgradeModal,{visible:D,onClose:()=>T(false),featureName:"Storage Keys"});return(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.root,children:[ae>0?(0,_jsxRuntime.jsx)(_StorageSaveNotice.StorageSaveNotice,{onDone:()=>ie(0)},ae):null,(0,_jsxRuntime.jsxs)(_reactNative.ScrollView,{testID:"buoy-storage-scroll",ref:we,onScroll:e=>{Me.current=e.nativeEvent.contentOffset.y},scrollEventThrottle:32,style:styles.scrollContainer,contentContainerStyle:styles.container,showsVerticalScrollIndicator:false,children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.backgroundGrid}),(0,_jsxRuntime.jsx)(_StorageFilterCards.StorageFilterCards,{stats:k,tabStats:b,healthPercentage:K,healthStatus:He,healthColor:Ue,activeFilter:y,onFilterChange:be,activeStorageType:d,onStorageTypeChange:xe,showStatus:!L}),Pe,g.length>0?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.keysSection,children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.sectionHeader,children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.sectionHeaderLeft,children:[(0,_jsxRuntime.jsxs)(_reactNative.Text,{style:styles.sectionTitle,children:[y==="all"?"KEYS":y==="missing"?"MISSING KEYS":"ISSUES TO FIX",d!=="all"&&` (${d.toUpperCase()})`]}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.countBadge,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.countText,children:C.length})})]}),$e]}),Ge,(0,_jsxRuntime.jsx)(_StorageKeySection.StorageKeySection,{title:"",count:-1,keys:C,emptyMessage:"",isSelectMode:F,selectedKeys:V,onSelectionChange:Re,eventCountByKey:G,onViewHistory:A,onHideKey:e=>W([e]),onToggleKey:De,onDeleteKey:ye,editBlockedFor:he,pinnedKeys:S,onTogglePin:Z,onRowRef:ke,onOpenKey:Se}),Ye]}):Je,(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.techFooter,children:"ASYNC STORAGE | MMKV | SECURE STORAGE BACKENDS"}),Xe]})]})}const styles=_reactNative.StyleSheet.create({root:{flex:1,minHeight:0},editorOverlay:{..._sharedUi.absoluteFill,zIndex:10},scrollContainer:{flex:1,backgroundColor:"transparent"},container:{padding:12,paddingBottom:120},backgroundGrid:{..._sharedUi.absoluteFill,opacity:.006,backgroundColor:_sharedUi.gameUIColors.info},techFooter:{fontSize:8,color:_sharedUi.night.color.textTertiary,fontFamily:_sharedUi.monoFont,textAlign:"center",marginTop:20,letterSpacing:1,opacity:.5},keysSection:{marginTop:8,backgroundColor:_sharedUi.night.color.bg,borderRadius:12,padding:12,borderWidth:1,borderColor:_sharedUi.night.color.border},sectionHeader:{flexDirection:"row",justifyContent:"space-between",alignItems:"center",marginBottom:10,paddingBottom:6,borderBottomWidth:1,borderBottomColor:_sharedUi.night.color.separator},sectionHeaderLeft:{flexDirection:"row",alignItems:"center",gap:8},sectionTitle:{fontSize:12,fontWeight:"600",color:_sharedUi.night.color.textSecondary,letterSpacing:.4,textTransform:"uppercase"},countBadge:{backgroundColor:_sharedUi.night.color.surfaceElevated,paddingHorizontal:8,paddingVertical:3,borderRadius:6,borderWidth:1,borderColor:_sharedUi.night.color.border},countText:{fontSize:11,fontWeight:"600",color:_sharedUi.night.color.text,fontFamily:_sharedUi.monoFont},emptyState:{alignItems:"center",justifyContent:"center",paddingVertical:48},emptyTitle:{fontSize:16,fontWeight:"600",color:_sharedUi.night.color.text,marginTop:12,marginBottom:8},emptySubtitle:{fontSize:13,color:_sharedUi.night.color.textSecondary,textAlign:"center"},emptyMMKVState:{backgroundColor:_sharedUi.night.color.surface,borderRadius:12,padding:20,borderWidth:1,borderColor:_sharedUi.night.color.border,marginTop:8,alignItems:"center"},emptyMMKVTitle:{fontSize:14,fontWeight:"600",color:_sharedUi.night.color.text,marginBottom:6},emptyMMKVSubtitle:{fontSize:12,color:_sharedUi.night.color.textSecondary,textAlign:"center",marginBottom:12},emptyMMKVCode:{fontSize:10,fontFamily:_sharedUi.monoFont,color:_sharedUi.night.color.accent,backgroundColor:_sharedUi.night.color.bg,padding:12,borderRadius:8,borderWidth:1,borderColor:_sharedUi.night.color.border,alignSelf:"stretch"},instanceNavbar:{marginTop:12,marginBottom:8,backgroundColor:_sharedUi.night.color.surface,borderRadius:10,borderWidth:1,borderColor:_sharedUi.night.color.border,padding:10,shadowColor:"#000",shadowOpacity:.08,shadowRadius:6,shadowOffset:{width:0,height:2}},instanceNavbarHeader:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",marginBottom:8,paddingLeft:2},instanceNavbarLabel:{fontSize:9,fontWeight:"700",color:_sharedUi.night.color.textTertiary,textTransform:"uppercase",letterSpacing:1},instanceNavbarScroll:{gap:8,paddingRight:8},instanceNavbarButton:{flexDirection:"row",alignItems:"center",gap:6,paddingHorizontal:12,paddingVertical:8,backgroundColor:_sharedUi.night.color.surfaceElevated,borderRadius:8,borderWidth:1,borderColor:_sharedUi.night.color.border,minWidth:90},instanceNavbarButtonActive:{borderWidth:1.5,shadowColor:"#000",shadowOpacity:.1,shadowRadius:4,shadowOffset:{width:0,height:1}},instanceNavbarButtonText:{fontSize:11,fontWeight:"600",color:_sharedUi.night.color.textSecondary,fontFamily:_sharedUi.monoFont,flex:1},instanceNavbarButtonTextActive:{fontWeight:"700",color:_sharedUi.night.color.text},instanceNavbarBadge:{backgroundColor:_sharedUi.night.color.bg,paddingHorizontal:6,paddingVertical:2,borderRadius:6,minWidth:24,alignItems:"center"},instanceNavbarBadgeText:{fontSize:10,fontWeight:"700",color:_sharedUi.night.color.textSecondary,fontFamily:_sharedUi.monoFont},clearSearchButton:{marginTop:16,paddingHorizontal:16,paddingVertical:8,backgroundColor:_sharedUi.night.color.surfaceElevated,borderRadius:6,borderWidth:1,borderColor:_sharedUi.night.color.border},clearSearchText:{fontSize:13,color:_sharedUi.night.color.text,fontWeight:"500"},limitBanner:{backgroundColor:_sharedUi.night.color.surface,borderRadius:10,borderWidth:1,borderColor:_sharedUi.night.color.accentBorderStrong,padding:12,marginTop:12},limitBannerContent:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",marginBottom:4},limitBannerLeft:{flexDirection:"row",alignItems:"center",gap:8},limitBannerText:{color:_sharedUi.night.color.text,fontSize:13,fontWeight:"600"},limitBannerSubtext:{color:_sharedUi.night.color.textTertiary,fontSize:11}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.useAsyncStorageKeys=useAsyncStorageKeys;var _react=require("react");var _appAsyncStorage=_interopRequireDefault(require("../utils/appAsyncStorage"));var _asyncStorageCompat=require("../utils/asyncStorageCompat");var _requiredStorageKeyScope=require("../utils/requiredStorageKeyScope");function _interopRequireDefault(s){return s&&s.__esModule?s:{default:s}}function useAsyncStorageKeys(s=[]){const[g,c]=(0,_react.useState)([]);const[
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.useAsyncStorageKeys=useAsyncStorageKeys;var _sharedUi=require("@buoy-gg/shared-ui");var _react=require("react");var _appAsyncStorage=_interopRequireDefault(require("../utils/appAsyncStorage"));var _asyncStorageCompat=require("../utils/asyncStorageCompat");var _requiredStorageKeyScope=require("../utils/requiredStorageKeyScope");function _interopRequireDefault(s){return s&&s.__esModule?s:{default:s}}function useAsyncStorageKeys(s=[]){const[g,c]=(0,_react.useState)([]);const[_,d]=(0,_react.useState)(true);const[x,l]=(0,_react.useState)(null);const S=JSON.stringify(s);const y=(0,_react.useRef)(s);y.current=s;const p=(0,_react.useCallback)(async()=>{const f=y.current;d(true);l(null);try{const o=(await _appAsyncStorage.default.getAllKeys()).filter(e=>!(0,_sharedUi.isDevToolsStorageKey)(e));if(!o||o.length===0){c([]);d(false);return}const T=await(0,_asyncStorageCompat.readMany)(o);const u=[];T.forEach(([e,n])=>{let r=n;if(n){try{r=JSON.parse(n)}catch{r=n}}const t=f.find(a=>{if(!(0,_requiredStorageKeyScope.requiredKeyAppliesTo)(a,"async"))return false;if(typeof a==="string")return a===e;return a.key===e});let i="optional_present";if(t){if(r===void 0||r===null){i="required_missing"}else if(typeof t==="object"&&t.expectedValue!==void 0){i=r===t.expectedValue?"required_present":"required_wrong_value"}else if(typeof t==="object"&&t.expectedType!==void 0){const a=r===null?"null":typeof r;i=a.toLowerCase()===t.expectedType.toLowerCase()?"required_present":"required_wrong_type"}else{i="required_present"}}const h={key:e,value:r,storageType:"async",status:i,category:t?"required":"optional",...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}};u.push(h)});f.forEach(e=>{if(!(0,_requiredStorageKeyScope.requiredKeyAppliesTo)(e,"async"))return;const n=typeof e==="string"?e:e.key;const r=u.some(t=>t.key===n);if(!r){u.push({key:n,value:void 0,storageType:"async",status:"required_missing",category:"required",...typeof e==="object"&&e.expectedValue!==void 0&&{expectedValue:e.expectedValue},...typeof e==="object"&&e.expectedType!==void 0&&{expectedType:e.expectedType},...typeof e==="object"&&e.description!==void 0&&{description:e.description}})}});c(u)}catch(o){l(o instanceof Error?o:new Error("Failed to fetch storage data"));c([])}finally{d(false)}},[S]);(0,_react.useEffect)(()=>{p()},[p]);return{storageKeys:g,isLoading:_,error:x,refresh:p}}
|
|
@@ -1 +1 @@
|
|
|
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[
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.useMMKVInstance=useMMKVInstance;exports.useMMKVInstanceExists=useMMKVInstanceExists;exports.useMMKVInstances=useMMKVInstances;var _sharedUi=require("@buoy-gg/shared-ui");var _react=require("react");var _MMKVInstanceRegistry=require("../utils/MMKVInstanceRegistry");function useMMKVInstances(t=false){const[s,e]=(0,_react.useState)([]);const[r,c]=(0,_react.useState)(true);const a=()=>{c(true);try{const n=_MMKVInstanceRegistry.mmkvInstanceRegistry.getAll().filter(({id:i})=>!(0,_sharedUi.isDevToolsStorageKey)(i));const o=n.map(i=>{const{instance:u,id:l,encrypted:f,readOnly:y}=i;const g=u.getAllKeys().filter(v=>!(0,_sharedUi.isDevToolsStorageKey)(v));const I=g?.length||0;const M=void 0;return{id:l,instance:u,encrypted:f,readOnly:y,keyCount:I,size:M}});e(o)}catch(n){e([])}finally{c(false)}};(0,_react.useEffect)(()=>{a()},[]);(0,_react.useEffect)(()=>{if(!t)return;const n=setInterval(()=>{a()},1e3);return()=>clearInterval(n)},[t]);return{instances:s,instanceCount:s.length,isLoading:r,refresh:a}}function useMMKVInstance(t){const[s,e]=(0,_react.useState)(null);(0,_react.useEffect)(()=>{if(!_MMKVInstanceRegistry.mmkvInstanceRegistry){e(null);return}const r=_MMKVInstanceRegistry.mmkvInstanceRegistry.get(t);if(!r){e(null);return}const c=r.instance.getAllKeys().filter(n=>!(0,_sharedUi.isDevToolsStorageKey)(n));const a=c?.length||0;e({...r,keyCount:a,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 +1 @@
|
|
|
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
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.useMMKVKeys=useMMKVKeys;exports.useMultiMMKVKeys=useMultiMMKVKeys;var _sharedUi=require("@buoy-gg/shared-ui");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 _=JSON.stringify(x);const y=(0,_react.useRef)(x);y.current=x;const l=(0,_react.useCallback)(()=>{const o=y.current;f(true);K(null);try{if(!p){a([]);f(false);return}const i=p.getAllKeys().filter(t=>!(0,_sharedUi.isDevToolsStorageKey)(t));if(!i||i.length===0){const t=o.filter(e=>(0,_requiredStorageKeyScope.requiredKeyAppliesTo)(e,"mmkv")).map(e=>{const s=typeof e==="string"?e:e.key;const r=typeof e==="object"?e.description:void 0;const n=typeof e==="object"?e.expectedValue:void 0;const d=typeof e==="object"?e.expectedType:void 0;return{key:s,value:void 0,valueType:void 0,storageType:"mmkv",instanceId:c,status:"required_missing",category:"required",description:r,expectedValue:n,expectedType:d}});a(t);f(false);return}const u=[];i.forEach(t=>{const{value:e,type:s}=(0,_mmkvTypeDetection.detectMMKVType)(p,t);const r=o.find(g=>{if(!(0,_requiredStorageKeyScope.requiredKeyAppliesTo)(g,"mmkv"))return false;if(typeof g==="string")return g===t;return g.key===t});let n="optional_present";if(r){if(e===void 0){n="required_missing"}else if(typeof r==="object"&&r.expectedValue!==void 0){n=String(e)===String(r.expectedValue)?"required_present":"required_wrong_value"}else if(typeof r==="object"&&r.expectedType!==void 0){n=(0,_mmkvTypeDetection.isTypeMatch)(s,r.expectedType)?"required_present":"required_wrong_type"}else{n="required_present"}}const d={key:t,value:e,valueType:s!=="unknown"?s:void 0,storageType:"mmkv",instanceId:c,status:n,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}};u.push(d)});o.forEach(t=>{if(!(0,_requiredStorageKeyScope.requiredKeyAppliesTo)(t,"mmkv"))return;const e=typeof t==="string"?t:t.key;const s=u.some(r=>r.key===e);if(!s){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,_]);(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 _=(0,_react.useRef)(c);_.current=c;const y=(0,_react.useCallback)(()=>{const l=_.current;m(true);v(null);try{const o=[];p.forEach(({instance:i,id:u})=>{const t=i.getAllKeys().filter(e=>!(0,_sharedUi.isDevToolsStorageKey)(e));if(!t||t.length===0){return}t.forEach(e=>{const{value:s,type:r}=(0,_mmkvTypeDetection.detectMMKVType)(i,e);const n=l.find(V=>{if(!(0,_requiredStorageKeyScope.requiredKeyAppliesTo)(V,"mmkv"))return false;if(typeof V==="string")return V===e;return V.key===e});let d="optional_present";if(n){if(s===void 0){d="required_missing"}else if(typeof n==="object"&&n.expectedValue!==void 0){d=String(s)===String(n.expectedValue)?"required_present":"required_wrong_value"}else if(typeof n==="object"&&n.expectedType!==void 0){d=(0,_mmkvTypeDetection.isTypeMatch)(r,n.expectedType)?"required_present":"required_wrong_type"}else{d="required_present"}}const g={key:e,value:s,valueType:r!=="unknown"?r:void 0,storageType:"mmkv",instanceId:u,status:d,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}};o.push(g)})});l.forEach(i=>{if(!(0,_requiredStorageKeyScope.requiredKeyAppliesTo)(i,"mmkv"))return;const u=typeof i==="string"?i:i.key;const t=o.some(e=>e.key===u);if(!t){const e=p[0]?.id||"mmkv.default";o.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(o)}catch(o){v(o instanceof Error?o: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}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.useSecureStoreKeys=useSecureStoreKeys;var _react=require("react");var _requiredStorageKeyScope=require("../utils/requiredStorageKeyScope");var _SecureStoreRegistry=require("../utils/SecureStoreRegistry");const BIOMETRIC_PLACEHOLDER="\u2022\u2022\u2022\u2022\u2022\u2022 (biometric protected)";const DEFAULT_POLL_MS=3e3;function signature(u){return JSON.stringify(u)}function useSecureStoreKeys(u=[],
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.useSecureStoreKeys=useSecureStoreKeys;var _sharedUi=require("@buoy-gg/shared-ui");var _react=require("react");var _requiredStorageKeyScope=require("../utils/requiredStorageKeyScope");var _SecureStoreRegistry=require("../utils/SecureStoreRegistry");const BIOMETRIC_PLACEHOLDER="\u2022\u2022\u2022\u2022\u2022\u2022 (biometric protected)";const DEFAULT_POLL_MS=3e3;function signature(u){return JSON.stringify(u)}function useSecureStoreKeys(u=[],b={}){const{pollMs:d=DEFAULT_POLL_MS}=b;const h=(0,_react.useRef)(u);h.current=u;const x=JSON.stringify(u);const[T,m]=(0,_react.useState)([]);const[L,p]=(0,_react.useState)(true);const[A,v]=(0,_react.useState)(null);const q=(0,_react.useRef)(signature([]));const y=(0,_react.useRef)(false);const f=(0,_react.useRef)(false);const l=(0,_react.useCallback)(r=>{const i=signature(r);if(i===q.current)return;q.current=i;m(r)},[]);const c=(0,_react.useCallback)(async()=>{if(f.current)return;f.current=true;try{const r=_SecureStoreRegistry.secureStoreRegistry.getModule();const i=_SecureStoreRegistry.secureStoreRegistry.getAll().filter(({key:e})=>!(0,_sharedUi.isDevToolsStorageKey)(e));const g=h.current.filter(e=>(0,_requiredStorageKeyScope.requiredKeyAppliesTo)(e,"secure"));const E=e=>g.find(t=>(typeof t==="string"?t:t.key)===e);if(!r||i.length===0&&g.length===0){l([]);y.current=true;p(false);return}if(!y.current)p(true);v(null);const S=[];const I=[...i,...g.map(e=>typeof e==="string"?e:e.key).filter(e=>!i.some(t=>t.key===e)).map(e=>({key:e,options:{},description:void 0}))];for(const e of I){const t=E(e.key);const n=typeof t==="object"?t:void 0;const R={...n?.expectedValue!==void 0&&{expectedValue:n.expectedValue},...n?.expectedType!==void 0&&{expectedType:n.expectedType}};const _=n?.description??e.description;if(e.options.requireAuthentication){S.push({key:e.key,value:BIOMETRIC_PLACEHOLDER,storageType:"secure",status:t?"required_present":"optional_present",category:t?"required":"optional",description:_??"Protected by biometric authentication \u2014 value not read by DevTools",...R,...e.options.keychainService&&{instanceId:e.options.keychainService}});continue}let s=null;try{s=await r.getItemAsync(e.key,e.options)}catch{}if(s===null&&!t)continue;let o=s;if(s){try{o=JSON.parse(s)}catch{o=s}}let a="optional_present";if(t){if(s===null)a="required_missing";else if(n?.expectedValue!==void 0)a=String(o)===String(n.expectedValue)?"required_present":"required_wrong_value";else if(n?.expectedType!==void 0){const O=o===null?"null":Array.isArray(o)?"array":typeof o;const k=n.expectedType.toLowerCase();a=O===k||k==="string"&&typeof s==="string"?"required_present":"required_wrong_type"}else a="required_present"}S.push({key:e.key,value:s===null?void 0:o,storageType:"secure",status:a,category:t?"required":"optional",..._&&{description:_},...R,...e.options.keychainService&&{instanceId:e.options.keychainService}})}l(S)}catch(r){v(r instanceof Error?r:new Error("Failed to read SecureStore"));l([])}finally{y.current=true;f.current=false;p(false)}},[l,x]);(0,_react.useEffect)(()=>{c();const r=_SecureStoreRegistry.secureStoreRegistry.subscribe(()=>{c()});if(d<=0)return r;const i=setInterval(c,d);return()=>{r();clearInterval(i)}},[c,d]);return{storageKeys:T,isLoading:L,error:A,refresh:c}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.batchPairsOf=batchPairsOf;exports.isStorageCapturing=exports.getStorageEvents=exports.clearStorageEvents=void 0;exports.isValueOnDevice=isValueOnDevice;exports.subscribeToStorageEvents=exports.storageEventStore=exports.onStorageEvent=void 0;var _sharedUi=require("@buoy-gg/shared-ui");var _AsyncStorageListener=require("../utils/AsyncStorageListener");var _MMKVListener=require("../utils/MMKVListener");var _MMKVInstanceRegistry=require("../utils/MMKVInstanceRegistry");var _mmkvTypeDetection=require("../utils/mmkvTypeDetection");function isValueOnDevice(
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.batchPairsOf=batchPairsOf;exports.isStorageCapturing=exports.getStorageEvents=exports.clearStorageEvents=void 0;exports.isValueOnDevice=isValueOnDevice;exports.subscribeToStorageEvents=exports.storageEventStore=exports.onStorageEvent=void 0;var _sharedUi=require("@buoy-gg/shared-ui");var _AsyncStorageListener=require("../utils/AsyncStorageListener");var _MMKVListener=require("../utils/MMKVListener");var _MMKVInstanceRegistry=require("../utils/MMKVInstanceRegistry");var _mmkvTypeDetection=require("../utils/mmkvTypeDetection");function isValueOnDevice(a){return!!a&&typeof a==="object"&&a.__buoyValueOnDevice===true}function batchPairsOf(a){if(a.storageType!=="async"||!a.data)return{};return{pairs:a.data.pairs,prevPairs:a.data.prevPairs}}function eventHasOnDeviceValues(a){const t=a.data;if(!t)return false;const{pairs:s,prevPairs:n}=batchPairsOf(a);return isValueOnDevice(t.value)||isValueOnDevice(t.prevValue)||isValueOnDevice(s)||isValueOnDevice(n)}let storageEventIdCounter=0;function nextStorageEventId(){return`se-${Date.now()}-${++storageEventIdCounter}`}class StorageEventStore extends _sharedUi.BaseEventStore{addEvent(t){const s=(0,_sharedUi.appStorageEvent)(t);if(s)super.addEvent(s)}asyncStorageUnsubscribe=null;mmkvUnsubscribe=null;hasScannedInitialState=false;constructor(){super({storeName:"storage",maxEvents:500})}async scanExistingState(){if(this.hasScannedInitialState)return;this.hasScannedInitialState=true;const t=new Date;const s=_MMKVInstanceRegistry.mmkvInstanceRegistry.getAll();for(const{id:n,instance:e}of s){try{const r=e.getAllKeys();for(const i of r){const{value:c,type:o}=(0,_mmkvTypeDetection.detectMMKVType)(e,i);const u={string:"set.string",number:"set.number",boolean:"set.boolean",buffer:"set.buffer"};const p=u[o]??"set.string";this.addEvent({action:p,timestamp:t,instanceId:n,data:{key:i,value:c,valueType:o,initialScan:true},storageType:"mmkv",id:nextStorageEventId()})}}catch{}}try{const{asyncStorage:n,readMany:e}=require("../utils/asyncStorageCompat");if(n){const r=await n.getAllKeys();if(r.length>0){const i=await e(r);for(const[c,o]of i){this.addEvent({action:"setItem",timestamp:t,data:{key:c,value:o??void 0,initialScan:true},storageType:"async",id:nextStorageEventId()})}}}}catch{}}async startCapturing(){if(!(0,_AsyncStorageListener.isListening)()){await(0,_AsyncStorageListener.startListening)()}if(!this.asyncStorageUnsubscribe){this.asyncStorageUnsubscribe=(0,_AsyncStorageListener.addListener)(t=>{const s={...t,storageType:"async",id:nextStorageEventId()};this.addEvent(s)})}if(!this.mmkvUnsubscribe){this.mmkvUnsubscribe=(0,_MMKVListener.addMMKVListener)(t=>{const s={...t,storageType:"mmkv",id:nextStorageEventId()};this.addEvent(s)})}await this.scanExistingState()}stopCapturing(){if(this.asyncStorageUnsubscribe){this.asyncStorageUnsubscribe();this.asyncStorageUnsubscribe=null}if(this.mmkvUnsubscribe){this.mmkvUnsubscribe();this.mmkvUnsubscribe=null}}isCapturing(){return this.asyncStorageUnsubscribe!==null||this.mmkvUnsubscribe!==null}getEventsByType(t){return this.events.filter(s=>s.storageType===t)}replaceEvents(t){const s=new Map;for(const e of this.events){if(!eventHasOnDeviceValues(e)){s.set(e.id,e)}}const n=t.map(_sharedUi.appStorageEvent).filter(e=>e!==null).map(e=>{const r=s.get(e.id);if(!r||!eventHasOnDeviceValues(e))return e;return{...e,data:{...e.data,value:r.data?.value,prevValue:r.data?.prevValue,...batchPairsOf(r)}}});super.replaceEvents(n)}hydrateEvent(t){const s=(0,_sharedUi.appStorageEvent)(t);if(!s)return;t=s;const n=this.events.findIndex(i=>i.id===t.id);if(n===-1)return;const e=this.events[n];const r=this.events.slice();r[n]={...e,...t,timestamp:e.timestamp,data:{...e.data,...t.data}};super.replaceEvents(r)}}const storageEventStore=exports.storageEventStore=new StorageEventStore;const subscribeToStorageEvents=a=>storageEventStore.subscribeToEvents(a);exports.subscribeToStorageEvents=subscribeToStorageEvents;const onStorageEvent=a=>storageEventStore.onEvent(a);exports.onStorageEvent=onStorageEvent;const getStorageEvents=()=>storageEventStore.getEvents();exports.getStorageEvents=getStorageEvents;const clearStorageEvents=()=>storageEventStore.clearEvents();exports.clearStorageEvents=clearStorageEvents;const isStorageCapturing=()=>storageEventStore.isCapturing();exports.isStorageCapturing=isStorageCapturing;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.VALUE_ON_DEVICE=exports.SNAPSHOT_VALUE_INLINE_LIMIT=exports.SNAPSHOT_EVENTS_BUDGET=void 0;exports.setToolRequiredStorageKeys=setToolRequiredStorageKeys;exports.storageSyncAdapter=void 0;var _appAsyncStorage=_interopRequireDefault(require("../utils/appAsyncStorage"));var _sharedUi=require("@buoy-gg/shared-ui");var _asyncStorageCompat=require("../utils/asyncStorageCompat");var _storageEventStore=require("../stores/storageEventStore");var _clearAllStorage=require("../utils/clearAllStorage");var _storageTimeTravelUtils=require("../utils/storageTimeTravelUtils");var _MMKVInstanceRegistry=require("../utils/MMKVInstanceRegistry");var _mmkvTypeDetection=require("../utils/mmkvTypeDetection");var _SecureStoreRegistry=require("../utils/SecureStoreRegistry");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const VALUE_ON_DEVICE=exports.VALUE_ON_DEVICE=Object.freeze({__buoyValueOnDevice:true,note:"Value stays on the device \u2014 fetched on demand via getEventDetail / mmkv.get / secure.get."});const SNAPSHOT_VALUE_INLINE_LIMIT=exports.SNAPSHOT_VALUE_INLINE_LIMIT=16*1024;const SNAPSHOT_EVENTS_BUDGET=exports.SNAPSHOT_EVENTS_BUDGET=1.25*1024*1024;const MAX_EVENT_DETAIL_BYTES=8*1024*1024;function toWireValue(e){if(e===void 0)return e;return(0,_sharedUi.isOverWireBudget)(e,SNAPSHOT_VALUE_INLINE_LIMIT)?VALUE_ON_DEVICE:e}function mapEventValues(e,t){const r=e.data;if(!r)return e;const n=t(r.value);const s=t(r.prevValue);const o=(0,_storageEventStore.batchPairsOf)(e);const i=t(o.pairs);const a=t(o.prevPairs);if(n===r.value&&s===r.prevValue&&i===o.pairs&&a===o.prevPairs){return e}return{...e,data:{...r,value:n,prevValue:s,...e.storageType==="async"?{pairs:i,prevPairs:a}:{}}}}function capDetailValue(e){if(e===void 0)return e;if(!(0,_sharedUi.isOverWireBudget)(e,MAX_EVENT_DETAIL_BYTES))return e;return(0,_sharedUi.isJsonSerializable)(e)?{__buoyTruncated:true,note:`Exceeds the ${MAX_EVENT_DETAIL_BYTES/(1024*1024)}MB detail limit \u2014 inspect it on-device.`}:VALUE_ON_DEVICE}const wireCache=new WeakMap;const strippedCache=new WeakMap;function wireFor(e){const t=wireCache.get(e);if(t)return t;let r;try{const n=mapEventValues(e,toWireValue);r={event:n,bytes:(0,_sharedUi.approxJsonSize)(n,SNAPSHOT_EVENTS_BUDGET).bytes}}catch{const n=mapEventValues(e,()=>VALUE_ON_DEVICE);r={event:n,bytes:1024}}wireCache.set(e,r);return r}function strippedFor(e){const t=strippedCache.get(e);if(t)return t;const r=mapEventValues(e,s=>s===void 0?void 0:VALUE_ON_DEVICE);const n={event:r,bytes:(0,_sharedUi.approxJsonSize)(r,SNAPSHOT_EVENTS_BUDGET).bytes};strippedCache.set(e,n);return n}function fitEventsToBudget(e){const t=new Array(e.length);let r=0;for(let n=0;n<e.length;n++){const s=wireFor(e[n]);if(r+s.bytes<=SNAPSHOT_EVENTS_BUDGET){t[n]=s.event;r+=s.bytes}else{const o=strippedFor(e[n]);t[n]=o.event;r+=o.bytes}}return t}function assertMMKVWritable(e){const t=_MMKVInstanceRegistry.mmkvInstanceRegistry.get(e);if(!t){throw new Error(`No MMKV instance registered as "${e}"`)}if(t.instance?.isReadOnly){throw new Error(`MMKV instance "${e}" is registered read-only`)}return t.instance}let toolRequiredStorageKeys=[];function setToolRequiredStorageKeys(e){toolRequiredStorageKeys=e}const storageSyncAdapter=exports.storageSyncAdapter={version:3,getSnapshot:()=>fitEventsToBudget(_storageEventStore.storageEventStore.getEvents().filter(e=>{const t=e.data?.key;return!(typeof t==="string"&&(0,_sharedUi.isDevToolsStorageKey)(t))})),subscribe:e=>_storageEventStore.storageEventStore.subscribeToEvents(e),actions:{clearEvents:()=>{_storageEventStore.storageEventStore.clearEvents()},getRequiredKeys:()=>toolRequiredStorageKeys,getEventDetail:e=>{const{id:t}=e??{};if(!t)return{found:false,reason:"missing id"};const r=_storageEventStore.storageEventStore.getEvents().find(s=>s.id===t);if(!r)return{found:false,reason:"unknown id"};const n=mapEventValues(r,capDetailValue);return{found:true,id:t,event:n}},clearAppStorage:()=>(0,_clearAllStorage.clearAllAppStorage)(),"timeTravel.undo":async e=>{const t=e?.id;if(!t)throw new Error("timeTravel.undo requires an event `id`");const r=_storageEventStore.storageEventStore.getEvents().find(s=>s.id===t);if(!r)throw new Error(`No storage event with id "${t}"`);if(r.storageType==="mmkv"){throw new Error("Time travel supports AsyncStorage events only")}const n=r;if(!(0,_storageTimeTravelUtils.canUndo)(n)){throw new Error(`Event "${t}" (${n.action}) has no previous value captured, so it cannot be undone`)}await(0,_storageTimeTravelUtils.undoOperation)(n);return{undone:true,action:n.action,key:n.data?.key}},"timeTravel.jump":async e=>{const{id:t,scope:r="key"}=e??{};if(!t)throw new Error("timeTravel.jump requires an event `id`");const n=_storageEventStore.storageEventStore.getEvents().filter(a=>a.storageType!=="mmkv").slice().reverse();const s=n.find(a=>a.id===t);if(!s)throw new Error(`No AsyncStorage event with id "${t}"`);const o=r==="all"?n:n.filter(a=>a.data?.key===s.data?.key);const i=o.findIndex(a=>a.id===t);if(i===-1)throw new Error(`Event "${t}" is not in the timeline`);await(0,_storageTimeTravelUtils.jumpToState)(o,i);return{jumped:true,scope:r,replayed:i+1,of:o.length,key:s.data?.key}},"async.getAllKeys":async()=>(await _appAsyncStorage.default.getAllKeys()).filter(e=>!(0,_sharedUi.isDevToolsStorageKey)(e)),"async.multiGet":async e=>(await(0,_asyncStorageCompat.readMany)(e.keys)).filter(([t])=>!(0,_sharedUi.isDevToolsStorageKey)(t)),"async.getItem":e=>{const{key:t}=e;return(0,_sharedUi.isDevToolsStorageKey)(t)?Promise.resolve(null):_appAsyncStorage.default.getItem(t)},"async.setItem":e=>{const{key:t,value:r}=e;return _appAsyncStorage.default.setItem(t,r)},"async.removeItem":e=>_appAsyncStorage.default.removeItem(e.key),"async.multiRemove":e=>(0,_asyncStorageCompat.removeMany)(e.keys),"async.multiSet":e=>(0,_asyncStorageCompat.writeMany)(e.pairs),"async.clear":()=>_appAsyncStorage.default.clear(),"mmkv.snapshot":()=>_MMKVInstanceRegistry.mmkvInstanceRegistry.getAll().map(({id:e,instance:t,encrypted:r,readOnly:n})=>{let s=[];try{s=t.getAllKeys().filter(o=>!(0,_sharedUi.isDevToolsStorageKey)(o)).map(o=>{const{value:i,type:a}=(0,_mmkvTypeDetection.detectMMKVType)(t,o);return{key:o,value:toWireValue(i),valueType:a}})}catch{}return{id:e,encrypted:r,readOnly:n,entries:s}}),"mmkv.get":e=>{const{instanceId:t,key:r}=e??{};if(!t||!r){return{found:false,reason:"missing instanceId/key"}}const n=_MMKVInstanceRegistry.mmkvInstanceRegistry.get(t);if(!n){return{found:false,reason:"unknown instance"}}const{value:s,type:o}=(0,_mmkvTypeDetection.detectMMKVType)(n.instance,r);return{found:true,instanceId:t,key:r,value:capDetailValue(s),valueType:o}},"mmkv.set":e=>{const{instanceId:t,key:r,value:n}=e;assertMMKVWritable(t).set(r,n)},"mmkv.remove":e=>{const{instanceId:t,key:r}=e;const n=assertMMKVWritable(t);if(n.remove)n.remove(r);else n.delete?.(r)},"secure.keys":async()=>{const e=_SecureStoreRegistry.secureStoreRegistry.getModule();return Promise.all(_SecureStoreRegistry.secureStoreRegistry.getAll().map(async({key:t,options:r,description:n})=>{let s=null;if(e&&!r.requireAuthentication){try{s=await e.getItemAsync(t,r)!=null}catch{s=null}}return{key:t,description:n,keychainService:r.keychainService,requireAuthentication:r.requireAuthentication??false,hasValue:s}}))},"secure.snapshot":async()=>{const e=_SecureStoreRegistry.secureStoreRegistry.getModule();const t=_SecureStoreRegistry.secureStoreRegistry.getAll();const r=[];for(const{key:n,options:s,description:o}of t){let i=null;if(e&&!s.requireAuthentication){try{i=await e.getItemAsync(n,s)}catch{}}r.push({key:n,description:o,keychainService:s.keychainService,requireAuthentication:s.requireAuthentication??false,value:i==null?i:toWireValue(i)})}return r},"secure.get":e=>{const{key:t}=e;const r=_SecureStoreRegistry.secureStoreRegistry.getAll().find(s=>s.key===t);const n=_SecureStoreRegistry.secureStoreRegistry.getModule();if(!r||!n||r.options.requireAuthentication){return Promise.resolve(null)}return n.getItemAsync(t,r.options)},"secure.set":e=>{const{key:t,value:r}=e;return _SecureStoreRegistry.secureStoreRegistry.setValue(t,r)},"secure.delete":e=>_SecureStoreRegistry.secureStoreRegistry.deleteValue(e.key)}};
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.VALUE_ON_DEVICE=exports.SNAPSHOT_VALUE_INLINE_LIMIT=exports.SNAPSHOT_EVENTS_BUDGET=void 0;exports.setToolRequiredStorageKeys=setToolRequiredStorageKeys;exports.storageSyncAdapter=void 0;var _appAsyncStorage=_interopRequireDefault(require("../utils/appAsyncStorage"));var _sharedUi=require("@buoy-gg/shared-ui");var _asyncStorageCompat=require("../utils/asyncStorageCompat");var _storageEventStore=require("../stores/storageEventStore");var _clearAllStorage=require("../utils/clearAllStorage");var _storageTimeTravelUtils=require("../utils/storageTimeTravelUtils");var _MMKVInstanceRegistry=require("../utils/MMKVInstanceRegistry");var _mmkvTypeDetection=require("../utils/mmkvTypeDetection");var _SecureStoreRegistry=require("../utils/SecureStoreRegistry");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const VALUE_ON_DEVICE=exports.VALUE_ON_DEVICE=Object.freeze({__buoyValueOnDevice:true,note:"Value stays on the device \u2014 fetched on demand via getEventDetail / mmkv.get / secure.get."});const SNAPSHOT_VALUE_INLINE_LIMIT=exports.SNAPSHOT_VALUE_INLINE_LIMIT=16*1024;const SNAPSHOT_EVENTS_BUDGET=exports.SNAPSHOT_EVENTS_BUDGET=1.25*1024*1024;const MAX_EVENT_DETAIL_BYTES=8*1024*1024;function toWireValue(e){if(e===void 0)return e;return(0,_sharedUi.isOverWireBudget)(e,SNAPSHOT_VALUE_INLINE_LIMIT)?VALUE_ON_DEVICE:e}function mapEventValues(e,t){const r=e.data;if(!r)return e;const n=t(r.value);const s=t(r.prevValue);const o=(0,_storageEventStore.batchPairsOf)(e);const i=t(o.pairs);const a=t(o.prevPairs);if(n===r.value&&s===r.prevValue&&i===o.pairs&&a===o.prevPairs){return e}return{...e,data:{...r,value:n,prevValue:s,...e.storageType==="async"?{pairs:i,prevPairs:a}:{}}}}function capDetailValue(e){if(e===void 0)return e;if(!(0,_sharedUi.isOverWireBudget)(e,MAX_EVENT_DETAIL_BYTES))return e;return(0,_sharedUi.isJsonSerializable)(e)?{__buoyTruncated:true,note:`Exceeds the ${MAX_EVENT_DETAIL_BYTES/(1024*1024)}MB detail limit \u2014 inspect it on-device.`}:VALUE_ON_DEVICE}const wireCache=new WeakMap;const strippedCache=new WeakMap;function wireFor(e){const t=wireCache.get(e);if(t)return t;let r;try{const n=mapEventValues(e,toWireValue);r={event:n,bytes:(0,_sharedUi.approxJsonSize)(n,SNAPSHOT_EVENTS_BUDGET).bytes}}catch{const n=mapEventValues(e,()=>VALUE_ON_DEVICE);r={event:n,bytes:1024}}wireCache.set(e,r);return r}function strippedFor(e){const t=strippedCache.get(e);if(t)return t;const r=mapEventValues(e,s=>s===void 0?void 0:VALUE_ON_DEVICE);const n={event:r,bytes:(0,_sharedUi.approxJsonSize)(r,SNAPSHOT_EVENTS_BUDGET).bytes};strippedCache.set(e,n);return n}function fitEventsToBudget(e){const t=new Array(e.length);let r=0;for(let n=0;n<e.length;n++){const s=wireFor(e[n]);if(r+s.bytes<=SNAPSHOT_EVENTS_BUDGET){t[n]=s.event;r+=s.bytes}else{const o=strippedFor(e[n]);t[n]=o.event;r+=o.bytes}}return t}function assertMMKVWritable(e){const t=_MMKVInstanceRegistry.mmkvInstanceRegistry.get(e);if(!t){throw new Error(`No MMKV instance registered as "${e}"`)}if(t.instance?.isReadOnly){throw new Error(`MMKV instance "${e}" is registered read-only`)}return t.instance}let toolRequiredStorageKeys=[];function setToolRequiredStorageKeys(e){toolRequiredStorageKeys=e}const storageSyncAdapter=exports.storageSyncAdapter={version:3,getSnapshot:()=>fitEventsToBudget(_storageEventStore.storageEventStore.getEvents().filter(e=>{const t=e.data?.key;return!(typeof t==="string"&&(0,_sharedUi.isDevToolsStorageKey)(t))})),subscribe:e=>_storageEventStore.storageEventStore.subscribeToEvents(e),actions:{clearEvents:()=>{_storageEventStore.storageEventStore.clearEvents()},getRequiredKeys:()=>toolRequiredStorageKeys,getEventDetail:e=>{const{id:t}=e??{};if(!t)return{found:false,reason:"missing id"};const r=_storageEventStore.storageEventStore.getEvents().find(s=>s.id===t);if(!r)return{found:false,reason:"unknown id"};const n=mapEventValues(r,capDetailValue);return{found:true,id:t,event:n}},clearAppStorage:()=>(0,_clearAllStorage.clearAllAppStorage)(),"timeTravel.undo":async e=>{const t=e?.id;if(!t)throw new Error("timeTravel.undo requires an event `id`");const r=_storageEventStore.storageEventStore.getEvents().find(s=>s.id===t);if(!r)throw new Error(`No storage event with id "${t}"`);if(r.storageType==="mmkv"){throw new Error("Time travel supports AsyncStorage events only")}const n=r;if(!(0,_storageTimeTravelUtils.canUndo)(n)){throw new Error(`Event "${t}" (${n.action}) has no previous value captured, so it cannot be undone`)}await(0,_storageTimeTravelUtils.undoOperation)(n);return{undone:true,action:n.action,key:n.data?.key}},"timeTravel.jump":async e=>{const{id:t,scope:r="key"}=e??{};if(!t)throw new Error("timeTravel.jump requires an event `id`");const n=_storageEventStore.storageEventStore.getEvents().filter(a=>a.storageType!=="mmkv").slice().reverse();const s=n.find(a=>a.id===t);if(!s)throw new Error(`No AsyncStorage event with id "${t}"`);const o=r==="all"?n:n.filter(a=>a.data?.key===s.data?.key);const i=o.findIndex(a=>a.id===t);if(i===-1)throw new Error(`Event "${t}" is not in the timeline`);await(0,_storageTimeTravelUtils.jumpToState)(o,i);return{jumped:true,scope:r,replayed:i+1,of:o.length,key:s.data?.key}},"async.getAllKeys":async()=>(await _appAsyncStorage.default.getAllKeys()).filter(e=>!(0,_sharedUi.isDevToolsStorageKey)(e)),"async.multiGet":async e=>(await(0,_asyncStorageCompat.readMany)(e.keys)).filter(([t])=>!(0,_sharedUi.isDevToolsStorageKey)(t)),"async.getItem":e=>{const{key:t}=e;return(0,_sharedUi.isDevToolsStorageKey)(t)?Promise.resolve(null):_appAsyncStorage.default.getItem(t)},"async.setItem":e=>{const{key:t,value:r}=e;return _appAsyncStorage.default.setItem(t,r)},"async.removeItem":e=>_appAsyncStorage.default.removeItem(e.key),"async.multiRemove":e=>(0,_asyncStorageCompat.removeMany)(e.keys),"async.multiSet":e=>(0,_asyncStorageCompat.writeMany)(e.pairs),"async.clear":()=>_appAsyncStorage.default.clear(),"mmkv.snapshot":()=>_MMKVInstanceRegistry.mmkvInstanceRegistry.getAll().filter(({id:e})=>!(0,_sharedUi.isDevToolsStorageKey)(e)).map(({id:e,instance:t,encrypted:r,readOnly:n})=>{let s=[];try{s=t.getAllKeys().filter(o=>!(0,_sharedUi.isDevToolsStorageKey)(o)).map(o=>{const{value:i,type:a}=(0,_mmkvTypeDetection.detectMMKVType)(t,o);return{key:o,value:toWireValue(i),valueType:a}})}catch{}return{id:e,encrypted:r,readOnly:n,entries:s}}),"mmkv.get":e=>{const{instanceId:t,key:r}=e??{};if(!t||!r||(0,_sharedUi.isDevToolsStorageKey)(r)||(0,_sharedUi.isDevToolsStorageKey)(t)){return{found:false,reason:"missing instanceId/key"}}const n=_MMKVInstanceRegistry.mmkvInstanceRegistry.get(t);if(!n){return{found:false,reason:"unknown instance"}}const{value:s,type:o}=(0,_mmkvTypeDetection.detectMMKVType)(n.instance,r);return{found:true,instanceId:t,key:r,value:capDetailValue(s),valueType:o}},"mmkv.set":e=>{const{instanceId:t,key:r,value:n}=e;assertMMKVWritable(t).set(r,n)},"mmkv.remove":e=>{const{instanceId:t,key:r}=e;const n=assertMMKVWritable(t);if(n.remove)n.remove(r);else n.delete?.(r)},"secure.keys":async()=>{const e=_SecureStoreRegistry.secureStoreRegistry.getModule();return Promise.all(_SecureStoreRegistry.secureStoreRegistry.getAll().filter(({key:t})=>!(0,_sharedUi.isDevToolsStorageKey)(t)).map(async({key:t,options:r,description:n})=>{let s=null;if(e&&!r.requireAuthentication){try{s=await e.getItemAsync(t,r)!=null}catch{s=null}}return{key:t,description:n,keychainService:r.keychainService,requireAuthentication:r.requireAuthentication??false,hasValue:s}}))},"secure.snapshot":async()=>{const e=_SecureStoreRegistry.secureStoreRegistry.getModule();const t=_SecureStoreRegistry.secureStoreRegistry.getAll().filter(({key:n})=>!(0,_sharedUi.isDevToolsStorageKey)(n));const r=[];for(const{key:n,options:s,description:o}of t){let i=null;if(e&&!s.requireAuthentication){try{i=await e.getItemAsync(n,s)}catch{}}r.push({key:n,description:o,keychainService:s.keychainService,requireAuthentication:s.requireAuthentication??false,value:i==null?i:toWireValue(i)})}return r},"secure.get":e=>{const{key:t}=e;if((0,_sharedUi.isDevToolsStorageKey)(t))return null;const r=_SecureStoreRegistry.secureStoreRegistry.getAll().find(s=>s.key===t);const n=_SecureStoreRegistry.secureStoreRegistry.getModule();if(!r||!n||r.options.requireAuthentication){return Promise.resolve(null)}return n.getItemAsync(t,r.options)},"secure.set":e=>{const{key:t,value:r}=e;return _SecureStoreRegistry.secureStoreRegistry.setValue(t,r)},"secure.delete":e=>_SecureStoreRegistry.secureStoreRegistry.deleteValue(e.key)}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.stopListening=exports.startListening=exports.resumeCapture=exports.removeAllListeners=exports.pauseCapture=exports.isPaused=exports.isListening=exports.getListenerCount=exports.default=exports.addListener=void 0;var _asyncStorageCompat=require("./asyncStorageCompat");const ORIGINALS_KEY=Symbol.for("@buoy-gg/storage.asyncStorageOriginals");function readStashedOriginals(){return globalThis[ORIGINALS_KEY]??null}function stashOriginals(n){globalThis[ORIGINALS_KEY]=n}class AsyncStorageListener{listeners=[];isListening=false;isInitialized=false;isPaused=false;ignoredKeys=new Set(["@react_buoy_storage_event_filters","@react_buoy_storage_key_filters","@react_buoy_storage_is_monitoring","REACT_QUERY_OFFLINE_CACHE"]);originalSetItem=null;originalRemoveItem=null;originalMergeItem=null;originalClear=null;originalMultiSet=null;originalMultiRemove=null;originalMultiMerge=null;originalSetMany=null;originalRemoveMany=null;shouldIgnoreKey(t){if(this.ignoredKeys.has(t))return true;for(const i of this.ignoredKeys){if(t.startsWith(i))return true}return false}adoptOriginals(t){this.originalSetItem=t.setItem;this.originalRemoveItem=t.removeItem;this.originalClear=t.clear;this.originalMergeItem=t.mergeItem;this.originalMultiSet=t.multiSet;this.originalMultiRemove=t.multiRemove;this.originalMultiMerge=t.multiMerge;this.originalSetMany=t.setMany;this.originalRemoveMany=t.removeMany}async initialize(){if(this.isInitialized){return true}if(_asyncStorageCompat.asyncStorage.setItem.name==="swizzled_setItem"){const i=readStashedOriginals();if(!i){return false}this.adoptOriginals(i);this.isInitialized=true;return true}const t={setItem:_asyncStorageCompat.asyncStorage.setItem.bind(_asyncStorageCompat.asyncStorage),removeItem:_asyncStorageCompat.asyncStorage.removeItem.bind(_asyncStorageCompat.asyncStorage),clear:_asyncStorageCompat.asyncStorage.clear.bind(_asyncStorageCompat.asyncStorage),mergeItem:null,multiSet:null,multiRemove:null,multiMerge:null,setMany:null,removeMany:null};if(_asyncStorageCompat.asyncStorageCaps.hasLegacyMultiApi){t.multiSet=_asyncStorageCompat.asyncStorage.multiSet.bind(_asyncStorageCompat.asyncStorage);t.multiRemove=_asyncStorageCompat.asyncStorage.multiRemove.bind(_asyncStorageCompat.asyncStorage);t.mergeItem=_asyncStorageCompat.asyncStorage.mergeItem.bind(_asyncStorageCompat.asyncStorage);t.multiMerge=_asyncStorageCompat.asyncStorage.multiMerge?_asyncStorageCompat.asyncStorage.multiMerge.bind(_asyncStorageCompat.asyncStorage):null}else{t.setMany=_asyncStorageCompat.asyncStorage.setMany.bind(_asyncStorageCompat.asyncStorage);t.removeMany=_asyncStorageCompat.asyncStorage.removeMany.bind(_asyncStorageCompat.asyncStorage)}stashOriginals(t);this.adoptOriginals(t);this.isInitialized=true;return true}restoreOriginalMethods(){if(!_asyncStorageCompat.asyncStorage||!this.originalSetItem){return}_asyncStorageCompat.asyncStorage.setItem=this.originalSetItem;if(this.originalRemoveItem){_asyncStorageCompat.asyncStorage.removeItem=this.originalRemoveItem}if(this.originalClear){_asyncStorageCompat.asyncStorage.clear=this.originalClear}if(this.originalMergeItem){_asyncStorageCompat.asyncStorage.mergeItem=this.originalMergeItem}if(this.originalMultiSet){_asyncStorageCompat.asyncStorage.multiSet=this.originalMultiSet}if(this.originalMultiRemove){_asyncStorageCompat.asyncStorage.multiRemove=this.originalMultiRemove}if(this.originalMultiMerge){_asyncStorageCompat.asyncStorage.multiMerge=this.originalMultiMerge}if(this.originalSetMany){_asyncStorageCompat.asyncStorage.setMany=this.originalSetMany}if(this.originalRemoveMany){_asyncStorageCompat.asyncStorage.removeMany=this.originalRemoveMany}}emit(t){if(this.isPaused){return}if(this.listeners.length===0){return}this.listeners.forEach(i=>{try{i(t)}catch(e){}})}async handleBatchSet(t,i,e="multiSet"){const s=t.filter(([l])=>!this.shouldIgnoreKey(l));if(s.length===0){return i()}const r=s.map(([l])=>l);let a=[];try{a=await(0,_asyncStorageCompat.readMany)(r)}catch{}const o=await i();this.emit({action:e,timestamp:new Date,data:{pairs:s,prevPairs:a}});return o}async handleBatchRemove(t,i){const e=t.filter(a=>!this.shouldIgnoreKey(a));if(e.length===0){return i()}let s=[];try{s=await(0,_asyncStorageCompat.readMany)(e)}catch{}const r=await i();this.emit({action:"multiRemove",timestamp:new Date,data:{keys:e,prevPairs:s}});return r}async startListening(){if(this.isListening){return}const t=await this.initialize();if(!t){return}if(_asyncStorageCompat.asyncStorage&&_asyncStorageCompat.asyncStorage.setItem.name==="swizzled_setItem"){this.restoreOriginalMethods()}const i=async(e,s)=>{if(!this.shouldIgnoreKey(e)){const r=this.originalSetItem?await _asyncStorageCompat.asyncStorage.getItem(e):null;const a=this.originalSetItem?await this.originalSetItem(e,s):void 0;this.emit({action:"setItem",timestamp:new Date,data:{key:e,value:s,prevValue:r}});return a}return this.originalSetItem?this.originalSetItem(e,s):Promise.resolve()};Object.defineProperty(i,"name",{value:"swizzled_setItem"});if(_asyncStorageCompat.asyncStorage){_asyncStorageCompat.asyncStorage.setItem=i}if(_asyncStorageCompat.asyncStorage){_asyncStorageCompat.asyncStorage.removeItem=async e=>{if(!this.shouldIgnoreKey(e)){const s=this.originalRemoveItem?await _asyncStorageCompat.asyncStorage.getItem(e):null;const r=this.originalRemoveItem?await this.originalRemoveItem(e):void 0;this.emit({action:"removeItem",timestamp:new Date,data:{key:e,prevValue:s}});return r}return this.originalRemoveItem?this.originalRemoveItem(e):Promise.resolve()}}if(_asyncStorageCompat.asyncStorageCaps.hasMergeApi&&_asyncStorageCompat.asyncStorage){_asyncStorageCompat.asyncStorage.mergeItem=async(e,s)=>{if(!this.shouldIgnoreKey(e)){const r=this.originalMergeItem?await _asyncStorageCompat.asyncStorage.getItem(e):null;const a=this.originalMergeItem?await this.originalMergeItem(e,s):void 0;this.emit({action:"mergeItem",timestamp:new Date,data:{key:e,value:s,prevValue:r}});return a}return this.originalMergeItem?this.originalMergeItem(e,s):Promise.resolve()}}if(_asyncStorageCompat.asyncStorage){_asyncStorageCompat.asyncStorage.clear=async()=>{let e=[];try{const r=await _asyncStorageCompat.asyncStorage.getAllKeys();const a=r.filter(o=>!this.shouldIgnoreKey(o));if(a.length>0){e=await(0,_asyncStorageCompat.readMany)(a)}}catch{}const s=this.originalClear?await this.originalClear():void 0;this.emit({action:"clear",timestamp:new Date,data:{prevPairs:e}});return s}}if(_asyncStorageCompat.asyncStorageCaps.hasLegacyMultiApi&&_asyncStorageCompat.asyncStorage){_asyncStorageCompat.asyncStorage.multiSet=e=>this.handleBatchSet(e,()=>this.originalMultiSet?this.originalMultiSet(e):Promise.resolve());_asyncStorageCompat.asyncStorage.multiRemove=e=>this.handleBatchRemove(e,()=>this.originalMultiRemove?this.originalMultiRemove(e):Promise.resolve());if(this.originalMultiMerge){_asyncStorageCompat.asyncStorage.multiMerge=e=>this.handleBatchSet(e,()=>this.originalMultiMerge?this.originalMultiMerge(e):Promise.resolve(),"multiMerge")}}else if(_asyncStorageCompat.asyncStorage){_asyncStorageCompat.asyncStorage.setMany=e=>this.handleBatchSet(Object.entries(e),()=>this.originalSetMany?this.originalSetMany(e):Promise.resolve());_asyncStorageCompat.asyncStorage.removeMany=e=>this.handleBatchRemove(e,()=>this.originalRemoveMany?this.originalRemoveMany(e):Promise.resolve())}this.isListening=true}stopListening(){if(!this.isListening){return}if(!_asyncStorageCompat.asyncStorage){return}this.restoreOriginalMethods();this.isListening=false}addListener(t){this.listeners.push(t);return()=>{const i=this.listeners.indexOf(t);if(i>-1){this.listeners.splice(i,1)}}}removeAllListeners(){this.listeners=[]}get isActive(){return this.isListening}get listenerCount(){return this.listeners.length}pause(){this.isPaused=true}resume(){this.isPaused=false}get paused(){return this.isPaused}}const asyncStorageListener=new AsyncStorageListener;const startListening=()=>asyncStorageListener.startListening();exports.startListening=startListening;const stopListening=()=>asyncStorageListener.stopListening();exports.stopListening=stopListening;const addListener=n=>asyncStorageListener.addListener(n);exports.addListener=addListener;const removeAllListeners=()=>asyncStorageListener.removeAllListeners();exports.removeAllListeners=removeAllListeners;const isListening=()=>asyncStorageListener.isActive;exports.isListening=isListening;const getListenerCount=()=>asyncStorageListener.listenerCount;exports.getListenerCount=getListenerCount;const pauseCapture=()=>asyncStorageListener.pause();exports.pauseCapture=pauseCapture;const resumeCapture=()=>asyncStorageListener.resume();exports.resumeCapture=resumeCapture;const isPaused=()=>asyncStorageListener.paused;exports.isPaused=isPaused;var _default=exports.default=asyncStorageListener;
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.stopListening=exports.startListening=exports.resumeCapture=exports.removeAllListeners=exports.pauseCapture=exports.isPaused=exports.isListening=exports.getListenerCount=exports.default=exports.addListener=void 0;var _sharedUi=require("@buoy-gg/shared-ui");var _asyncStorageCompat=require("./asyncStorageCompat");const ORIGINALS_KEY=Symbol.for("@buoy-gg/storage.asyncStorageOriginals");function readStashedOriginals(){return globalThis[ORIGINALS_KEY]??null}function stashOriginals(n){globalThis[ORIGINALS_KEY]=n}class AsyncStorageListener{listeners=[];isListening=false;isInitialized=false;isPaused=false;ignoredKeys=new Set(["@react_buoy_storage_event_filters","@react_buoy_storage_key_filters","@react_buoy_storage_is_monitoring","REACT_QUERY_OFFLINE_CACHE"]);originalSetItem=null;originalRemoveItem=null;originalMergeItem=null;originalClear=null;originalMultiSet=null;originalMultiRemove=null;originalMultiMerge=null;originalSetMany=null;originalRemoveMany=null;shouldIgnoreKey(t){if((0,_sharedUi.isDevToolsStorageKey)(t))return true;if(this.ignoredKeys.has(t))return true;for(const i of this.ignoredKeys){if(t.startsWith(i))return true}return false}adoptOriginals(t){this.originalSetItem=t.setItem;this.originalRemoveItem=t.removeItem;this.originalClear=t.clear;this.originalMergeItem=t.mergeItem;this.originalMultiSet=t.multiSet;this.originalMultiRemove=t.multiRemove;this.originalMultiMerge=t.multiMerge;this.originalSetMany=t.setMany;this.originalRemoveMany=t.removeMany}async initialize(){if(this.isInitialized){return true}if(_asyncStorageCompat.asyncStorage.setItem.name==="swizzled_setItem"){const i=readStashedOriginals();if(!i){return false}this.adoptOriginals(i);this.isInitialized=true;return true}const t={setItem:_asyncStorageCompat.asyncStorage.setItem.bind(_asyncStorageCompat.asyncStorage),removeItem:_asyncStorageCompat.asyncStorage.removeItem.bind(_asyncStorageCompat.asyncStorage),clear:_asyncStorageCompat.asyncStorage.clear.bind(_asyncStorageCompat.asyncStorage),mergeItem:null,multiSet:null,multiRemove:null,multiMerge:null,setMany:null,removeMany:null};if(_asyncStorageCompat.asyncStorageCaps.hasLegacyMultiApi){t.multiSet=_asyncStorageCompat.asyncStorage.multiSet.bind(_asyncStorageCompat.asyncStorage);t.multiRemove=_asyncStorageCompat.asyncStorage.multiRemove.bind(_asyncStorageCompat.asyncStorage);t.mergeItem=_asyncStorageCompat.asyncStorage.mergeItem.bind(_asyncStorageCompat.asyncStorage);t.multiMerge=_asyncStorageCompat.asyncStorage.multiMerge?_asyncStorageCompat.asyncStorage.multiMerge.bind(_asyncStorageCompat.asyncStorage):null}else{t.setMany=_asyncStorageCompat.asyncStorage.setMany.bind(_asyncStorageCompat.asyncStorage);t.removeMany=_asyncStorageCompat.asyncStorage.removeMany.bind(_asyncStorageCompat.asyncStorage)}stashOriginals(t);this.adoptOriginals(t);this.isInitialized=true;return true}restoreOriginalMethods(){if(!_asyncStorageCompat.asyncStorage||!this.originalSetItem){return}_asyncStorageCompat.asyncStorage.setItem=this.originalSetItem;if(this.originalRemoveItem){_asyncStorageCompat.asyncStorage.removeItem=this.originalRemoveItem}if(this.originalClear){_asyncStorageCompat.asyncStorage.clear=this.originalClear}if(this.originalMergeItem){_asyncStorageCompat.asyncStorage.mergeItem=this.originalMergeItem}if(this.originalMultiSet){_asyncStorageCompat.asyncStorage.multiSet=this.originalMultiSet}if(this.originalMultiRemove){_asyncStorageCompat.asyncStorage.multiRemove=this.originalMultiRemove}if(this.originalMultiMerge){_asyncStorageCompat.asyncStorage.multiMerge=this.originalMultiMerge}if(this.originalSetMany){_asyncStorageCompat.asyncStorage.setMany=this.originalSetMany}if(this.originalRemoveMany){_asyncStorageCompat.asyncStorage.removeMany=this.originalRemoveMany}}emit(t){if(this.isPaused){return}if(this.listeners.length===0){return}this.listeners.forEach(i=>{try{i(t)}catch(e){}})}async handleBatchSet(t,i,e="multiSet"){const s=t.filter(([l])=>!this.shouldIgnoreKey(l));if(s.length===0){return i()}const r=s.map(([l])=>l);let a=[];try{a=await(0,_asyncStorageCompat.readMany)(r)}catch{}const o=await i();this.emit({action:e,timestamp:new Date,data:{pairs:s,prevPairs:a}});return o}async handleBatchRemove(t,i){const e=t.filter(a=>!this.shouldIgnoreKey(a));if(e.length===0){return i()}let s=[];try{s=await(0,_asyncStorageCompat.readMany)(e)}catch{}const r=await i();this.emit({action:"multiRemove",timestamp:new Date,data:{keys:e,prevPairs:s}});return r}async startListening(){if(this.isListening){return}const t=await this.initialize();if(!t){return}if(_asyncStorageCompat.asyncStorage&&_asyncStorageCompat.asyncStorage.setItem.name==="swizzled_setItem"){this.restoreOriginalMethods()}const i=async(e,s)=>{if(!this.shouldIgnoreKey(e)){const r=this.originalSetItem?await _asyncStorageCompat.asyncStorage.getItem(e):null;const a=this.originalSetItem?await this.originalSetItem(e,s):void 0;this.emit({action:"setItem",timestamp:new Date,data:{key:e,value:s,prevValue:r}});return a}return this.originalSetItem?this.originalSetItem(e,s):Promise.resolve()};Object.defineProperty(i,"name",{value:"swizzled_setItem"});if(_asyncStorageCompat.asyncStorage){_asyncStorageCompat.asyncStorage.setItem=i}if(_asyncStorageCompat.asyncStorage){_asyncStorageCompat.asyncStorage.removeItem=async e=>{if(!this.shouldIgnoreKey(e)){const s=this.originalRemoveItem?await _asyncStorageCompat.asyncStorage.getItem(e):null;const r=this.originalRemoveItem?await this.originalRemoveItem(e):void 0;this.emit({action:"removeItem",timestamp:new Date,data:{key:e,prevValue:s}});return r}return this.originalRemoveItem?this.originalRemoveItem(e):Promise.resolve()}}if(_asyncStorageCompat.asyncStorageCaps.hasMergeApi&&_asyncStorageCompat.asyncStorage){_asyncStorageCompat.asyncStorage.mergeItem=async(e,s)=>{if(!this.shouldIgnoreKey(e)){const r=this.originalMergeItem?await _asyncStorageCompat.asyncStorage.getItem(e):null;const a=this.originalMergeItem?await this.originalMergeItem(e,s):void 0;this.emit({action:"mergeItem",timestamp:new Date,data:{key:e,value:s,prevValue:r}});return a}return this.originalMergeItem?this.originalMergeItem(e,s):Promise.resolve()}}if(_asyncStorageCompat.asyncStorage){_asyncStorageCompat.asyncStorage.clear=async()=>{let e=[];try{const r=await _asyncStorageCompat.asyncStorage.getAllKeys();const a=r.filter(o=>!this.shouldIgnoreKey(o));if(a.length>0){e=await(0,_asyncStorageCompat.readMany)(a)}}catch{}const s=this.originalClear?await this.originalClear():void 0;this.emit({action:"clear",timestamp:new Date,data:{prevPairs:e}});return s}}if(_asyncStorageCompat.asyncStorageCaps.hasLegacyMultiApi&&_asyncStorageCompat.asyncStorage){_asyncStorageCompat.asyncStorage.multiSet=e=>this.handleBatchSet(e,()=>this.originalMultiSet?this.originalMultiSet(e):Promise.resolve());_asyncStorageCompat.asyncStorage.multiRemove=e=>this.handleBatchRemove(e,()=>this.originalMultiRemove?this.originalMultiRemove(e):Promise.resolve());if(this.originalMultiMerge){_asyncStorageCompat.asyncStorage.multiMerge=e=>this.handleBatchSet(e,()=>this.originalMultiMerge?this.originalMultiMerge(e):Promise.resolve(),"multiMerge")}}else if(_asyncStorageCompat.asyncStorage){_asyncStorageCompat.asyncStorage.setMany=e=>this.handleBatchSet(Object.entries(e),()=>this.originalSetMany?this.originalSetMany(e):Promise.resolve());_asyncStorageCompat.asyncStorage.removeMany=e=>this.handleBatchRemove(e,()=>this.originalRemoveMany?this.originalRemoveMany(e):Promise.resolve())}this.isListening=true}stopListening(){if(!this.isListening){return}if(!_asyncStorageCompat.asyncStorage){return}this.restoreOriginalMethods();this.isListening=false}addListener(t){this.listeners.push(t);return()=>{const i=this.listeners.indexOf(t);if(i>-1){this.listeners.splice(i,1)}}}removeAllListeners(){this.listeners=[]}get isActive(){return this.isListening}get listenerCount(){return this.listeners.length}pause(){this.isPaused=true}resume(){this.isPaused=false}get paused(){return this.isPaused}}const asyncStorageListener=new AsyncStorageListener;const startListening=()=>asyncStorageListener.startListening();exports.startListening=startListening;const stopListening=()=>asyncStorageListener.stopListening();exports.stopListening=stopListening;const addListener=n=>asyncStorageListener.addListener(n);exports.addListener=addListener;const removeAllListeners=()=>asyncStorageListener.removeAllListeners();exports.removeAllListeners=removeAllListeners;const isListening=()=>asyncStorageListener.isActive;exports.isListening=isListening;const getListenerCount=()=>asyncStorageListener.listenerCount;exports.getListenerCount=getListenerCount;const pauseCapture=()=>asyncStorageListener.pause();exports.pauseCapture=pauseCapture;const resumeCapture=()=>asyncStorageListener.resume();exports.resumeCapture=resumeCapture;const isPaused=()=>asyncStorageListener.paused;exports.isPaused=isPaused;var _default=exports.default=asyncStorageListener;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.addListener=addListener;exports.default=void 0;exports.getListenerCount=getListenerCount;exports.isListening=isListening;exports.isPaused=isPaused;exports.pauseCapture=pauseCapture;exports.removeAllListeners=removeAllListeners;exports.resumeCapture=resumeCapture;exports.startListening=startListening;exports.stopListening=stopListening;var _utils=require("@buoy-gg/shared-ui/utils");var _capacitorPreferences=require("./capacitorPreferences");const listeners=new Set;let stop;let paused=false;const ignoredKeys=new Set(["@react_buoy_storage_event_filters","@react_buoy_storage_key_filters","@react_buoy_storage_is_monitoring","REACT_QUERY_OFFLINE_CACHE"]);const ignored=e=>[...ignoredKeys].some(t=>e.startsWith(t));function deliver(e){for(const
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.addListener=addListener;exports.default=void 0;exports.getListenerCount=getListenerCount;exports.isListening=isListening;exports.isPaused=isPaused;exports.pauseCapture=pauseCapture;exports.removeAllListeners=removeAllListeners;exports.resumeCapture=resumeCapture;exports.startListening=startListening;exports.stopListening=stopListening;var _sharedUi=require("@buoy-gg/shared-ui");var _utils=require("@buoy-gg/shared-ui/utils");var _capacitorPreferences=require("./capacitorPreferences");const listeners=new Set;let stop;let paused=false;const ignoredKeys=new Set(["@react_buoy_storage_event_filters","@react_buoy_storage_key_filters","@react_buoy_storage_is_monitoring","REACT_QUERY_OFFLINE_CACHE"]);const ignored=e=>(0,_sharedUi.isDevToolsStorageKey)(e)||[...ignoredKeys].some(t=>e.startsWith(t));function deliver(e){const t=(0,_sharedUi.appStorageEvent)(e);if(!t)return;e=t;for(const s of[...listeners]){try{s(e)}catch{}}}async function startListening(){if(stop||typeof window==="undefined")return;if((0,_capacitorPreferences.usesCapacitorPreferences)()){stop=(0,_capacitorPreferences.subscribePreferencesChanges)(e=>{if(!paused)deliver(e)});return}stop=(0,_utils.subscribeToBrowserStorage)(e=>{if(paused||e.area!=="localStorage"||e.key!==void 0&&ignored(e.key))return;const{area:t,action:s,...r}=e;if(r.prevPairs)r.prevPairs=r.prevPairs.filter(([i])=>!ignored(i));deliver({action:s,data:r,timestamp:new Date})})}function stopListening(){stop?.();stop=void 0}function addListener(e){listeners.add(e);return()=>{listeners.delete(e)}}function removeAllListeners(){listeners.clear()}function isListening(){return!!stop}function getListenerCount(){return listeners.size}function pauseCapture(){paused=true}function resumeCapture(){paused=false}function isPaused(){return paused}const asyncStorageListener={startListening,stopListening,addListener,removeAllListeners,pause:pauseCapture,resume:resumeCapture,get isActive(){return isListening()},get listenerCount(){return listeners.size},get paused(){return paused}};var _default=exports.default=asyncStorageListener;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.removeMMKVInstance=exports.removeAllMMKVListeners=exports.removeAllMMKVInstances=exports.mmkvListener=exports.isMMKVListening=exports.isMMKVInstanceMonitored=exports.getMonitoredMMKVInstances=exports.getMMKVListenerCount=exports.getMMKVInstanceCount=exports.default=exports.addMMKVListener=exports.addMMKVInstance=void 0;var _mmkvTypeDetection=require("./mmkvTypeDetection");class MMKVListener{listeners=[];instances=new Map;ignoredKeys=new Set(["@react_buoy_storage_event_filters","@react_buoy_storage_key_filters","@react_buoy_storage_is_monitoring","REACT_QUERY_OFFLINE_CACHE"]);shouldIgnoreKey(e){if(this.ignoredKeys.has(e))return true;for(const t of this.ignoredKeys){if(e.startsWith(t))return true}return false}emit(e){if(this.listeners.length===0)return;this.listeners.forEach(t=>{try{t(e)}catch(r){}})}addInstance(e,t){if(this.instances.has(t)){return}let r;const i=new Map;try{for(const s of e.getAllKeys()??[]){if(this.shouldIgnoreKey(s))continue;i.set(s,(0,_mmkvTypeDetection.detectMMKVType)(e,s).value)}}catch{}if(typeof e.addOnValueChangedListener==="function"){try{r=e.addOnValueChangedListener(s=>{if(this.shouldIgnoreKey(s))return;const{value:a,type:o}=(0,_mmkvTypeDetection.detectMMKVType)(e,s);const M=i.get(s);const
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.removeMMKVInstance=exports.removeAllMMKVListeners=exports.removeAllMMKVInstances=exports.mmkvListener=exports.isMMKVListening=exports.isMMKVInstanceMonitored=exports.getMonitoredMMKVInstances=exports.getMMKVListenerCount=exports.getMMKVInstanceCount=exports.default=exports.addMMKVListener=exports.addMMKVInstance=void 0;var _sharedUi=require("@buoy-gg/shared-ui");var _mmkvTypeDetection=require("./mmkvTypeDetection");class MMKVListener{listeners=[];instances=new Map;ignoredKeys=new Set(["@react_buoy_storage_event_filters","@react_buoy_storage_key_filters","@react_buoy_storage_is_monitoring","REACT_QUERY_OFFLINE_CACHE"]);shouldIgnoreKey(e){if((0,_sharedUi.isDevToolsStorageKey)(e))return true;if(this.ignoredKeys.has(e))return true;for(const t of this.ignoredKeys){if(e.startsWith(t))return true}return false}emit(e){if(this.listeners.length===0)return;this.listeners.forEach(t=>{try{t(e)}catch(r){}})}addInstance(e,t){if(this.instances.has(t)){return}let r;const i=new Map;try{for(const s of e.getAllKeys()??[]){if(this.shouldIgnoreKey(s))continue;i.set(s,(0,_mmkvTypeDetection.detectMMKVType)(e,s).value)}}catch{}if(typeof e.addOnValueChangedListener==="function"){try{r=e.addOnValueChangedListener(s=>{if(this.shouldIgnoreKey(s))return;const{value:a,type:o}=(0,_mmkvTypeDetection.detectMMKVType)(e,s);const M=i.get(s);const u=o==="unknown"||a===void 0;if(u){i.delete(s);const c={action:"delete",timestamp:new Date,instanceId:t,data:{key:s,prevValue:M,success:true}};this.emit(c)}else{i.set(s,a);const c=o==="string"?"set.string":o==="number"?"set.number":o==="boolean"?"set.boolean":o==="buffer"?"set.buffer":"set.string";const l={action:c,timestamp:new Date,instanceId:t,data:{key:s,value:a,prevValue:M,valueType:o,success:true}};this.emit(l)}})}catch(s){}}this.instances.set(t,{instance:e,instanceId:t,originalMethods:{},nativeListenerUnsubscribe:r,lastKnownValues:i})}removeInstance(e){const t=this.instances.get(e);if(!t){return}const{nativeListenerUnsubscribe:r}=t;try{if(typeof r==="function"){r()}else if(typeof r?.remove==="function"){r.remove()}}catch{}this.instances.delete(e)}removeAllInstances(){const e=Array.from(this.instances.keys());e.forEach(t=>this.removeInstance(t))}addListener(e){this.listeners.push(e);return()=>{const t=this.listeners.indexOf(e);if(t>-1){this.listeners.splice(t,1)}}}removeAllListeners(){this.listeners=[]}hasInstance(e){return this.instances.has(e)}getMonitoredInstances(){return Array.from(this.instances.keys())}get instanceCount(){return this.instances.size}get listenerCount(){return this.listeners.length}get isActive(){return this.instances.size>0}}const mmkvListener=exports.mmkvListener=new MMKVListener;const addMMKVInstance=(n,e)=>mmkvListener.addInstance(n,e);exports.addMMKVInstance=addMMKVInstance;const removeMMKVInstance=n=>mmkvListener.removeInstance(n);exports.removeMMKVInstance=removeMMKVInstance;const removeAllMMKVInstances=()=>mmkvListener.removeAllInstances();exports.removeAllMMKVInstances=removeAllMMKVInstances;const addMMKVListener=n=>mmkvListener.addListener(n);exports.addMMKVListener=addMMKVListener;const removeAllMMKVListeners=()=>mmkvListener.removeAllListeners();exports.removeAllMMKVListeners=removeAllMMKVListeners;const isMMKVInstanceMonitored=n=>mmkvListener.hasInstance(n);exports.isMMKVInstanceMonitored=isMMKVInstanceMonitored;const getMonitoredMMKVInstances=()=>mmkvListener.getMonitoredInstances();exports.getMonitoredMMKVInstances=getMonitoredMMKVInstances;const getMMKVInstanceCount=()=>mmkvListener.instanceCount;exports.getMMKVInstanceCount=getMMKVInstanceCount;const getMMKVListenerCount=()=>mmkvListener.listenerCount;exports.getMMKVListenerCount=getMMKVListenerCount;const isMMKVListening=()=>mmkvListener.isActive;exports.isMMKVListening=isMMKVListening;var _default=exports.default=mmkvListener;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.startBrowserStorageCapture=startBrowserStorageCapture;var _utils=require("@buoy-gg/shared-ui/utils");var _sharedUi=require("@buoy-gg/shared-ui");var _MMKVInstanceRegistry=require("./MMKVInstanceRegistry");var _capacitorPreferences=require("./capacitorPreferences");let owners=0;function webStorageBackend(
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.startBrowserStorageCapture=startBrowserStorageCapture;var _utils=require("@buoy-gg/shared-ui/utils");var _sharedUi=require("@buoy-gg/shared-ui");var _MMKVInstanceRegistry=require("./MMKVInstanceRegistry");var _capacitorPreferences=require("./capacitorPreferences");let owners=0;function webStorageBackend(s){const t=()=>(0,_utils.getBrowserStorage)(s);const n=()=>Array.from({length:t().length},(e,r)=>t().key(r)).filter(e=>e!==null&&!(0,_sharedUi.isDevToolsStorageKey)(e));return{set(e,r){t().setItem(e,String(r))},getString(e){return t().getItem(e)??void 0},getNumber(){return void 0},getBoolean(){return void 0},getBuffer(){return void 0},contains(e){return t().getItem(e)!==null},delete(e){const r=this.contains(e);t().removeItem(e);return r},getAllKeys:n,clearAll(){for(const e of n())t().removeItem(e)},get size(){return n().reduce((e,r)=>e+2*(r.length+(t().getItem(r)?.length??0)),0)},addOnValueChangedListener(e){return{remove:(0,_utils.subscribeToBrowserStorage)(r=>{if(r.area!==s)return;if(r.key!==void 0){if(!(0,_sharedUi.isDevToolsStorageKey)(r.key))e(r.key)}else r.prevPairs?.forEach(([o])=>{if(!(0,_sharedUi.isDevToolsStorageKey)(o))e(o)})})}}}}function instances(){return(0,_capacitorPreferences.usesCapacitorPreferences)()?["localStorage","sessionStorage"]:["sessionStorage"]}function startBrowserStorageCapture(){if(typeof window==="undefined")return()=>{};try{(0,_utils.getBrowserStorage)("sessionStorage")}catch{return()=>{}}const s=instances();if(++owners===1)for(const n of s)(0,_MMKVInstanceRegistry.registerMMKVInstance)(n,webStorageBackend(n));let t=true;return()=>{if(t){t=false;if(--owners===0)for(const n of s)(0,_MMKVInstanceRegistry.unregisterMMKVInstance)(n)}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var _appAsyncStorage=_interopRequireDefault(require("./appAsyncStorage"));var _sharedUi=require("@buoy-gg/shared-ui");var _asyncStorageCompat=require("./asyncStorageCompat");var _clearAllStorage=require("./clearAllStorage");var _MMKVInstanceRegistry=require("./MMKVInstanceRegistry");var _mmkvTypeDetection=require("./mmkvTypeDetection");var _SecureStoreRegistry=require("./SecureStoreRegistry");function _interopRequireDefault(s){return s&&s.__esModule?s:{default:s}}function deleteMMKVKey(s,
|
|
1
|
+
"use strict";var _appAsyncStorage=_interopRequireDefault(require("./appAsyncStorage"));var _sharedUi=require("@buoy-gg/shared-ui");var _asyncStorageCompat=require("./asyncStorageCompat");var _clearAllStorage=require("./clearAllStorage");var _MMKVInstanceRegistry=require("./MMKVInstanceRegistry");var _mmkvTypeDetection=require("./mmkvTypeDetection");var _SecureStoreRegistry=require("./SecureStoreRegistry");function _interopRequireDefault(s){return s&&s.__esModule?s:{default:s}}function deleteMMKVKey(s,i){if(s.remove)s.remove(i);else s.delete?.(i)}function status(){return{canCapture:true,canRestore:true}}async function captureStorageData(){const s=[];const i=(await _appAsyncStorage.default.getAllKeys()).filter(o=>!(0,_sharedUi.isDevToolsStorageKey)(o));const a=(await(0,_asyncStorageCompat.readMany)(i)).filter(o=>o[1]!==null);const r={};for(const{id:o,instance:p}of _MMKVInstanceRegistry.mmkvInstanceRegistry.getAll().filter(({id:e})=>!(0,_sharedUi.isDevToolsStorageKey)(e))){try{r[o]=p.getAllKeys().filter(e=>!(0,_sharedUi.isDevToolsStorageKey)(e)).map(e=>{const{value:y,type:c}=(0,_mmkvTypeDetection.detectMMKVType)(p,e);if(c==="buffer"){s.push(`mmkv "${o}"/"${e}": ArrayBuffer value not capturable`)}return{key:e,value:y,valueType:c}})}catch{s.push(`mmkv "${o}": unreadable, captured without entries`);r[o]=[]}}const u={};const n=_SecureStoreRegistry.secureStoreRegistry.getModule();for(const{key:o,options:p}of _SecureStoreRegistry.secureStoreRegistry.getAll().filter(({key:e})=>!(0,_sharedUi.isDevToolsStorageKey)(e))){if(p.requireAuthentication){s.push(`secure "${o}": biometric-protected, not capturable`);continue}let e=null;if(n){try{e=await n.getItemAsync(o,p)}catch{s.push(`secure "${o}": unreadable, captured as unset`)}}u[o]=e}return{data:{async:a,mmkv:r,secure:u},warnings:s}}async function capture(){const{data:s,warnings:i}=await captureStorageData();return{data:s,warnings:i}}async function restore(s,i){const a=s;const r=(0,_sharedUi.createRestoreScope)(i);const u=r.touch;const n=(0,_sharedUi.emptyRestoreResult)();if(!a){return(0,_sharedUi.failedRestore)("empty storage snapshot")}try{const e=(a.async??[]).filter(([t])=>!(0,_sharedUi.isDevToolsStorageKey)(t)&&u(`async:${t}`));const y=new Set(e.map(([t])=>t));const c=(await _appAsyncStorage.default.getAllKeys()).filter(t=>!(0,_sharedUi.isDevToolsStorageKey)(t));const d=c.filter(t=>!y.has(t)&&u(`async:${t}`));r.countExcluded((a.async??[]).length-e.length);if(d.length>0)await(0,_asyncStorageCompat.removeMany)(d);if(e.length>0)await(0,_asyncStorageCompat.writeMany)(e);n.applied+=e.length+d.length}catch(e){n.ok=false;n.warnings.push(`asyncstorage restore failed: ${String(e)}`)}for(const[e,y]of Object.entries(a.mmkv??{})){if((0,_sharedUi.isDevToolsStorageKey)(e))continue;const c=_MMKVInstanceRegistry.mmkvInstanceRegistry.get(e);if(!c){n.skipped.push({id:`mmkv:${e}`,reason:"instance not registered"});continue}if(c.instance.isReadOnly){n.skipped.push({id:`mmkv:${e}`,reason:"instance registered read-only"});continue}const{instance:d}=c;try{const t=new Set(y.map(l=>l.key));const g=d.getAllKeys().filter(l=>!(0,_sharedUi.isDevToolsStorageKey)(l));for(const l of g){if(!r.allows(`mmkv:${e}/${l}`))continue;if(!t.has(l)){deleteMMKVKey(d,l);n.applied+=1}}for(const l of y){if((0,_sharedUi.isDevToolsStorageKey)(l.key))continue;if(!u(`mmkv:${e}/${l.key}`))continue;if(l.valueType==="buffer"){n.skipped.push({id:`mmkv:${e}/${l.key}`,reason:"ArrayBuffer values cannot be restored"});continue}d.set(l.key,l.value);n.applied+=1}}catch(t){n.ok=false;n.warnings.push(`mmkv "${e}" restore failed: ${String(t)}`)}}const o=a.secure??{};for(const{key:e,options:y}of _SecureStoreRegistry.secureStoreRegistry.getAll().filter(({key:c})=>!(0,_sharedUi.isDevToolsStorageKey)(c))){if(!r.allows(`secure:${e}`))continue;if(y.requireAuthentication){if(e in o){n.skipped.push({id:`secure:${e}`,reason:"biometric-protected keys are never written"})}continue}try{if(e in o){const c=o[e];if(c===null)await _SecureStoreRegistry.secureStoreRegistry.deleteValue(e);else await _SecureStoreRegistry.secureStoreRegistry.setValue(e,c)}else{await _SecureStoreRegistry.secureStoreRegistry.deleteValue(e)}n.applied+=1}catch(c){n.ok=false;n.warnings.push(`secure "${e}" restore failed: ${String(c)}`)}}for(const e of Object.keys(o)){if((0,_sharedUi.isDevToolsStorageKey)(e))continue;if(!u(`secure:${e}`))continue;if(!_SecureStoreRegistry.secureStoreRegistry.getAll().filter(({key:y})=>!(0,_sharedUi.isDevToolsStorageKey)(y)).some(y=>y.key===e)){n.skipped.push({id:`secure:${e}`,reason:"key no longer registered with registerSecureStoreKeys"})}}const p=r.excludedWarning("item(s)");if(p)n.warnings.push(p);return n}async function clear(){const s=(0,_sharedUi.emptyRestoreResult)();try{await(0,_clearAllStorage.clearAllAppStorage)();s.applied+=1}catch(i){s.ok=false;s.warnings.push(`asyncstorage clear failed: ${String(i)}`)}for(const{id:i,instance:a}of _MMKVInstanceRegistry.mmkvInstanceRegistry.getAll().filter(({id:r})=>!(0,_sharedUi.isDevToolsStorageKey)(r))){if(a.isReadOnly){s.skipped.push({id:`mmkv:${i}`,reason:"instance registered read-only"});continue}try{for(const r of a.getAllKeys().filter(u=>!(0,_sharedUi.isDevToolsStorageKey)(u))){deleteMMKVKey(a,r);s.applied+=1}}catch(r){s.ok=false;s.warnings.push(`mmkv "${i}" clear failed: ${String(r)}`)}}for(const{key:i,options:a}of _SecureStoreRegistry.secureStoreRegistry.getAll().filter(({key:r})=>!(0,_sharedUi.isDevToolsStorageKey)(r))){if(a.requireAuthentication){s.skipped.push({id:`secure:${i}`,reason:"biometric-protected keys are never written"});continue}try{await _SecureStoreRegistry.secureStoreRegistry.deleteValue(i);s.applied+=1}catch(r){s.ok=false;s.warnings.push(`secure "${i}" clear failed: ${String(r)}`)}}return s}const ITEM_RENDER_CHAR_LIMIT=256*1024;function classifyValue(s,i,a,r,u,n){return(0,_sharedUi.classifyPreviewItem)({key:s,label:i,oldValue:a,newValue:r,inOld:u,inNew:n},{equal:Object.is,tooLarge:o=>typeof o==="string"&&o.length>ITEM_RENDER_CHAR_LIMIT,tooLargeReason:"value too large to render a diff \u2014 restore still applies it"})}async function previewItems(s,i){const a=s??{async:[],mmkv:{},secure:{}};const r=i===void 0;const u=r?(await captureStorageData()).data:i??{async:[],mmkv:{},secure:{}};const n=[];const o=[];const p=new Map(u.async??[]);const e=new Map(a.async??[]);for(const t of(0,_sharedUi.unionKeys)(p,e)){if((0,_sharedUi.isDevToolsStorageKey)(t))continue;n.push(classifyValue(`async:${t}`,t,p.get(t),e.get(t),p.has(t),e.has(t)))}for(const t of(0,_sharedUi.unionKeys)(u.mmkv,a.mmkv)){if((0,_sharedUi.isDevToolsStorageKey)(t))continue;const g=r?_MMKVInstanceRegistry.mmkvInstanceRegistry.get(t):null;const l=r&&!g;const w=r&&g?.instance.isReadOnly===true;const m=new Map((u.mmkv?.[t]??[]).map(f=>[f.key,f]));const S=new Map((a.mmkv?.[t]??[]).map(f=>[f.key,f]));for(const f of(0,_sharedUi.unionKeys)(m,S)){if((0,_sharedUi.isDevToolsStorageKey)(f))continue;const K=`mmkv:${t}/${f}`;const $=`${t} \xB7 ${f}`;const k=m.get(f);const h=S.get(f);let v=classifyValue(K,$,k?.value,h?.value,m.has(f),S.has(f));if(l){v=(0,_sharedUi.wontApply)(v,"MMKV instance not registered")}else if(w){v=(0,_sharedUi.wontApply)(v,"MMKV instance registered read-only")}else if(h?.valueType==="buffer"||k?.valueType==="buffer"){v=(0,_sharedUi.wontApply)(v,"ArrayBuffer values cannot be restored")}n.push(v)}}const y=u.secure??{};const c=a.secure??{};const d=r?new Map(_SecureStoreRegistry.secureStoreRegistry.getAll().filter(({key:t})=>!(0,_sharedUi.isDevToolsStorageKey)(t)).map(t=>[t.key,t])):null;for(const t of(0,_sharedUi.unionKeys)(y,c)){if((0,_sharedUi.isDevToolsStorageKey)(t))continue;let g=classifyValue(`secure:${t}`,t,y[t],c[t],t in y,t in c);if(r){const l=d?.get(t);if(!l){g=(0,_sharedUi.wontApply)(g,"key no longer registered with registerSecureStoreKeys")}else if(l.options.requireAuthentication){g=(0,_sharedUi.wontApply)(g,"biometric-protected keys are never written")}}n.push(g)}return{items:n,notes:o}}(0,_sharedUi.registerStateSnapshotProvider)({id:"storage",label:"Storage",status,capture,restore,clear,previewItems});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";import{storageLabels as wt}from"../utils/storageLabels";import{useMemo as S,useCallback as b,useState as N,useEffect as A,useRef as ie}from"react";import{StyleSheet as It,Text as m,View as f,TouchableOpacity as ae,ScrollView as Re,Alert as le}from"react-native";import{absoluteFill as Ae,useLimit as Ee,TIER_LIMITS as _t,monoFont as W}from"@buoy-gg/shared-ui";import{Database as Le,Zap as Mt,ProBadge as ze,ProUpgradeModal as Kt,ToolEmptyState as xt,resolveListEmptyState as Bt}from"@buoy-gg/shared-ui";import{isDevToolsStorageKey as p}from"@buoy-gg/shared-ui";import{StorageKeySection as Nt,storageRowId as De}from"./StorageKeySection";import{StorageKeyDetailScreen as qt}from"./StorageKeyDetailScreen";import{StorageFilterCards as Vt}from"./StorageFilterCards";import{useAsyncStorageKeys as Rt}from"../hooks/useAsyncStorageKeys";import{addListener as At}from"../utils/AsyncStorageListener";import{useMultiMMKVKeys as Et}from"../hooks/useMMKVKeys";import{useSecureStoreKeys as Lt}from"../hooks/useSecureStoreKeys";import{useMMKVInstances as zt}from"../hooks/useMMKVInstances";import{StorageSaveNotice as Dt}from"./StorageSaveNotice";import{StorageActionButtons as Ft}from"./StorageActionButtons";import{SelectionActionBar as Wt}from"./SelectionActionBar";import{addMMKVListener as Ot}from"../utils/MMKVListener";import{onStorageBrowserRefresh as Ht}from"../utils/storageBrowserRefresh";import{deleteStorageKeys as Pt}from"../utils/deleteStorageKeys";import{setStorageValue as $t,storageEditBlockedReason as Ut}from"../utils/setStorageValue";import{gameUIColors as E,macOSColors as J,night as s,HardDrive as Fe}from"@buoy-gg/shared-ui";import{useIsPro as jt}from"@buoy-gg/license";import{jsx as a,jsxs as d,Fragment as Gt}from"react/jsx-runtime";const We=[J.semantic.info,J.semantic.success,J.semantic.warning,J.semantic.debug,"#FF6B9D","#00D9FF"];function L(z){const ce=z.split("").reduce((O,de)=>O+de.charCodeAt(0),0);return We[ce%We.length]}export const FREE_TIER_KEY_LIMIT=_t["storage.keys"].free;export function GameUIStorageBrowser({requiredStorageKeys:z=[],showFilters:ce=false,ignoredPatterns:O=new Set(["@react_buoy"]),onTogglePattern:de,onAddPattern:ue,searchQuery:w="",storageDataRef:X,eventCountByKey:ge,lastWriteByKey:Yt,onViewHistory:Z,enabledStorageTypes:H,statusFilter:ye,onStatusFilterChange:me,onStatusCountsChange:fe,pinnedKeys:_,onTogglePin:he,storageTypeFilter:pe,onStorageTypeFilterChange:Se,applySafeAreaInset:Oe,detailKey:P=null,onOpenKey:He,onCloseDetail:be}){const M=jt();const $=Ee("storage.keys");const Ce=Ee("storage.mmkvInstances");const[Q,q]=N(false);A(()=>{if(Q&&M){q(false)}},[Q,M]);const[Pe,$e]=N("all");const ee=ye!=null&&me!=null;const T=ee?ye:Pe;const Ue=ee?me:$e;const[je,Ge]=N("all");const ve=pe!=null&&Se!=null;const C=ve?pe:je;const Ye=ve?Se:Ge;const[g,Te]=N(null);const Je=ie(null);const Xe=ie(0);const ke=ie(new Map);const Ze=b((e,t)=>{if(t)ke.current.set(e,t);else ke.current.delete(e)},[]);const[we,Ie]=N(0);const[te,re]=N(false);const[U,V]=N(new Set);const{instances:y}=zt(false);const{storageKeys:_e,isLoading:Qe,error:et,refresh:j}=Rt(z);const tt=S(()=>y.map(e=>({instance:e.instance,id:e.id})),[y]);const{storageKeys:oe,isLoading:rt,error:ot,refresh:G}=Et(tt,z);const Me=S(()=>{if(!g){return oe}return oe.filter(e=>e.instanceId===g)},[oe,g]);const{storageKeys:Ke,isLoading:nt,error:st,refresh:xe}=Lt(z);const c=S(()=>{return[..._e,...Me,...Ke]},[_e,Me,Ke]);const K=S(()=>{if(!P)return null;const e=De(P);return c.find(t=>De(t)===e)??P},[P,c]);const it=Qe||rt||nt;const Be=et||ot||st;const k=b(()=>{j();G();xe()},[j,G,xe]);const R=b(e=>{return e.instanceId?`${e.storageType}-${e.instanceId}-${e.key}`:`${e.storageType}-${e.key}`},[]);const at=b(()=>{re(e=>{if(e){V(new Set)}return!e})},[]);const lt=b((e,t)=>{const r=R(e);V(h=>{const i=new Set(h);if(t){i.add(r)}else{i.delete(r)}return i})},[R]);const ct=b(()=>{V(new Set);re(false);k()},[k]);const ne=b(e=>{e.forEach(t=>ue?.(t.key));V(new Set);re(false)},[ue]);const se=b(async(e,t)=>{if(!M){q(true);throw new Error("Editing storage values is a Pro feature.")}await $t(e,t,y);k();Ie(r=>r+1)},[M,y,k]);const dt=b(e=>{void se(e,JSON.stringify(!e.value)).catch(t=>{le.alert("Couldn't save",t instanceof Error?t.message:String(t))})},[se]);const Ne=b((e,t)=>{if(!M){q(true);return}le.alert("Delete key",`Delete "${e.key}"? This cannot be undone.`,[{text:"Cancel",style:"cancel"},{text:"Delete",style:"destructive",onPress:async()=>{try{await Pt([e],y.map(r=>({id:r.id,instance:r.instance})));k();t?.()}catch(r){le.alert("Error",`Failed to delete key: ${r}`)}}}])},[M,y,k]);const qe=b(e=>Ut(e,y),[y]);const ut=S(()=>{const e=c;const t={valid:e.filter(l=>l.status==="required_present"||l.status==="optional_present").length,missing:e.filter(l=>l.status==="required_missing").length,issues:e.filter(l=>l.status==="required_wrong_value"||l.status==="required_wrong_type").length,total:e.length};const r=e.filter(l=>l.storageType==="async");const h=e.filter(l=>l.storageType==="mmkv");const i=e.filter(l=>l.storageType==="secure");return{summary:{valid:t.valid,missing:t.missing,issues:t.issues,total:t.total,timestamp:new Date().toISOString()},asyncStorage:r.reduce((l,u)=>{l[u.key]=u.value;return l},{}),mmkv:h.reduce((l,u)=>{const I=u.instanceId||"default";if(!l[I])l[I]={};l[I][u.key]=u.value;return l},{}),secure:i.reduce((l,u)=>{l[u.key]=u.value;return l},{})}},[c]);A(()=>{if(X){X.current=c}},[c,X]);A(()=>{let e;const t=At(r=>{clearTimeout(e);e=setTimeout(()=>{j()},100)});return()=>{clearTimeout(e);t()}},[j]);A(()=>{let e;const t=Ht(()=>{clearTimeout(e);e=setTimeout(k,100)});return()=>{clearTimeout(e);t()}},[k]);A(()=>{let e;const t=Ot(r=>{const h=g===null||r.instanceId===g;if(h){clearTimeout(e);e=setTimeout(()=>{G()},100)}});return()=>{clearTimeout(e);t()}},[G,g]);const D=S(()=>{const e=c;const t=e.filter(i=>!p(i.key));const r=e.filter(i=>p(i.key));const h={totalCount:e.length,requiredCount:t.filter(i=>i.category==="required").length,missingCount:t.filter(i=>i.status==="required_missing").length,wrongValueCount:t.filter(i=>i.status==="required_wrong_value").length,wrongTypeCount:t.filter(i=>i.status==="required_wrong_type").length,presentRequiredCount:t.filter(i=>i.status==="required_present").length,optionalCount:t.filter(i=>i.category==="optional").length,mmkvCount:e.filter(i=>i.storageType==="mmkv").length,asyncCount:e.filter(i=>i.storageType==="async").length,secureCount:e.filter(i=>i.storageType==="secure").length,devToolsCount:r.length};return h},[c]);const x=S(()=>{let e=c.filter(o=>!p(o.key));if(C!=="all"){e=e.filter(o=>o.storageType===C)}const t=e.filter(o=>o.status==="required_present"||o.status==="optional_present").length;const r=e.filter(o=>o.status==="required_missing").length;const h=e.filter(o=>o.status==="required_wrong_type"||o.status==="required_wrong_value").length;let i=0;let l=0;let u=0;let I=0;if(T==="all"){i=c.filter(o=>!p(o.key)&&o.storageType==="async"&&(o.status==="required_present"||o.status==="optional_present")).length;l=c.filter(o=>!p(o.key)&&o.storageType==="mmkv"&&(o.status==="required_present"||o.status==="optional_present")).length;u=c.filter(o=>!p(o.key)&&o.storageType==="secure"&&(o.status==="required_present"||o.status==="optional_present")).length;I=i+l+u}else if(T==="missing"){i=c.filter(o=>!p(o.key)&&o.storageType==="async"&&o.status==="required_missing").length;l=c.filter(o=>!p(o.key)&&o.storageType==="mmkv"&&o.status==="required_missing").length;u=c.filter(o=>!p(o.key)&&o.storageType==="secure"&&o.status==="required_missing").length;I=i+l+u}else if(T==="issues"){i=c.filter(o=>!p(o.key)&&o.storageType==="async"&&(o.status==="required_wrong_type"||o.status==="required_wrong_value")).length;l=c.filter(o=>!p(o.key)&&o.storageType==="mmkv"&&(o.status==="required_wrong_type"||o.status==="required_wrong_value")).length;u=c.filter(o=>!p(o.key)&&o.storageType==="secure"&&(o.status==="required_wrong_type"||o.status==="required_wrong_value")).length;I=i+l+u}return{validCount:t,missingCount:r,issuesCount:h,asyncCount:i,mmkvCount:l,secureCount:u,totalCount:I}},[c,T,C]);A(()=>{fe?.({validCount:x.validCount,missingCount:x.missingCount,issuesCount:x.issuesCount})},[fe,x.validCount,x.missingCount,x.issuesCount]);const Ve=S(()=>{return[...c].sort((e,t)=>{const r={required_missing:1,required_wrong_type:2,required_wrong_value:3,required_present:4,optional_present:5};return(r[e.status]||999)-(r[t.status]||999)})},[c]);const Jt=S(()=>{return Array.from(new Set(c.map(e=>e.key))).sort()},[c]);const v=S(()=>{let e=Ve;if(H&&H.size>0){e=e.filter(t=>H.has(t.storageType))}e=e.filter(t=>{const r=Array.from(O).some(h=>t.key.includes(h));return!r});if(w){const t=w.toLowerCase();e=e.filter(r=>r.key.toLowerCase().includes(t))}switch(T){case"all":e=e.filter(t=>t.status==="required_present"||t.status==="optional_present");break;case"missing":e=e.filter(t=>t.status==="required_missing");break;case"issues":e=e.filter(t=>t.status==="required_wrong_type"||t.status==="required_wrong_value");break}if(C!=="all"){e=e.filter(t=>t.storageType===C)}if(_&&_.size>0){const t=e.filter(h=>_.has(h.key));const r=e.filter(h=>!_.has(h.key));e=[...t,...r]}return e},[Ve,T,C,O,w,g,H,_]);const B=S(()=>v.slice(0,$),[v,$]);const Y=S(()=>{return Math.max(0,v.length-$)},[v.length,$]);const gt=Y>0;const Xt=S(()=>{const e=v.filter(r=>!p(r.key));const t={totalCount:v.length,requiredCount:e.filter(r=>r.category==="required").length,missingCount:e.filter(r=>r.status==="required_missing").length,wrongValueCount:e.filter(r=>r.status==="required_wrong_value").length,wrongTypeCount:e.filter(r=>r.status==="required_wrong_type").length,presentRequiredCount:e.filter(r=>r.status==="required_present").length,optionalCount:e.filter(r=>r.category==="optional").length,mmkvCount:v.filter(r=>r.storageType==="mmkv").length,asyncCount:v.filter(r=>r.storageType==="async").length,secureCount:v.filter(r=>r.storageType==="secure").length,devToolsCount:v.filter(r=>p(r.key)).length};return t},[v]);const yt=S(()=>{return B.filter(e=>U.has(R(e)))},[B,U,R]);const mt=b(()=>{const e=new Set(B.map(R));V(e)},[B,R]);const ft=b(()=>{V(new Set)},[]);const F=D.requiredCount>0?Math.round(D.presentRequiredCount/D.requiredCount*100):D.totalCount>0?100:0;const ht=F>=90?"OPTIMAL":F>=70?"WARNING":"CRITICAL";const pt=F>=90?E.success:F>=70?E.warning:E.error;if(K){return a(f,{style:n.root,children:a(qt,{storageKey:K,editBlockedReason:qe(K),eventCount:ge?.[K.key],onSave:e=>se(K,e),onViewHistory:Z?()=>Z(K.key):void 0,onDeleteKey:e=>Ne(e,()=>be?.()),onHideKey:e=>{ne([e]);be?.()},isPinned:_?.has(K.key)??false,onTogglePin:he,applySafeAreaInset:Oe})})}if(it&&c.length===0){return d(f,{style:n.emptyState,children:[a(Le,{size:48,color:s.color.textTertiary}),a(m,{style:n.emptyTitle,children:"Loading storage keys..."})]})}if(Be){return d(f,{style:n.emptyState,children:[a(Le,{size:48,color:E.error}),a(m,{style:[n.emptyTitle,{color:E.error}],children:"Error loading storage"}),a(m,{style:n.emptySubtitle,children:Be.message})]})}const St=d(Gt,{children:[C==="mmkv"&&y.length===0&&d(f,{style:n.emptyMMKVState,children:[a(m,{style:n.emptyMMKVTitle,children:"No MMKV Instances Detected"}),a(m,{style:n.emptyMMKVSubtitle,children:"MMKV instances must be registered with registerMMKVInstance()"}),a(m,{style:n.emptyMMKVCode,children:`import { registerMMKVInstance } from '@buoy-gg/storage';
|
|
1
|
+
"use strict";import{storageLabels as wt}from"../utils/storageLabels";import{useMemo as S,useCallback as b,useState as N,useEffect as A,useRef as ie}from"react";import{StyleSheet as It,Text as m,View as f,TouchableOpacity as ae,ScrollView as Re,Alert as le}from"react-native";import{absoluteFill as Ae,useLimit as Ee,TIER_LIMITS as _t,monoFont as W}from"@buoy-gg/shared-ui";import{Database as Le,Zap as Mt,ProBadge as ze,ProUpgradeModal as Kt,ToolEmptyState as xt,resolveListEmptyState as Bt}from"@buoy-gg/shared-ui";import{isDevToolsStorageKey as h}from"@buoy-gg/shared-ui";import{StorageKeySection as Nt,storageRowId as De}from"./StorageKeySection";import{StorageKeyDetailScreen as qt}from"./StorageKeyDetailScreen";import{StorageFilterCards as Vt}from"./StorageFilterCards";import{useAsyncStorageKeys as Rt}from"../hooks/useAsyncStorageKeys";import{addListener as At}from"../utils/AsyncStorageListener";import{useMultiMMKVKeys as Et}from"../hooks/useMMKVKeys";import{useSecureStoreKeys as Lt}from"../hooks/useSecureStoreKeys";import{useMMKVInstances as zt}from"../hooks/useMMKVInstances";import{StorageSaveNotice as Dt}from"./StorageSaveNotice";import{StorageActionButtons as Ft}from"./StorageActionButtons";import{SelectionActionBar as Wt}from"./SelectionActionBar";import{addMMKVListener as Ot}from"../utils/MMKVListener";import{onStorageBrowserRefresh as Ht}from"../utils/storageBrowserRefresh";import{deleteStorageKeys as Pt}from"../utils/deleteStorageKeys";import{setStorageValue as $t,storageEditBlockedReason as Ut}from"../utils/setStorageValue";import{gameUIColors as E,macOSColors as J,night as s,HardDrive as Fe}from"@buoy-gg/shared-ui";import{useIsPro as jt}from"@buoy-gg/license";import{jsx as a,jsxs as d,Fragment as Gt}from"react/jsx-runtime";const We=[J.semantic.info,J.semantic.success,J.semantic.warning,J.semantic.debug,"#FF6B9D","#00D9FF"];function L(z){const ce=z.split("").reduce((O,de)=>O+de.charCodeAt(0),0);return We[ce%We.length]}export const FREE_TIER_KEY_LIMIT=_t["storage.keys"].free;export function GameUIStorageBrowser({requiredStorageKeys:z=[],showFilters:ce=false,ignoredPatterns:O=new Set(["@react_buoy"]),onTogglePattern:de,onAddPattern:ue,searchQuery:w="",storageDataRef:X,eventCountByKey:ge,lastWriteByKey:Yt,onViewHistory:Z,enabledStorageTypes:H,statusFilter:ye,onStatusFilterChange:me,onStatusCountsChange:fe,pinnedKeys:_,onTogglePin:he,storageTypeFilter:pe,onStorageTypeFilterChange:Se,applySafeAreaInset:Oe,detailKey:P=null,onOpenKey:He,onCloseDetail:be}){const M=jt();const $=Ee("storage.keys");const Ce=Ee("storage.mmkvInstances");const[Q,q]=N(false);A(()=>{if(Q&&M){q(false)}},[Q,M]);const[Pe,$e]=N("all");const ee=ye!=null&&me!=null;const T=ee?ye:Pe;const Ue=ee?me:$e;const[je,Ge]=N("all");const ve=pe!=null&&Se!=null;const C=ve?pe:je;const Ye=ve?Se:Ge;const[g,Te]=N(null);const Je=ie(null);const Xe=ie(0);const ke=ie(new Map);const Ze=b((e,t)=>{if(t)ke.current.set(e,t);else ke.current.delete(e)},[]);const[we,Ie]=N(0);const[te,re]=N(false);const[U,V]=N(new Set);const{instances:y}=zt(false);const{storageKeys:_e,isLoading:Qe,error:et,refresh:j}=Rt(z);const tt=S(()=>y.map(e=>({instance:e.instance,id:e.id})),[y]);const{storageKeys:oe,isLoading:rt,error:ot,refresh:G}=Et(tt,z);const Me=S(()=>{if(!g){return oe}return oe.filter(e=>e.instanceId===g)},[oe,g]);const{storageKeys:Ke,isLoading:nt,error:st,refresh:xe}=Lt(z);const c=S(()=>{return[..._e,...Me,...Ke].filter(e=>!h(e.key))},[_e,Me,Ke]);const K=S(()=>{if(!P)return null;const e=De(P);return c.find(t=>De(t)===e)??P},[P,c]);const it=Qe||rt||nt;const Be=et||ot||st;const k=b(()=>{j();G();xe()},[j,G,xe]);const R=b(e=>{return e.instanceId?`${e.storageType}-${e.instanceId}-${e.key}`:`${e.storageType}-${e.key}`},[]);const at=b(()=>{re(e=>{if(e){V(new Set)}return!e})},[]);const lt=b((e,t)=>{const r=R(e);V(p=>{const i=new Set(p);if(t){i.add(r)}else{i.delete(r)}return i})},[R]);const ct=b(()=>{V(new Set);re(false);k()},[k]);const ne=b(e=>{e.forEach(t=>ue?.(t.key));V(new Set);re(false)},[ue]);const se=b(async(e,t)=>{if(!M){q(true);throw new Error("Editing storage values is a Pro feature.")}await $t(e,t,y);k();Ie(r=>r+1)},[M,y,k]);const dt=b(e=>{void se(e,JSON.stringify(!e.value)).catch(t=>{le.alert("Couldn't save",t instanceof Error?t.message:String(t))})},[se]);const Ne=b((e,t)=>{if(!M){q(true);return}le.alert("Delete key",`Delete "${e.key}"? This cannot be undone.`,[{text:"Cancel",style:"cancel"},{text:"Delete",style:"destructive",onPress:async()=>{try{await Pt([e],y.map(r=>({id:r.id,instance:r.instance})));k();t?.()}catch(r){le.alert("Error",`Failed to delete key: ${r}`)}}}])},[M,y,k]);const qe=b(e=>Ut(e,y),[y]);const ut=S(()=>{const e=c;const t={valid:e.filter(l=>l.status==="required_present"||l.status==="optional_present").length,missing:e.filter(l=>l.status==="required_missing").length,issues:e.filter(l=>l.status==="required_wrong_value"||l.status==="required_wrong_type").length,total:e.length};const r=e.filter(l=>l.storageType==="async");const p=e.filter(l=>l.storageType==="mmkv");const i=e.filter(l=>l.storageType==="secure");return{summary:{valid:t.valid,missing:t.missing,issues:t.issues,total:t.total,timestamp:new Date().toISOString()},asyncStorage:r.reduce((l,u)=>{l[u.key]=u.value;return l},{}),mmkv:p.reduce((l,u)=>{const I=u.instanceId||"default";if(!l[I])l[I]={};l[I][u.key]=u.value;return l},{}),secure:i.reduce((l,u)=>{l[u.key]=u.value;return l},{})}},[c]);A(()=>{if(X){X.current=c}},[c,X]);A(()=>{let e;const t=At(r=>{clearTimeout(e);e=setTimeout(()=>{j()},100)});return()=>{clearTimeout(e);t()}},[j]);A(()=>{let e;const t=Ht(()=>{clearTimeout(e);e=setTimeout(k,100)});return()=>{clearTimeout(e);t()}},[k]);A(()=>{let e;const t=Ot(r=>{const p=g===null||r.instanceId===g;if(p){clearTimeout(e);e=setTimeout(()=>{G()},100)}});return()=>{clearTimeout(e);t()}},[G,g]);const D=S(()=>{const e=c;const t=e.filter(i=>!h(i.key));const r=e.filter(i=>h(i.key));const p={totalCount:e.length,requiredCount:t.filter(i=>i.category==="required").length,missingCount:t.filter(i=>i.status==="required_missing").length,wrongValueCount:t.filter(i=>i.status==="required_wrong_value").length,wrongTypeCount:t.filter(i=>i.status==="required_wrong_type").length,presentRequiredCount:t.filter(i=>i.status==="required_present").length,optionalCount:t.filter(i=>i.category==="optional").length,mmkvCount:e.filter(i=>i.storageType==="mmkv").length,asyncCount:e.filter(i=>i.storageType==="async").length,secureCount:e.filter(i=>i.storageType==="secure").length,devToolsCount:r.length};return p},[c]);const x=S(()=>{let e=c.filter(o=>!h(o.key));if(C!=="all"){e=e.filter(o=>o.storageType===C)}const t=e.filter(o=>o.status==="required_present"||o.status==="optional_present").length;const r=e.filter(o=>o.status==="required_missing").length;const p=e.filter(o=>o.status==="required_wrong_type"||o.status==="required_wrong_value").length;let i=0;let l=0;let u=0;let I=0;if(T==="all"){i=c.filter(o=>!h(o.key)&&o.storageType==="async"&&(o.status==="required_present"||o.status==="optional_present")).length;l=c.filter(o=>!h(o.key)&&o.storageType==="mmkv"&&(o.status==="required_present"||o.status==="optional_present")).length;u=c.filter(o=>!h(o.key)&&o.storageType==="secure"&&(o.status==="required_present"||o.status==="optional_present")).length;I=i+l+u}else if(T==="missing"){i=c.filter(o=>!h(o.key)&&o.storageType==="async"&&o.status==="required_missing").length;l=c.filter(o=>!h(o.key)&&o.storageType==="mmkv"&&o.status==="required_missing").length;u=c.filter(o=>!h(o.key)&&o.storageType==="secure"&&o.status==="required_missing").length;I=i+l+u}else if(T==="issues"){i=c.filter(o=>!h(o.key)&&o.storageType==="async"&&(o.status==="required_wrong_type"||o.status==="required_wrong_value")).length;l=c.filter(o=>!h(o.key)&&o.storageType==="mmkv"&&(o.status==="required_wrong_type"||o.status==="required_wrong_value")).length;u=c.filter(o=>!h(o.key)&&o.storageType==="secure"&&(o.status==="required_wrong_type"||o.status==="required_wrong_value")).length;I=i+l+u}return{validCount:t,missingCount:r,issuesCount:p,asyncCount:i,mmkvCount:l,secureCount:u,totalCount:I}},[c,T,C]);A(()=>{fe?.({validCount:x.validCount,missingCount:x.missingCount,issuesCount:x.issuesCount})},[fe,x.validCount,x.missingCount,x.issuesCount]);const Ve=S(()=>{return[...c].sort((e,t)=>{const r={required_missing:1,required_wrong_type:2,required_wrong_value:3,required_present:4,optional_present:5};return(r[e.status]||999)-(r[t.status]||999)})},[c]);const Jt=S(()=>{return Array.from(new Set(c.map(e=>e.key))).sort()},[c]);const v=S(()=>{let e=Ve;if(H&&H.size>0){e=e.filter(t=>H.has(t.storageType))}e=e.filter(t=>{const r=Array.from(O).some(p=>t.key.includes(p));return!r});if(w){const t=w.toLowerCase();e=e.filter(r=>r.key.toLowerCase().includes(t))}switch(T){case"all":e=e.filter(t=>t.status==="required_present"||t.status==="optional_present");break;case"missing":e=e.filter(t=>t.status==="required_missing");break;case"issues":e=e.filter(t=>t.status==="required_wrong_type"||t.status==="required_wrong_value");break}if(C!=="all"){e=e.filter(t=>t.storageType===C)}if(_&&_.size>0){const t=e.filter(p=>_.has(p.key));const r=e.filter(p=>!_.has(p.key));e=[...t,...r]}return e},[Ve,T,C,O,w,g,H,_]);const B=S(()=>v.slice(0,$),[v,$]);const Y=S(()=>{return Math.max(0,v.length-$)},[v.length,$]);const gt=Y>0;const Xt=S(()=>{const e=v.filter(r=>!h(r.key));const t={totalCount:v.length,requiredCount:e.filter(r=>r.category==="required").length,missingCount:e.filter(r=>r.status==="required_missing").length,wrongValueCount:e.filter(r=>r.status==="required_wrong_value").length,wrongTypeCount:e.filter(r=>r.status==="required_wrong_type").length,presentRequiredCount:e.filter(r=>r.status==="required_present").length,optionalCount:e.filter(r=>r.category==="optional").length,mmkvCount:v.filter(r=>r.storageType==="mmkv").length,asyncCount:v.filter(r=>r.storageType==="async").length,secureCount:v.filter(r=>r.storageType==="secure").length,devToolsCount:v.filter(r=>h(r.key)).length};return t},[v]);const yt=S(()=>{return B.filter(e=>U.has(R(e)))},[B,U,R]);const mt=b(()=>{const e=new Set(B.map(R));V(e)},[B,R]);const ft=b(()=>{V(new Set)},[]);const F=D.requiredCount>0?Math.round(D.presentRequiredCount/D.requiredCount*100):D.totalCount>0?100:0;const ht=F>=90?"OPTIMAL":F>=70?"WARNING":"CRITICAL";const pt=F>=90?E.success:F>=70?E.warning:E.error;if(K){return a(f,{style:n.root,children:a(qt,{storageKey:K,editBlockedReason:qe(K),eventCount:ge?.[K.key],onSave:e=>se(K,e),onViewHistory:Z?()=>Z(K.key):void 0,onDeleteKey:e=>Ne(e,()=>be?.()),onHideKey:e=>{ne([e]);be?.()},isPinned:_?.has(K.key)??false,onTogglePin:he,applySafeAreaInset:Oe})})}if(it&&c.length===0){return d(f,{style:n.emptyState,children:[a(Le,{size:48,color:s.color.textTertiary}),a(m,{style:n.emptyTitle,children:"Loading storage keys..."})]})}if(Be){return d(f,{style:n.emptyState,children:[a(Le,{size:48,color:E.error}),a(m,{style:[n.emptyTitle,{color:E.error}],children:"Error loading storage"}),a(m,{style:n.emptySubtitle,children:Be.message})]})}const St=d(Gt,{children:[C==="mmkv"&&y.length===0&&d(f,{style:n.emptyMMKVState,children:[a(m,{style:n.emptyMMKVTitle,children:"No MMKV Instances Detected"}),a(m,{style:n.emptyMMKVSubtitle,children:"MMKV instances must be registered with registerMMKVInstance()"}),a(m,{style:n.emptyMMKVCode,children:`import { registerMMKVInstance } from '@buoy-gg/storage';
|
|
2
2
|
|
|
3
3
|
const storage = createMMKV();
|
|
4
|
-
registerMMKVInstance('mmkv.default', storage);`})]}),C==="mmkv"&&y.length>0&&d(f,{style:n.instanceNavbar,children:[d(f,{style:n.instanceNavbarHeader,children:[a(m,{style:n.instanceNavbarLabel,children:"INSTANCES"}),y.length>Ce&&a(ze,{style:{transform:[{scale:.85}]}})]}),d(Re,{horizontal:true,showsHorizontalScrollIndicator:false,contentContainerStyle:n.instanceNavbarScroll,children:[(M||y.length===1)&&d(ae,{onPress:()=>Te(null),testID:"buoy-storage-instance-all",accessibilityRole:"button",accessibilityLabel:`All ${wt.mmkv} instances`,style:[n.instanceNavbarButton,g===null&&n.instanceNavbarButtonActive],children:[a(Fe,{size:12,color:g===null?s.color.text:s.color.textSecondary}),a(m,{style:[n.instanceNavbarButtonText,g===null&&n.instanceNavbarButtonTextActive],children:"All"}),a(f,{style:n.instanceNavbarBadge,children:a(m,{style:n.instanceNavbarBadgeText,children:y.reduce((e,t)=>e+t.keyCount,0)})})]}),y.map((e,t)=>{const r=t>=Ce;return d(ae,{testID:`buoy-storage-instance-${e.id}`,accessibilityRole:"button",accessibilityLabel:`MMKV instance ${e.id}`,onPress:()=>{if(r){q(true)}else{Te(e.id)}},style:[n.instanceNavbarButton,e.id===g&&n.instanceNavbarButtonActive,{borderColor:r?s.color.border:L(e.id)+"40",backgroundColor:e.id===g?L(e.id)+"20":s.color.surfaceElevated,opacity:r?.5:1}],children:[a(Fe,{size:12,color:e.id===g?L(e.id):s.color.textSecondary}),a(m,{style:[n.instanceNavbarButtonText,e.id===g&&{color:L(e.id),fontWeight:"700"}],children:e.id}),a(f,{style:[n.instanceNavbarBadge,e.id===g&&{backgroundColor:L(e.id)+"30"}],children:a(m,{style:[n.instanceNavbarBadgeText,e.id===g&&{color:L(e.id)}],children:e.keyCount})})]},e.id)})]})]})]});const bt=a(Ft,{copyValue:ut,mmkvInstances:y.map(e=>({id:e.id,instance:e.instance})),activeStorageType:C,onClearComplete:k,isSelectMode:te,onToggleSelectMode:at,selectedCount:U.size});const Ct=te?a(Wt,{selectedKeys:yt,mmkvInstances:y.map(e=>({id:e.id,instance:e.instance})),onDeleteComplete:ct,onHideKeys:ne,onSelectAll:mt,onClearSelection:ft,totalVisibleKeys:B.length}):null;const vt=gt?d(ae,{style:n.limitBanner,onPress:()=>q(true),activeOpacity:.8,testID:"buoy-storage-locked-banner",accessibilityRole:"button",children:[d(f,{style:n.limitBannerContent,children:[d(f,{style:n.limitBannerLeft,children:[a(Mt,{size:16,color:s.color.accent}),a(m,{style:n.limitBannerText,children:w?`${Y} matching ${Y===1?"key":"keys"} in locked storage`:`${Y} keys locked`})]}),a(ze,{})]}),a(m,{style:n.limitBannerSubtext,children:w?"Upgrade to Pro to search your full storage":"Upgrade to Pro to unlock full storage access"})]}):null;const Tt=(()=>{const e=c.some(r=>!
|
|
4
|
+
registerMMKVInstance('mmkv.default', storage);`})]}),C==="mmkv"&&y.length>0&&d(f,{style:n.instanceNavbar,children:[d(f,{style:n.instanceNavbarHeader,children:[a(m,{style:n.instanceNavbarLabel,children:"INSTANCES"}),y.length>Ce&&a(ze,{style:{transform:[{scale:.85}]}})]}),d(Re,{horizontal:true,showsHorizontalScrollIndicator:false,contentContainerStyle:n.instanceNavbarScroll,children:[(M||y.length===1)&&d(ae,{onPress:()=>Te(null),testID:"buoy-storage-instance-all",accessibilityRole:"button",accessibilityLabel:`All ${wt.mmkv} instances`,style:[n.instanceNavbarButton,g===null&&n.instanceNavbarButtonActive],children:[a(Fe,{size:12,color:g===null?s.color.text:s.color.textSecondary}),a(m,{style:[n.instanceNavbarButtonText,g===null&&n.instanceNavbarButtonTextActive],children:"All"}),a(f,{style:n.instanceNavbarBadge,children:a(m,{style:n.instanceNavbarBadgeText,children:y.reduce((e,t)=>e+t.keyCount,0)})})]}),y.map((e,t)=>{const r=t>=Ce;return d(ae,{testID:`buoy-storage-instance-${e.id}`,accessibilityRole:"button",accessibilityLabel:`MMKV instance ${e.id}`,onPress:()=>{if(r){q(true)}else{Te(e.id)}},style:[n.instanceNavbarButton,e.id===g&&n.instanceNavbarButtonActive,{borderColor:r?s.color.border:L(e.id)+"40",backgroundColor:e.id===g?L(e.id)+"20":s.color.surfaceElevated,opacity:r?.5:1}],children:[a(Fe,{size:12,color:e.id===g?L(e.id):s.color.textSecondary}),a(m,{style:[n.instanceNavbarButtonText,e.id===g&&{color:L(e.id),fontWeight:"700"}],children:e.id}),a(f,{style:[n.instanceNavbarBadge,e.id===g&&{backgroundColor:L(e.id)+"30"}],children:a(m,{style:[n.instanceNavbarBadgeText,e.id===g&&{color:L(e.id)}],children:e.keyCount})})]},e.id)})]})]})]});const bt=a(Ft,{copyValue:ut,mmkvInstances:y.map(e=>({id:e.id,instance:e.instance})),activeStorageType:C,onClearComplete:k,isSelectMode:te,onToggleSelectMode:at,selectedCount:U.size});const Ct=te?a(Wt,{selectedKeys:yt,mmkvInstances:y.map(e=>({id:e.id,instance:e.instance})),onDeleteComplete:ct,onHideKeys:ne,onSelectAll:mt,onClearSelection:ft,totalVisibleKeys:B.length}):null;const vt=gt?d(ae,{style:n.limitBanner,onPress:()=>q(true),activeOpacity:.8,testID:"buoy-storage-locked-banner",accessibilityRole:"button",children:[d(f,{style:n.limitBannerContent,children:[d(f,{style:n.limitBannerLeft,children:[a(Mt,{size:16,color:s.color.accent}),a(m,{style:n.limitBannerText,children:w?`${Y} matching ${Y===1?"key":"keys"} in locked storage`:`${Y} keys locked`})]}),a(ze,{})]}),a(m,{style:n.limitBannerSubtext,children:w?"Upgrade to Pro to search your full storage":"Upgrade to Pro to unlock full storage access"})]}):null;const Tt=(()=>{const e=c.some(r=>!h(r.key));let t;if(w||!e){t=Bt({subject:"keys",verb:"registered",search:w,total:e?1:0,waiting:{otto:"empty",title:"No storage keys",message:"Nothing is registered for this tool to read."}});if(w&&e){t={...t,message:"No keys match. Clear the search to see them."}}}else if(T==="missing"){t={otto:"thumbsup",title:"No missing keys",message:"All required keys are present"}}else if(T==="issues"){t={otto:"cool",title:"No issues found",message:"All storage keys are correctly configured"}}else{t={otto:"broken",title:"No valid keys found",message:"All keys have issues or are missing"}}return a(xt,{...t,testID:"buoy-storage-keys-empty"})})();const kt=a(Kt,{visible:Q,onClose:()=>q(false),featureName:"Storage Keys"});return d(f,{style:n.root,children:[we>0?a(Dt,{onDone:()=>Ie(0)},we):null,d(Re,{testID:"buoy-storage-scroll",ref:Je,onScroll:e=>{Xe.current=e.nativeEvent.contentOffset.y},scrollEventThrottle:32,style:n.scrollContainer,contentContainerStyle:n.container,showsVerticalScrollIndicator:false,children:[a(f,{style:n.backgroundGrid}),a(Vt,{stats:D,tabStats:x,healthPercentage:F,healthStatus:ht,healthColor:pt,activeFilter:T,onFilterChange:Ue,activeStorageType:C,onStorageTypeChange:Ye,showStatus:!ee}),St,v.length>0?d(f,{style:n.keysSection,children:[d(f,{style:n.sectionHeader,children:[d(f,{style:n.sectionHeaderLeft,children:[d(m,{style:n.sectionTitle,children:[T==="all"?"KEYS":T==="missing"?"MISSING KEYS":"ISSUES TO FIX",C!=="all"&&` (${C.toUpperCase()})`]}),a(f,{style:n.countBadge,children:a(m,{style:n.countText,children:B.length})})]}),bt]}),Ct,a(Nt,{title:"",count:-1,keys:B,emptyMessage:"",isSelectMode:te,selectedKeys:U,onSelectionChange:lt,eventCountByKey:ge,onViewHistory:Z,onHideKey:e=>ne([e]),onToggleKey:dt,onDeleteKey:Ne,editBlockedFor:qe,pinnedKeys:_,onTogglePin:he,onRowRef:Ze,onOpenKey:He}),vt]}):Tt,a(m,{style:n.techFooter,children:"ASYNC STORAGE | MMKV | SECURE STORAGE BACKENDS"}),kt]})]})}const n=It.create({root:{flex:1,minHeight:0},editorOverlay:{...Ae,zIndex:10},scrollContainer:{flex:1,backgroundColor:"transparent"},container:{padding:12,paddingBottom:120},backgroundGrid:{...Ae,opacity:.006,backgroundColor:E.info},techFooter:{fontSize:8,color:s.color.textTertiary,fontFamily:W,textAlign:"center",marginTop:20,letterSpacing:1,opacity:.5},keysSection:{marginTop:8,backgroundColor:s.color.bg,borderRadius:12,padding:12,borderWidth:1,borderColor:s.color.border},sectionHeader:{flexDirection:"row",justifyContent:"space-between",alignItems:"center",marginBottom:10,paddingBottom:6,borderBottomWidth:1,borderBottomColor:s.color.separator},sectionHeaderLeft:{flexDirection:"row",alignItems:"center",gap:8},sectionTitle:{fontSize:12,fontWeight:"600",color:s.color.textSecondary,letterSpacing:.4,textTransform:"uppercase"},countBadge:{backgroundColor:s.color.surfaceElevated,paddingHorizontal:8,paddingVertical:3,borderRadius:6,borderWidth:1,borderColor:s.color.border},countText:{fontSize:11,fontWeight:"600",color:s.color.text,fontFamily:W},emptyState:{alignItems:"center",justifyContent:"center",paddingVertical:48},emptyTitle:{fontSize:16,fontWeight:"600",color:s.color.text,marginTop:12,marginBottom:8},emptySubtitle:{fontSize:13,color:s.color.textSecondary,textAlign:"center"},emptyMMKVState:{backgroundColor:s.color.surface,borderRadius:12,padding:20,borderWidth:1,borderColor:s.color.border,marginTop:8,alignItems:"center"},emptyMMKVTitle:{fontSize:14,fontWeight:"600",color:s.color.text,marginBottom:6},emptyMMKVSubtitle:{fontSize:12,color:s.color.textSecondary,textAlign:"center",marginBottom:12},emptyMMKVCode:{fontSize:10,fontFamily:W,color:s.color.accent,backgroundColor:s.color.bg,padding:12,borderRadius:8,borderWidth:1,borderColor:s.color.border,alignSelf:"stretch"},instanceNavbar:{marginTop:12,marginBottom:8,backgroundColor:s.color.surface,borderRadius:10,borderWidth:1,borderColor:s.color.border,padding:10,shadowColor:"#000",shadowOpacity:.08,shadowRadius:6,shadowOffset:{width:0,height:2}},instanceNavbarHeader:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",marginBottom:8,paddingLeft:2},instanceNavbarLabel:{fontSize:9,fontWeight:"700",color:s.color.textTertiary,textTransform:"uppercase",letterSpacing:1},instanceNavbarScroll:{gap:8,paddingRight:8},instanceNavbarButton:{flexDirection:"row",alignItems:"center",gap:6,paddingHorizontal:12,paddingVertical:8,backgroundColor:s.color.surfaceElevated,borderRadius:8,borderWidth:1,borderColor:s.color.border,minWidth:90},instanceNavbarButtonActive:{borderWidth:1.5,shadowColor:"#000",shadowOpacity:.1,shadowRadius:4,shadowOffset:{width:0,height:1}},instanceNavbarButtonText:{fontSize:11,fontWeight:"600",color:s.color.textSecondary,fontFamily:W,flex:1},instanceNavbarButtonTextActive:{fontWeight:"700",color:s.color.text},instanceNavbarBadge:{backgroundColor:s.color.bg,paddingHorizontal:6,paddingVertical:2,borderRadius:6,minWidth:24,alignItems:"center"},instanceNavbarBadgeText:{fontSize:10,fontWeight:"700",color:s.color.textSecondary,fontFamily:W},clearSearchButton:{marginTop:16,paddingHorizontal:16,paddingVertical:8,backgroundColor:s.color.surfaceElevated,borderRadius:6,borderWidth:1,borderColor:s.color.border},clearSearchText:{fontSize:13,color:s.color.text,fontWeight:"500"},limitBanner:{backgroundColor:s.color.surface,borderRadius:10,borderWidth:1,borderColor:s.color.accentBorderStrong,padding:12,marginTop:12},limitBannerContent:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",marginBottom:4},limitBannerLeft:{flexDirection:"row",alignItems:"center",gap:8},limitBannerText:{color:s.color.text,fontSize:13,fontWeight:"600"},limitBannerSubtext:{color:s.color.textTertiary,fontSize:11}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{useState as f,useEffect as j,useCallback as
|
|
1
|
+
"use strict";import{isDevToolsStorageKey as S}from"@buoy-gg/shared-ui";import{useState as f,useEffect as j,useCallback as K,useRef as w}from"react";import E from"../utils/appAsyncStorage";import{readMany as k}from"../utils/asyncStorageCompat";import{requiredKeyAppliesTo as x}from"../utils/requiredStorageKeyScope";export function useAsyncStorageKeys(a=[]){const[m,p]=f([]);const[T,d]=f(true);const[h,l]=f(null);const V=JSON.stringify(a);const y=w(a);y.current=a;const u=K(async()=>{const g=y.current;d(true);l(null);try{const n=(await E.getAllKeys()).filter(e=>!S(e));if(!n||n.length===0){p([]);d(false);return}const _=await k(n);const c=[];_.forEach(([e,o])=>{let r=o;if(o){try{r=JSON.parse(o)}catch{r=o}}const t=g.find(s=>{if(!x(s,"async"))return false;if(typeof s==="string")return s===e;return s.key===e});let i="optional_present";if(t){if(r===void 0||r===null){i="required_missing"}else if(typeof t==="object"&&t.expectedValue!==void 0){i=r===t.expectedValue?"required_present":"required_wrong_value"}else if(typeof t==="object"&&t.expectedType!==void 0){const s=r===null?"null":typeof r;i=s.toLowerCase()===t.expectedType.toLowerCase()?"required_present":"required_wrong_type"}else{i="required_present"}}const b={key:e,value:r,storageType:"async",status:i,category:t?"required":"optional",...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}};c.push(b)});g.forEach(e=>{if(!x(e,"async"))return;const o=typeof e==="string"?e:e.key;const r=c.some(t=>t.key===o);if(!r){c.push({key:o,value:void 0,storageType:"async",status:"required_missing",category:"required",...typeof e==="object"&&e.expectedValue!==void 0&&{expectedValue:e.expectedValue},...typeof e==="object"&&e.expectedType!==void 0&&{expectedType:e.expectedType},...typeof e==="object"&&e.description!==void 0&&{description:e.description}})}});p(c)}catch(n){l(n instanceof Error?n:new Error("Failed to fetch storage data"));p([])}finally{d(false)}},[V]);j(()=>{u()},[u]);return{storageKeys:m,isLoading:T,error:h,refresh:u}}
|