@buoy-gg/storage 7.0.56 → 7.0.58

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/lib/commonjs/storage/components/StorageActionButtons.js +1 -1
  2. package/lib/commonjs/storage/components/StorageEventDetailContent.js +1 -1
  3. package/lib/commonjs/storage/components/StorageModalWithTabs.js +1 -1
  4. package/lib/commonjs/storage/hooks/useAsyncStorageKeys.js +1 -1
  5. package/lib/commonjs/storage/sync/storageSyncAdapter.js +1 -1
  6. package/lib/commonjs/storage/utils/AsyncStorageListener.web.js +1 -1
  7. package/lib/commonjs/storage/utils/appAsyncStorage.js +1 -0
  8. package/lib/commonjs/storage/utils/appAsyncStorage.web.js +1 -0
  9. package/lib/commonjs/storage/utils/asyncStorageCompat.js +1 -1
  10. package/lib/commonjs/storage/utils/browserStorageLifecycle.web.js +1 -1
  11. package/lib/commonjs/storage/utils/capacitorPreferences.js +1 -0
  12. package/lib/commonjs/storage/utils/clearAllStorage.js +1 -1
  13. package/lib/commonjs/storage/utils/setStorageValue.js +1 -1
  14. package/lib/commonjs/storage/utils/snapshotProvider.js +1 -1
  15. package/lib/commonjs/storage/utils/storageLabels.web.js +1 -1
  16. package/lib/commonjs/storage/utils/storageQueryUtils.js +1 -1
  17. package/lib/commonjs/storage/utils/storageTimeTravelUtils.js +1 -1
  18. package/lib/module/storage/components/StorageActionButtons.js +1 -1
  19. package/lib/module/storage/components/StorageEventDetailContent.js +1 -1
  20. package/lib/module/storage/components/StorageModalWithTabs.js +1 -1
  21. package/lib/module/storage/hooks/useAsyncStorageKeys.js +1 -1
  22. package/lib/module/storage/sync/storageSyncAdapter.js +1 -1
  23. package/lib/module/storage/utils/AsyncStorageListener.web.js +1 -1
  24. package/lib/module/storage/utils/appAsyncStorage.js +1 -0
  25. package/lib/module/storage/utils/appAsyncStorage.web.js +1 -0
  26. package/lib/module/storage/utils/asyncStorageCompat.js +1 -1
  27. package/lib/module/storage/utils/browserStorageLifecycle.web.js +1 -1
  28. package/lib/module/storage/utils/capacitorPreferences.js +1 -0
  29. package/lib/module/storage/utils/clearAllStorage.js +1 -1
  30. package/lib/module/storage/utils/setStorageValue.js +1 -1
  31. package/lib/module/storage/utils/snapshotProvider.js +1 -1
  32. package/lib/module/storage/utils/storageLabels.web.js +1 -1
  33. package/lib/module/storage/utils/storageQueryUtils.js +1 -1
  34. package/lib/module/storage/utils/storageTimeTravelUtils.js +1 -1
  35. package/lib/typescript/storage/utils/appAsyncStorage.d.ts +7 -0
  36. package/lib/typescript/storage/utils/appAsyncStorage.web.d.ts +5 -0
  37. package/lib/typescript/storage/utils/capacitorPreferences.d.ts +25 -0
  38. package/lib/web/index.mjs +2 -2
  39. package/package.json +5 -5
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.StorageActionButtons=StorageActionButtons;var _storageLabels=require("../utils/storageLabels");var _react=require("react");var _reactNative=require("react-native");var _sharedUi=require("@buoy-gg/shared-ui");var _license=require("@buoy-gg/license");var _asyncStorage=_interopRequireDefault(require("@react-native-async-storage/async-storage"));var _jsxRuntime=require("react/jsx-runtime");function _interopRequireDefault(l){return l&&l.__esModule?l:{default:l}}function StorageActionButtons({copyValue:l,mmkvInstances:t=[],activeStorageType:s="all",onClearComplete:c,isSelectMode:r=false,onToggleSelectMode:y,selectedCount:h=0}){const[u,a]=(0,_react.useState)(false);const o=(0,_license.useIsPro)();(0,_react.useEffect)(()=>{if(u&&o){a(false)}},[u,o]);const g=()=>{if(!o){a(true);return}_reactNative.Alert.alert(`Clear ${_storageLabels.storageLabels.asyncFull}`,`Delete all ${_storageLabels.storageLabels.asyncFull} keys? This cannot be undone.`,[{text:"Cancel",style:"cancel"},{text:"Clear",style:"destructive",onPress:async()=>{try{await _asyncStorage.default.clear();c?.()}catch(e){_reactNative.Alert.alert("Error",`Failed: ${e}`)}}}])};const x=(e,b)=>{if(!o){a(true);return}_reactNative.Alert.alert(`Clear ${b}`,`Delete all keys from ${b}? This cannot be undone.`,[{text:"Cancel",style:"cancel"},{text:"Clear",style:"destructive",onPress:()=>{try{const i=t.find(D=>D.id===e);if(i){i.instance.clearAll();c?.()}}catch(i){_reactNative.Alert.alert("Error",`Failed: ${i}`)}}}])};const f=()=>{if(!o){a(true);return}_reactNative.Alert.alert(`Clear All ${_storageLabels.storageLabels.mmkv}`,`Delete all keys from ${t.length} instances? This cannot be undone.`,[{text:"Cancel",style:"cancel"},{text:"Clear All",style:"destructive",onPress:()=>{try{t.forEach(e=>e.instance.clearAll());c?.()}catch(e){_reactNative.Alert.alert("Error",`Failed: ${e}`)}}}])};const A=()=>{if(!o){a(true);return}_reactNative.Alert.alert("Clear All Storage","Delete all storage data? This cannot be undone.",[{text:"Cancel",style:"cancel"},{text:"Clear All",style:"destructive",onPress:async()=>{try{await _asyncStorage.default.clear();t.forEach(e=>e.instance.clearAll());c?.()}catch(e){_reactNative.Alert.alert("Error",`Failed: ${e}`)}}}])};const C=s==="all"||s==="async";const d=s==="all"||s==="mmkv";const n=s==="all";const j=C&&!n;const v=d&&!n;const w=d&&t.length>1&&!n;return(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.container,children:[y&&(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:y,testID:"buoy-storage-select-mode",accessibilityLabel:r?"Exit selection mode":"Select keys",accessibilityRole:"button",style:[styles.actionButton,r&&styles.actionButtonActive],children:r?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.selectModeActiveContainer,children:[(0,_jsxRuntime.jsx)(_sharedUi.X,{size:14,color:_sharedUi.night.color.accent}),h>0&&(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.selectedCountText,children:h})]}):(0,_jsxRuntime.jsx)(_sharedUi.SquareDashed,{size:16,color:_sharedUi.night.color.textSecondary})}),!r&&(0,_jsxRuntime.jsx)(_sharedUi.CopyButton,{value:l,size:16,testID:"buoy-storage-export-copy",buttonStyle:styles.actionButton,colors:{idle:_sharedUi.night.color.textSecondary,success:_sharedUi.macOSColors.semantic.success,error:_sharedUi.macOSColors.semantic.error}}),!r&&n&&(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:A,testID:"buoy-storage-clear-all",accessibilityLabel:"Clear all storage",accessibilityRole:"button",style:styles.actionButton,children:(0,_jsxRuntime.jsx)(_sharedUi.Trash2,{size:16,color:_sharedUi.night.color.danger})}),!r&&j&&(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:g,testID:"buoy-storage-clear-async",accessibilityLabel:`Clear ${_storageLabels.storageLabels.asyncFull}`,accessibilityRole:"button",style:styles.actionButton,children:(0,_jsxRuntime.jsx)(_sharedUi.Trash2,{size:16,color:_sharedUi.night.color.danger})}),!r&&w&&(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:f,testID:"buoy-storage-clear-mmkv-all",accessibilityLabel:`Clear all ${_storageLabels.storageLabels.mmkv} instances`,accessibilityRole:"button",style:styles.actionButton,children:(0,_jsxRuntime.jsx)(_sharedUi.Trash2,{size:16,color:_sharedUi.night.color.danger})}),!r&&v&&t.length===1&&(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:()=>x(t[0].id,t[0].id),testID:"buoy-storage-clear-mmkv",accessibilityLabel:`Clear ${_storageLabels.storageLabels.mmkv} instance`,accessibilityRole:"button",style:styles.actionButton,children:(0,_jsxRuntime.jsx)(_sharedUi.Trash2,{size:16,color:_sharedUi.night.color.danger})}),(0,_jsxRuntime.jsx)(_sharedUi.ProUpgradeModal,{visible:u,onClose:()=>a(false),featureName:"Storage Editing"})]})}const styles=_reactNative.StyleSheet.create({container:{flexDirection:"row",alignItems:"center",gap:8},actionButton:{width:32,height:32,alignItems:"center",justifyContent:"center",borderRadius:6,backgroundColor:_sharedUi.night.color.buttonSurface,borderWidth:1,borderColor:_sharedUi.night.color.border},actionButtonActive:{backgroundColor:_sharedUi.night.color.accentSoft,borderColor:_sharedUi.night.color.accentBorderStrong},selectModeActiveContainer:{flexDirection:"row",alignItems:"center",gap:2},selectedCountText:{fontSize:10,fontWeight:"700",color:_sharedUi.night.color.accent,fontFamily:_sharedUi.monoFont}});
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.StorageActionButtons=StorageActionButtons;var _storageLabels=require("../utils/storageLabels");var _react=require("react");var _reactNative=require("react-native");var _sharedUi=require("@buoy-gg/shared-ui");var _license=require("@buoy-gg/license");var _appAsyncStorage=_interopRequireDefault(require("../utils/appAsyncStorage"));var _jsxRuntime=require("react/jsx-runtime");function _interopRequireDefault(l){return l&&l.__esModule?l:{default:l}}function StorageActionButtons({copyValue:l,mmkvInstances:t=[],activeStorageType:s="all",onClearComplete:c,isSelectMode:r=false,onToggleSelectMode:y,selectedCount:h=0}){const[u,a]=(0,_react.useState)(false);const o=(0,_license.useIsPro)();(0,_react.useEffect)(()=>{if(u&&o){a(false)}},[u,o]);const g=()=>{if(!o){a(true);return}_reactNative.Alert.alert(`Clear ${_storageLabels.storageLabels.asyncFull}`,`Delete all ${_storageLabels.storageLabels.asyncFull} keys? This cannot be undone.`,[{text:"Cancel",style:"cancel"},{text:"Clear",style:"destructive",onPress:async()=>{try{await _appAsyncStorage.default.clear();c?.()}catch(e){_reactNative.Alert.alert("Error",`Failed: ${e}`)}}}])};const x=(e,b)=>{if(!o){a(true);return}_reactNative.Alert.alert(`Clear ${b}`,`Delete all keys from ${b}? This cannot be undone.`,[{text:"Cancel",style:"cancel"},{text:"Clear",style:"destructive",onPress:()=>{try{const i=t.find(p=>p.id===e);if(i){i.instance.clearAll();c?.()}}catch(i){_reactNative.Alert.alert("Error",`Failed: ${i}`)}}}])};const f=()=>{if(!o){a(true);return}_reactNative.Alert.alert(`Clear All ${_storageLabels.storageLabels.mmkv}`,`Delete all keys from ${t.length} instances? This cannot be undone.`,[{text:"Cancel",style:"cancel"},{text:"Clear All",style:"destructive",onPress:()=>{try{t.forEach(e=>e.instance.clearAll());c?.()}catch(e){_reactNative.Alert.alert("Error",`Failed: ${e}`)}}}])};const A=()=>{if(!o){a(true);return}_reactNative.Alert.alert("Clear All Storage","Delete all storage data? This cannot be undone.",[{text:"Cancel",style:"cancel"},{text:"Clear All",style:"destructive",onPress:async()=>{try{await _appAsyncStorage.default.clear();t.forEach(e=>e.instance.clearAll());c?.()}catch(e){_reactNative.Alert.alert("Error",`Failed: ${e}`)}}}])};const C=s==="all"||s==="async";const d=s==="all"||s==="mmkv";const n=s==="all";const j=C&&!n;const v=d&&!n;const w=d&&t.length>1&&!n;return(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.container,children:[y&&(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:y,testID:"buoy-storage-select-mode",accessibilityLabel:r?"Exit selection mode":"Select keys",accessibilityRole:"button",style:[styles.actionButton,r&&styles.actionButtonActive],children:r?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.selectModeActiveContainer,children:[(0,_jsxRuntime.jsx)(_sharedUi.X,{size:14,color:_sharedUi.night.color.accent}),h>0&&(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.selectedCountText,children:h})]}):(0,_jsxRuntime.jsx)(_sharedUi.SquareDashed,{size:16,color:_sharedUi.night.color.textSecondary})}),!r&&(0,_jsxRuntime.jsx)(_sharedUi.CopyButton,{value:l,size:16,testID:"buoy-storage-export-copy",buttonStyle:styles.actionButton,colors:{idle:_sharedUi.night.color.textSecondary,success:_sharedUi.macOSColors.semantic.success,error:_sharedUi.macOSColors.semantic.error}}),!r&&n&&(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:A,testID:"buoy-storage-clear-all",accessibilityLabel:"Clear all storage",accessibilityRole:"button",style:styles.actionButton,children:(0,_jsxRuntime.jsx)(_sharedUi.Trash2,{size:16,color:_sharedUi.night.color.danger})}),!r&&j&&(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:g,testID:"buoy-storage-clear-async",accessibilityLabel:`Clear ${_storageLabels.storageLabels.asyncFull}`,accessibilityRole:"button",style:styles.actionButton,children:(0,_jsxRuntime.jsx)(_sharedUi.Trash2,{size:16,color:_sharedUi.night.color.danger})}),!r&&w&&(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:f,testID:"buoy-storage-clear-mmkv-all",accessibilityLabel:`Clear all ${_storageLabels.storageLabels.mmkv} instances`,accessibilityRole:"button",style:styles.actionButton,children:(0,_jsxRuntime.jsx)(_sharedUi.Trash2,{size:16,color:_sharedUi.night.color.danger})}),!r&&v&&t.length===1&&(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:()=>x(t[0].id,t[0].id),testID:"buoy-storage-clear-mmkv",accessibilityLabel:`Clear ${_storageLabels.storageLabels.mmkv} instance`,accessibilityRole:"button",style:styles.actionButton,children:(0,_jsxRuntime.jsx)(_sharedUi.Trash2,{size:16,color:_sharedUi.night.color.danger})}),(0,_jsxRuntime.jsx)(_sharedUi.ProUpgradeModal,{visible:u,onClose:()=>a(false),featureName:"Storage Editing"})]})}const styles=_reactNative.StyleSheet.create({container:{flexDirection:"row",alignItems:"center",gap:8},actionButton:{width:32,height:32,alignItems:"center",justifyContent:"center",borderRadius:6,backgroundColor:_sharedUi.night.color.buttonSurface,borderWidth:1,borderColor:_sharedUi.night.color.border},actionButtonActive:{backgroundColor:_sharedUi.night.color.accentSoft,borderColor:_sharedUi.night.color.accentBorderStrong},selectModeActiveContainer:{flexDirection:"row",alignItems:"center",gap:2},selectedCountText:{fontSize:10,fontWeight:"700",color:_sharedUi.night.color.accent,fontFamily:_sharedUi.monoFont}});
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.StorageEventDetailContent=StorageEventDetailContent;exports.StorageEventDetailFooter=StorageEventDetailFooter;var _reactNative=require("react-native");var _react=require("react");var _asyncStorage=_interopRequireDefault(require("@react-native-async-storage/async-storage"));var _sharedUi=require("@buoy-gg/shared-ui");var _license=require("@buoy-gg/license");var _lineDiff=require("../utils/lineDiff");var _ThemedSplitView=require("./DiffViewer/modes/ThemedSplitView");var _diffThemes=require("./DiffViewer/themes/diffThemes");var _TreeDiffViewer=require("./DiffViewer/TreeDiffViewer");var _storageActionHelpers=require("../utils/storageActionHelpers");var _StorageEventActionButton=require("./StorageEventActionButton");var _storageTimeTravelUtils=require("../utils/storageTimeTravelUtils");var _jsxRuntime=require("react/jsx-runtime");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const ORIGIN_INDEX=-1;const ORIGIN_LABELS={prior:{label:"BEFORE #1",timestamp:"value before first event",relativeTime:"not captured",badge:"PRIOR"},absent:{label:"NO PRIOR VALUE",timestamp:"key did not exist",relativeTime:"created here",badge:"ABSENT"},scanned:{label:"ALREADY PRESENT",timestamp:"value found at startup",relativeTime:"not a write",badge:"SCANNED"}};function getActionColor(e){switch(e){case"setItem":case"multiSet":return _sharedUi.macOSColors.semantic.success;case"removeItem":case"multiRemove":case"clear":return _sharedUi.macOSColors.semantic.error;case"mergeItem":case"multiMerge":return _sharedUi.macOSColors.semantic.info;default:return _sharedUi.macOSColors.text.muted}}function getValueType(e){if(e===null)return"null";if(e===void 0)return"undefined";if(Array.isArray(e))return"array";return typeof e}function formatTimeWithMs(e){const t=String(e.getHours()).padStart(2,"0");const f=String(e.getMinutes()).padStart(2,"0");const g=String(e.getSeconds()).padStart(2,"0");const l=String(e.getMilliseconds()).padStart(3,"0");return`${t}:${f}:${g}.${l}`}const SPLIT_VIEW_OPTIONS={hideLineNumbers:false,disableWordDiff:false,showDiffOnly:false,compareMethod:"words",contextLines:3,lineOffset:0};const SPLIT_VIEW_DIFFERENCES=[];function StorageEventDetailContent({conversation:e,selectedEventIndex:t=0,onEventIndexChange:f=()=>{},disableInternalFooter:g=false}){const l=(0,_license.useIsPro)();const[S,h]=(0,_react.useState)(false);const[p,M]=(0,_react.useState)("split");const[o,T]=(0,_react.useState)(Math.max(ORIGIN_INDEX,t-1));const[n,b]=(0,_react.useState)(t);const w=(0,_react.useRef)(false);const d=(0,_react.useMemo)(()=>e.events.sort((r,u)=>r.timestamp.getTime()-u.timestamp.getTime()),[e.events]);const s=d.length;(0,_react.useEffect)(()=>{if(w.current)return;const r=async()=>{try{const u=await _asyncStorage.default.getItem(_sharedUi.devToolsStorageKeys.storage.diffViewerMode());if(u==="split"||u==="tree"){M(u)}w.current=true}catch{}};r()},[]);(0,_react.useEffect)(()=>{const r=Math.min(s-1,Math.max(0,t));const u=Math.max(ORIGIN_INDEX,Math.min(r-1,t-1));T(u);b(r)},[t,s]);const D=(0,_react.useCallback)(async r=>{M(r);try{await _asyncStorage.default.setItem(_sharedUi.devToolsStorageKeys.storage.diffViewerMode(),r)}catch{}},[]);const a=d[t];const $=a?.action;const v=o===ORIGIN_INDEX;const c=v?void 0:d[Math.max(0,Math.min(s-1,o))];const i=d[Math.max(0,Math.min(s-1,n))];const m=(0,_react.useMemo)(()=>{const r=i?.data;if(r?.initialScan)return"scanned";return r?.prevValue===null||r?.prevValue===void 0?"absent":"prior"},[i]);const C=(0,_react.useMemo)(()=>{if(m==="absent")return _lineDiff.ABSENT_VALUE;if(m==="scanned")return(0,_sharedUi.parseValue)(i?.data?.value);return(0,_sharedUi.parseValue)(i?.data?.prevValue)},[m,i]);const P=(0,_react.useMemo)(()=>v?{index:ORIGIN_INDEX,label:ORIGIN_LABELS[m].label,timestamp:ORIGIN_LABELS[m].timestamp,relativeTime:ORIGIN_LABELS[m].relativeTime,badge:(0,_jsxRuntime.jsx)(_reactNative.View,{style:[styles.actionBadgeSmall,{backgroundColor:`${_sharedUi.night.color.textTertiary}20`}],children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.actionTextSmall,{color:_sharedUi.night.color.textTertiary}],children:ORIGIN_LABELS[m].badge})})}:{index:o,label:`#${o+1} / ${s}`,timestamp:c?formatTimeWithMs(c.timestamp):"",relativeTime:c?(0,_sharedUi.formatRelativeTime)(c.timestamp):"",badge:c?(0,_jsxRuntime.jsx)(_reactNative.View,{style:[styles.actionBadgeSmall,{backgroundColor:`${getActionColor(c.action)}20`}],children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.actionTextSmall,{color:getActionColor(c.action)}],children:(0,_storageActionHelpers.translateStorageAction)(c.action)})}):void 0},[o,c,s,v,m]);const R=(0,_react.useMemo)(()=>({index:n,label:`#${n+1} / ${s}`,timestamp:i?formatTimeWithMs(i.timestamp):"",relativeTime:i?(0,_sharedUi.formatRelativeTime)(i.timestamp):"",badge:i?(0,_jsxRuntime.jsx)(_reactNative.View,{style:[styles.actionBadgeSmall,{backgroundColor:`${getActionColor(i.action)}20`}],children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.actionTextSmall,{color:getActionColor(i.action)}],children:(0,_storageActionHelpers.translateStorageAction)(i.action)})}):void 0}),[n,i,s]);const I=(0,_react.useMemo)(()=>[{key:"tree",label:"TREE VIEW"},{key:"split",label:"SPLIT VIEW"}],[]);const N=(0,_react.useCallback)(()=>{if(o>ORIGIN_INDEX){T(o-1)}},[o]);const k=(0,_react.useCallback)(()=>{if(o<n-1){T(o+1)}},[o,n]);const _=(0,_react.useCallback)(()=>{if(n>o+1){b(n-1)}},[n,o]);const L=(0,_react.useCallback)(()=>{if(n<s-1){b(n+1)}},[n,s]);const y=(0,_react.useMemo)(()=>v?C:(0,_sharedUi.parseValue)(c?.data?.value??null),[v,C,c]);const x=(0,_react.useMemo)(()=>(0,_sharedUi.parseValue)(i?.data?.value),[i]);const j=(0,_react.useCallback)(()=>{if(p==="split"){return(0,_jsxRuntime.jsx)(_ThemedSplitView.ThemedSplitView,{oldValue:y,newValue:x,differences:SPLIT_VIEW_DIFFERENCES,theme:_diffThemes.diffThemes.devToolsDefault,options:SPLIT_VIEW_OPTIONS,showThemeName:false,scrollEnabled:false})}return(0,_jsxRuntime.jsx)(_TreeDiffViewer.TreeDiffViewer,{oldValue:y,newValue:x,scrollEnabled:false})},[y,x,p]);const A=(0,_react.useCallback)(()=>{f(Math.max(0,t-1))},[t,f]);const O=(0,_react.useCallback)(()=>{f(Math.min(s-1,t+1))},[t,s,f]);const B=(0,_react.useCallback)(async()=>{if(!l){h(true);return}if(!a||a.storageType==="mmkv")return;try{await(0,_storageTimeTravelUtils.undoOperation)(a)}catch{}},[a,l]);const F=(0,_react.useCallback)(async()=>{if(!l){h(true);return}if(!a||a.storageType==="mmkv")return;const r=d.filter(V=>V.storageType!=="mmkv");const u=r.findIndex(V=>V.timestamp.getTime()===a.timestamp.getTime());if(u===-1)return;try{await(0,_storageTimeTravelUtils.jumpToState)(r,u)}catch{}},[a,d,l]);const q=(0,_react.useCallback)(async()=>{if(!a)return;const r={action:a.action,timestamp:a.timestamp.toISOString(),data:a.data};await(0,_sharedUi.copyToClipboard)(r)},[a]);const E=a?.storageType!=="mmkv";const U=E&&a&&(0,_storageTimeTravelUtils.canUndo)(a);return(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[E&&(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.actionButtonsContainer,children:[(0,_jsxRuntime.jsx)(_StorageEventActionButton.StorageEventActionButton,{type:"undo",text:"UNDO",onPress:B,disabled:!U,locked:!l}),(0,_jsxRuntime.jsx)(_StorageEventActionButton.StorageEventActionButton,{type:"jump",text:"JUMP",onPress:F,locked:!l}),(0,_jsxRuntime.jsx)(_StorageEventActionButton.StorageEventActionButton,{type:"copy",text:"COPY",onPress:q})]}),(0,_jsxRuntime.jsx)(_sharedUi.EventHistoryViewer,{activeView:"diff",diffViewLabel:"DIFF VIEW",diffViewDescription:"Compare changes between versions",diffViewIcon:_sharedUi.GitBranch,diffModeTabs:I,activeDiffMode:p,onDiffModeChange:D,renderDiffContent:j,scrollDiffSection:true,leftEvent:P,rightEvent:R,showCompareNavigation:true,onLeftPrevious:N,onLeftNext:k,onRightPrevious:_,onRightNext:L,canLeftPrevious:o>ORIGIN_INDEX,canLeftNext:o<n-1,canRightPrevious:n>o+1,canRightNext:n<s-1,disableInternalFooter:g,footerCurrentIndex:t,footerTotalItems:s,footerItemLabel:"Event",footerSubtitle:(0,_sharedUi.formatRelativeTime)(a?.timestamp),onFooterPrevious:A,onFooterNext:O}),(0,_jsxRuntime.jsx)(_sharedUi.ProUpgradeModal,{visible:S,onClose:()=>h(false),featureName:"Storage Time-Travel"})]})}function StorageEventDetailFooter({conversation:e,selectedEventIndex:t=0,onEventIndexChange:f=()=>{},applySafeAreaInset:g=true}){const l=e.events.sort((h,p)=>h.timestamp.getTime()-p.timestamp.getTime());const S=l.length;return(0,_jsxRuntime.jsx)(_sharedUi.EventStepperFooter,{currentIndex:t,totalItems:S,onPrevious:()=>f(Math.max(0,t-1)),onNext:()=>f(Math.min(S-1,t+1)),itemLabel:"Event",subtitle:(0,_sharedUi.formatRelativeTime)(l[t]?.timestamp),applySafeAreaInset:g})}const styles=_reactNative.StyleSheet.create({actionButtonsContainer:{flexDirection:"row",justifyContent:"center",alignItems:"center",gap:8,paddingHorizontal:12,paddingVertical:10,backgroundColor:_sharedUi.night.color.surface,borderBottomWidth:1,borderBottomColor:_sharedUi.night.color.border},valueBox:{backgroundColor:_sharedUi.night.color.bg,borderRadius:6,borderWidth:1,borderColor:_sharedUi.night.color.border,padding:8},valueText:{fontSize:12,color:_sharedUi.night.color.text,fontFamily:_sharedUi.monoFont,lineHeight:18},actionBadgeSmall:{paddingHorizontal:6,paddingVertical:1,borderRadius:3},actionTextSmall:{fontSize:8,fontWeight:"700",fontFamily:_sharedUi.monoFont}});
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.StorageEventDetailContent=StorageEventDetailContent;exports.StorageEventDetailFooter=StorageEventDetailFooter;var _reactNative=require("react-native");var _react=require("react");var _appAsyncStorage=_interopRequireDefault(require("../utils/appAsyncStorage"));var _sharedUi=require("@buoy-gg/shared-ui");var _license=require("@buoy-gg/license");var _lineDiff=require("../utils/lineDiff");var _ThemedSplitView=require("./DiffViewer/modes/ThemedSplitView");var _diffThemes=require("./DiffViewer/themes/diffThemes");var _TreeDiffViewer=require("./DiffViewer/TreeDiffViewer");var _storageActionHelpers=require("../utils/storageActionHelpers");var _StorageEventActionButton=require("./StorageEventActionButton");var _storageTimeTravelUtils=require("../utils/storageTimeTravelUtils");var _jsxRuntime=require("react/jsx-runtime");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const ORIGIN_INDEX=-1;const ORIGIN_LABELS={prior:{label:"BEFORE #1",timestamp:"value before first event",relativeTime:"not captured",badge:"PRIOR"},absent:{label:"NO PRIOR VALUE",timestamp:"key did not exist",relativeTime:"created here",badge:"ABSENT"},scanned:{label:"ALREADY PRESENT",timestamp:"value found at startup",relativeTime:"not a write",badge:"SCANNED"}};function getActionColor(e){switch(e){case"setItem":case"multiSet":return _sharedUi.macOSColors.semantic.success;case"removeItem":case"multiRemove":case"clear":return _sharedUi.macOSColors.semantic.error;case"mergeItem":case"multiMerge":return _sharedUi.macOSColors.semantic.info;default:return _sharedUi.macOSColors.text.muted}}function getValueType(e){if(e===null)return"null";if(e===void 0)return"undefined";if(Array.isArray(e))return"array";return typeof e}function formatTimeWithMs(e){const t=String(e.getHours()).padStart(2,"0");const f=String(e.getMinutes()).padStart(2,"0");const g=String(e.getSeconds()).padStart(2,"0");const l=String(e.getMilliseconds()).padStart(3,"0");return`${t}:${f}:${g}.${l}`}const SPLIT_VIEW_OPTIONS={hideLineNumbers:false,disableWordDiff:false,showDiffOnly:false,compareMethod:"words",contextLines:3,lineOffset:0};const SPLIT_VIEW_DIFFERENCES=[];function StorageEventDetailContent({conversation:e,selectedEventIndex:t=0,onEventIndexChange:f=()=>{},disableInternalFooter:g=false}){const l=(0,_license.useIsPro)();const[S,p]=(0,_react.useState)(false);const[h,M]=(0,_react.useState)("split");const[r,T]=(0,_react.useState)(Math.max(ORIGIN_INDEX,t-1));const[n,b]=(0,_react.useState)(t);const w=(0,_react.useRef)(false);const d=(0,_react.useMemo)(()=>e.events.sort((o,u)=>o.timestamp.getTime()-u.timestamp.getTime()),[e.events]);const s=d.length;(0,_react.useEffect)(()=>{if(w.current)return;const o=async()=>{try{const u=await _appAsyncStorage.default.getItem(_sharedUi.devToolsStorageKeys.storage.diffViewerMode());if(u==="split"||u==="tree"){M(u)}w.current=true}catch{}};o()},[]);(0,_react.useEffect)(()=>{const o=Math.min(s-1,Math.max(0,t));const u=Math.max(ORIGIN_INDEX,Math.min(o-1,t-1));T(u);b(o)},[t,s]);const D=(0,_react.useCallback)(async o=>{M(o);try{await _appAsyncStorage.default.setItem(_sharedUi.devToolsStorageKeys.storage.diffViewerMode(),o)}catch{}},[]);const a=d[t];const $=a?.action;const v=r===ORIGIN_INDEX;const c=v?void 0:d[Math.max(0,Math.min(s-1,r))];const i=d[Math.max(0,Math.min(s-1,n))];const m=(0,_react.useMemo)(()=>{const o=i?.data;if(o?.initialScan)return"scanned";return o?.prevValue===null||o?.prevValue===void 0?"absent":"prior"},[i]);const C=(0,_react.useMemo)(()=>{if(m==="absent")return _lineDiff.ABSENT_VALUE;if(m==="scanned")return(0,_sharedUi.parseValue)(i?.data?.value);return(0,_sharedUi.parseValue)(i?.data?.prevValue)},[m,i]);const P=(0,_react.useMemo)(()=>v?{index:ORIGIN_INDEX,label:ORIGIN_LABELS[m].label,timestamp:ORIGIN_LABELS[m].timestamp,relativeTime:ORIGIN_LABELS[m].relativeTime,badge:(0,_jsxRuntime.jsx)(_reactNative.View,{style:[styles.actionBadgeSmall,{backgroundColor:`${_sharedUi.night.color.textTertiary}20`}],children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.actionTextSmall,{color:_sharedUi.night.color.textTertiary}],children:ORIGIN_LABELS[m].badge})})}:{index:r,label:`#${r+1} / ${s}`,timestamp:c?formatTimeWithMs(c.timestamp):"",relativeTime:c?(0,_sharedUi.formatRelativeTime)(c.timestamp):"",badge:c?(0,_jsxRuntime.jsx)(_reactNative.View,{style:[styles.actionBadgeSmall,{backgroundColor:`${getActionColor(c.action)}20`}],children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.actionTextSmall,{color:getActionColor(c.action)}],children:(0,_storageActionHelpers.translateStorageAction)(c.action)})}):void 0},[r,c,s,v,m]);const R=(0,_react.useMemo)(()=>({index:n,label:`#${n+1} / ${s}`,timestamp:i?formatTimeWithMs(i.timestamp):"",relativeTime:i?(0,_sharedUi.formatRelativeTime)(i.timestamp):"",badge:i?(0,_jsxRuntime.jsx)(_reactNative.View,{style:[styles.actionBadgeSmall,{backgroundColor:`${getActionColor(i.action)}20`}],children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[styles.actionTextSmall,{color:getActionColor(i.action)}],children:(0,_storageActionHelpers.translateStorageAction)(i.action)})}):void 0}),[n,i,s]);const I=(0,_react.useMemo)(()=>[{key:"tree",label:"TREE VIEW"},{key:"split",label:"SPLIT VIEW"}],[]);const N=(0,_react.useCallback)(()=>{if(r>ORIGIN_INDEX){T(r-1)}},[r]);const k=(0,_react.useCallback)(()=>{if(r<n-1){T(r+1)}},[r,n]);const _=(0,_react.useCallback)(()=>{if(n>r+1){b(n-1)}},[n,r]);const A=(0,_react.useCallback)(()=>{if(n<s-1){b(n+1)}},[n,s]);const y=(0,_react.useMemo)(()=>v?C:(0,_sharedUi.parseValue)(c?.data?.value??null),[v,C,c]);const x=(0,_react.useMemo)(()=>(0,_sharedUi.parseValue)(i?.data?.value),[i]);const L=(0,_react.useCallback)(()=>{if(h==="split"){return(0,_jsxRuntime.jsx)(_ThemedSplitView.ThemedSplitView,{oldValue:y,newValue:x,differences:SPLIT_VIEW_DIFFERENCES,theme:_diffThemes.diffThemes.devToolsDefault,options:SPLIT_VIEW_OPTIONS,showThemeName:false,scrollEnabled:false})}return(0,_jsxRuntime.jsx)(_TreeDiffViewer.TreeDiffViewer,{oldValue:y,newValue:x,scrollEnabled:false})},[y,x,h]);const j=(0,_react.useCallback)(()=>{f(Math.max(0,t-1))},[t,f]);const O=(0,_react.useCallback)(()=>{f(Math.min(s-1,t+1))},[t,s,f]);const B=(0,_react.useCallback)(async()=>{if(!l){p(true);return}if(!a||a.storageType==="mmkv")return;try{await(0,_storageTimeTravelUtils.undoOperation)(a)}catch{}},[a,l]);const F=(0,_react.useCallback)(async()=>{if(!l){p(true);return}if(!a||a.storageType==="mmkv")return;const o=d.filter(V=>V.storageType!=="mmkv");const u=o.findIndex(V=>V.timestamp.getTime()===a.timestamp.getTime());if(u===-1)return;try{await(0,_storageTimeTravelUtils.jumpToState)(o,u)}catch{}},[a,d,l]);const q=(0,_react.useCallback)(async()=>{if(!a)return;const o={action:a.action,timestamp:a.timestamp.toISOString(),data:a.data};await(0,_sharedUi.copyToClipboard)(o)},[a]);const E=a?.storageType!=="mmkv";const U=E&&a&&(0,_storageTimeTravelUtils.canUndo)(a);return(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[E&&(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.actionButtonsContainer,children:[(0,_jsxRuntime.jsx)(_StorageEventActionButton.StorageEventActionButton,{type:"undo",text:"UNDO",onPress:B,disabled:!U,locked:!l}),(0,_jsxRuntime.jsx)(_StorageEventActionButton.StorageEventActionButton,{type:"jump",text:"JUMP",onPress:F,locked:!l}),(0,_jsxRuntime.jsx)(_StorageEventActionButton.StorageEventActionButton,{type:"copy",text:"COPY",onPress:q})]}),(0,_jsxRuntime.jsx)(_sharedUi.EventHistoryViewer,{activeView:"diff",diffViewLabel:"DIFF VIEW",diffViewDescription:"Compare changes between versions",diffViewIcon:_sharedUi.GitBranch,diffModeTabs:I,activeDiffMode:h,onDiffModeChange:D,renderDiffContent:L,scrollDiffSection:true,leftEvent:P,rightEvent:R,showCompareNavigation:true,onLeftPrevious:N,onLeftNext:k,onRightPrevious:_,onRightNext:A,canLeftPrevious:r>ORIGIN_INDEX,canLeftNext:r<n-1,canRightPrevious:n>r+1,canRightNext:n<s-1,disableInternalFooter:g,footerCurrentIndex:t,footerTotalItems:s,footerItemLabel:"Event",footerSubtitle:(0,_sharedUi.formatRelativeTime)(a?.timestamp),onFooterPrevious:j,onFooterNext:O}),(0,_jsxRuntime.jsx)(_sharedUi.ProUpgradeModal,{visible:S,onClose:()=>p(false),featureName:"Storage Time-Travel"})]})}function StorageEventDetailFooter({conversation:e,selectedEventIndex:t=0,onEventIndexChange:f=()=>{},applySafeAreaInset:g=true}){const l=e.events.sort((p,h)=>p.timestamp.getTime()-h.timestamp.getTime());const S=l.length;return(0,_jsxRuntime.jsx)(_sharedUi.EventStepperFooter,{currentIndex:t,totalItems:S,onPrevious:()=>f(Math.max(0,t-1)),onNext:()=>f(Math.min(S-1,t+1)),itemLabel:"Event",subtitle:(0,_sharedUi.formatRelativeTime)(l[t]?.timestamp),applySafeAreaInset:g})}const styles=_reactNative.StyleSheet.create({actionButtonsContainer:{flexDirection:"row",justifyContent:"center",alignItems:"center",gap:8,paddingHorizontal:12,paddingVertical:10,backgroundColor:_sharedUi.night.color.surface,borderBottomWidth:1,borderBottomColor:_sharedUi.night.color.border},valueBox:{backgroundColor:_sharedUi.night.color.bg,borderRadius:6,borderWidth:1,borderColor:_sharedUi.night.color.border,padding:8},valueText:{fontSize:12,color:_sharedUi.night.color.text,fontFamily:_sharedUi.monoFont,lineHeight:18},actionBadgeSmall:{paddingHorizontal:6,paddingVertical:1,borderRadius:3},actionTextSmall:{fontSize:8,fontWeight:"700",fontFamily:_sharedUi.monoFont}});
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.FREE_TIER_EVENT_LIMIT=void 0;exports.StorageModalWithTabs=StorageModalWithTabs;exports.StorageToolView=StorageToolView;var _react=require("react");var _reactNative=require("react-native");var _asyncStorage=_interopRequireDefault(require("@react-native-async-storage/async-storage"));var _sharedUi=require("@buoy-gg/shared-ui");var _StorageBrowserMode=require("./StorageBrowserMode");var _StorageTypeFilterBar=require("./StorageTypeFilterBar");var _clearAllStorage=require("../utils/clearAllStorage");var _useStorageEvents=require("../hooks/useStorageEvents");var _StorageEventDetailContent=require("./StorageEventDetailContent");var _StorageEventFilterView=require("./StorageEventFilterView");var _StorageEventCard=require("./StorageEventCard");var _license=require("@buoy-gg/license");var _jsxRuntime=require("react/jsx-runtime");function _interopRequireDefault(o){return o&&o.__esModule?o:{default:o}}const FREE_TIER_EVENT_LIMIT=exports.FREE_TIER_EVENT_LIMIT=_sharedUi.TIER_LIMITS["storage.events"].free;const ASYNC_STORAGE_BACKEND={getItem:o=>_asyncStorage.default.getItem(o),setItem:(o,p)=>_asyncStorage.default.setItem(o,p)};const TAB_PERSISTENCE={storage:ASYNC_STORAGE_BACKEND,parse:o=>o==="browser"||o==="events"?o:void 0,serialize:o=>o};const BOOLEAN_PERSISTENCE={storage:ASYNC_STORAGE_BACKEND,parse:o=>o==="true",serialize:o=>o.toString()};const STRING_SET_PERSISTENCE={storage:ASYNC_STORAGE_BACKEND,parse:o=>new Set(JSON.parse(o)),serialize:o=>JSON.stringify(Array.from(o))};const IGNORED_PATTERNS_PERSISTENCE={...STRING_SET_PERSISTENCE,parse:o=>{const p=JSON.parse(o);if(!p.includes("@react_buoy"))p.push("@react_buoy");return new Set(p)}};function StorageModalWithTabs({visible:o,onClose:p,onBack:F,onMinimize:oe,enableSharedModalDimensions:ne=false,requiredStorageKeys:ae=[],inline:se=false,onTabChange:O,onRefresh:z,onEventSelect:C}){const De=(0,_license.useIsPro)();const I=(0,_sharedUi.useLimit)("storage.events");const[m,le]=(0,_sharedUi.usePersistedState)(_sharedUi.devToolsStorageKeys.storage.activeTab(),"browser",TAB_PERSISTENCE);(0,_react.useEffect)(()=>{O?.(m)},[m,O]);const[L,q]=(0,_react.useState)("");const[B,k]=(0,_react.useState)(null);const[M,P]=(0,_react.useState)(false);const[W,ie]=(0,_sharedUi.usePersistedState)(_sharedUi.devToolsStorageKeys.storage.isMonitoring(),true,BOOLEAN_PERSISTENCE);const{events:T,clearEvents:$,isCapturing:ce}=(0,_useStorageEvents.useStorageEvents)({enabled:W});const[A,b]=(0,_react.useState)(null);const[S,D]=(0,_react.useState)(null);const[c,d]=(0,_react.useState)(null);const[j,h]=(0,_react.useState)(0);const[x,_]=(0,_react.useState)(false);const[u,G]=(0,_sharedUi.usePersistedState)(_sharedUi.devToolsStorageKeys.storage.eventFilters(),new Set(["@react_buoy","@RNAsyncStorage","redux-persist","persist:"]),IGNORED_PATTERNS_PERSISTENCE);const[f,J]=(0,_react.useState)("all");const[g,de]=(0,_react.useState)(new Set(["async","mmkv","secure"]));const[ue,ge]=(0,_sharedUi.usePersistedState)(_sharedUi.devToolsStorageKeys.storage.pinnedKeys(),new Set,STRING_SET_PERSISTENCE);const _e=(0,_react.useRef)(null);const Q=W&&ce;const[R,ye]=(0,_react.useState)("bottomSheet");const pe=(0,_react.useCallback)(e=>{ye(e)},[]);const Se=(0,_react.useCallback)(()=>{ie(e=>!e)},[]);const he=(0,_react.useCallback)(()=>{$();b(null);h(0)},[$]);const fe=(0,_react.useCallback)(e=>{D(e);d(null)},[]);const U=(0,_react.useCallback)(()=>{D(null);d(null)},[]);const Y=(0,_react.useCallback)(e=>{G(t=>{const r=new Set(t);if(r.has(e)){r.delete(e)}else{r.add(e)}return r})},[]);const X=(0,_react.useCallback)(e=>{G(t=>new Set([...t,e]))},[]);const ve=(0,_react.useCallback)(e=>{ge(t=>{const r=new Set(t);if(r.has(e)){r.delete(e)}else{r.add(e)}return r})},[]);const me=(0,_react.useCallback)(()=>{_(!x)},[x]);const Te=(0,_react.useCallback)(e=>{de(t=>{const r=new Set(t);if(r.has(e)){r.delete(e)}else{r.add(e)}return r})},[]);const H=(0,_react.useRef)([]);const be=(0,_react.useCallback)(()=>{const e=H.current;return{timestamp:new Date().toISOString(),totalKeys:e.length,asyncStorage:e.filter(t=>t.storageType==="async").reduce((t,r)=>{t[r.key]=(0,_sharedUi.truncatePayload)(r.value);return t},{}),mmkv:e.filter(t=>t.storageType==="mmkv").reduce((t,r)=>{const n=r.instanceId||"default";if(!t[n])t[n]={};t[n][r.key]=(0,_sharedUi.truncatePayload)(r.value);return t},{}),secure:e.filter(t=>t.storageType==="secure").reduce((t,r)=>{t[r.key]=(0,_sharedUi.truncatePayload)(r.value);return t},{})}},[]);const Re=(0,_react.useCallback)(async()=>{_reactNative.Alert.alert("Clear Storage","Choose what to clear:",[{text:"Cancel",style:"cancel"},{text:"Clear App Storage",onPress:async()=>{try{await(0,_clearAllStorage.clearAllAppStorage)()}catch(e){_reactNative.Alert.alert("Error","Failed to clear app storage")}}},{text:"Clear All (Including Dev Tools)",style:"destructive",onPress:async()=>{try{await(0,_clearAllStorage.clearAllStorageIncludingDevTools)()}catch(e){_reactNative.Alert.alert("Error","Failed to clear all storage")}}}])},[]);const w=e=>{const t=(0,_sharedUi.parseValue)(e);if(t===null)return"null";if(t===void 0)return"undefined";if(Array.isArray(t))return"array";if(typeof t==="boolean")return"boolean";if(typeof t==="number")return"number";if(typeof t==="string")return"string";if(typeof t==="object")return"object";return"undefined"};const[Z,xe]=(0,_react.useState)([]);(0,_react.useEffect)(()=>{const e=async()=>{try{const t=await _asyncStorage.default.getAllKeys();xe([...t].sort())}catch(t){}};if(o){e()}},[o]);const Ee=(0,_react.useMemo)(()=>{const e=new Set(Z);T.forEach(t=>{if(t.data?.key){e.add(t.data.key)}});return Array.from(e).sort()},[T,Z]);const l=(0,_react.useMemo)(()=>{const e=new Map;T.forEach(t=>{if(!t.data?.key)return;const r=t.data.key;if(!g.has(t.storageType))return;const n=Array.from(u).some(v=>r.includes(v));if(n)return;const a=e.get(r);if(!a){e.set(r,{key:r,lastEvent:t,events:[t],totalOperations:1,currentValue:t.data.value,valueType:w(t.data.value),storageTypes:new Set([t.storageType])})}else{a.events.push(t);a.totalOperations++;a.storageTypes.add(t.storageType);if(t.timestamp>a.lastEvent.timestamp){a.lastEvent=t;a.currentValue=t.data.value;a.valueType=w(t.data.value)}}});return Array.from(e.values()).sort((t,r)=>r.lastEvent.timestamp.getTime()-t.lastEvent.timestamp.getTime())},[T,u,g]);const s=(0,_react.useMemo)(()=>{if(!A)return null;return l.find(e=>e.key===A)||null},[A,l]);const Ce=(0,_react.useMemo)(()=>{const e={};l.forEach(t=>{e[t.key]=t.totalOperations});return e},[l]);const Ie=(0,_react.useMemo)(()=>{const e={};l.forEach(t=>{e[t.key]=t.lastEvent.timestamp.getTime()});return e},[l]);const y=(0,_react.useMemo)(()=>{if(!S)return null;return l.find(e=>e.key===S)||null},[S,l]);(0,_react.useEffect)(()=>{if(!C)return;const e=s?s:c!==null?y:null;const t=s?j:c;if(!e||t==null)return;const r=[...e.events].sort((v,V)=>v.timestamp.getTime()-V.timestamp.getTime());const n=r[t];const a=r[t-1];if(n)C(n);if(a)C(a)},[C,s,j,y,c]);const E=(0,_react.useMemo)(()=>{return T.filter(e=>{if(!e.data?.key)return false;if(!g.has(e.storageType))return false;const t=e.data.key;return!Array.from(u).some(r=>t.includes(r))})},[T,u,g]);const ke=(0,_react.useMemo)(()=>(0,_StorageTypeFilterBar.countByStorageType)(E),[E]);const i=(0,_react.useMemo)(()=>{if(f==="all")return E;return E.filter(e=>e.storageType===f)},[E,f]);const je=(0,_react.useCallback)(()=>{return i.map(e=>({key:e.data?.key,action:e.action,value:(0,_sharedUi.truncatePayload)(e.data?.value),storageType:e.storageType,timestamp:e.timestamp.toISOString()}))},[i]);const we=(0,_react.useMemo)(()=>i.slice(0,I),[i,I]);const K=(0,_react.useMemo)(()=>Math.max(0,i.length-I),[i.length,I]);const Fe=.8;const Be=(0,_react.useCallback)(e=>e.id,[]);const ee=(0,_react.useCallback)(e=>{const t=l.find(a=>a.key===e.data?.key);if(!t)return;const r=[...t.events].sort((a,v)=>a.timestamp.getTime()-v.timestamp.getTime());const n=r.findIndex(a=>a.timestamp.getTime()===e.timestamp.getTime());b(t.key);h(n>=0?n:0)},[l]);const Me=(0,_react.useCallback)(({item:e})=>{const t={key:e.data?.key||"",lastAction:e.action,totalOperations:1,lastEventTimestamp:e.timestamp,storageTypes:new Set([e.storageType]),valueType:w(e.data?.value)};return(0,_jsxRuntime.jsx)(_StorageEventCard.StorageEventCard,{data:t,onPress:()=>ee(e),testID:`buoy-storage-event-${e.id}`})},[ee]);if(!o)return null;const Pe=ne?_sharedUi.devToolsStorageKeys.modal.root():_sharedUi.devToolsStorageKeys.storage.modal();const te=()=>{if(x){return(0,_jsxRuntime.jsx)(_StorageEventFilterView.StorageEventFilterView,{ignoredPatterns:u,onTogglePattern:Y,onAddPattern:X,availableKeys:Ee,enabledStorageTypes:g,onToggleStorageType:Te})}if(m==="browser"){if(S&&y){if(c!==null){return(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.contentWrapper,children:(0,_jsxRuntime.jsx)(_StorageEventDetailContent.StorageEventDetailContent,{conversation:y,selectedEventIndex:c,onEventIndexChange:d,disableInternalFooter:true})})}const t=[...y.events].sort((n,a)=>n.timestamp.getTime()-a.timestamp.getTime());const r=[...t].reverse();return(0,_jsxRuntime.jsx)(_reactNative.FlatList,{testID:"buoy-storage-history-list",style:styles.flexFill,data:r,keyExtractor:n=>n.id,renderItem:({item:n})=>{const a=t.findIndex(V=>V.timestamp.getTime()===n.timestamp.getTime());const v={key:n.data?.key||"",lastAction:n.action,totalOperations:1,lastEventTimestamp:n.timestamp,storageTypes:new Set([n.storageType]),valueType:w(n.data?.value)};return(0,_jsxRuntime.jsx)(_StorageEventCard.StorageEventCard,{data:v,onPress:()=>d(a>=0?a:0),testID:`buoy-storage-history-event-${n.id}`})},contentContainerStyle:styles.listContent,ItemSeparatorComponent:()=>(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.separator}),initialNumToRender:20})}return(0,_jsxRuntime.jsx)(_StorageBrowserMode.StorageBrowserMode,{requiredStorageKeys:ae,ignoredPatterns:u,onTogglePattern:Y,onAddPattern:X,searchQuery:L,storageDataRef:H,eventCountByKey:Ce,lastWriteByKey:Ie,onViewHistory:fe,enabledStorageTypes:g,pinnedKeys:ue,onTogglePin:ve,applySafeAreaInset:R==="bottomSheet",storageTypeFilter:f,onStorageTypeFilterChange:J,detailKey:B,onOpenKey:k,onCloseDetail:()=>k(null)})}if(s){return(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.contentWrapper,children:(0,_jsxRuntime.jsx)(_StorageEventDetailContent.StorageEventDetailContent,{conversation:s,selectedEventIndex:j,onEventIndexChange:h,disableInternalFooter:true})})}const e=(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.eventFilterBar,children:(0,_jsxRuntime.jsx)(_StorageTypeFilterBar.StorageTypeFilterBar,{active:f,onChange:J,counts:ke})});if(i.length===0){const t=f!=="all";return(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.flexFill,children:[e,(0,_jsxRuntime.jsx)(_sharedUi.ToolEmptyState,{testID:"buoy-storage-events-empty",...!Q?{otto:"paused",title:"Event listener is paused",message:"Press play to start monitoring"}:t?{otto:"filtering",title:`No ${f} events`,message:"Other backends have events \u2014 pick All Types to see them"}:{otto:"listening",title:"No storage events yet",message:"Storage operations will appear here"}})]})}return(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.flexFill,children:[e,(0,_jsxRuntime.jsx)(_reactNative.FlatList,{testID:"buoy-storage-events-list",style:styles.flexFill,data:we,renderItem:Me,keyExtractor:Be,onEndReachedThreshold:Fe,contentContainerStyle:styles.listContent,ListFooterComponent:K>0?(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.lockedBannerContainer,children:(0,_jsxRuntime.jsx)(_sharedUi.ProFeatureBanner,{featureName:`${K} event${K>1?"s":""} locked`,description:"Upgrade to Pro to unlock full event history"})}):null,initialNumToRender:10,maxToRenderPerBatch:10,windowSize:10})]})};const N=s&&s.events.length>1?(0,_jsxRuntime.jsx)(_StorageEventDetailContent.StorageEventDetailFooter,{conversation:s,selectedEventIndex:j,onEventIndexChange:h,applySafeAreaInset:R==="bottomSheet"}):y&&c!==null&&y.events.length>1?(0,_jsxRuntime.jsx)(_StorageEventDetailContent.StorageEventDetailFooter,{conversation:y,selectedEventIndex:c,onEventIndexChange:d,applySafeAreaInset:R==="bottomSheet"}):null;const Ae=x?()=>_(false):c!==null?()=>d(null):S?U:s?()=>{b(null);h(0)}:F;const re=x?(0,_jsxRuntime.jsxs)(_sharedUi.ModalHeader,{children:[(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation,{onBack:()=>_(false)}),(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Content,{title:"Filters"})]}):S?(0,_jsxRuntime.jsxs)(_sharedUi.ModalHeader,{children:[(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation,{onBack:c!==null?()=>d(null):U}),(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Content,{title:`${S} History`,centered:true})]}):s?(0,_jsxRuntime.jsxs)(_sharedUi.ModalHeader,{children:[(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation,{onBack:()=>{b(null);h(0)}}),(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Content,{title:s.key})]}):B?(0,_jsxRuntime.jsxs)(_sharedUi.ModalHeader,{children:[(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation,{onBack:()=>k(null)}),(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Content,{title:B.key,centered:true,testID:"buoy-storage-detail-title"})]}):(0,_jsxRuntime.jsxs)(_sharedUi.ModalHeader,{children:[F&&(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation,{onBack:F}),(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Content,{title:"",children:M?(0,_jsxRuntime.jsx)(_sharedUi.SearchBar,{value:L,onChange:q,onClear:()=>{q("");P(false)},placeholder:"Search storage keys...",testID:"buoy-storage-search",autoFocus:true,onSubmitEditing:()=>P(false),returnKeyType:"search",containerStyle:styles.headerSearchContainer}):(0,_jsxRuntime.jsx)(_sharedUi.TabSelector,{tabs:[{key:"browser",label:"Storage"},{key:"events",label:`Events${i.length>0?` (${i.length})`:""}`}],activeTab:m,testIDPrefix:"buoy-storage-tab",onTabChange:e=>{le(e);D(null);d(null);b(null);h(0);k(null)}})}),(0,_jsxRuntime.jsxs)(_sharedUi.ModalHeader.Actions,{children:[z&&!M?(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:z,style:styles.iconButton,testID:"buoy-storage-refresh",accessibilityLabel:"Refresh storage",accessibilityRole:"button",children:(0,_jsxRuntime.jsx)(_sharedUi.RefreshCw,{size:14,color:_sharedUi.night.color.textSecondary})}):null,(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:me,testID:"buoy-storage-filters",accessibilityLabel:"Storage filters",accessibilityRole:"button",style:[styles.iconButton,(u.size>0||g.size<3)&&styles.activeFilterButton],children:(0,_jsxRuntime.jsx)(_sharedUi.Filter,{size:14,color:u.size>0||g.size<3?_sharedUi.night.color.accent:_sharedUi.night.color.textSecondary})}),m==="browser"&&!M&&(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:()=>P(true),testID:"buoy-storage-search-open",accessibilityLabel:"Open search",accessibilityRole:"button",style:styles.iconButton,children:(0,_jsxRuntime.jsx)(_sharedUi.Search,{size:14,color:_sharedUi.night.color.textSecondary})}),(0,_jsxRuntime.jsx)(_sharedUi.ToolbarCopyButton,{value:be,disabled:H.current.length===0,buttonStyle:styles.iconButton,testID:"buoy-storage-copy"})]}),m==="events"&&(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsx)(_sharedUi.ToolbarCopyButton,{value:je,disabled:i.length===0,buttonStyle:styles.iconButton,testID:"buoy-storage-events-copy"}),(0,_jsxRuntime.jsx)(_sharedUi.PowerToggleButton,{isEnabled:Q,onToggle:Se,accessibilityLabel:"Toggle storage event monitoring",testID:"buoy-storage-power"}),(0,_jsxRuntime.jsx)(_sharedUi.ToolbarClearButton,{onPress:he,buttonStyle:styles.iconButton,testID:"buoy-storage-clear-events"})]})]})]});if(se){return(0,_jsxRuntime.jsx)(_sharedUi.TickProvider,{children:(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.inlineRoot,children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.inlineHeader,..._sharedUi.windowDragProps,children:re}),te(),N]})})}return(0,_jsxRuntime.jsx)(_sharedUi.TickProvider,{children:(0,_jsxRuntime.jsx)(_sharedUi.JsModal,{visible:o,onClose:p,onBack:Ae,onMinimize:oe,persistenceKey:Pe,header:{showToggleButton:true,customContent:re},onModeChange:pe,enablePersistence:true,initialMode:"bottomSheet",enableGlitchEffects:true,styles:{},footer:N,footerHeight:N?68:0,disableScrollWrapper:true,children:te()})})}function StorageToolView(o={}){return(0,_jsxRuntime.jsx)(StorageModalWithTabs,{...o,inline:true,visible:true,onClose:()=>{}})}const styles=_reactNative.StyleSheet.create({inlineRoot:{flex:1,minHeight:0,backgroundColor:"transparent"},inlineHeader:{paddingHorizontal:12,paddingVertical:8,borderBottomWidth:1,borderBottomColor:_sharedUi.macOSColors.border.default,backgroundColor:"transparent"},headerSearchContainer:{flex:1},flexFill:{flex:1},iconButton:{width:32,height:32,borderRadius:8,backgroundColor:_sharedUi.night.color.buttonSurface,borderWidth:1,borderColor:_sharedUi.night.color.border,alignItems:"center",justifyContent:"center"},activeFilterButton:{backgroundColor:_sharedUi.night.color.accentSoft,borderColor:_sharedUi.night.color.accentBorderStrong},separator:{height:8},listContent:{paddingVertical:6},lockedBannerContainer:{marginTop:8,marginHorizontal:16},eventFilterBar:{paddingHorizontal:12,paddingTop:8,paddingBottom:4},emptyState:{flex:1,justifyContent:"center",alignItems:"center",padding:32},emptyTitle:{color:_sharedUi.night.color.text,fontSize:16,fontWeight:"600",marginTop:16,marginBottom:8,fontFamily:_sharedUi.monoFont,letterSpacing:.5,textTransform:"uppercase"},emptySubtitle:{color:_sharedUi.night.color.textSecondary,fontSize:14,textAlign:"center",fontFamily:_sharedUi.monoFont},eventNavigation:{flexDirection:"row",alignItems:"center",gap:8,paddingHorizontal:8},navButton:{padding:4,borderRadius:4},navButtonDisabled:{opacity:.3},eventCounter:{color:_sharedUi.night.color.text,fontSize:12,fontWeight:"600",fontFamily:_sharedUi.monoFont,paddingHorizontal:8},headerTopRow:{flexDirection:"row",alignItems:"center",gap:8,marginBottom:12},keyNameContainer:{flex:1,flexDirection:"row",alignItems:"center",gap:6,backgroundColor:_sharedUi.night.color.surfaceElevated,paddingHorizontal:10,paddingVertical:4,borderRadius:6,borderWidth:1,borderColor:_sharedUi.night.color.border,height:28},keyNameText:{flex:1,fontSize:13,fontWeight:"600",color:_sharedUi.night.color.accent,fontFamily:_sharedUi.monoFont,letterSpacing:.5},contentWrapper:{flex:1}});
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.FREE_TIER_EVENT_LIMIT=void 0;exports.StorageModalWithTabs=StorageModalWithTabs;exports.StorageToolView=StorageToolView;var _react=require("react");var _reactNative=require("react-native");var _appAsyncStorage=_interopRequireDefault(require("../utils/appAsyncStorage"));var _sharedUi=require("@buoy-gg/shared-ui");var _StorageBrowserMode=require("./StorageBrowserMode");var _StorageTypeFilterBar=require("./StorageTypeFilterBar");var _clearAllStorage=require("../utils/clearAllStorage");var _useStorageEvents=require("../hooks/useStorageEvents");var _StorageEventDetailContent=require("./StorageEventDetailContent");var _StorageEventFilterView=require("./StorageEventFilterView");var _StorageEventCard=require("./StorageEventCard");var _license=require("@buoy-gg/license");var _jsxRuntime=require("react/jsx-runtime");function _interopRequireDefault(o){return o&&o.__esModule?o:{default:o}}const FREE_TIER_EVENT_LIMIT=exports.FREE_TIER_EVENT_LIMIT=_sharedUi.TIER_LIMITS["storage.events"].free;const ASYNC_STORAGE_BACKEND={getItem:o=>_appAsyncStorage.default.getItem(o),setItem:(o,p)=>_appAsyncStorage.default.setItem(o,p)};const TAB_PERSISTENCE={storage:ASYNC_STORAGE_BACKEND,parse:o=>o==="browser"||o==="events"?o:void 0,serialize:o=>o};const BOOLEAN_PERSISTENCE={storage:ASYNC_STORAGE_BACKEND,parse:o=>o==="true",serialize:o=>o.toString()};const STRING_SET_PERSISTENCE={storage:ASYNC_STORAGE_BACKEND,parse:o=>new Set(JSON.parse(o)),serialize:o=>JSON.stringify(Array.from(o))};const IGNORED_PATTERNS_PERSISTENCE={...STRING_SET_PERSISTENCE,parse:o=>{const p=JSON.parse(o);if(!p.includes("@react_buoy"))p.push("@react_buoy");return new Set(p)}};function StorageModalWithTabs({visible:o,onClose:p,onBack:F,onMinimize:oe,enableSharedModalDimensions:ne=false,requiredStorageKeys:ae=[],inline:se=false,onTabChange:O,onRefresh:z,onEventSelect:C}){const De=(0,_license.useIsPro)();const I=(0,_sharedUi.useLimit)("storage.events");const[m,le]=(0,_sharedUi.usePersistedState)(_sharedUi.devToolsStorageKeys.storage.activeTab(),"browser",TAB_PERSISTENCE);(0,_react.useEffect)(()=>{O?.(m)},[m,O]);const[L,q]=(0,_react.useState)("");const[B,k]=(0,_react.useState)(null);const[M,P]=(0,_react.useState)(false);const[W,ie]=(0,_sharedUi.usePersistedState)(_sharedUi.devToolsStorageKeys.storage.isMonitoring(),true,BOOLEAN_PERSISTENCE);const{events:T,clearEvents:$,isCapturing:ce}=(0,_useStorageEvents.useStorageEvents)({enabled:W});const[A,b]=(0,_react.useState)(null);const[S,D]=(0,_react.useState)(null);const[c,d]=(0,_react.useState)(null);const[j,h]=(0,_react.useState)(0);const[x,_]=(0,_react.useState)(false);const[u,G]=(0,_sharedUi.usePersistedState)(_sharedUi.devToolsStorageKeys.storage.eventFilters(),new Set(["@react_buoy","@RNAsyncStorage","redux-persist","persist:"]),IGNORED_PATTERNS_PERSISTENCE);const[f,J]=(0,_react.useState)("all");const[g,de]=(0,_react.useState)(new Set(["async","mmkv","secure"]));const[ue,ge]=(0,_sharedUi.usePersistedState)(_sharedUi.devToolsStorageKeys.storage.pinnedKeys(),new Set,STRING_SET_PERSISTENCE);const _e=(0,_react.useRef)(null);const Q=W&&ce;const[R,ye]=(0,_react.useState)("bottomSheet");const pe=(0,_react.useCallback)(e=>{ye(e)},[]);const Se=(0,_react.useCallback)(()=>{ie(e=>!e)},[]);const he=(0,_react.useCallback)(()=>{$();b(null);h(0)},[$]);const fe=(0,_react.useCallback)(e=>{D(e);d(null)},[]);const U=(0,_react.useCallback)(()=>{D(null);d(null)},[]);const Y=(0,_react.useCallback)(e=>{G(t=>{const r=new Set(t);if(r.has(e)){r.delete(e)}else{r.add(e)}return r})},[]);const X=(0,_react.useCallback)(e=>{G(t=>new Set([...t,e]))},[]);const ve=(0,_react.useCallback)(e=>{ge(t=>{const r=new Set(t);if(r.has(e)){r.delete(e)}else{r.add(e)}return r})},[]);const me=(0,_react.useCallback)(()=>{_(!x)},[x]);const Te=(0,_react.useCallback)(e=>{de(t=>{const r=new Set(t);if(r.has(e)){r.delete(e)}else{r.add(e)}return r})},[]);const H=(0,_react.useRef)([]);const be=(0,_react.useCallback)(()=>{const e=H.current;return{timestamp:new Date().toISOString(),totalKeys:e.length,asyncStorage:e.filter(t=>t.storageType==="async").reduce((t,r)=>{t[r.key]=(0,_sharedUi.truncatePayload)(r.value);return t},{}),mmkv:e.filter(t=>t.storageType==="mmkv").reduce((t,r)=>{const n=r.instanceId||"default";if(!t[n])t[n]={};t[n][r.key]=(0,_sharedUi.truncatePayload)(r.value);return t},{}),secure:e.filter(t=>t.storageType==="secure").reduce((t,r)=>{t[r.key]=(0,_sharedUi.truncatePayload)(r.value);return t},{})}},[]);const Re=(0,_react.useCallback)(async()=>{_reactNative.Alert.alert("Clear Storage","Choose what to clear:",[{text:"Cancel",style:"cancel"},{text:"Clear App Storage",onPress:async()=>{try{await(0,_clearAllStorage.clearAllAppStorage)()}catch(e){_reactNative.Alert.alert("Error","Failed to clear app storage")}}},{text:"Clear All (Including Dev Tools)",style:"destructive",onPress:async()=>{try{await(0,_clearAllStorage.clearAllStorageIncludingDevTools)()}catch(e){_reactNative.Alert.alert("Error","Failed to clear all storage")}}}])},[]);const w=e=>{const t=(0,_sharedUi.parseValue)(e);if(t===null)return"null";if(t===void 0)return"undefined";if(Array.isArray(t))return"array";if(typeof t==="boolean")return"boolean";if(typeof t==="number")return"number";if(typeof t==="string")return"string";if(typeof t==="object")return"object";return"undefined"};const[Z,xe]=(0,_react.useState)([]);(0,_react.useEffect)(()=>{const e=async()=>{try{const t=await _appAsyncStorage.default.getAllKeys();xe([...t].sort())}catch(t){}};if(o){e()}},[o]);const Ee=(0,_react.useMemo)(()=>{const e=new Set(Z);T.forEach(t=>{if(t.data?.key){e.add(t.data.key)}});return Array.from(e).sort()},[T,Z]);const l=(0,_react.useMemo)(()=>{const e=new Map;T.forEach(t=>{if(!t.data?.key)return;const r=t.data.key;if(!g.has(t.storageType))return;const n=Array.from(u).some(v=>r.includes(v));if(n)return;const a=e.get(r);if(!a){e.set(r,{key:r,lastEvent:t,events:[t],totalOperations:1,currentValue:t.data.value,valueType:w(t.data.value),storageTypes:new Set([t.storageType])})}else{a.events.push(t);a.totalOperations++;a.storageTypes.add(t.storageType);if(t.timestamp>a.lastEvent.timestamp){a.lastEvent=t;a.currentValue=t.data.value;a.valueType=w(t.data.value)}}});return Array.from(e.values()).sort((t,r)=>r.lastEvent.timestamp.getTime()-t.lastEvent.timestamp.getTime())},[T,u,g]);const s=(0,_react.useMemo)(()=>{if(!A)return null;return l.find(e=>e.key===A)||null},[A,l]);const Ce=(0,_react.useMemo)(()=>{const e={};l.forEach(t=>{e[t.key]=t.totalOperations});return e},[l]);const Ie=(0,_react.useMemo)(()=>{const e={};l.forEach(t=>{e[t.key]=t.lastEvent.timestamp.getTime()});return e},[l]);const y=(0,_react.useMemo)(()=>{if(!S)return null;return l.find(e=>e.key===S)||null},[S,l]);(0,_react.useEffect)(()=>{if(!C)return;const e=s?s:c!==null?y:null;const t=s?j:c;if(!e||t==null)return;const r=[...e.events].sort((v,V)=>v.timestamp.getTime()-V.timestamp.getTime());const n=r[t];const a=r[t-1];if(n)C(n);if(a)C(a)},[C,s,j,y,c]);const E=(0,_react.useMemo)(()=>{return T.filter(e=>{if(!e.data?.key)return false;if(!g.has(e.storageType))return false;const t=e.data.key;return!Array.from(u).some(r=>t.includes(r))})},[T,u,g]);const ke=(0,_react.useMemo)(()=>(0,_StorageTypeFilterBar.countByStorageType)(E),[E]);const i=(0,_react.useMemo)(()=>{if(f==="all")return E;return E.filter(e=>e.storageType===f)},[E,f]);const je=(0,_react.useCallback)(()=>{return i.map(e=>({key:e.data?.key,action:e.action,value:(0,_sharedUi.truncatePayload)(e.data?.value),storageType:e.storageType,timestamp:e.timestamp.toISOString()}))},[i]);const we=(0,_react.useMemo)(()=>i.slice(0,I),[i,I]);const K=(0,_react.useMemo)(()=>Math.max(0,i.length-I),[i.length,I]);const Fe=.8;const Be=(0,_react.useCallback)(e=>e.id,[]);const ee=(0,_react.useCallback)(e=>{const t=l.find(a=>a.key===e.data?.key);if(!t)return;const r=[...t.events].sort((a,v)=>a.timestamp.getTime()-v.timestamp.getTime());const n=r.findIndex(a=>a.timestamp.getTime()===e.timestamp.getTime());b(t.key);h(n>=0?n:0)},[l]);const Me=(0,_react.useCallback)(({item:e})=>{const t={key:e.data?.key||"",lastAction:e.action,totalOperations:1,lastEventTimestamp:e.timestamp,storageTypes:new Set([e.storageType]),valueType:w(e.data?.value)};return(0,_jsxRuntime.jsx)(_StorageEventCard.StorageEventCard,{data:t,onPress:()=>ee(e),testID:`buoy-storage-event-${e.id}`})},[ee]);if(!o)return null;const Pe=ne?_sharedUi.devToolsStorageKeys.modal.root():_sharedUi.devToolsStorageKeys.storage.modal();const te=()=>{if(x){return(0,_jsxRuntime.jsx)(_StorageEventFilterView.StorageEventFilterView,{ignoredPatterns:u,onTogglePattern:Y,onAddPattern:X,availableKeys:Ee,enabledStorageTypes:g,onToggleStorageType:Te})}if(m==="browser"){if(S&&y){if(c!==null){return(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.contentWrapper,children:(0,_jsxRuntime.jsx)(_StorageEventDetailContent.StorageEventDetailContent,{conversation:y,selectedEventIndex:c,onEventIndexChange:d,disableInternalFooter:true})})}const t=[...y.events].sort((n,a)=>n.timestamp.getTime()-a.timestamp.getTime());const r=[...t].reverse();return(0,_jsxRuntime.jsx)(_reactNative.FlatList,{testID:"buoy-storage-history-list",style:styles.flexFill,data:r,keyExtractor:n=>n.id,renderItem:({item:n})=>{const a=t.findIndex(V=>V.timestamp.getTime()===n.timestamp.getTime());const v={key:n.data?.key||"",lastAction:n.action,totalOperations:1,lastEventTimestamp:n.timestamp,storageTypes:new Set([n.storageType]),valueType:w(n.data?.value)};return(0,_jsxRuntime.jsx)(_StorageEventCard.StorageEventCard,{data:v,onPress:()=>d(a>=0?a:0),testID:`buoy-storage-history-event-${n.id}`})},contentContainerStyle:styles.listContent,ItemSeparatorComponent:()=>(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.separator}),initialNumToRender:20})}return(0,_jsxRuntime.jsx)(_StorageBrowserMode.StorageBrowserMode,{requiredStorageKeys:ae,ignoredPatterns:u,onTogglePattern:Y,onAddPattern:X,searchQuery:L,storageDataRef:H,eventCountByKey:Ce,lastWriteByKey:Ie,onViewHistory:fe,enabledStorageTypes:g,pinnedKeys:ue,onTogglePin:ve,applySafeAreaInset:R==="bottomSheet",storageTypeFilter:f,onStorageTypeFilterChange:J,detailKey:B,onOpenKey:k,onCloseDetail:()=>k(null)})}if(s){return(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.contentWrapper,children:(0,_jsxRuntime.jsx)(_StorageEventDetailContent.StorageEventDetailContent,{conversation:s,selectedEventIndex:j,onEventIndexChange:h,disableInternalFooter:true})})}const e=(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.eventFilterBar,children:(0,_jsxRuntime.jsx)(_StorageTypeFilterBar.StorageTypeFilterBar,{active:f,onChange:J,counts:ke})});if(i.length===0){const t=f!=="all";return(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.flexFill,children:[e,(0,_jsxRuntime.jsx)(_sharedUi.ToolEmptyState,{testID:"buoy-storage-events-empty",...!Q?{otto:"paused",title:"Event listener is paused",message:"Press play to start monitoring"}:t?{otto:"filtering",title:`No ${f} events`,message:"Other backends have events \u2014 pick All Types to see them"}:{otto:"listening",title:"No storage events yet",message:"Storage operations will appear here"}})]})}return(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.flexFill,children:[e,(0,_jsxRuntime.jsx)(_reactNative.FlatList,{testID:"buoy-storage-events-list",style:styles.flexFill,data:we,renderItem:Me,keyExtractor:Be,onEndReachedThreshold:Fe,contentContainerStyle:styles.listContent,ListFooterComponent:K>0?(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.lockedBannerContainer,children:(0,_jsxRuntime.jsx)(_sharedUi.ProFeatureBanner,{featureName:`${K} event${K>1?"s":""} locked`,description:"Upgrade to Pro to unlock full event history"})}):null,initialNumToRender:10,maxToRenderPerBatch:10,windowSize:10})]})};const N=s&&s.events.length>1?(0,_jsxRuntime.jsx)(_StorageEventDetailContent.StorageEventDetailFooter,{conversation:s,selectedEventIndex:j,onEventIndexChange:h,applySafeAreaInset:R==="bottomSheet"}):y&&c!==null&&y.events.length>1?(0,_jsxRuntime.jsx)(_StorageEventDetailContent.StorageEventDetailFooter,{conversation:y,selectedEventIndex:c,onEventIndexChange:d,applySafeAreaInset:R==="bottomSheet"}):null;const Ae=x?()=>_(false):c!==null?()=>d(null):S?U:s?()=>{b(null);h(0)}:F;const re=x?(0,_jsxRuntime.jsxs)(_sharedUi.ModalHeader,{children:[(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation,{onBack:()=>_(false)}),(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Content,{title:"Filters"})]}):S?(0,_jsxRuntime.jsxs)(_sharedUi.ModalHeader,{children:[(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation,{onBack:c!==null?()=>d(null):U}),(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Content,{title:`${S} History`,centered:true})]}):s?(0,_jsxRuntime.jsxs)(_sharedUi.ModalHeader,{children:[(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation,{onBack:()=>{b(null);h(0)}}),(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Content,{title:s.key})]}):B?(0,_jsxRuntime.jsxs)(_sharedUi.ModalHeader,{children:[(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation,{onBack:()=>k(null)}),(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Content,{title:B.key,centered:true,testID:"buoy-storage-detail-title"})]}):(0,_jsxRuntime.jsxs)(_sharedUi.ModalHeader,{children:[F&&(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Navigation,{onBack:F}),(0,_jsxRuntime.jsx)(_sharedUi.ModalHeader.Content,{title:"",children:M?(0,_jsxRuntime.jsx)(_sharedUi.SearchBar,{value:L,onChange:q,onClear:()=>{q("");P(false)},placeholder:"Search storage keys...",testID:"buoy-storage-search",autoFocus:true,onSubmitEditing:()=>P(false),returnKeyType:"search",containerStyle:styles.headerSearchContainer}):(0,_jsxRuntime.jsx)(_sharedUi.TabSelector,{tabs:[{key:"browser",label:"Storage"},{key:"events",label:`Events${i.length>0?` (${i.length})`:""}`}],activeTab:m,testIDPrefix:"buoy-storage-tab",onTabChange:e=>{le(e);D(null);d(null);b(null);h(0);k(null)}})}),(0,_jsxRuntime.jsxs)(_sharedUi.ModalHeader.Actions,{children:[z&&!M?(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:z,style:styles.iconButton,testID:"buoy-storage-refresh",accessibilityLabel:"Refresh storage",accessibilityRole:"button",children:(0,_jsxRuntime.jsx)(_sharedUi.RefreshCw,{size:14,color:_sharedUi.night.color.textSecondary})}):null,(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:me,testID:"buoy-storage-filters",accessibilityLabel:"Storage filters",accessibilityRole:"button",style:[styles.iconButton,(u.size>0||g.size<3)&&styles.activeFilterButton],children:(0,_jsxRuntime.jsx)(_sharedUi.Filter,{size:14,color:u.size>0||g.size<3?_sharedUi.night.color.accent:_sharedUi.night.color.textSecondary})}),m==="browser"&&!M&&(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{onPress:()=>P(true),testID:"buoy-storage-search-open",accessibilityLabel:"Open search",accessibilityRole:"button",style:styles.iconButton,children:(0,_jsxRuntime.jsx)(_sharedUi.Search,{size:14,color:_sharedUi.night.color.textSecondary})}),(0,_jsxRuntime.jsx)(_sharedUi.ToolbarCopyButton,{value:be,disabled:H.current.length===0,buttonStyle:styles.iconButton,testID:"buoy-storage-copy"})]}),m==="events"&&(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsx)(_sharedUi.ToolbarCopyButton,{value:je,disabled:i.length===0,buttonStyle:styles.iconButton,testID:"buoy-storage-events-copy"}),(0,_jsxRuntime.jsx)(_sharedUi.PowerToggleButton,{isEnabled:Q,onToggle:Se,accessibilityLabel:"Toggle storage event monitoring",testID:"buoy-storage-power"}),(0,_jsxRuntime.jsx)(_sharedUi.ToolbarClearButton,{onPress:he,buttonStyle:styles.iconButton,testID:"buoy-storage-clear-events"})]})]})]});if(se){return(0,_jsxRuntime.jsx)(_sharedUi.TickProvider,{children:(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.inlineRoot,children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.inlineHeader,..._sharedUi.windowDragProps,children:re}),te(),N]})})}return(0,_jsxRuntime.jsx)(_sharedUi.TickProvider,{children:(0,_jsxRuntime.jsx)(_sharedUi.JsModal,{visible:o,onClose:p,onBack:Ae,onMinimize:oe,persistenceKey:Pe,header:{showToggleButton:true,customContent:re},onModeChange:pe,enablePersistence:true,initialMode:"bottomSheet",enableGlitchEffects:true,styles:{},footer:N,footerHeight:N?68:0,disableScrollWrapper:true,children:te()})})}function StorageToolView(o={}){return(0,_jsxRuntime.jsx)(StorageModalWithTabs,{...o,inline:true,visible:true,onClose:()=>{}})}const styles=_reactNative.StyleSheet.create({inlineRoot:{flex:1,minHeight:0,backgroundColor:"transparent"},inlineHeader:{paddingHorizontal:12,paddingVertical:8,borderBottomWidth:1,borderBottomColor:_sharedUi.macOSColors.border.default,backgroundColor:"transparent"},headerSearchContainer:{flex:1},flexFill:{flex:1},iconButton:{width:32,height:32,borderRadius:8,backgroundColor:_sharedUi.night.color.buttonSurface,borderWidth:1,borderColor:_sharedUi.night.color.border,alignItems:"center",justifyContent:"center"},activeFilterButton:{backgroundColor:_sharedUi.night.color.accentSoft,borderColor:_sharedUi.night.color.accentBorderStrong},separator:{height:8},listContent:{paddingVertical:6},lockedBannerContainer:{marginTop:8,marginHorizontal:16},eventFilterBar:{paddingHorizontal:12,paddingTop:8,paddingBottom:4},emptyState:{flex:1,justifyContent:"center",alignItems:"center",padding:32},emptyTitle:{color:_sharedUi.night.color.text,fontSize:16,fontWeight:"600",marginTop:16,marginBottom:8,fontFamily:_sharedUi.monoFont,letterSpacing:.5,textTransform:"uppercase"},emptySubtitle:{color:_sharedUi.night.color.textSecondary,fontSize:14,textAlign:"center",fontFamily:_sharedUi.monoFont},eventNavigation:{flexDirection:"row",alignItems:"center",gap:8,paddingHorizontal:8},navButton:{padding:4,borderRadius:4},navButtonDisabled:{opacity:.3},eventCounter:{color:_sharedUi.night.color.text,fontSize:12,fontWeight:"600",fontFamily:_sharedUi.monoFont,paddingHorizontal:8},headerTopRow:{flexDirection:"row",alignItems:"center",gap:8,marginBottom:12},keyNameContainer:{flex:1,flexDirection:"row",alignItems:"center",gap:6,backgroundColor:_sharedUi.night.color.surfaceElevated,paddingHorizontal:10,paddingVertical:4,borderRadius:6,borderWidth:1,borderColor:_sharedUi.night.color.border,height:28},keyNameText:{flex:1,fontSize:13,fontWeight:"600",color:_sharedUi.night.color.accent,fontFamily:_sharedUi.monoFont,letterSpacing:.5},contentWrapper:{flex:1}});
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.useAsyncStorageKeys=useAsyncStorageKeys;var _react=require("react");var _asyncStorage=_interopRequireDefault(require("@react-native-async-storage/async-storage"));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,u]=(0,_react.useState)([]);const[x,d]=(0,_react.useState)(true);const[_,y]=(0,_react.useState)(null);const S=JSON.stringify(s);const f=(0,_react.useRef)(s);f.current=s;const p=(0,_react.useCallback)(async()=>{const l=f.current;d(true);y(null);try{const o=await _asyncStorage.default.getAllKeys();if(!o||o.length===0){u([]);d(false);return}const T=await(0,_asyncStorageCompat.readMany)(o);const c=[];T.forEach(([t,n])=>{let r=n;if(n){try{r=JSON.parse(n)}catch{r=n}}const e=l.find(a=>{if(!(0,_requiredStorageKeyScope.requiredKeyAppliesTo)(a,"async"))return false;if(typeof a==="string")return a===t;return a.key===t});let i="optional_present";if(e){if(r===void 0||r===null){i="required_missing"}else if(typeof e==="object"&&e.expectedValue!==void 0){i=r===e.expectedValue?"required_present":"required_wrong_value"}else if(typeof e==="object"&&e.expectedType!==void 0){const a=r===null?"null":typeof r;i=a.toLowerCase()===e.expectedType.toLowerCase()?"required_present":"required_wrong_type"}else{i="required_present"}}const K={key:t,value:r,storageType:"async",status:i,category:e?"required":"optional",...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.push(K)});l.forEach(t=>{if(!(0,_requiredStorageKeyScope.requiredKeyAppliesTo)(t,"async"))return;const n=typeof t==="string"?t:t.key;const r=c.some(e=>e.key===n);if(!r){c.push({key:n,value:void 0,storageType:"async",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}})}});u(c)}catch(o){y(o instanceof Error?o:new Error("Failed to fetch storage data"));u([])}finally{d(false)}},[S]);(0,_react.useEffect)(()=>{p()},[p]);return{storageKeys:g,isLoading:x,error:_,refresh:p}}
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[x,p]=(0,_react.useState)(true);const[_,l]=(0,_react.useState)(null);const S=JSON.stringify(s);const y=(0,_react.useRef)(s);y.current=s;const d=(0,_react.useCallback)(async()=>{const f=y.current;p(true);l(null);try{const o=await _appAsyncStorage.default.getAllKeys();if(!o||o.length===0){c([]);p(false);return}const T=await(0,_asyncStorageCompat.readMany)(o);const u=[];T.forEach(([t,n])=>{let r=n;if(n){try{r=JSON.parse(n)}catch{r=n}}const e=f.find(a=>{if(!(0,_requiredStorageKeyScope.requiredKeyAppliesTo)(a,"async"))return false;if(typeof a==="string")return a===t;return a.key===t});let i="optional_present";if(e){if(r===void 0||r===null){i="required_missing"}else if(typeof e==="object"&&e.expectedValue!==void 0){i=r===e.expectedValue?"required_present":"required_wrong_value"}else if(typeof e==="object"&&e.expectedType!==void 0){const a=r===null?"null":typeof r;i=a.toLowerCase()===e.expectedType.toLowerCase()?"required_present":"required_wrong_type"}else{i="required_present"}}const K={key:t,value:r,storageType:"async",status:i,category:e?"required":"optional",...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}};u.push(K)});f.forEach(t=>{if(!(0,_requiredStorageKeyScope.requiredKeyAppliesTo)(t,"async"))return;const n=typeof t==="string"?t:t.key;const r=u.some(e=>e.key===n);if(!r){u.push({key:n,value:void 0,storageType:"async",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}})}});c(u)}catch(o){l(o instanceof Error?o:new Error("Failed to fetch storage data"));c([])}finally{p(false)}},[S]);(0,_react.useEffect)(()=>{d()},[d]);return{storageKeys:g,isLoading:x,error:_,refresh:d}}
@@ -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 _asyncStorage=_interopRequireDefault(require("@react-native-async-storage/async-storage"));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 _asyncStorage.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):_asyncStorage.default.getItem(t)},"async.setItem":e=>{const{key:t,value:r}=e;return _asyncStorage.default.setItem(t,r)},"async.removeItem":e=>_asyncStorage.default.removeItem(e.key),"async.multiRemove":e=>(0,_asyncStorageCompat.removeMany)(e.keys),"async.multiSet":e=>(0,_asyncStorageCompat.writeMany)(e.pairs),"async.clear":()=>_asyncStorage.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().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 +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");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(s=>e.startsWith(s));async function startListening(){if(stop||typeof window==="undefined")return;stop=(0,_utils.subscribeToBrowserStorage)(e=>{if(paused||e.area!=="localStorage"||e.key!==void 0&&ignored(e.key))return;const{area:s,action:n,...t}=e;if(t.prevPairs)t.prevPairs=t.prevPairs.filter(([r])=>!ignored(r));const i={action:n,data:t,timestamp:new Date};for(const r of[...listeners]){try{r(i)}catch{}}})}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
+ "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 t of[...listeners]){try{t(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(([n])=>!ignored(n));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;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _asyncStorage=_interopRequireDefault(require("@react-native-async-storage/async-storage"));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}var _default=exports.default=_asyncStorage.default;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _asyncStorage=_interopRequireDefault(require("@react-native-async-storage/async-storage"));var _capacitorPreferences=require("./capacitorPreferences");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const pick=()=>(0,_capacitorPreferences.usesCapacitorPreferences)()?_capacitorPreferences.preferencesAsyncStorage:_asyncStorage.default;const appAsyncStorage={getItem:e=>pick().getItem(e),setItem:(e,t)=>pick().setItem(e,t),removeItem:e=>pick().removeItem(e),clear:()=>pick().clear(),getAllKeys:()=>pick().getAllKeys(),multiGet:e=>pick().multiGet(e),multiSet:e=>pick().multiSet(e),multiRemove:e=>pick().multiRemove(e),mergeItem:(e,t)=>pick().mergeItem(e,t),multiMerge:e=>pick().multiMerge(e)};var _default=exports.default=appAsyncStorage;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=exports.asyncStorageCaps=exports.asyncStorage=void 0;exports.readMany=readMany;exports.removeMany=removeMany;exports.writeMany=writeMany;var _asyncStorage=_interopRequireDefault(require("@react-native-async-storage/async-storage"));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const asyncStorage=exports.asyncStorage=_asyncStorage.default;const asyncStorageCaps=exports.asyncStorageCaps={hasLegacyMultiApi:typeof asyncStorage?.multiGet==="function",hasMergeApi:typeof asyncStorage?.mergeItem==="function"};async function readMany(e){if(typeof asyncStorage.multiGet==="function"){return await asyncStorage.multiGet(e)}const t=await asyncStorage.getMany(e);return e.map(r=>[r,t[r]??null])}async function writeMany(e){if(typeof asyncStorage.multiSet==="function"){return asyncStorage.multiSet(e)}const t={};for(const[r,n]of e)t[r]=n;return asyncStorage.setMany(t)}async function removeMany(e){if(typeof asyncStorage.multiRemove==="function"){return asyncStorage.multiRemove(e)}return asyncStorage.removeMany(e)}var _default=exports.default=asyncStorage;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=exports.asyncStorageCaps=exports.asyncStorage=void 0;exports.readMany=readMany;exports.removeMany=removeMany;exports.writeMany=writeMany;var _appAsyncStorage=_interopRequireDefault(require("./appAsyncStorage"));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const asyncStorage=exports.asyncStorage=_appAsyncStorage.default;const asyncStorageCaps=exports.asyncStorageCaps={hasLegacyMultiApi:typeof asyncStorage?.multiGet==="function",hasMergeApi:typeof asyncStorage?.mergeItem==="function"};async function readMany(e){if(typeof asyncStorage.multiGet==="function"){return await asyncStorage.multiGet(e)}const t=await asyncStorage.getMany(e);return e.map(r=>[r,t[r]??null])}async function writeMany(e){if(typeof asyncStorage.multiSet==="function"){return asyncStorage.multiSet(e)}const t={};for(const[r,n]of e)t[r]=n;return asyncStorage.setMany(t)}async function removeMany(e){if(typeof asyncStorage.multiRemove==="function"){return asyncStorage.multiRemove(e)}return asyncStorage.removeMany(e)}var _default=exports.default=asyncStorage;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.startBrowserStorageCapture=startBrowserStorageCapture;var _utils=require("@buoy-gg/shared-ui/utils");var _MMKVInstanceRegistry=require("./MMKVInstanceRegistry");let owners=0;const storage=()=>(0,_utils.getBrowserStorage)("sessionStorage");const keys=()=>Array.from({length:storage().length},(e,r)=>storage().key(r)).filter(e=>e!==null);const sessionBackend={set(e,r){storage().setItem(e,String(r))},getString(e){return storage().getItem(e)??void 0},getNumber(){return void 0},getBoolean(){return void 0},getBuffer(){return void 0},contains(e){return storage().getItem(e)!==null},delete(e){const r=this.contains(e);storage().removeItem(e);return r},getAllKeys:keys,clearAll(){storage().clear()},get size(){return keys().reduce((e,r)=>e+2*(r.length+(storage().getItem(r)?.length??0)),0)},addOnValueChangedListener(e){return{remove:(0,_utils.subscribeToBrowserStorage)(r=>{if(r.area!=="sessionStorage")return;if(r.key!==void 0)e(r.key);else r.prevPairs?.forEach(([t])=>e(t))})}}};function startBrowserStorageCapture(){if(typeof window==="undefined")return()=>{};try{storage()}catch{return()=>{}}if(++owners===1)(0,_MMKVInstanceRegistry.registerMMKVInstance)("sessionStorage",sessionBackend);let e=true;return()=>{if(e){e=false;if(--owners===0)(0,_MMKVInstanceRegistry.unregisterMMKVInstance)("sessionStorage")}}}
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(o){const t=()=>(0,_utils.getBrowserStorage)(o);const n=()=>Array.from({length:t().length},(e,r)=>t().key(r)).filter(e=>e!==null&&!(o==="localStorage"&&(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!==o)return;if(r.key!==void 0){if(!(o==="localStorage"&&(0,_sharedUi.isDevToolsStorageKey)(r.key)))e(r.key)}else r.prevPairs?.forEach(([s])=>e(s))})}}}}function instances(){return(0,_capacitorPreferences.usesCapacitorPreferences)()?["localStorage","sessionStorage"]:["sessionStorage"]}function startBrowserStorageCapture(){if(typeof window==="undefined")return()=>{};try{(0,_utils.getBrowserStorage)("sessionStorage")}catch{return()=>{}}const o=instances();if(++owners===1)for(const n of o)(0,_MMKVInstanceRegistry.registerMMKVInstance)(n,webStorageBackend(n));let t=true;return()=>{if(t){t=false;if(--owners===0)for(const n of o)(0,_MMKVInstanceRegistry.unregisterMMKVInstance)(n)}}}
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.preferencesAsyncStorage=void 0;exports.subscribePreferencesChanges=subscribePreferencesChanges;exports.usesCapacitorPreferences=usesCapacitorPreferences;var _license=require("@buoy-gg/license");const PLUGIN="Preferences";function usesCapacitorPreferences(){return(0,_license.isCapacitorNative)()&&(0,_license.hasCapacitorPlugin)(PLUGIN)}const changeListeners=new Set;function emit(e,t){const r={action:e,data:t,timestamp:new Date};for(const a of Array.from(changeListeners)){try{a(r)}catch{}}}function subscribePreferencesChanges(e){changeListeners.add(e);ensureAppWriteCapture();return()=>{changeListeners.delete(e)}}async function readValue(e){const{value:t}=await(0,_license.callCapacitorNative)(PLUGIN,"get",{key:e});return t??null}async function readKeys(){const{keys:e}=await(0,_license.callCapacitorNative)(PLUGIN,"keys");return Array.isArray(e)?e:[]}async function readPairs(e){return Promise.all(e.map(async t=>[t,await readValue(t)]))}let capturing=false;function ensureAppWriteCapture(){if(capturing||!usesCapacitorPreferences()||!(0,_license.installCapacitorBridge)())return;capturing=true;(0,_license.interceptCapacitor)({plugin:PLUGIN,methods:["set","remove","clear"],promise:async(e,t)=>{if(changeListeners.size===0)return t();const r=typeof e.options.key==="string"?e.options.key:void 0;if(e.method==="clear"){const s=readKeys().catch(()=>[]);const c=await t();emit("clear",{keys:await s});return c}if(r===void 0)return t();const a=readValue(r).catch(()=>null);const n=await t();const i=await a;if(e.method==="set")emit("setItem",{key:r,value:String(e.options.value??""),prevValue:i});else emit("removeItem",{key:r,prevValue:i});return n}})}function mergeJson(e,t){if(!e||!t||typeof e!=="object"||typeof t!=="object"||Array.isArray(e)||Array.isArray(t)){return t}const r={...e};for(const[a,n]of Object.entries(t)){r[a]=a in r?mergeJson(r[a],n):n}return r}function parse(e){if(e===null)return null;try{return JSON.parse(e)}catch{return null}}const preferencesAsyncStorage=exports.preferencesAsyncStorage={getItem(e){return readValue(e)},async setItem(e,t){const r=readValue(e).catch(()=>null);await(0,_license.callCapacitorNative)(PLUGIN,"set",{key:e,value:String(t)});emit("setItem",{key:e,value:String(t),prevValue:await r})},async removeItem(e){const t=readValue(e).catch(()=>null);await(0,_license.callCapacitorNative)(PLUGIN,"remove",{key:e});emit("removeItem",{key:e,prevValue:await t})},async clear(){const e=await readPairs(await readKeys()).catch(()=>void 0);await(0,_license.callCapacitorNative)(PLUGIN,"clear");emit("clear",{prevPairs:e?.filter(t=>t[1]!==null)})},getAllKeys(){return readKeys()},multiGet(e){return readPairs(e)},async multiSet(e){const t=readPairs(e.map(([r])=>r)).catch(()=>void 0);await Promise.all(e.map(([r,a])=>(0,_license.callCapacitorNative)(PLUGIN,"set",{key:r,value:String(a)})));emit("multiSet",{pairs:e.map(([r,a])=>[r,String(a)]),prevPairs:await t})},async multiRemove(e){const t=readPairs(e).catch(()=>void 0);await Promise.all(e.map(r=>(0,_license.callCapacitorNative)(PLUGIN,"remove",{key:r})));emit("multiRemove",{keys:[...e],prevPairs:await t})},async mergeItem(e,t){const r=await readValue(e);await preferencesAsyncStorage.setItem(e,JSON.stringify(mergeJson(parse(r),parse(t))))},async multiMerge(e){for(const[t,r]of e)await preferencesAsyncStorage.mergeItem(t,r)}};
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.clearAllAppStorage=clearAllAppStorage;exports.clearAllStorageIncludingDevTools=clearAllStorageIncludingDevTools;var _asyncStorage=_interopRequireDefault(require("@react-native-async-storage/async-storage"));var _asyncStorageCompat=require("./asyncStorageCompat");var _sharedUi=require("@buoy-gg/shared-ui");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}async function clearAllAppStorage(){const e=await _asyncStorage.default.getAllKeys();if(!e||e.length===0){return}const a=e.filter(r=>!(0,_sharedUi.isDevToolsStorageKey)(r));if(a.length===0){return}await(0,_asyncStorageCompat.removeMany)(a)}async function clearAllStorageIncludingDevTools(){await _asyncStorage.default.clear()}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.clearAllAppStorage=clearAllAppStorage;exports.clearAllStorageIncludingDevTools=clearAllStorageIncludingDevTools;var _appAsyncStorage=_interopRequireDefault(require("./appAsyncStorage"));var _asyncStorageCompat=require("./asyncStorageCompat");var _sharedUi=require("@buoy-gg/shared-ui");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}async function clearAllAppStorage(){const e=await _appAsyncStorage.default.getAllKeys();if(!e||e.length===0){return}const r=e.filter(a=>!(0,_sharedUi.isDevToolsStorageKey)(a));if(r.length===0){return}await(0,_asyncStorageCompat.removeMany)(r)}async function clearAllStorageIncludingDevTools(){await _appAsyncStorage.default.clear()}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.setStorageValue=setStorageValue;exports.storageEditBlockedReason=storageEditBlockedReason;exports.storageValueToEditableText=storageValueToEditableText;exports.structuredStorageValue=structuredStorageValue;exports.validateStorageValue=validateStorageValue;var _asyncStorage=_interopRequireDefault(require("@react-native-async-storage/async-storage"));var _SecureStoreRegistry=require("./SecureStoreRegistry");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function storageEditBlockedReason(e,t=[]){if(e.storageType==="mmkv"){if(e.valueType==="buffer"){return"Buffer values can't be edited \u2014 the tool only ever sees their byte length, not their contents."}const r=t.find(n=>n.id===(e.instanceId||"default"));if(r?.readOnly){return`MMKV instance "${r.id}" is registered read-only.`}}if(e.storageType==="secure"){const r=_SecureStoreRegistry.secureStoreRegistry.getAll().find(n=>n.key===e.key);if(r?.options.requireAuthentication){return"Biometric-protected keys can't be edited \u2014 writing one would fire an auth prompt."}if(!_SecureStoreRegistry.secureStoreRegistry.getModule()){return"No SecureStore module is registered."}}return null}function validateStorageValue(e,t){if(e.storageType==="mmkv"){const r=mmkvTargetType(e);if(r==="number"){if(t.trim()===""||Number.isNaN(Number(t))){return"Must be a number \u2014 this MMKV key is stored as a number."}}if(r==="boolean"){const n=t.trim().toLowerCase();if(n!=="true"&&n!=="false"){return'Must be "true" or "false" \u2014 this MMKV key is stored as a boolean.'}}return null}if(isStructured(e.value)){try{JSON.parse(t)}catch(r){return`This key holds JSON \u2014 ${r instanceof Error?r.message:"invalid JSON"}`}}return null}function storageValueToEditableText(e){if(e===void 0||e===null)return"";if(typeof e==="string"){const t=e.trim();if(t.startsWith("{")||t.startsWith("[")){try{return JSON.stringify(JSON.parse(e),null,2)}catch{return e}}return e}if(typeof e==="object")return JSON.stringify(e,null,2);return String(e)}function structuredStorageValue(e){const{value:t}=e;if(t!==null&&typeof t==="object")return t;if(typeof t==="string"){const r=t.trim();if(!r.startsWith("{")&&!r.startsWith("["))return void 0;try{const n=JSON.parse(t);return n!==null&&typeof n==="object"?n:void 0}catch{return void 0}}return void 0}async function setStorageValue(e,t,r=[]){const n=storageEditBlockedReason(e,r);if(n)throw new Error(n);const i=validateStorageValue(e,t);if(i)throw new Error(i);switch(e.storageType){case"async":{await _asyncStorage.default.setItem(e.key,normalizeJsonText(e,t));return}case"secure":{await _SecureStoreRegistry.secureStoreRegistry.setValue(e.key,normalizeJsonText(e,t));return}case"mmkv":{const u=e.instanceId||"default";const o=r.find(s=>s.id===u);if(!o){throw new Error(`MMKV instance "${u}" is not registered.`)}o.instance.set(e.key,coerceMMKV(e,t));return}default:{throw new Error(`Unsupported storage type "${String(e.storageType)}"`)}}}function isStructured(e){return e!==null&&typeof e==="object"}function normalizeJsonText(e,t){if(!isStructured(e.value))return t;return JSON.stringify(JSON.parse(t))}function mmkvTargetType(e){if(e.valueType)return e.valueType;if(typeof e.value==="number")return"number";if(typeof e.value==="boolean")return"boolean";return"string"}function coerceMMKV(e,t){switch(mmkvTargetType(e)){case"number":return Number(t);case"boolean":return t.trim().toLowerCase()==="true";default:return t}}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.setStorageValue=setStorageValue;exports.storageEditBlockedReason=storageEditBlockedReason;exports.storageValueToEditableText=storageValueToEditableText;exports.structuredStorageValue=structuredStorageValue;exports.validateStorageValue=validateStorageValue;var _appAsyncStorage=_interopRequireDefault(require("./appAsyncStorage"));var _SecureStoreRegistry=require("./SecureStoreRegistry");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function storageEditBlockedReason(e,t=[]){if(e.storageType==="mmkv"){if(e.valueType==="buffer"){return"Buffer values can't be edited \u2014 the tool only ever sees their byte length, not their contents."}const r=t.find(n=>n.id===(e.instanceId||"default"));if(r?.readOnly){return`MMKV instance "${r.id}" is registered read-only.`}}if(e.storageType==="secure"){const r=_SecureStoreRegistry.secureStoreRegistry.getAll().find(n=>n.key===e.key);if(r?.options.requireAuthentication){return"Biometric-protected keys can't be edited \u2014 writing one would fire an auth prompt."}if(!_SecureStoreRegistry.secureStoreRegistry.getModule()){return"No SecureStore module is registered."}}return null}function validateStorageValue(e,t){if(e.storageType==="mmkv"){const r=mmkvTargetType(e);if(r==="number"){if(t.trim()===""||Number.isNaN(Number(t))){return"Must be a number \u2014 this MMKV key is stored as a number."}}if(r==="boolean"){const n=t.trim().toLowerCase();if(n!=="true"&&n!=="false"){return'Must be "true" or "false" \u2014 this MMKV key is stored as a boolean.'}}return null}if(isStructured(e.value)){try{JSON.parse(t)}catch(r){return`This key holds JSON \u2014 ${r instanceof Error?r.message:"invalid JSON"}`}}return null}function storageValueToEditableText(e){if(e===void 0||e===null)return"";if(typeof e==="string"){const t=e.trim();if(t.startsWith("{")||t.startsWith("[")){try{return JSON.stringify(JSON.parse(e),null,2)}catch{return e}}return e}if(typeof e==="object")return JSON.stringify(e,null,2);return String(e)}function structuredStorageValue(e){const{value:t}=e;if(t!==null&&typeof t==="object")return t;if(typeof t==="string"){const r=t.trim();if(!r.startsWith("{")&&!r.startsWith("["))return void 0;try{const n=JSON.parse(t);return n!==null&&typeof n==="object"?n:void 0}catch{return void 0}}return void 0}async function setStorageValue(e,t,r=[]){const n=storageEditBlockedReason(e,r);if(n)throw new Error(n);const i=validateStorageValue(e,t);if(i)throw new Error(i);switch(e.storageType){case"async":{await _appAsyncStorage.default.setItem(e.key,normalizeJsonText(e,t));return}case"secure":{await _SecureStoreRegistry.secureStoreRegistry.setValue(e.key,normalizeJsonText(e,t));return}case"mmkv":{const u=e.instanceId||"default";const o=r.find(s=>s.id===u);if(!o){throw new Error(`MMKV instance "${u}" is not registered.`)}o.instance.set(e.key,coerceMMKV(e,t));return}default:{throw new Error(`Unsupported storage type "${String(e.storageType)}"`)}}}function isStructured(e){return e!==null&&typeof e==="object"}function normalizeJsonText(e,t){if(!isStructured(e.value))return t;return JSON.stringify(JSON.parse(t))}function mmkvTargetType(e){if(e.valueType)return e.valueType;if(typeof e.value==="number")return"number";if(typeof e.value==="boolean")return"boolean";return"string"}function coerceMMKV(e,t){switch(mmkvTargetType(e)){case"number":return Number(t);case"boolean":return t.trim().toLowerCase()==="true";default:return t}}
@@ -1 +1 @@
1
- "use strict";var _asyncStorage=_interopRequireDefault(require("@react-native-async-storage/async-storage"));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,a){if(s.remove)s.remove(a);else s.delete?.(a)}function status(){return{canCapture:true,canRestore:true}}async function captureStorageData(){const s=[];const a=(await _asyncStorage.default.getAllKeys()).filter(o=>!(0,_sharedUi.isDevToolsStorageKey)(o));const i=(await(0,_asyncStorageCompat.readMany)(a)).filter(o=>o[1]!==null);const n={};for(const{id:o,instance:f}of _MMKVInstanceRegistry.mmkvInstanceRegistry.getAll()){try{n[o]=f.getAllKeys().filter(e=>!(0,_sharedUi.isDevToolsStorageKey)(e)).map(e=>{const{value:y,type:l}=(0,_mmkvTypeDetection.detectMMKVType)(f,e);if(l==="buffer"){s.push(`mmkv "${o}"/"${e}": ArrayBuffer value not capturable`)}return{key:e,value:y,valueType:l}})}catch{s.push(`mmkv "${o}": unreadable, captured without entries`);n[o]=[]}}const u={};const r=_SecureStoreRegistry.secureStoreRegistry.getModule();for(const{key:o,options:f}of _SecureStoreRegistry.secureStoreRegistry.getAll()){if(f.requireAuthentication){s.push(`secure "${o}": biometric-protected, not capturable`);continue}let e=null;if(r){try{e=await r.getItemAsync(o,f)}catch{s.push(`secure "${o}": unreadable, captured as unset`)}}u[o]=e}return{data:{async:i,mmkv:n,secure:u},warnings:s}}async function capture(){const{data:s,warnings:a}=await captureStorageData();return{data:s,warnings:a}}async function restore(s,a){const i=s;const n=(0,_sharedUi.createRestoreScope)(a);const u=n.touch;const r=(0,_sharedUi.emptyRestoreResult)();if(!i){return(0,_sharedUi.failedRestore)("empty storage snapshot")}try{const e=(i.async??[]).filter(([t])=>!(0,_sharedUi.isDevToolsStorageKey)(t)&&u(`async:${t}`));const y=new Set(e.map(([t])=>t));const l=(await _asyncStorage.default.getAllKeys()).filter(t=>!(0,_sharedUi.isDevToolsStorageKey)(t));const d=l.filter(t=>!y.has(t)&&u(`async:${t}`));n.countExcluded((i.async??[]).length-e.length);if(d.length>0)await(0,_asyncStorageCompat.removeMany)(d);if(e.length>0)await(0,_asyncStorageCompat.writeMany)(e);r.applied+=e.length+d.length}catch(e){r.ok=false;r.warnings.push(`asyncstorage restore failed: ${String(e)}`)}for(const[e,y]of Object.entries(i.mmkv??{})){const l=_MMKVInstanceRegistry.mmkvInstanceRegistry.get(e);if(!l){r.skipped.push({id:`mmkv:${e}`,reason:"instance not registered"});continue}if(l.instance.isReadOnly){r.skipped.push({id:`mmkv:${e}`,reason:"instance registered read-only"});continue}const{instance:d}=l;try{const t=new Set(y.map(c=>c.key));const g=d.getAllKeys().filter(c=>!(0,_sharedUi.isDevToolsStorageKey)(c));for(const c of g){if(!n.allows(`mmkv:${e}/${c}`))continue;if(!t.has(c)){deleteMMKVKey(d,c);r.applied+=1}}for(const c of y){if((0,_sharedUi.isDevToolsStorageKey)(c.key))continue;if(!u(`mmkv:${e}/${c.key}`))continue;if(c.valueType==="buffer"){r.skipped.push({id:`mmkv:${e}/${c.key}`,reason:"ArrayBuffer values cannot be restored"});continue}d.set(c.key,c.value);r.applied+=1}}catch(t){r.ok=false;r.warnings.push(`mmkv "${e}" restore failed: ${String(t)}`)}}const o=i.secure??{};for(const{key:e,options:y}of _SecureStoreRegistry.secureStoreRegistry.getAll()){if(!n.allows(`secure:${e}`))continue;if(y.requireAuthentication){if(e in o){r.skipped.push({id:`secure:${e}`,reason:"biometric-protected keys are never written"})}continue}try{if(e in o){const l=o[e];if(l===null)await _SecureStoreRegistry.secureStoreRegistry.deleteValue(e);else await _SecureStoreRegistry.secureStoreRegistry.setValue(e,l)}else{await _SecureStoreRegistry.secureStoreRegistry.deleteValue(e)}r.applied+=1}catch(l){r.ok=false;r.warnings.push(`secure "${e}" restore failed: ${String(l)}`)}}for(const e of Object.keys(o)){if(!u(`secure:${e}`))continue;if(!_SecureStoreRegistry.secureStoreRegistry.getAll().some(y=>y.key===e)){r.skipped.push({id:`secure:${e}`,reason:"key no longer registered with registerSecureStoreKeys"})}}const f=n.excludedWarning("item(s)");if(f)r.warnings.push(f);return r}async function clear(){const s=(0,_sharedUi.emptyRestoreResult)();try{await(0,_clearAllStorage.clearAllAppStorage)();s.applied+=1}catch(a){s.ok=false;s.warnings.push(`asyncstorage clear failed: ${String(a)}`)}for(const{id:a,instance:i}of _MMKVInstanceRegistry.mmkvInstanceRegistry.getAll()){if(i.isReadOnly){s.skipped.push({id:`mmkv:${a}`,reason:"instance registered read-only"});continue}try{for(const n of i.getAllKeys().filter(u=>!(0,_sharedUi.isDevToolsStorageKey)(u))){deleteMMKVKey(i,n);s.applied+=1}}catch(n){s.ok=false;s.warnings.push(`mmkv "${a}" clear failed: ${String(n)}`)}}for(const{key:a,options:i}of _SecureStoreRegistry.secureStoreRegistry.getAll()){if(i.requireAuthentication){s.skipped.push({id:`secure:${a}`,reason:"biometric-protected keys are never written"});continue}try{await _SecureStoreRegistry.secureStoreRegistry.deleteValue(a);s.applied+=1}catch(n){s.ok=false;s.warnings.push(`secure "${a}" clear failed: ${String(n)}`)}}return s}const ITEM_RENDER_CHAR_LIMIT=256*1024;function classifyValue(s,a,i,n,u,r){return(0,_sharedUi.classifyPreviewItem)({key:s,label:a,oldValue:i,newValue:n,inOld:u,inNew:r},{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,a){const i=s??{async:[],mmkv:{},secure:{}};const n=a===void 0;const u=n?(await captureStorageData()).data:a??{async:[],mmkv:{},secure:{}};const r=[];const o=[];const f=new Map(u.async??[]);const e=new Map(i.async??[]);for(const t of(0,_sharedUi.unionKeys)(f,e)){if((0,_sharedUi.isDevToolsStorageKey)(t))continue;r.push(classifyValue(`async:${t}`,t,f.get(t),e.get(t),f.has(t),e.has(t)))}for(const t of(0,_sharedUi.unionKeys)(u.mmkv,i.mmkv)){const g=n?_MMKVInstanceRegistry.mmkvInstanceRegistry.get(t):null;const c=n&&!g;const w=n&&g?.instance.isReadOnly===true;const v=new Map((u.mmkv?.[t]??[]).map(p=>[p.key,p]));const k=new Map((i.mmkv?.[t]??[]).map(p=>[p.key,p]));for(const p of(0,_sharedUi.unionKeys)(v,k)){if((0,_sharedUi.isDevToolsStorageKey)(p))continue;const $=`mmkv:${t}/${p}`;const R=`${t} \xB7 ${p}`;const h=v.get(p);const S=k.get(p);let m=classifyValue($,R,h?.value,S?.value,v.has(p),k.has(p));if(c){m=(0,_sharedUi.wontApply)(m,"MMKV instance not registered")}else if(w){m=(0,_sharedUi.wontApply)(m,"MMKV instance registered read-only")}else if(S?.valueType==="buffer"||h?.valueType==="buffer"){m=(0,_sharedUi.wontApply)(m,"ArrayBuffer values cannot be restored")}r.push(m)}}const y=u.secure??{};const l=i.secure??{};const d=n?new Map(_SecureStoreRegistry.secureStoreRegistry.getAll().map(t=>[t.key,t])):null;for(const t of(0,_sharedUi.unionKeys)(y,l)){let g=classifyValue(`secure:${t}`,t,y[t],l[t],t in y,t in l);if(n){const c=d?.get(t);if(!c){g=(0,_sharedUi.wontApply)(g,"key no longer registered with registerSecureStoreKeys")}else if(c.options.requireAuthentication){g=(0,_sharedUi.wontApply)(g,"biometric-protected keys are never written")}}r.push(g)}return{items:r,notes:o}}(0,_sharedUi.registerStateSnapshotProvider)({id:"storage",label:"Storage",status,capture,restore,clear,previewItems});
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,a){if(s.remove)s.remove(a);else s.delete?.(a)}function status(){return{canCapture:true,canRestore:true}}async function captureStorageData(){const s=[];const a=(await _appAsyncStorage.default.getAllKeys()).filter(o=>!(0,_sharedUi.isDevToolsStorageKey)(o));const i=(await(0,_asyncStorageCompat.readMany)(a)).filter(o=>o[1]!==null);const n={};for(const{id:o,instance:f}of _MMKVInstanceRegistry.mmkvInstanceRegistry.getAll()){try{n[o]=f.getAllKeys().filter(e=>!(0,_sharedUi.isDevToolsStorageKey)(e)).map(e=>{const{value:y,type:l}=(0,_mmkvTypeDetection.detectMMKVType)(f,e);if(l==="buffer"){s.push(`mmkv "${o}"/"${e}": ArrayBuffer value not capturable`)}return{key:e,value:y,valueType:l}})}catch{s.push(`mmkv "${o}": unreadable, captured without entries`);n[o]=[]}}const u={};const r=_SecureStoreRegistry.secureStoreRegistry.getModule();for(const{key:o,options:f}of _SecureStoreRegistry.secureStoreRegistry.getAll()){if(f.requireAuthentication){s.push(`secure "${o}": biometric-protected, not capturable`);continue}let e=null;if(r){try{e=await r.getItemAsync(o,f)}catch{s.push(`secure "${o}": unreadable, captured as unset`)}}u[o]=e}return{data:{async:i,mmkv:n,secure:u},warnings:s}}async function capture(){const{data:s,warnings:a}=await captureStorageData();return{data:s,warnings:a}}async function restore(s,a){const i=s;const n=(0,_sharedUi.createRestoreScope)(a);const u=n.touch;const r=(0,_sharedUi.emptyRestoreResult)();if(!i){return(0,_sharedUi.failedRestore)("empty storage snapshot")}try{const e=(i.async??[]).filter(([t])=>!(0,_sharedUi.isDevToolsStorageKey)(t)&&u(`async:${t}`));const y=new Set(e.map(([t])=>t));const l=(await _appAsyncStorage.default.getAllKeys()).filter(t=>!(0,_sharedUi.isDevToolsStorageKey)(t));const d=l.filter(t=>!y.has(t)&&u(`async:${t}`));n.countExcluded((i.async??[]).length-e.length);if(d.length>0)await(0,_asyncStorageCompat.removeMany)(d);if(e.length>0)await(0,_asyncStorageCompat.writeMany)(e);r.applied+=e.length+d.length}catch(e){r.ok=false;r.warnings.push(`asyncstorage restore failed: ${String(e)}`)}for(const[e,y]of Object.entries(i.mmkv??{})){const l=_MMKVInstanceRegistry.mmkvInstanceRegistry.get(e);if(!l){r.skipped.push({id:`mmkv:${e}`,reason:"instance not registered"});continue}if(l.instance.isReadOnly){r.skipped.push({id:`mmkv:${e}`,reason:"instance registered read-only"});continue}const{instance:d}=l;try{const t=new Set(y.map(c=>c.key));const g=d.getAllKeys().filter(c=>!(0,_sharedUi.isDevToolsStorageKey)(c));for(const c of g){if(!n.allows(`mmkv:${e}/${c}`))continue;if(!t.has(c)){deleteMMKVKey(d,c);r.applied+=1}}for(const c of y){if((0,_sharedUi.isDevToolsStorageKey)(c.key))continue;if(!u(`mmkv:${e}/${c.key}`))continue;if(c.valueType==="buffer"){r.skipped.push({id:`mmkv:${e}/${c.key}`,reason:"ArrayBuffer values cannot be restored"});continue}d.set(c.key,c.value);r.applied+=1}}catch(t){r.ok=false;r.warnings.push(`mmkv "${e}" restore failed: ${String(t)}`)}}const o=i.secure??{};for(const{key:e,options:y}of _SecureStoreRegistry.secureStoreRegistry.getAll()){if(!n.allows(`secure:${e}`))continue;if(y.requireAuthentication){if(e in o){r.skipped.push({id:`secure:${e}`,reason:"biometric-protected keys are never written"})}continue}try{if(e in o){const l=o[e];if(l===null)await _SecureStoreRegistry.secureStoreRegistry.deleteValue(e);else await _SecureStoreRegistry.secureStoreRegistry.setValue(e,l)}else{await _SecureStoreRegistry.secureStoreRegistry.deleteValue(e)}r.applied+=1}catch(l){r.ok=false;r.warnings.push(`secure "${e}" restore failed: ${String(l)}`)}}for(const e of Object.keys(o)){if(!u(`secure:${e}`))continue;if(!_SecureStoreRegistry.secureStoreRegistry.getAll().some(y=>y.key===e)){r.skipped.push({id:`secure:${e}`,reason:"key no longer registered with registerSecureStoreKeys"})}}const f=n.excludedWarning("item(s)");if(f)r.warnings.push(f);return r}async function clear(){const s=(0,_sharedUi.emptyRestoreResult)();try{await(0,_clearAllStorage.clearAllAppStorage)();s.applied+=1}catch(a){s.ok=false;s.warnings.push(`asyncstorage clear failed: ${String(a)}`)}for(const{id:a,instance:i}of _MMKVInstanceRegistry.mmkvInstanceRegistry.getAll()){if(i.isReadOnly){s.skipped.push({id:`mmkv:${a}`,reason:"instance registered read-only"});continue}try{for(const n of i.getAllKeys().filter(u=>!(0,_sharedUi.isDevToolsStorageKey)(u))){deleteMMKVKey(i,n);s.applied+=1}}catch(n){s.ok=false;s.warnings.push(`mmkv "${a}" clear failed: ${String(n)}`)}}for(const{key:a,options:i}of _SecureStoreRegistry.secureStoreRegistry.getAll()){if(i.requireAuthentication){s.skipped.push({id:`secure:${a}`,reason:"biometric-protected keys are never written"});continue}try{await _SecureStoreRegistry.secureStoreRegistry.deleteValue(a);s.applied+=1}catch(n){s.ok=false;s.warnings.push(`secure "${a}" clear failed: ${String(n)}`)}}return s}const ITEM_RENDER_CHAR_LIMIT=256*1024;function classifyValue(s,a,i,n,u,r){return(0,_sharedUi.classifyPreviewItem)({key:s,label:a,oldValue:i,newValue:n,inOld:u,inNew:r},{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,a){const i=s??{async:[],mmkv:{},secure:{}};const n=a===void 0;const u=n?(await captureStorageData()).data:a??{async:[],mmkv:{},secure:{}};const r=[];const o=[];const f=new Map(u.async??[]);const e=new Map(i.async??[]);for(const t of(0,_sharedUi.unionKeys)(f,e)){if((0,_sharedUi.isDevToolsStorageKey)(t))continue;r.push(classifyValue(`async:${t}`,t,f.get(t),e.get(t),f.has(t),e.has(t)))}for(const t of(0,_sharedUi.unionKeys)(u.mmkv,i.mmkv)){const g=n?_MMKVInstanceRegistry.mmkvInstanceRegistry.get(t):null;const c=n&&!g;const w=n&&g?.instance.isReadOnly===true;const v=new Map((u.mmkv?.[t]??[]).map(p=>[p.key,p]));const k=new Map((i.mmkv?.[t]??[]).map(p=>[p.key,p]));for(const p of(0,_sharedUi.unionKeys)(v,k)){if((0,_sharedUi.isDevToolsStorageKey)(p))continue;const $=`mmkv:${t}/${p}`;const A=`${t} \xB7 ${p}`;const h=v.get(p);const S=k.get(p);let m=classifyValue($,A,h?.value,S?.value,v.has(p),k.has(p));if(c){m=(0,_sharedUi.wontApply)(m,"MMKV instance not registered")}else if(w){m=(0,_sharedUi.wontApply)(m,"MMKV instance registered read-only")}else if(S?.valueType==="buffer"||h?.valueType==="buffer"){m=(0,_sharedUi.wontApply)(m,"ArrayBuffer values cannot be restored")}r.push(m)}}const y=u.secure??{};const l=i.secure??{};const d=n?new Map(_SecureStoreRegistry.secureStoreRegistry.getAll().map(t=>[t.key,t])):null;for(const t of(0,_sharedUi.unionKeys)(y,l)){let g=classifyValue(`secure:${t}`,t,y[t],l[t],t in y,t in l);if(n){const c=d?.get(t);if(!c){g=(0,_sharedUi.wontApply)(g,"key no longer registered with registerSecureStoreKeys")}else if(c.options.requireAuthentication){g=(0,_sharedUi.wontApply)(g,"biometric-protected keys are never written")}}r.push(g)}return{items:r,notes:o}}(0,_sharedUi.registerStateSnapshotProvider)({id:"storage",label:"Storage",status,capture,restore,clear,previewItems});
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.storageLabels=void 0;const storageLabels=exports.storageLabels={async:"Local",asyncFull:"localStorage",mmkv:"Session",secure:"Secure",hasSecure:false};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.storageLabels=void 0;var _capacitorPreferences=require("./capacitorPreferences");const storageLabels=exports.storageLabels=(0,_capacitorPreferences.usesCapacitorPreferences)()?{async:"Preferences",asyncFull:"Capacitor Preferences",mmkv:"Web",secure:"Secure",hasSecure:false}:{async:"Local",asyncFull:"localStorage",mmkv:"Session",secure:"Secure",hasSecure:false};
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.getStorageTypeHexColor=getStorageTypeHexColor;exports.getStorageTypeLabel=getStorageTypeLabel;var _sharedUi=require("@buoy-gg/shared-ui");function getStorageTypeLabel(e){switch(e){case"mmkv":return"MMKV";case"async":return"Async";case"secure":return"Secure";default:return e}}function getStorageTypeHexColor(e){switch(e){case"mmkv":return _sharedUi.gameUIColors.info;case"async":return _sharedUi.gameUIColors.warning;case"secure":return _sharedUi.gameUIColors.success;default:return _sharedUi.gameUIColors.muted}}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.getStorageTypeHexColor=getStorageTypeHexColor;exports.getStorageTypeLabel=getStorageTypeLabel;var _sharedUi=require("@buoy-gg/shared-ui");var _storageLabels=require("./storageLabels");function getStorageTypeLabel(e){switch(e){case"mmkv":return _storageLabels.storageLabels.mmkv;case"async":return _storageLabels.storageLabels.async;case"secure":return"Secure";default:return e}}function getStorageTypeHexColor(e){switch(e){case"mmkv":return _sharedUi.gameUIColors.info;case"async":return _sharedUi.gameUIColors.warning;case"secure":return _sharedUi.gameUIColors.success;default:return _sharedUi.gameUIColors.muted}}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.canUndo=canUndo;exports.jumpToState=jumpToState;exports.undoOperation=undoOperation;var _sharedUi=require("@buoy-gg/shared-ui");var _asyncStorage=_interopRequireDefault(require("@react-native-async-storage/async-storage"));var _asyncStorageCompat=require("./asyncStorageCompat");function _interopRequireDefault(s){return s&&s.__esModule?s:{default:s}}function isOmittedStorageValue(s){return!!s&&typeof s==="object"&&s.__buoyValueOnDevice===true}async function undoOperation(s){const{action:r,data:e}=s;if(isOmittedStorageValue(e?.prevValue)||isOmittedStorageValue(e?.prevPairs)){throw new Error("Cannot undo: previous value is still on the device \u2014 fetch getEventDetail first")}{switch(r){case"setItem":case"mergeItem":if(e?.key){if(e.prevValue===null||e.prevValue===void 0){await _asyncStorage.default.removeItem(e.key)}else{await _asyncStorage.default.setItem(e.key,e.prevValue)}}break;case"removeItem":if(e?.key&&e.prevValue!==null&&e.prevValue!==void 0){await _asyncStorage.default.setItem(e.key,e.prevValue)}break;case"multiSet":case"multiMerge":if(e?.prevPairs&&e.prevPairs.length>0){for(const[t,a]of e.prevPairs){if(a===null){await _asyncStorage.default.removeItem(t)}else{await _asyncStorage.default.setItem(t,a)}}}break;case"multiRemove":if(e?.prevPairs&&e.prevPairs.length>0){for(const[t,a]of e.prevPairs){if(a!==null){await _asyncStorage.default.setItem(t,a)}}}break;case"clear":if(e?.prevPairs&&e.prevPairs.length>0){const t=e.prevPairs.filter(([,a])=>a!==null);if(t.length>0){await(0,_asyncStorageCompat.writeMany)(t)}}break;default:throw new Error(`Cannot undo unknown action type: ${r}`)}}}async function jumpToState(s,r){if(r<0||r>=s.length){throw new Error(`Invalid event index: ${r}`)}for(const i of s){const n=i.data;if(isOmittedStorageValue(n?.value)||isOmittedStorageValue(n?.prevValue)||isOmittedStorageValue(n?.pairs)||isOmittedStorageValue(n?.prevPairs)){throw new Error("Cannot jump: some event values are still on the device \u2014 fetch getEventDetail first")}}const e=new Map;for(let i=0;i<=r;i++){applyEventToStateMap(s[i],e)}const t=new Set;for(const i of s){collectEventKeys(i,t)}const a=[];const o=[];for(const i of t){if((0,_sharedUi.isDevToolsStorageKey)(i))continue;const n=e.get(i);if(n===void 0||n===null){o.push(i)}else{a.push([i,n])}}if(o.length>0){await(0,_asyncStorageCompat.removeMany)(o)}if(a.length>0){await(0,_asyncStorageCompat.writeMany)(a)}}function collectEventKeys(s,r){const{data:e}=s;if(!e)return;if(e.key)r.add(e.key);if(e.keys)for(const t of e.keys)r.add(t);if(e.pairs)for(const[t]of e.pairs)r.add(t);if(e.prevPairs)for(const[t]of e.prevPairs)r.add(t)}function applyEventToStateMap(s,r){const{action:e,data:t}=s;switch(e){case"setItem":if(t?.key&&t?.value!==void 0){r.set(t.key,t.value)}break;case"removeItem":if(t?.key){r.set(t.key,null)}break;case"mergeItem":if(t?.key&&t?.value!==void 0){const a=r.get(t.key);if(a){try{const o=JSON.parse(a);const i=JSON.parse(t.value);const n={...o,...i};r.set(t.key,JSON.stringify(n))}catch{r.set(t.key,t.value)}}else{r.set(t.key,t.value)}}break;case"multiSet":if(t?.pairs){for(const[a,o]of t.pairs){r.set(a,o)}}break;case"multiRemove":if(t?.keys){for(const a of t.keys){r.set(a,null)}}break;case"multiMerge":if(t?.pairs){for(const[a,o]of t.pairs){const i=r.get(a);if(i){try{const n=JSON.parse(i);const c=JSON.parse(o);const u={...n,...c};r.set(a,JSON.stringify(u))}catch{r.set(a,o)}}else{r.set(a,o)}}}break;case"clear":r.clear();break}}function canUndo(s){const{action:r,data:e}=s;switch(r){case"setItem":case"mergeItem":case"removeItem":return!!e?.key&&!isOmittedStorageValue(e.prevValue);case"multiSet":case"multiRemove":case"multiMerge":case"clear":return!!e?.prevPairs&&e.prevPairs.length>0&&!isOmittedStorageValue(e.prevPairs);default:return false}}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.canUndo=canUndo;exports.jumpToState=jumpToState;exports.undoOperation=undoOperation;var _sharedUi=require("@buoy-gg/shared-ui");var _appAsyncStorage=_interopRequireDefault(require("./appAsyncStorage"));var _asyncStorageCompat=require("./asyncStorageCompat");function _interopRequireDefault(s){return s&&s.__esModule?s:{default:s}}function isOmittedStorageValue(s){return!!s&&typeof s==="object"&&s.__buoyValueOnDevice===true}async function undoOperation(s){const{action:r,data:e}=s;if(isOmittedStorageValue(e?.prevValue)||isOmittedStorageValue(e?.prevPairs)){throw new Error("Cannot undo: previous value is still on the device \u2014 fetch getEventDetail first")}{switch(r){case"setItem":case"mergeItem":if(e?.key){if(e.prevValue===null||e.prevValue===void 0){await _appAsyncStorage.default.removeItem(e.key)}else{await _appAsyncStorage.default.setItem(e.key,e.prevValue)}}break;case"removeItem":if(e?.key&&e.prevValue!==null&&e.prevValue!==void 0){await _appAsyncStorage.default.setItem(e.key,e.prevValue)}break;case"multiSet":case"multiMerge":if(e?.prevPairs&&e.prevPairs.length>0){for(const[t,a]of e.prevPairs){if(a===null){await _appAsyncStorage.default.removeItem(t)}else{await _appAsyncStorage.default.setItem(t,a)}}}break;case"multiRemove":if(e?.prevPairs&&e.prevPairs.length>0){for(const[t,a]of e.prevPairs){if(a!==null){await _appAsyncStorage.default.setItem(t,a)}}}break;case"clear":if(e?.prevPairs&&e.prevPairs.length>0){const t=e.prevPairs.filter(([,a])=>a!==null);if(t.length>0){await(0,_asyncStorageCompat.writeMany)(t)}}break;default:throw new Error(`Cannot undo unknown action type: ${r}`)}}}async function jumpToState(s,r){if(r<0||r>=s.length){throw new Error(`Invalid event index: ${r}`)}for(const i of s){const n=i.data;if(isOmittedStorageValue(n?.value)||isOmittedStorageValue(n?.prevValue)||isOmittedStorageValue(n?.pairs)||isOmittedStorageValue(n?.prevPairs)){throw new Error("Cannot jump: some event values are still on the device \u2014 fetch getEventDetail first")}}const e=new Map;for(let i=0;i<=r;i++){applyEventToStateMap(s[i],e)}const t=new Set;for(const i of s){collectEventKeys(i,t)}const a=[];const o=[];for(const i of t){if((0,_sharedUi.isDevToolsStorageKey)(i))continue;const n=e.get(i);if(n===void 0||n===null){o.push(i)}else{a.push([i,n])}}if(o.length>0){await(0,_asyncStorageCompat.removeMany)(o)}if(a.length>0){await(0,_asyncStorageCompat.writeMany)(a)}}function collectEventKeys(s,r){const{data:e}=s;if(!e)return;if(e.key)r.add(e.key);if(e.keys)for(const t of e.keys)r.add(t);if(e.pairs)for(const[t]of e.pairs)r.add(t);if(e.prevPairs)for(const[t]of e.prevPairs)r.add(t)}function applyEventToStateMap(s,r){const{action:e,data:t}=s;switch(e){case"setItem":if(t?.key&&t?.value!==void 0){r.set(t.key,t.value)}break;case"removeItem":if(t?.key){r.set(t.key,null)}break;case"mergeItem":if(t?.key&&t?.value!==void 0){const a=r.get(t.key);if(a){try{const o=JSON.parse(a);const i=JSON.parse(t.value);const n={...o,...i};r.set(t.key,JSON.stringify(n))}catch{r.set(t.key,t.value)}}else{r.set(t.key,t.value)}}break;case"multiSet":if(t?.pairs){for(const[a,o]of t.pairs){r.set(a,o)}}break;case"multiRemove":if(t?.keys){for(const a of t.keys){r.set(a,null)}}break;case"multiMerge":if(t?.pairs){for(const[a,o]of t.pairs){const i=r.get(a);if(i){try{const n=JSON.parse(i);const u=JSON.parse(o);const c={...n,...u};r.set(a,JSON.stringify(c))}catch{r.set(a,o)}}else{r.set(a,o)}}}break;case"clear":r.clear();break}}function canUndo(s){const{action:r,data:e}=s;switch(r){case"setItem":case"mergeItem":case"removeItem":return!!e?.key&&!isOmittedStorageValue(e.prevValue);case"multiSet":case"multiRemove":case"multiMerge":case"clear":return!!e?.prevPairs&&e.prevPairs.length>0&&!isOmittedStorageValue(e.prevPairs);default:return false}}
@@ -1 +1 @@
1
- "use strict";import{storageLabels as i}from"../utils/storageLabels";import{useState as V,useEffect as j}from"react";import{View as w,Text as k,StyleSheet as K,TouchableOpacity as y,Alert as s}from"react-native";import{Trash2 as f,CopyButton as I,SquareDashed as T,X as U,ProUpgradeModal as O,monoFont as W}from"@buoy-gg/shared-ui";import{macOSColors as D,night as t}from"@buoy-gg/shared-ui";import{useIsPro as _}from"@buoy-gg/license";import $ from"@react-native-async-storage/async-storage";import{jsx as e,jsxs as B}from"react/jsx-runtime";export function StorageActionButtons({copyValue:P,mmkvInstances:l=[],activeStorageType:u="all",onClearComplete:d,isSelectMode:a=false,onToggleSelectMode:C,selectedCount:m=0}){const[g,c]=V(false);const n=_();j(()=>{if(g&&n){c(false)}},[g,n]);const p=()=>{if(!n){c(true);return}s.alert(`Clear ${i.asyncFull}`,`Delete all ${i.asyncFull} keys? This cannot be undone.`,[{text:"Cancel",style:"cancel"},{text:"Clear",style:"destructive",onPress:async()=>{try{await $.clear();d?.()}catch(r){s.alert("Error",`Failed: ${r}`)}}}])};const E=(r,x)=>{if(!n){c(true);return}s.alert(`Clear ${x}`,`Delete all keys from ${x}? This cannot be undone.`,[{text:"Cancel",style:"cancel"},{text:"Clear",style:"destructive",onPress:()=>{try{const b=l.find(R=>R.id===r);if(b){b.instance.clearAll();d?.()}}catch(b){s.alert("Error",`Failed: ${b}`)}}}])};const F=()=>{if(!n){c(true);return}s.alert(`Clear All ${i.mmkv}`,`Delete all keys from ${l.length} instances? This cannot be undone.`,[{text:"Cancel",style:"cancel"},{text:"Clear All",style:"destructive",onPress:()=>{try{l.forEach(r=>r.instance.clearAll());d?.()}catch(r){s.alert("Error",`Failed: ${r}`)}}}])};const z=()=>{if(!n){c(true);return}s.alert("Clear All Storage","Delete all storage data? This cannot be undone.",[{text:"Cancel",style:"cancel"},{text:"Clear All",style:"destructive",onPress:async()=>{try{await $.clear();l.forEach(r=>r.instance.clearAll());d?.()}catch(r){s.alert("Error",`Failed: ${r}`)}}}])};const M=u==="all"||u==="async";const A=u==="all"||u==="mmkv";const h=u==="all";const S=M&&!h;const v=A&&!h;const L=A&&l.length>1&&!h;return B(w,{style:o.container,children:[C&&e(y,{onPress:C,testID:"buoy-storage-select-mode",accessibilityLabel:a?"Exit selection mode":"Select keys",accessibilityRole:"button",style:[o.actionButton,a&&o.actionButtonActive],children:a?B(w,{style:o.selectModeActiveContainer,children:[e(U,{size:14,color:t.color.accent}),m>0&&e(k,{style:o.selectedCountText,children:m})]}):e(T,{size:16,color:t.color.textSecondary})}),!a&&e(I,{value:P,size:16,testID:"buoy-storage-export-copy",buttonStyle:o.actionButton,colors:{idle:t.color.textSecondary,success:D.semantic.success,error:D.semantic.error}}),!a&&h&&e(y,{onPress:z,testID:"buoy-storage-clear-all",accessibilityLabel:"Clear all storage",accessibilityRole:"button",style:o.actionButton,children:e(f,{size:16,color:t.color.danger})}),!a&&S&&e(y,{onPress:p,testID:"buoy-storage-clear-async",accessibilityLabel:`Clear ${i.asyncFull}`,accessibilityRole:"button",style:o.actionButton,children:e(f,{size:16,color:t.color.danger})}),!a&&L&&e(y,{onPress:F,testID:"buoy-storage-clear-mmkv-all",accessibilityLabel:`Clear all ${i.mmkv} instances`,accessibilityRole:"button",style:o.actionButton,children:e(f,{size:16,color:t.color.danger})}),!a&&v&&l.length===1&&e(y,{onPress:()=>E(l[0].id,l[0].id),testID:"buoy-storage-clear-mmkv",accessibilityLabel:`Clear ${i.mmkv} instance`,accessibilityRole:"button",style:o.actionButton,children:e(f,{size:16,color:t.color.danger})}),e(O,{visible:g,onClose:()=>c(false),featureName:"Storage Editing"})]})}const o=K.create({container:{flexDirection:"row",alignItems:"center",gap:8},actionButton:{width:32,height:32,alignItems:"center",justifyContent:"center",borderRadius:6,backgroundColor:t.color.buttonSurface,borderWidth:1,borderColor:t.color.border},actionButtonActive:{backgroundColor:t.color.accentSoft,borderColor:t.color.accentBorderStrong},selectModeActiveContainer:{flexDirection:"row",alignItems:"center",gap:2},selectedCountText:{fontSize:10,fontWeight:"700",color:t.color.accent,fontFamily:W}});
1
+ "use strict";import{storageLabels as i}from"../utils/storageLabels";import{useState as V,useEffect as j}from"react";import{View as w,Text as k,StyleSheet as K,TouchableOpacity as y,Alert as s}from"react-native";import{Trash2 as f,CopyButton as I,SquareDashed as T,X as U,ProUpgradeModal as O,monoFont as W}from"@buoy-gg/shared-ui";import{macOSColors as D,night as t}from"@buoy-gg/shared-ui";import{useIsPro as _}from"@buoy-gg/license";import $ from"../utils/appAsyncStorage";import{jsx as e,jsxs as B}from"react/jsx-runtime";export function StorageActionButtons({copyValue:P,mmkvInstances:l=[],activeStorageType:u="all",onClearComplete:d,isSelectMode:a=false,onToggleSelectMode:C,selectedCount:m=0}){const[g,c]=V(false);const n=_();j(()=>{if(g&&n){c(false)}},[g,n]);const p=()=>{if(!n){c(true);return}s.alert(`Clear ${i.asyncFull}`,`Delete all ${i.asyncFull} keys? This cannot be undone.`,[{text:"Cancel",style:"cancel"},{text:"Clear",style:"destructive",onPress:async()=>{try{await $.clear();d?.()}catch(r){s.alert("Error",`Failed: ${r}`)}}}])};const E=(r,x)=>{if(!n){c(true);return}s.alert(`Clear ${x}`,`Delete all keys from ${x}? This cannot be undone.`,[{text:"Cancel",style:"cancel"},{text:"Clear",style:"destructive",onPress:()=>{try{const b=l.find(R=>R.id===r);if(b){b.instance.clearAll();d?.()}}catch(b){s.alert("Error",`Failed: ${b}`)}}}])};const F=()=>{if(!n){c(true);return}s.alert(`Clear All ${i.mmkv}`,`Delete all keys from ${l.length} instances? This cannot be undone.`,[{text:"Cancel",style:"cancel"},{text:"Clear All",style:"destructive",onPress:()=>{try{l.forEach(r=>r.instance.clearAll());d?.()}catch(r){s.alert("Error",`Failed: ${r}`)}}}])};const z=()=>{if(!n){c(true);return}s.alert("Clear All Storage","Delete all storage data? This cannot be undone.",[{text:"Cancel",style:"cancel"},{text:"Clear All",style:"destructive",onPress:async()=>{try{await $.clear();l.forEach(r=>r.instance.clearAll());d?.()}catch(r){s.alert("Error",`Failed: ${r}`)}}}])};const M=u==="all"||u==="async";const A=u==="all"||u==="mmkv";const h=u==="all";const S=M&&!h;const v=A&&!h;const L=A&&l.length>1&&!h;return B(w,{style:o.container,children:[C&&e(y,{onPress:C,testID:"buoy-storage-select-mode",accessibilityLabel:a?"Exit selection mode":"Select keys",accessibilityRole:"button",style:[o.actionButton,a&&o.actionButtonActive],children:a?B(w,{style:o.selectModeActiveContainer,children:[e(U,{size:14,color:t.color.accent}),m>0&&e(k,{style:o.selectedCountText,children:m})]}):e(T,{size:16,color:t.color.textSecondary})}),!a&&e(I,{value:P,size:16,testID:"buoy-storage-export-copy",buttonStyle:o.actionButton,colors:{idle:t.color.textSecondary,success:D.semantic.success,error:D.semantic.error}}),!a&&h&&e(y,{onPress:z,testID:"buoy-storage-clear-all",accessibilityLabel:"Clear all storage",accessibilityRole:"button",style:o.actionButton,children:e(f,{size:16,color:t.color.danger})}),!a&&S&&e(y,{onPress:p,testID:"buoy-storage-clear-async",accessibilityLabel:`Clear ${i.asyncFull}`,accessibilityRole:"button",style:o.actionButton,children:e(f,{size:16,color:t.color.danger})}),!a&&L&&e(y,{onPress:F,testID:"buoy-storage-clear-mmkv-all",accessibilityLabel:`Clear all ${i.mmkv} instances`,accessibilityRole:"button",style:o.actionButton,children:e(f,{size:16,color:t.color.danger})}),!a&&v&&l.length===1&&e(y,{onPress:()=>E(l[0].id,l[0].id),testID:"buoy-storage-clear-mmkv",accessibilityLabel:`Clear ${i.mmkv} instance`,accessibilityRole:"button",style:o.actionButton,children:e(f,{size:16,color:t.color.danger})}),e(O,{visible:g,onClose:()=>c(false),featureName:"Storage Editing"})]})}const o=K.create({container:{flexDirection:"row",alignItems:"center",gap:8},actionButton:{width:32,height:32,alignItems:"center",justifyContent:"center",borderRadius:6,backgroundColor:t.color.buttonSurface,borderWidth:1,borderColor:t.color.border},actionButtonActive:{backgroundColor:t.color.accentSoft,borderColor:t.color.accentBorderStrong},selectModeActiveContainer:{flexDirection:"row",alignItems:"center",gap:2},selectedCountText:{fontSize:10,fontWeight:"700",color:t.color.accent,fontFamily:W}});
@@ -1 +1 @@
1
- "use strict";import{View as w,Text as k,StyleSheet as ft}from"react-native";import{useState as P,useCallback as f,useMemo as g,useEffect as j,useRef as dt}from"react";import H from"@react-native-async-storage/async-storage";import{formatRelativeTime as E,macOSColors as I,night as h,parseValue as N,devToolsStorageKeys as z,GitBranch as ut,EventStepperFooter as pt,EventHistoryViewer as gt,copyToClipboard as ht,ProUpgradeModal as St,monoFont as G}from"@buoy-gg/shared-ui";import{useIsPro as bt}from"@buoy-gg/license";import{ABSENT_VALUE as Tt}from"../utils/lineDiff";import{ThemedSplitView as vt}from"./DiffViewer/modes/ThemedSplitView";import{diffThemes as yt}from"./DiffViewer/themes/diffThemes";import{TreeDiffViewer as xt}from"./DiffViewer/TreeDiffViewer";import{translateStorageAction as J}from"../utils/storageActionHelpers";import{StorageEventActionButton as B}from"./StorageEventActionButton";import{undoOperation as Mt,jumpToState as Vt,canUndo as wt}from"../utils/storageTimeTravelUtils";import{jsx as l,jsxs as K,Fragment as Pt}from"react/jsx-runtime";const T=-1;const R={prior:{label:"BEFORE #1",timestamp:"value before first event",relativeTime:"not captured",badge:"PRIOR"},absent:{label:"NO PRIOR VALUE",timestamp:"key did not exist",relativeTime:"created here",badge:"ABSENT"},scanned:{label:"ALREADY PRESENT",timestamp:"value found at startup",relativeTime:"not a write",badge:"SCANNED"}};function C(a){switch(a){case"setItem":case"multiSet":return I.semantic.success;case"removeItem":case"multiRemove":case"clear":return I.semantic.error;case"mergeItem":case"multiMerge":return I.semantic.info;default:return I.text.muted}}function jt(a){if(a===null)return"null";if(a===void 0)return"undefined";if(Array.isArray(a))return"array";return typeof a}function Y(a){const t=String(a.getHours()).padStart(2,"0");const u=String(a.getMinutes()).padStart(2,"0");const v=String(a.getSeconds()).padStart(2,"0");const c=String(a.getMilliseconds()).padStart(3,"0");return`${t}:${u}:${v}.${c}`}const Et={hideLineNumbers:false,disableWordDiff:false,showDiffOnly:false,compareMethod:"words",contextLines:3,lineOffset:0};const It=[];export function StorageEventDetailContent({conversation:a,selectedEventIndex:t=0,onEventIndexChange:u=()=>{},disableInternalFooter:v=false}){const c=bt();const[V,y]=P(false);const[x,$]=P("split");const[r,D]=P(Math.max(T,t-1));const[i,L]=P(t);const W=dt(false);const b=g(()=>a.events.sort((o,d)=>o.timestamp.getTime()-d.timestamp.getTime()),[a.events]);const s=b.length;j(()=>{if(W.current)return;const o=async()=>{try{const d=await H.getItem(z.storage.diffViewerMode());if(d==="split"||d==="tree"){$(d)}W.current=true}catch{}};o()},[]);j(()=>{const o=Math.min(s-1,Math.max(0,t));const d=Math.max(T,Math.min(o-1,t-1));D(d);L(o)},[t,s]);const X=f(async o=>{$(o);try{await H.setItem(z.storage.diffViewerMode(),o)}catch{}},[]);const e=b[t];const Nt=e?.action;const M=r===T;const m=M?void 0:b[Math.max(0,Math.min(s-1,r))];const n=b[Math.max(0,Math.min(s-1,i))];const p=g(()=>{const o=n?.data;if(o?.initialScan)return"scanned";return o?.prevValue===null||o?.prevValue===void 0?"absent":"prior"},[n]);const _=g(()=>{if(p==="absent")return Tt;if(p==="scanned")return N(n?.data?.value);return N(n?.data?.prevValue)},[p,n]);const q=g(()=>M?{index:T,label:R[p].label,timestamp:R[p].timestamp,relativeTime:R[p].relativeTime,badge:l(w,{style:[S.actionBadgeSmall,{backgroundColor:`${h.color.textTertiary}20`}],children:l(k,{style:[S.actionTextSmall,{color:h.color.textTertiary}],children:R[p].badge})})}:{index:r,label:`#${r+1} / ${s}`,timestamp:m?Y(m.timestamp):"",relativeTime:m?E(m.timestamp):"",badge:m?l(w,{style:[S.actionBadgeSmall,{backgroundColor:`${C(m.action)}20`}],children:l(k,{style:[S.actionTextSmall,{color:C(m.action)}],children:J(m.action)})}):void 0},[r,m,s,M,p]);const Q=g(()=>({index:i,label:`#${i+1} / ${s}`,timestamp:n?Y(n.timestamp):"",relativeTime:n?E(n.timestamp):"",badge:n?l(w,{style:[S.actionBadgeSmall,{backgroundColor:`${C(n.action)}20`}],children:l(k,{style:[S.actionTextSmall,{color:C(n.action)}],children:J(n.action)})}):void 0}),[i,n,s]);const Z=g(()=>[{key:"tree",label:"TREE VIEW"},{key:"split",label:"SPLIT VIEW"}],[]);const tt=f(()=>{if(r>T){D(r-1)}},[r]);const et=f(()=>{if(r<i-1){D(r+1)}},[r,i]);const ot=f(()=>{if(i>r+1){L(i-1)}},[i,r]);const at=f(()=>{if(i<s-1){L(i+1)}},[i,s]);const F=g(()=>M?_:N(m?.data?.value??null),[M,_,m]);const A=g(()=>N(n?.data?.value),[n]);const rt=f(()=>{if(x==="split"){return l(vt,{oldValue:F,newValue:A,differences:It,theme:yt.devToolsDefault,options:Et,showThemeName:false,scrollEnabled:false})}return l(xt,{oldValue:F,newValue:A,scrollEnabled:false})},[F,A,x]);const nt=f(()=>{u(Math.max(0,t-1))},[t,u]);const it=f(()=>{u(Math.min(s-1,t+1))},[t,s,u]);const st=f(async()=>{if(!c){y(true);return}if(!e||e.storageType==="mmkv")return;try{await Mt(e)}catch{}},[e,c]);const lt=f(async()=>{if(!c){y(true);return}if(!e||e.storageType==="mmkv")return;const o=b.filter(O=>O.storageType!=="mmkv");const d=o.findIndex(O=>O.timestamp.getTime()===e.timestamp.getTime());if(d===-1)return;try{await Vt(o,d)}catch{}},[e,b,c]);const ct=f(async()=>{if(!e)return;const o={action:e.action,timestamp:e.timestamp.toISOString(),data:e.data};await ht(o)},[e]);const U=e?.storageType!=="mmkv";const mt=U&&e&&wt(e);return K(Pt,{children:[U&&K(w,{style:S.actionButtonsContainer,children:[l(B,{type:"undo",text:"UNDO",onPress:st,disabled:!mt,locked:!c}),l(B,{type:"jump",text:"JUMP",onPress:lt,locked:!c}),l(B,{type:"copy",text:"COPY",onPress:ct})]}),l(gt,{activeView:"diff",diffViewLabel:"DIFF VIEW",diffViewDescription:"Compare changes between versions",diffViewIcon:ut,diffModeTabs:Z,activeDiffMode:x,onDiffModeChange:X,renderDiffContent:rt,scrollDiffSection:true,leftEvent:q,rightEvent:Q,showCompareNavigation:true,onLeftPrevious:tt,onLeftNext:et,onRightPrevious:ot,onRightNext:at,canLeftPrevious:r>T,canLeftNext:r<i-1,canRightPrevious:i>r+1,canRightNext:i<s-1,disableInternalFooter:v,footerCurrentIndex:t,footerTotalItems:s,footerItemLabel:"Event",footerSubtitle:E(e?.timestamp),onFooterPrevious:nt,onFooterNext:it}),l(St,{visible:V,onClose:()=>y(false),featureName:"Storage Time-Travel"})]})}export function StorageEventDetailFooter({conversation:a,selectedEventIndex:t=0,onEventIndexChange:u=()=>{},applySafeAreaInset:v=true}){const c=a.events.sort((y,x)=>y.timestamp.getTime()-x.timestamp.getTime());const V=c.length;return l(pt,{currentIndex:t,totalItems:V,onPrevious:()=>u(Math.max(0,t-1)),onNext:()=>u(Math.min(V-1,t+1)),itemLabel:"Event",subtitle:E(c[t]?.timestamp),applySafeAreaInset:v})}const S=ft.create({actionButtonsContainer:{flexDirection:"row",justifyContent:"center",alignItems:"center",gap:8,paddingHorizontal:12,paddingVertical:10,backgroundColor:h.color.surface,borderBottomWidth:1,borderBottomColor:h.color.border},valueBox:{backgroundColor:h.color.bg,borderRadius:6,borderWidth:1,borderColor:h.color.border,padding:8},valueText:{fontSize:12,color:h.color.text,fontFamily:G,lineHeight:18},actionBadgeSmall:{paddingHorizontal:6,paddingVertical:1,borderRadius:3},actionTextSmall:{fontSize:8,fontWeight:"700",fontFamily:G}});
1
+ "use strict";import{View as w,Text as k,StyleSheet as ft}from"react-native";import{useState as P,useCallback as f,useMemo as g,useEffect as j,useRef as dt}from"react";import H from"../utils/appAsyncStorage";import{formatRelativeTime as E,macOSColors as I,night as h,parseValue as N,devToolsStorageKeys as z,GitBranch as ut,EventStepperFooter as pt,EventHistoryViewer as gt,copyToClipboard as ht,ProUpgradeModal as St,monoFont as G}from"@buoy-gg/shared-ui";import{useIsPro as bt}from"@buoy-gg/license";import{ABSENT_VALUE as Tt}from"../utils/lineDiff";import{ThemedSplitView as vt}from"./DiffViewer/modes/ThemedSplitView";import{diffThemes as yt}from"./DiffViewer/themes/diffThemes";import{TreeDiffViewer as xt}from"./DiffViewer/TreeDiffViewer";import{translateStorageAction as J}from"../utils/storageActionHelpers";import{StorageEventActionButton as B}from"./StorageEventActionButton";import{undoOperation as Mt,jumpToState as Vt,canUndo as wt}from"../utils/storageTimeTravelUtils";import{jsx as l,jsxs as K,Fragment as Pt}from"react/jsx-runtime";const T=-1;const R={prior:{label:"BEFORE #1",timestamp:"value before first event",relativeTime:"not captured",badge:"PRIOR"},absent:{label:"NO PRIOR VALUE",timestamp:"key did not exist",relativeTime:"created here",badge:"ABSENT"},scanned:{label:"ALREADY PRESENT",timestamp:"value found at startup",relativeTime:"not a write",badge:"SCANNED"}};function C(a){switch(a){case"setItem":case"multiSet":return I.semantic.success;case"removeItem":case"multiRemove":case"clear":return I.semantic.error;case"mergeItem":case"multiMerge":return I.semantic.info;default:return I.text.muted}}function jt(a){if(a===null)return"null";if(a===void 0)return"undefined";if(Array.isArray(a))return"array";return typeof a}function Y(a){const t=String(a.getHours()).padStart(2,"0");const u=String(a.getMinutes()).padStart(2,"0");const v=String(a.getSeconds()).padStart(2,"0");const c=String(a.getMilliseconds()).padStart(3,"0");return`${t}:${u}:${v}.${c}`}const Et={hideLineNumbers:false,disableWordDiff:false,showDiffOnly:false,compareMethod:"words",contextLines:3,lineOffset:0};const It=[];export function StorageEventDetailContent({conversation:a,selectedEventIndex:t=0,onEventIndexChange:u=()=>{},disableInternalFooter:v=false}){const c=bt();const[V,y]=P(false);const[x,$]=P("split");const[r,D]=P(Math.max(T,t-1));const[i,L]=P(t);const W=dt(false);const b=g(()=>a.events.sort((o,d)=>o.timestamp.getTime()-d.timestamp.getTime()),[a.events]);const s=b.length;j(()=>{if(W.current)return;const o=async()=>{try{const d=await H.getItem(z.storage.diffViewerMode());if(d==="split"||d==="tree"){$(d)}W.current=true}catch{}};o()},[]);j(()=>{const o=Math.min(s-1,Math.max(0,t));const d=Math.max(T,Math.min(o-1,t-1));D(d);L(o)},[t,s]);const X=f(async o=>{$(o);try{await H.setItem(z.storage.diffViewerMode(),o)}catch{}},[]);const e=b[t];const Nt=e?.action;const M=r===T;const m=M?void 0:b[Math.max(0,Math.min(s-1,r))];const n=b[Math.max(0,Math.min(s-1,i))];const p=g(()=>{const o=n?.data;if(o?.initialScan)return"scanned";return o?.prevValue===null||o?.prevValue===void 0?"absent":"prior"},[n]);const _=g(()=>{if(p==="absent")return Tt;if(p==="scanned")return N(n?.data?.value);return N(n?.data?.prevValue)},[p,n]);const q=g(()=>M?{index:T,label:R[p].label,timestamp:R[p].timestamp,relativeTime:R[p].relativeTime,badge:l(w,{style:[S.actionBadgeSmall,{backgroundColor:`${h.color.textTertiary}20`}],children:l(k,{style:[S.actionTextSmall,{color:h.color.textTertiary}],children:R[p].badge})})}:{index:r,label:`#${r+1} / ${s}`,timestamp:m?Y(m.timestamp):"",relativeTime:m?E(m.timestamp):"",badge:m?l(w,{style:[S.actionBadgeSmall,{backgroundColor:`${C(m.action)}20`}],children:l(k,{style:[S.actionTextSmall,{color:C(m.action)}],children:J(m.action)})}):void 0},[r,m,s,M,p]);const Q=g(()=>({index:i,label:`#${i+1} / ${s}`,timestamp:n?Y(n.timestamp):"",relativeTime:n?E(n.timestamp):"",badge:n?l(w,{style:[S.actionBadgeSmall,{backgroundColor:`${C(n.action)}20`}],children:l(k,{style:[S.actionTextSmall,{color:C(n.action)}],children:J(n.action)})}):void 0}),[i,n,s]);const Z=g(()=>[{key:"tree",label:"TREE VIEW"},{key:"split",label:"SPLIT VIEW"}],[]);const tt=f(()=>{if(r>T){D(r-1)}},[r]);const et=f(()=>{if(r<i-1){D(r+1)}},[r,i]);const ot=f(()=>{if(i>r+1){L(i-1)}},[i,r]);const at=f(()=>{if(i<s-1){L(i+1)}},[i,s]);const F=g(()=>M?_:N(m?.data?.value??null),[M,_,m]);const A=g(()=>N(n?.data?.value),[n]);const rt=f(()=>{if(x==="split"){return l(vt,{oldValue:F,newValue:A,differences:It,theme:yt.devToolsDefault,options:Et,showThemeName:false,scrollEnabled:false})}return l(xt,{oldValue:F,newValue:A,scrollEnabled:false})},[F,A,x]);const nt=f(()=>{u(Math.max(0,t-1))},[t,u]);const it=f(()=>{u(Math.min(s-1,t+1))},[t,s,u]);const st=f(async()=>{if(!c){y(true);return}if(!e||e.storageType==="mmkv")return;try{await Mt(e)}catch{}},[e,c]);const lt=f(async()=>{if(!c){y(true);return}if(!e||e.storageType==="mmkv")return;const o=b.filter(O=>O.storageType!=="mmkv");const d=o.findIndex(O=>O.timestamp.getTime()===e.timestamp.getTime());if(d===-1)return;try{await Vt(o,d)}catch{}},[e,b,c]);const ct=f(async()=>{if(!e)return;const o={action:e.action,timestamp:e.timestamp.toISOString(),data:e.data};await ht(o)},[e]);const U=e?.storageType!=="mmkv";const mt=U&&e&&wt(e);return K(Pt,{children:[U&&K(w,{style:S.actionButtonsContainer,children:[l(B,{type:"undo",text:"UNDO",onPress:st,disabled:!mt,locked:!c}),l(B,{type:"jump",text:"JUMP",onPress:lt,locked:!c}),l(B,{type:"copy",text:"COPY",onPress:ct})]}),l(gt,{activeView:"diff",diffViewLabel:"DIFF VIEW",diffViewDescription:"Compare changes between versions",diffViewIcon:ut,diffModeTabs:Z,activeDiffMode:x,onDiffModeChange:X,renderDiffContent:rt,scrollDiffSection:true,leftEvent:q,rightEvent:Q,showCompareNavigation:true,onLeftPrevious:tt,onLeftNext:et,onRightPrevious:ot,onRightNext:at,canLeftPrevious:r>T,canLeftNext:r<i-1,canRightPrevious:i>r+1,canRightNext:i<s-1,disableInternalFooter:v,footerCurrentIndex:t,footerTotalItems:s,footerItemLabel:"Event",footerSubtitle:E(e?.timestamp),onFooterPrevious:nt,onFooterNext:it}),l(St,{visible:V,onClose:()=>y(false),featureName:"Storage Time-Travel"})]})}export function StorageEventDetailFooter({conversation:a,selectedEventIndex:t=0,onEventIndexChange:u=()=>{},applySafeAreaInset:v=true}){const c=a.events.sort((y,x)=>y.timestamp.getTime()-x.timestamp.getTime());const V=c.length;return l(pt,{currentIndex:t,totalItems:V,onPrevious:()=>u(Math.max(0,t-1)),onNext:()=>u(Math.min(V-1,t+1)),itemLabel:"Event",subtitle:E(c[t]?.timestamp),applySafeAreaInset:v})}const S=ft.create({actionButtonsContainer:{flexDirection:"row",justifyContent:"center",alignItems:"center",gap:8,paddingHorizontal:12,paddingVertical:10,backgroundColor:h.color.surface,borderBottomWidth:1,borderBottomColor:h.color.border},valueBox:{backgroundColor:h.color.bg,borderRadius:6,borderWidth:1,borderColor:h.color.border,padding:8},valueText:{fontSize:12,color:h.color.text,fontFamily:G,lineHeight:18},actionBadgeSmall:{paddingHorizontal:6,paddingVertical:1,borderRadius:3},actionTextSmall:{fontSize:8,fontWeight:"700",fontFamily:G}});
@@ -1 +1 @@
1
- "use strict";import{useState as g,useCallback as i,useEffect as ee,useRef as be,useMemo as y}from"react";import{View as S,TouchableOpacity as te,StyleSheet as lt,FlatList as Ee,Alert as ne}from"react-native";import oe from"@react-native-async-storage/async-storage";import{JsModal as it,ModalHeader as c,TabSelector as ct,parseValue as dt,devToolsStorageKeys as P,macOSColors as ut,night as d,ToolEmptyState as gt,Filter as yt,RefreshCw as pt,Search as mt,SearchBar as ft,PowerToggleButton as ht,ToolbarCopyButton as Ce,ToolbarClearButton as St,truncatePayload as _,TickProvider as Ie,useLimit as vt,TIER_LIMITS as Tt,windowDragProps as bt,usePersistedState as M,monoFont as L}from"@buoy-gg/shared-ui";import{StorageBrowserMode as Et}from"./StorageBrowserMode";import{StorageTypeFilterBar as Ct,countByStorageType as It}from"./StorageTypeFilterBar";import{clearAllAppStorage as xt,clearAllStorageIncludingDevTools as kt}from"../utils/clearAllStorage";import{ProFeatureBanner as wt}from"@buoy-gg/shared-ui";import{useStorageEvents as Bt}from"../hooks/useStorageEvents";import{StorageEventDetailContent as xe,StorageEventDetailFooter as ke}from"./StorageEventDetailContent";import{StorageEventFilterView as Ft}from"./StorageEventFilterView";import{StorageEventCard as we}from"./StorageEventCard";import{useIsPro as Pt}from"@buoy-gg/license";import{jsx as n,jsxs as p,Fragment as Be}from"react/jsx-runtime";export const FREE_TIER_EVENT_LIMIT=Tt["storage.events"].free;const re={getItem:r=>oe.getItem(r),setItem:(r,C)=>oe.setItem(r,C)};const At={storage:re,parse:r=>r==="browser"||r==="events"?r:void 0,serialize:r=>r};const Dt={storage:re,parse:r=>r==="true",serialize:r=>r.toString()};const Fe={storage:re,parse:r=>new Set(JSON.parse(r)),serialize:r=>JSON.stringify(Array.from(r))};const Rt={...Fe,parse:r=>{const C=JSON.parse(r);if(!C.includes("@react_buoy"))C.push("@react_buoy");return new Set(C)}};export function StorageModalWithTabs({visible:r,onClose:C,onBack:V,onMinimize:Pe,enableSharedModalDimensions:Ae=false,requiredStorageKeys:De=[],inline:Re=false,onTabChange:ae,onRefresh:se,onEventSelect:K}){const Kt=Pt();const N=vt("storage.events");const[B,Ke]=M(P.storage.activeTab(),"browser",At);ee(()=>{ae?.(B)},[B,ae]);const[le,ie]=g("");const[W,H]=g(null);const[j,$]=g(false);const[ce,Ne]=M(P.storage.isMonitoring(),true,Dt);const{events:F,clearEvents:de,isCapturing:He}=Bt({enabled:ce});const[G,A]=g(null);const[I,J]=g(null);const[h,v]=g(null);const[z,x]=g(0);const[D,Q]=g(false);const[T,ue]=M(P.storage.eventFilters(),new Set(["@react_buoy","@RNAsyncStorage","redux-persist","persist:"]),Rt);const[k,ge]=g("all");const[b,ze]=g(new Set(["async","mmkv","secure"]));const[Oe,_e]=M(P.storage.pinnedKeys(),new Set,Fe);const Nt=be(null);const ye=ce&&He;const[q,Me]=g("bottomSheet");const Le=i(e=>{Me(e)},[]);const Ve=i(()=>{Ne(e=>!e)},[]);const We=i(()=>{de();A(null);x(0)},[de]);const je=i(e=>{J(e);v(null)},[]);const pe=i(()=>{J(null);v(null)},[]);const me=i(e=>{ue(t=>{const o=new Set(t);if(o.has(e)){o.delete(e)}else{o.add(e)}return o})},[]);const fe=i(e=>{ue(t=>new Set([...t,e]))},[]);const $e=i(e=>{_e(t=>{const o=new Set(t);if(o.has(e)){o.delete(e)}else{o.add(e)}return o})},[]);const Ge=i(()=>{Q(!D)},[D]);const Je=i(e=>{ze(t=>{const o=new Set(t);if(o.has(e)){o.delete(e)}else{o.add(e)}return o})},[]);const U=be([]);const Qe=i(()=>{const e=U.current;return{timestamp:new Date().toISOString(),totalKeys:e.length,asyncStorage:e.filter(t=>t.storageType==="async").reduce((t,o)=>{t[o.key]=_(o.value);return t},{}),mmkv:e.filter(t=>t.storageType==="mmkv").reduce((t,o)=>{const a=o.instanceId||"default";if(!t[a])t[a]={};t[a][o.key]=_(o.value);return t},{}),secure:e.filter(t=>t.storageType==="secure").reduce((t,o)=>{t[o.key]=_(o.value);return t},{})}},[]);const Ht=i(async()=>{ne.alert("Clear Storage","Choose what to clear:",[{text:"Cancel",style:"cancel"},{text:"Clear App Storage",onPress:async()=>{try{await xt()}catch(e){ne.alert("Error","Failed to clear app storage")}}},{text:"Clear All (Including Dev Tools)",style:"destructive",onPress:async()=>{try{await kt()}catch(e){ne.alert("Error","Failed to clear all storage")}}}])},[]);const O=e=>{const t=dt(e);if(t===null)return"null";if(t===void 0)return"undefined";if(Array.isArray(t))return"array";if(typeof t==="boolean")return"boolean";if(typeof t==="number")return"number";if(typeof t==="string")return"string";if(typeof t==="object")return"object";return"undefined"};const[he,qe]=g([]);ee(()=>{const e=async()=>{try{const t=await oe.getAllKeys();qe([...t].sort())}catch(t){}};if(r){e()}},[r]);const Ue=y(()=>{const e=new Set(he);F.forEach(t=>{if(t.data?.key){e.add(t.data.key)}});return Array.from(e).sort()},[F,he]);const m=y(()=>{const e=new Map;F.forEach(t=>{if(!t.data?.key)return;const o=t.data.key;if(!b.has(t.storageType))return;const a=Array.from(T).some(w=>o.includes(w));if(a)return;const s=e.get(o);if(!s){e.set(o,{key:o,lastEvent:t,events:[t],totalOperations:1,currentValue:t.data.value,valueType:O(t.data.value),storageTypes:new Set([t.storageType])})}else{s.events.push(t);s.totalOperations++;s.storageTypes.add(t.storageType);if(t.timestamp>s.lastEvent.timestamp){s.lastEvent=t;s.currentValue=t.data.value;s.valueType=O(t.data.value)}}});return Array.from(e.values()).sort((t,o)=>o.lastEvent.timestamp.getTime()-t.lastEvent.timestamp.getTime())},[F,T,b]);const u=y(()=>{if(!G)return null;return m.find(e=>e.key===G)||null},[G,m]);const Ye=y(()=>{const e={};m.forEach(t=>{e[t.key]=t.totalOperations});return e},[m]);const Xe=y(()=>{const e={};m.forEach(t=>{e[t.key]=t.lastEvent.timestamp.getTime()});return e},[m]);const E=y(()=>{if(!I)return null;return m.find(e=>e.key===I)||null},[I,m]);ee(()=>{if(!K)return;const e=u?u:h!==null?E:null;const t=u?z:h;if(!e||t==null)return;const o=[...e.events].sort((w,Z)=>w.timestamp.getTime()-Z.timestamp.getTime());const a=o[t];const s=o[t-1];if(a)K(a);if(s)K(s)},[K,u,z,E,h]);const R=y(()=>{return F.filter(e=>{if(!e.data?.key)return false;if(!b.has(e.storageType))return false;const t=e.data.key;return!Array.from(T).some(o=>t.includes(o))})},[F,T,b]);const Ze=y(()=>It(R),[R]);const f=y(()=>{if(k==="all")return R;return R.filter(e=>e.storageType===k)},[R,k]);const et=i(()=>{return f.map(e=>({key:e.data?.key,action:e.action,value:_(e.data?.value),storageType:e.storageType,timestamp:e.timestamp.toISOString()}))},[f]);const tt=y(()=>f.slice(0,N),[f,N]);const Y=y(()=>Math.max(0,f.length-N),[f.length,N]);const nt=.8;const ot=i(e=>e.id,[]);const Se=i(e=>{const t=m.find(s=>s.key===e.data?.key);if(!t)return;const o=[...t.events].sort((s,w)=>s.timestamp.getTime()-w.timestamp.getTime());const a=o.findIndex(s=>s.timestamp.getTime()===e.timestamp.getTime());A(t.key);x(a>=0?a:0)},[m]);const rt=i(({item:e})=>{const t={key:e.data?.key||"",lastAction:e.action,totalOperations:1,lastEventTimestamp:e.timestamp,storageTypes:new Set([e.storageType]),valueType:O(e.data?.value)};return n(we,{data:t,onPress:()=>Se(e),testID:`buoy-storage-event-${e.id}`})},[Se]);if(!r)return null;const at=Ae?P.modal.root():P.storage.modal();const ve=()=>{if(D){return n(Ft,{ignoredPatterns:T,onTogglePattern:me,onAddPattern:fe,availableKeys:Ue,enabledStorageTypes:b,onToggleStorageType:Je})}if(B==="browser"){if(I&&E){if(h!==null){return n(S,{style:l.contentWrapper,children:n(xe,{conversation:E,selectedEventIndex:h,onEventIndexChange:v,disableInternalFooter:true})})}const t=[...E.events].sort((a,s)=>a.timestamp.getTime()-s.timestamp.getTime());const o=[...t].reverse();return n(Ee,{testID:"buoy-storage-history-list",style:l.flexFill,data:o,keyExtractor:a=>a.id,renderItem:({item:a})=>{const s=t.findIndex(Z=>Z.timestamp.getTime()===a.timestamp.getTime());const w={key:a.data?.key||"",lastAction:a.action,totalOperations:1,lastEventTimestamp:a.timestamp,storageTypes:new Set([a.storageType]),valueType:O(a.data?.value)};return n(we,{data:w,onPress:()=>v(s>=0?s:0),testID:`buoy-storage-history-event-${a.id}`})},contentContainerStyle:l.listContent,ItemSeparatorComponent:()=>n(S,{style:l.separator}),initialNumToRender:20})}return n(Et,{requiredStorageKeys:De,ignoredPatterns:T,onTogglePattern:me,onAddPattern:fe,searchQuery:le,storageDataRef:U,eventCountByKey:Ye,lastWriteByKey:Xe,onViewHistory:je,enabledStorageTypes:b,pinnedKeys:Oe,onTogglePin:$e,applySafeAreaInset:q==="bottomSheet",storageTypeFilter:k,onStorageTypeFilterChange:ge,detailKey:W,onOpenKey:H,onCloseDetail:()=>H(null)})}if(u){return n(S,{style:l.contentWrapper,children:n(xe,{conversation:u,selectedEventIndex:z,onEventIndexChange:x,disableInternalFooter:true})})}const e=n(S,{style:l.eventFilterBar,children:n(Ct,{active:k,onChange:ge,counts:Ze})});if(f.length===0){const t=k!=="all";return p(S,{style:l.flexFill,children:[e,n(gt,{testID:"buoy-storage-events-empty",...!ye?{otto:"paused",title:"Event listener is paused",message:"Press play to start monitoring"}:t?{otto:"filtering",title:`No ${k} events`,message:"Other backends have events \u2014 pick All Types to see them"}:{otto:"listening",title:"No storage events yet",message:"Storage operations will appear here"}})]})}return p(S,{style:l.flexFill,children:[e,n(Ee,{testID:"buoy-storage-events-list",style:l.flexFill,data:tt,renderItem:rt,keyExtractor:ot,onEndReachedThreshold:nt,contentContainerStyle:l.listContent,ListFooterComponent:Y>0?n(S,{style:l.lockedBannerContainer,children:n(wt,{featureName:`${Y} event${Y>1?"s":""} locked`,description:"Upgrade to Pro to unlock full event history"})}):null,initialNumToRender:10,maxToRenderPerBatch:10,windowSize:10})]})};const X=u&&u.events.length>1?n(ke,{conversation:u,selectedEventIndex:z,onEventIndexChange:x,applySafeAreaInset:q==="bottomSheet"}):E&&h!==null&&E.events.length>1?n(ke,{conversation:E,selectedEventIndex:h,onEventIndexChange:v,applySafeAreaInset:q==="bottomSheet"}):null;const st=D?()=>Q(false):h!==null?()=>v(null):I?pe:u?()=>{A(null);x(0)}:V;const Te=D?p(c,{children:[n(c.Navigation,{onBack:()=>Q(false)}),n(c.Content,{title:"Filters"})]}):I?p(c,{children:[n(c.Navigation,{onBack:h!==null?()=>v(null):pe}),n(c.Content,{title:`${I} History`,centered:true})]}):u?p(c,{children:[n(c.Navigation,{onBack:()=>{A(null);x(0)}}),n(c.Content,{title:u.key})]}):W?p(c,{children:[n(c.Navigation,{onBack:()=>H(null)}),n(c.Content,{title:W.key,centered:true,testID:"buoy-storage-detail-title"})]}):p(c,{children:[V&&n(c.Navigation,{onBack:V}),n(c.Content,{title:"",children:j?n(ft,{value:le,onChange:ie,onClear:()=>{ie("");$(false)},placeholder:"Search storage keys...",testID:"buoy-storage-search",autoFocus:true,onSubmitEditing:()=>$(false),returnKeyType:"search",containerStyle:l.headerSearchContainer}):n(ct,{tabs:[{key:"browser",label:"Storage"},{key:"events",label:`Events${f.length>0?` (${f.length})`:""}`}],activeTab:B,testIDPrefix:"buoy-storage-tab",onTabChange:e=>{Ke(e);J(null);v(null);A(null);x(0);H(null)}})}),p(c.Actions,{children:[se&&!j?n(te,{onPress:se,style:l.iconButton,testID:"buoy-storage-refresh",accessibilityLabel:"Refresh storage",accessibilityRole:"button",children:n(pt,{size:14,color:d.color.textSecondary})}):null,n(te,{onPress:Ge,testID:"buoy-storage-filters",accessibilityLabel:"Storage filters",accessibilityRole:"button",style:[l.iconButton,(T.size>0||b.size<3)&&l.activeFilterButton],children:n(yt,{size:14,color:T.size>0||b.size<3?d.color.accent:d.color.textSecondary})}),B==="browser"&&!j&&p(Be,{children:[n(te,{onPress:()=>$(true),testID:"buoy-storage-search-open",accessibilityLabel:"Open search",accessibilityRole:"button",style:l.iconButton,children:n(mt,{size:14,color:d.color.textSecondary})}),n(Ce,{value:Qe,disabled:U.current.length===0,buttonStyle:l.iconButton,testID:"buoy-storage-copy"})]}),B==="events"&&p(Be,{children:[n(Ce,{value:et,disabled:f.length===0,buttonStyle:l.iconButton,testID:"buoy-storage-events-copy"}),n(ht,{isEnabled:ye,onToggle:Ve,accessibilityLabel:"Toggle storage event monitoring",testID:"buoy-storage-power"}),n(St,{onPress:We,buttonStyle:l.iconButton,testID:"buoy-storage-clear-events"})]})]})]});if(Re){return n(Ie,{children:p(S,{style:l.inlineRoot,children:[n(S,{style:l.inlineHeader,...bt,children:Te}),ve(),X]})})}return n(Ie,{children:n(it,{visible:r,onClose:C,onBack:st,onMinimize:Pe,persistenceKey:at,header:{showToggleButton:true,customContent:Te},onModeChange:Le,enablePersistence:true,initialMode:"bottomSheet",enableGlitchEffects:true,styles:{},footer:X,footerHeight:X?68:0,disableScrollWrapper:true,children:ve()})})}export function StorageToolView(r={}){return n(StorageModalWithTabs,{...r,inline:true,visible:true,onClose:()=>{}})}const l=lt.create({inlineRoot:{flex:1,minHeight:0,backgroundColor:"transparent"},inlineHeader:{paddingHorizontal:12,paddingVertical:8,borderBottomWidth:1,borderBottomColor:ut.border.default,backgroundColor:"transparent"},headerSearchContainer:{flex:1},flexFill:{flex:1},iconButton:{width:32,height:32,borderRadius:8,backgroundColor:d.color.buttonSurface,borderWidth:1,borderColor:d.color.border,alignItems:"center",justifyContent:"center"},activeFilterButton:{backgroundColor:d.color.accentSoft,borderColor:d.color.accentBorderStrong},separator:{height:8},listContent:{paddingVertical:6},lockedBannerContainer:{marginTop:8,marginHorizontal:16},eventFilterBar:{paddingHorizontal:12,paddingTop:8,paddingBottom:4},emptyState:{flex:1,justifyContent:"center",alignItems:"center",padding:32},emptyTitle:{color:d.color.text,fontSize:16,fontWeight:"600",marginTop:16,marginBottom:8,fontFamily:L,letterSpacing:.5,textTransform:"uppercase"},emptySubtitle:{color:d.color.textSecondary,fontSize:14,textAlign:"center",fontFamily:L},eventNavigation:{flexDirection:"row",alignItems:"center",gap:8,paddingHorizontal:8},navButton:{padding:4,borderRadius:4},navButtonDisabled:{opacity:.3},eventCounter:{color:d.color.text,fontSize:12,fontWeight:"600",fontFamily:L,paddingHorizontal:8},headerTopRow:{flexDirection:"row",alignItems:"center",gap:8,marginBottom:12},keyNameContainer:{flex:1,flexDirection:"row",alignItems:"center",gap:6,backgroundColor:d.color.surfaceElevated,paddingHorizontal:10,paddingVertical:4,borderRadius:6,borderWidth:1,borderColor:d.color.border,height:28},keyNameText:{flex:1,fontSize:13,fontWeight:"600",color:d.color.accent,fontFamily:L,letterSpacing:.5},contentWrapper:{flex:1}});
1
+ "use strict";import{useState as g,useCallback as i,useEffect as ee,useRef as be,useMemo as y}from"react";import{View as S,TouchableOpacity as te,StyleSheet as lt,FlatList as Ee,Alert as ne}from"react-native";import oe from"../utils/appAsyncStorage";import{JsModal as it,ModalHeader as c,TabSelector as ct,parseValue as dt,devToolsStorageKeys as P,macOSColors as ut,night as d,ToolEmptyState as gt,Filter as yt,RefreshCw as pt,Search as mt,SearchBar as ft,PowerToggleButton as ht,ToolbarCopyButton as Ce,ToolbarClearButton as St,truncatePayload as _,TickProvider as Ie,useLimit as vt,TIER_LIMITS as Tt,windowDragProps as bt,usePersistedState as M,monoFont as L}from"@buoy-gg/shared-ui";import{StorageBrowserMode as Et}from"./StorageBrowserMode";import{StorageTypeFilterBar as Ct,countByStorageType as It}from"./StorageTypeFilterBar";import{clearAllAppStorage as xt,clearAllStorageIncludingDevTools as kt}from"../utils/clearAllStorage";import{ProFeatureBanner as wt}from"@buoy-gg/shared-ui";import{useStorageEvents as Bt}from"../hooks/useStorageEvents";import{StorageEventDetailContent as xe,StorageEventDetailFooter as ke}from"./StorageEventDetailContent";import{StorageEventFilterView as Ft}from"./StorageEventFilterView";import{StorageEventCard as we}from"./StorageEventCard";import{useIsPro as Pt}from"@buoy-gg/license";import{jsx as n,jsxs as p,Fragment as Be}from"react/jsx-runtime";export const FREE_TIER_EVENT_LIMIT=Tt["storage.events"].free;const re={getItem:r=>oe.getItem(r),setItem:(r,C)=>oe.setItem(r,C)};const At={storage:re,parse:r=>r==="browser"||r==="events"?r:void 0,serialize:r=>r};const Dt={storage:re,parse:r=>r==="true",serialize:r=>r.toString()};const Fe={storage:re,parse:r=>new Set(JSON.parse(r)),serialize:r=>JSON.stringify(Array.from(r))};const Rt={...Fe,parse:r=>{const C=JSON.parse(r);if(!C.includes("@react_buoy"))C.push("@react_buoy");return new Set(C)}};export function StorageModalWithTabs({visible:r,onClose:C,onBack:V,onMinimize:Pe,enableSharedModalDimensions:Ae=false,requiredStorageKeys:De=[],inline:Re=false,onTabChange:ae,onRefresh:se,onEventSelect:K}){const Kt=Pt();const N=vt("storage.events");const[B,Ke]=M(P.storage.activeTab(),"browser",At);ee(()=>{ae?.(B)},[B,ae]);const[le,ie]=g("");const[W,H]=g(null);const[j,$]=g(false);const[ce,Ne]=M(P.storage.isMonitoring(),true,Dt);const{events:F,clearEvents:de,isCapturing:He}=Bt({enabled:ce});const[G,A]=g(null);const[I,J]=g(null);const[h,v]=g(null);const[z,x]=g(0);const[D,Q]=g(false);const[T,ue]=M(P.storage.eventFilters(),new Set(["@react_buoy","@RNAsyncStorage","redux-persist","persist:"]),Rt);const[k,ge]=g("all");const[b,ze]=g(new Set(["async","mmkv","secure"]));const[Oe,_e]=M(P.storage.pinnedKeys(),new Set,Fe);const Nt=be(null);const ye=ce&&He;const[q,Me]=g("bottomSheet");const Le=i(e=>{Me(e)},[]);const Ve=i(()=>{Ne(e=>!e)},[]);const We=i(()=>{de();A(null);x(0)},[de]);const je=i(e=>{J(e);v(null)},[]);const pe=i(()=>{J(null);v(null)},[]);const me=i(e=>{ue(t=>{const o=new Set(t);if(o.has(e)){o.delete(e)}else{o.add(e)}return o})},[]);const fe=i(e=>{ue(t=>new Set([...t,e]))},[]);const $e=i(e=>{_e(t=>{const o=new Set(t);if(o.has(e)){o.delete(e)}else{o.add(e)}return o})},[]);const Ge=i(()=>{Q(!D)},[D]);const Je=i(e=>{ze(t=>{const o=new Set(t);if(o.has(e)){o.delete(e)}else{o.add(e)}return o})},[]);const U=be([]);const Qe=i(()=>{const e=U.current;return{timestamp:new Date().toISOString(),totalKeys:e.length,asyncStorage:e.filter(t=>t.storageType==="async").reduce((t,o)=>{t[o.key]=_(o.value);return t},{}),mmkv:e.filter(t=>t.storageType==="mmkv").reduce((t,o)=>{const a=o.instanceId||"default";if(!t[a])t[a]={};t[a][o.key]=_(o.value);return t},{}),secure:e.filter(t=>t.storageType==="secure").reduce((t,o)=>{t[o.key]=_(o.value);return t},{})}},[]);const Ht=i(async()=>{ne.alert("Clear Storage","Choose what to clear:",[{text:"Cancel",style:"cancel"},{text:"Clear App Storage",onPress:async()=>{try{await xt()}catch(e){ne.alert("Error","Failed to clear app storage")}}},{text:"Clear All (Including Dev Tools)",style:"destructive",onPress:async()=>{try{await kt()}catch(e){ne.alert("Error","Failed to clear all storage")}}}])},[]);const O=e=>{const t=dt(e);if(t===null)return"null";if(t===void 0)return"undefined";if(Array.isArray(t))return"array";if(typeof t==="boolean")return"boolean";if(typeof t==="number")return"number";if(typeof t==="string")return"string";if(typeof t==="object")return"object";return"undefined"};const[he,qe]=g([]);ee(()=>{const e=async()=>{try{const t=await oe.getAllKeys();qe([...t].sort())}catch(t){}};if(r){e()}},[r]);const Ue=y(()=>{const e=new Set(he);F.forEach(t=>{if(t.data?.key){e.add(t.data.key)}});return Array.from(e).sort()},[F,he]);const m=y(()=>{const e=new Map;F.forEach(t=>{if(!t.data?.key)return;const o=t.data.key;if(!b.has(t.storageType))return;const a=Array.from(T).some(w=>o.includes(w));if(a)return;const s=e.get(o);if(!s){e.set(o,{key:o,lastEvent:t,events:[t],totalOperations:1,currentValue:t.data.value,valueType:O(t.data.value),storageTypes:new Set([t.storageType])})}else{s.events.push(t);s.totalOperations++;s.storageTypes.add(t.storageType);if(t.timestamp>s.lastEvent.timestamp){s.lastEvent=t;s.currentValue=t.data.value;s.valueType=O(t.data.value)}}});return Array.from(e.values()).sort((t,o)=>o.lastEvent.timestamp.getTime()-t.lastEvent.timestamp.getTime())},[F,T,b]);const u=y(()=>{if(!G)return null;return m.find(e=>e.key===G)||null},[G,m]);const Ye=y(()=>{const e={};m.forEach(t=>{e[t.key]=t.totalOperations});return e},[m]);const Xe=y(()=>{const e={};m.forEach(t=>{e[t.key]=t.lastEvent.timestamp.getTime()});return e},[m]);const E=y(()=>{if(!I)return null;return m.find(e=>e.key===I)||null},[I,m]);ee(()=>{if(!K)return;const e=u?u:h!==null?E:null;const t=u?z:h;if(!e||t==null)return;const o=[...e.events].sort((w,Z)=>w.timestamp.getTime()-Z.timestamp.getTime());const a=o[t];const s=o[t-1];if(a)K(a);if(s)K(s)},[K,u,z,E,h]);const R=y(()=>{return F.filter(e=>{if(!e.data?.key)return false;if(!b.has(e.storageType))return false;const t=e.data.key;return!Array.from(T).some(o=>t.includes(o))})},[F,T,b]);const Ze=y(()=>It(R),[R]);const f=y(()=>{if(k==="all")return R;return R.filter(e=>e.storageType===k)},[R,k]);const et=i(()=>{return f.map(e=>({key:e.data?.key,action:e.action,value:_(e.data?.value),storageType:e.storageType,timestamp:e.timestamp.toISOString()}))},[f]);const tt=y(()=>f.slice(0,N),[f,N]);const Y=y(()=>Math.max(0,f.length-N),[f.length,N]);const nt=.8;const ot=i(e=>e.id,[]);const Se=i(e=>{const t=m.find(s=>s.key===e.data?.key);if(!t)return;const o=[...t.events].sort((s,w)=>s.timestamp.getTime()-w.timestamp.getTime());const a=o.findIndex(s=>s.timestamp.getTime()===e.timestamp.getTime());A(t.key);x(a>=0?a:0)},[m]);const rt=i(({item:e})=>{const t={key:e.data?.key||"",lastAction:e.action,totalOperations:1,lastEventTimestamp:e.timestamp,storageTypes:new Set([e.storageType]),valueType:O(e.data?.value)};return n(we,{data:t,onPress:()=>Se(e),testID:`buoy-storage-event-${e.id}`})},[Se]);if(!r)return null;const at=Ae?P.modal.root():P.storage.modal();const ve=()=>{if(D){return n(Ft,{ignoredPatterns:T,onTogglePattern:me,onAddPattern:fe,availableKeys:Ue,enabledStorageTypes:b,onToggleStorageType:Je})}if(B==="browser"){if(I&&E){if(h!==null){return n(S,{style:l.contentWrapper,children:n(xe,{conversation:E,selectedEventIndex:h,onEventIndexChange:v,disableInternalFooter:true})})}const t=[...E.events].sort((a,s)=>a.timestamp.getTime()-s.timestamp.getTime());const o=[...t].reverse();return n(Ee,{testID:"buoy-storage-history-list",style:l.flexFill,data:o,keyExtractor:a=>a.id,renderItem:({item:a})=>{const s=t.findIndex(Z=>Z.timestamp.getTime()===a.timestamp.getTime());const w={key:a.data?.key||"",lastAction:a.action,totalOperations:1,lastEventTimestamp:a.timestamp,storageTypes:new Set([a.storageType]),valueType:O(a.data?.value)};return n(we,{data:w,onPress:()=>v(s>=0?s:0),testID:`buoy-storage-history-event-${a.id}`})},contentContainerStyle:l.listContent,ItemSeparatorComponent:()=>n(S,{style:l.separator}),initialNumToRender:20})}return n(Et,{requiredStorageKeys:De,ignoredPatterns:T,onTogglePattern:me,onAddPattern:fe,searchQuery:le,storageDataRef:U,eventCountByKey:Ye,lastWriteByKey:Xe,onViewHistory:je,enabledStorageTypes:b,pinnedKeys:Oe,onTogglePin:$e,applySafeAreaInset:q==="bottomSheet",storageTypeFilter:k,onStorageTypeFilterChange:ge,detailKey:W,onOpenKey:H,onCloseDetail:()=>H(null)})}if(u){return n(S,{style:l.contentWrapper,children:n(xe,{conversation:u,selectedEventIndex:z,onEventIndexChange:x,disableInternalFooter:true})})}const e=n(S,{style:l.eventFilterBar,children:n(Ct,{active:k,onChange:ge,counts:Ze})});if(f.length===0){const t=k!=="all";return p(S,{style:l.flexFill,children:[e,n(gt,{testID:"buoy-storage-events-empty",...!ye?{otto:"paused",title:"Event listener is paused",message:"Press play to start monitoring"}:t?{otto:"filtering",title:`No ${k} events`,message:"Other backends have events \u2014 pick All Types to see them"}:{otto:"listening",title:"No storage events yet",message:"Storage operations will appear here"}})]})}return p(S,{style:l.flexFill,children:[e,n(Ee,{testID:"buoy-storage-events-list",style:l.flexFill,data:tt,renderItem:rt,keyExtractor:ot,onEndReachedThreshold:nt,contentContainerStyle:l.listContent,ListFooterComponent:Y>0?n(S,{style:l.lockedBannerContainer,children:n(wt,{featureName:`${Y} event${Y>1?"s":""} locked`,description:"Upgrade to Pro to unlock full event history"})}):null,initialNumToRender:10,maxToRenderPerBatch:10,windowSize:10})]})};const X=u&&u.events.length>1?n(ke,{conversation:u,selectedEventIndex:z,onEventIndexChange:x,applySafeAreaInset:q==="bottomSheet"}):E&&h!==null&&E.events.length>1?n(ke,{conversation:E,selectedEventIndex:h,onEventIndexChange:v,applySafeAreaInset:q==="bottomSheet"}):null;const st=D?()=>Q(false):h!==null?()=>v(null):I?pe:u?()=>{A(null);x(0)}:V;const Te=D?p(c,{children:[n(c.Navigation,{onBack:()=>Q(false)}),n(c.Content,{title:"Filters"})]}):I?p(c,{children:[n(c.Navigation,{onBack:h!==null?()=>v(null):pe}),n(c.Content,{title:`${I} History`,centered:true})]}):u?p(c,{children:[n(c.Navigation,{onBack:()=>{A(null);x(0)}}),n(c.Content,{title:u.key})]}):W?p(c,{children:[n(c.Navigation,{onBack:()=>H(null)}),n(c.Content,{title:W.key,centered:true,testID:"buoy-storage-detail-title"})]}):p(c,{children:[V&&n(c.Navigation,{onBack:V}),n(c.Content,{title:"",children:j?n(ft,{value:le,onChange:ie,onClear:()=>{ie("");$(false)},placeholder:"Search storage keys...",testID:"buoy-storage-search",autoFocus:true,onSubmitEditing:()=>$(false),returnKeyType:"search",containerStyle:l.headerSearchContainer}):n(ct,{tabs:[{key:"browser",label:"Storage"},{key:"events",label:`Events${f.length>0?` (${f.length})`:""}`}],activeTab:B,testIDPrefix:"buoy-storage-tab",onTabChange:e=>{Ke(e);J(null);v(null);A(null);x(0);H(null)}})}),p(c.Actions,{children:[se&&!j?n(te,{onPress:se,style:l.iconButton,testID:"buoy-storage-refresh",accessibilityLabel:"Refresh storage",accessibilityRole:"button",children:n(pt,{size:14,color:d.color.textSecondary})}):null,n(te,{onPress:Ge,testID:"buoy-storage-filters",accessibilityLabel:"Storage filters",accessibilityRole:"button",style:[l.iconButton,(T.size>0||b.size<3)&&l.activeFilterButton],children:n(yt,{size:14,color:T.size>0||b.size<3?d.color.accent:d.color.textSecondary})}),B==="browser"&&!j&&p(Be,{children:[n(te,{onPress:()=>$(true),testID:"buoy-storage-search-open",accessibilityLabel:"Open search",accessibilityRole:"button",style:l.iconButton,children:n(mt,{size:14,color:d.color.textSecondary})}),n(Ce,{value:Qe,disabled:U.current.length===0,buttonStyle:l.iconButton,testID:"buoy-storage-copy"})]}),B==="events"&&p(Be,{children:[n(Ce,{value:et,disabled:f.length===0,buttonStyle:l.iconButton,testID:"buoy-storage-events-copy"}),n(ht,{isEnabled:ye,onToggle:Ve,accessibilityLabel:"Toggle storage event monitoring",testID:"buoy-storage-power"}),n(St,{onPress:We,buttonStyle:l.iconButton,testID:"buoy-storage-clear-events"})]})]})]});if(Re){return n(Ie,{children:p(S,{style:l.inlineRoot,children:[n(S,{style:l.inlineHeader,...bt,children:Te}),ve(),X]})})}return n(Ie,{children:n(it,{visible:r,onClose:C,onBack:st,onMinimize:Pe,persistenceKey:at,header:{showToggleButton:true,customContent:Te},onModeChange:Le,enablePersistence:true,initialMode:"bottomSheet",enableGlitchEffects:true,styles:{},footer:X,footerHeight:X?68:0,disableScrollWrapper:true,children:ve()})})}export function StorageToolView(r={}){return n(StorageModalWithTabs,{...r,inline:true,visible:true,onClose:()=>{}})}const l=lt.create({inlineRoot:{flex:1,minHeight:0,backgroundColor:"transparent"},inlineHeader:{paddingHorizontal:12,paddingVertical:8,borderBottomWidth:1,borderBottomColor:ut.border.default,backgroundColor:"transparent"},headerSearchContainer:{flex:1},flexFill:{flex:1},iconButton:{width:32,height:32,borderRadius:8,backgroundColor:d.color.buttonSurface,borderWidth:1,borderColor:d.color.border,alignItems:"center",justifyContent:"center"},activeFilterButton:{backgroundColor:d.color.accentSoft,borderColor:d.color.accentBorderStrong},separator:{height:8},listContent:{paddingVertical:6},lockedBannerContainer:{marginTop:8,marginHorizontal:16},eventFilterBar:{paddingHorizontal:12,paddingTop:8,paddingBottom:4},emptyState:{flex:1,justifyContent:"center",alignItems:"center",padding:32},emptyTitle:{color:d.color.text,fontSize:16,fontWeight:"600",marginTop:16,marginBottom:8,fontFamily:L,letterSpacing:.5,textTransform:"uppercase"},emptySubtitle:{color:d.color.textSecondary,fontSize:14,textAlign:"center",fontFamily:L},eventNavigation:{flexDirection:"row",alignItems:"center",gap:8,paddingHorizontal:8},navButton:{padding:4,borderRadius:4},navButtonDisabled:{opacity:.3},eventCounter:{color:d.color.text,fontSize:12,fontWeight:"600",fontFamily:L,paddingHorizontal:8},headerTopRow:{flexDirection:"row",alignItems:"center",gap:8,marginBottom:12},keyNameContainer:{flex:1,flexDirection:"row",alignItems:"center",gap:6,backgroundColor:d.color.surfaceElevated,paddingHorizontal:10,paddingVertical:4,borderRadius:6,borderWidth:1,borderColor:d.color.border,height:28},keyNameText:{flex:1,fontSize:13,fontWeight:"600",color:d.color.accent,fontFamily:L,letterSpacing:.5},contentWrapper:{flex:1}});
@@ -1 +1 @@
1
- "use strict";import{useState as f,useEffect as j,useCallback as S,useRef as w}from"react";import K from"@react-native-async-storage/async-storage";import{readMany as E}from"../utils/asyncStorageCompat";import{requiredKeyAppliesTo as x}from"../utils/requiredStorageKeyScope";export function useAsyncStorageKeys(a=[]){const[T,p]=f([]);const[m,d]=f(true);const[h,y]=f(null);const V=JSON.stringify(a);const l=w(a);l.current=a;const u=S(async()=>{const g=l.current;d(true);y(null);try{const o=await K.getAllKeys();if(!o||o.length===0){p([]);d(false);return}const _=await E(o);const c=[];_.forEach(([t,n])=>{let r=n;if(n){try{r=JSON.parse(n)}catch{r=n}}const e=g.find(s=>{if(!x(s,"async"))return false;if(typeof s==="string")return s===t;return s.key===t});let i="optional_present";if(e){if(r===void 0||r===null){i="required_missing"}else if(typeof e==="object"&&e.expectedValue!==void 0){i=r===e.expectedValue?"required_present":"required_wrong_value"}else if(typeof e==="object"&&e.expectedType!==void 0){const s=r===null?"null":typeof r;i=s.toLowerCase()===e.expectedType.toLowerCase()?"required_present":"required_wrong_type"}else{i="required_present"}}const b={key:t,value:r,storageType:"async",status:i,category:e?"required":"optional",...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.push(b)});g.forEach(t=>{if(!x(t,"async"))return;const n=typeof t==="string"?t:t.key;const r=c.some(e=>e.key===n);if(!r){c.push({key:n,value:void 0,storageType:"async",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}})}});p(c)}catch(o){y(o instanceof Error?o:new Error("Failed to fetch storage data"));p([])}finally{d(false)}},[V]);j(()=>{u()},[u]);return{storageKeys:T,isLoading:m,error:h,refresh:u}}
1
+ "use strict";import{useState as f,useEffect as j,useCallback as S,useRef as w}from"react";import K from"../utils/appAsyncStorage";import{readMany as E}from"../utils/asyncStorageCompat";import{requiredKeyAppliesTo as x}from"../utils/requiredStorageKeyScope";export function useAsyncStorageKeys(a=[]){const[T,p]=f([]);const[m,d]=f(true);const[h,y]=f(null);const V=JSON.stringify(a);const l=w(a);l.current=a;const u=S(async()=>{const g=l.current;d(true);y(null);try{const o=await K.getAllKeys();if(!o||o.length===0){p([]);d(false);return}const _=await E(o);const c=[];_.forEach(([t,n])=>{let r=n;if(n){try{r=JSON.parse(n)}catch{r=n}}const e=g.find(s=>{if(!x(s,"async"))return false;if(typeof s==="string")return s===t;return s.key===t});let i="optional_present";if(e){if(r===void 0||r===null){i="required_missing"}else if(typeof e==="object"&&e.expectedValue!==void 0){i=r===e.expectedValue?"required_present":"required_wrong_value"}else if(typeof e==="object"&&e.expectedType!==void 0){const s=r===null?"null":typeof r;i=s.toLowerCase()===e.expectedType.toLowerCase()?"required_present":"required_wrong_type"}else{i="required_present"}}const b={key:t,value:r,storageType:"async",status:i,category:e?"required":"optional",...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.push(b)});g.forEach(t=>{if(!x(t,"async"))return;const n=typeof t==="string"?t:t.key;const r=c.some(e=>e.key===n);if(!r){c.push({key:n,value:void 0,storageType:"async",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}})}});p(c)}catch(o){y(o instanceof Error?o:new Error("Failed to fetch storage data"));p([])}finally{d(false)}},[V]);j(()=>{u()},[u]);return{storageKeys:T,isLoading:m,error:h,refresh:u}}