@buoy-gg/storage 7.0.41 → 7.0.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/README.md +11 -90
  2. package/lib/commonjs/index.js +1 -353
  3. package/lib/commonjs/preset.js +1 -85
  4. package/lib/commonjs/storage/components/DiffViewer/TreeDiffViewer.js +1 -36
  5. package/lib/commonjs/storage/components/DiffViewer/modes/ThemedSplitView.js +1 -12
  6. package/lib/commonjs/storage/components/DiffViewer/themes/diffThemes.js +1 -24
  7. package/lib/commonjs/storage/components/GameUIStorageBrowser.js +3 -1259
  8. package/lib/commonjs/storage/components/MMKVInstanceInfoPanel.js +1 -257
  9. package/lib/commonjs/storage/components/MMKVInstanceSelector.js +1 -419
  10. package/lib/commonjs/storage/components/SelectionActionBar.js +1 -207
  11. package/lib/commonjs/storage/components/StorageActionButtons.js +1 -242
  12. package/lib/commonjs/storage/components/StorageBrowserMode.js +1 -61
  13. package/lib/commonjs/storage/components/StorageEventActionButton.js +1 -121
  14. package/lib/commonjs/storage/components/StorageEventCard.js +1 -118
  15. package/lib/commonjs/storage/components/StorageEventDetailContent.js +1 -494
  16. package/lib/commonjs/storage/components/StorageEventFilterView.js +1 -160
  17. package/lib/commonjs/storage/components/StorageEventsSection.js +1 -24
  18. package/lib/commonjs/storage/components/StorageFilterCards.js +1 -231
  19. package/lib/commonjs/storage/components/StorageKeyCard.js +1 -520
  20. package/lib/commonjs/storage/components/StorageKeyDetailScreen.js +1 -579
  21. package/lib/commonjs/storage/components/StorageKeyRow.js +1 -559
  22. package/lib/commonjs/storage/components/StorageKeySection.js +1 -160
  23. package/lib/commonjs/storage/components/StorageKeyStats.js +1 -345
  24. package/lib/commonjs/storage/components/StorageModalWithTabs.js +1 -954
  25. package/lib/commonjs/storage/components/StorageSaveNotice.js +1 -171
  26. package/lib/commonjs/storage/components/StorageSection.js +1 -43
  27. package/lib/commonjs/storage/components/StorageTypeFilterBar.js +1 -144
  28. package/lib/commonjs/storage/hooks/useAsyncStorageKeys.js +1 -141
  29. package/lib/commonjs/storage/hooks/useMMKVInstances.js +1 -210
  30. package/lib/commonjs/storage/hooks/useMMKVKeys.js +1 -376
  31. package/lib/commonjs/storage/hooks/useSecureStoreKeys.js +1 -202
  32. package/lib/commonjs/storage/hooks/useStorageEvents.js +1 -61
  33. package/lib/commonjs/storage/stores/storageEventStore.js +1 -312
  34. package/lib/commonjs/storage/sync/storageSyncAdapter.js +1 -492
  35. package/lib/commonjs/storage/types.js +1 -5
  36. package/lib/commonjs/storage/utils/AsyncStorageListener.js +1 -691
  37. package/lib/commonjs/storage/utils/AsyncStorageListener.web.js +1 -89
  38. package/lib/commonjs/storage/utils/MMKVInstanceRegistry.js +1 -203
  39. package/lib/commonjs/storage/utils/MMKVListener.js +1 -416
  40. package/lib/commonjs/storage/utils/SecureStoreRegistry.js +1 -200
  41. package/lib/commonjs/storage/utils/asyncStorageCompat.js +1 -89
  42. package/lib/commonjs/storage/utils/browserStorageLifecycle.js +1 -10
  43. package/lib/commonjs/storage/utils/browserStorageLifecycle.web.js +1 -70
  44. package/lib/commonjs/storage/utils/clearAllStorage.js +1 -48
  45. package/lib/commonjs/storage/utils/deleteStorageKeys.js +1 -82
  46. package/lib/commonjs/storage/utils/lineDiff.js +1 -30
  47. package/lib/commonjs/storage/utils/mmkvAvailability.js +1 -62
  48. package/lib/commonjs/storage/utils/mmkvAvailability.web.js +1 -21
  49. package/lib/commonjs/storage/utils/mmkvTypeDetection.js +1 -154
  50. package/lib/commonjs/storage/utils/requiredStorageKeyScope.js +1 -17
  51. package/lib/commonjs/storage/utils/setStorageValue.js +1 -218
  52. package/lib/commonjs/storage/utils/snapshotProvider.js +1 -382
  53. package/lib/commonjs/storage/utils/storageActionHelpers.js +1 -46
  54. package/lib/commonjs/storage/utils/storageBrowserRefresh.js +1 -49
  55. package/lib/commonjs/storage/utils/storageLabels.js +1 -13
  56. package/lib/commonjs/storage/utils/storageLabels.web.js +1 -13
  57. package/lib/commonjs/storage/utils/storageOps.js +1 -53
  58. package/lib/commonjs/storage/utils/storageQueryUtils.js +1 -35
  59. package/lib/commonjs/storage/utils/storageTimeTravelUtils.js +1 -288
  60. package/lib/commonjs/storage/utils/valueType.js +1 -83
  61. package/lib/module/index.js +1 -114
  62. package/lib/module/preset.js +1 -82
  63. package/lib/module/storage/components/DiffViewer/TreeDiffViewer.js +1 -32
  64. package/lib/module/storage/components/DiffViewer/modes/ThemedSplitView.js +1 -9
  65. package/lib/module/storage/components/DiffViewer/themes/diffThemes.js +1 -10
  66. package/lib/module/storage/components/GameUIStorageBrowser.js +3 -1257
  67. package/lib/module/storage/components/MMKVInstanceInfoPanel.js +1 -253
  68. package/lib/module/storage/components/MMKVInstanceSelector.js +1 -415
  69. package/lib/module/storage/components/SelectionActionBar.js +1 -204
  70. package/lib/module/storage/components/StorageActionButtons.js +1 -238
  71. package/lib/module/storage/components/StorageBrowserMode.js +1 -57
  72. package/lib/module/storage/components/StorageEventActionButton.js +1 -118
  73. package/lib/module/storage/components/StorageEventCard.js +1 -113
  74. package/lib/module/storage/components/StorageEventDetailContent.js +1 -490
  75. package/lib/module/storage/components/StorageEventFilterView.js +1 -156
  76. package/lib/module/storage/components/StorageEventsSection.js +1 -20
  77. package/lib/module/storage/components/StorageFilterCards.js +1 -227
  78. package/lib/module/storage/components/StorageKeyCard.js +1 -517
  79. package/lib/module/storage/components/StorageKeyDetailScreen.js +1 -577
  80. package/lib/module/storage/components/StorageKeyRow.js +1 -554
  81. package/lib/module/storage/components/StorageKeySection.js +1 -155
  82. package/lib/module/storage/components/StorageKeyStats.js +1 -342
  83. package/lib/module/storage/components/StorageModalWithTabs.js +1 -949
  84. package/lib/module/storage/components/StorageSaveNotice.js +1 -168
  85. package/lib/module/storage/components/StorageSection.js +1 -40
  86. package/lib/module/storage/components/StorageTypeFilterBar.js +1 -139
  87. package/lib/module/storage/hooks/useAsyncStorageKeys.js +1 -136
  88. package/lib/module/storage/hooks/useMMKVInstances.js +1 -204
  89. package/lib/module/storage/hooks/useMMKVKeys.js +1 -371
  90. package/lib/module/storage/hooks/useSecureStoreKeys.js +1 -199
  91. package/lib/module/storage/hooks/useStorageEvents.js +1 -58
  92. package/lib/module/storage/stores/storageEventStore.js +1 -301
  93. package/lib/module/storage/sync/storageSyncAdapter.js +1 -486
  94. package/lib/module/storage/types.js +1 -3
  95. package/lib/module/storage/utils/AsyncStorageListener.js +1 -679
  96. package/lib/module/storage/utils/AsyncStorageListener.web.js +1 -76
  97. package/lib/module/storage/utils/MMKVInstanceRegistry.js +1 -197
  98. package/lib/module/storage/utils/MMKVListener.js +1 -403
  99. package/lib/module/storage/utils/SecureStoreRegistry.js +1 -194
  100. package/lib/module/storage/utils/asyncStorageCompat.js +1 -81
  101. package/lib/module/storage/utils/browserStorageLifecycle.js +1 -6
  102. package/lib/module/storage/utils/browserStorageLifecycle.web.js +1 -66
  103. package/lib/module/storage/utils/clearAllStorage.js +1 -43
  104. package/lib/module/storage/utils/deleteStorageKeys.js +1 -78
  105. package/lib/module/storage/utils/lineDiff.js +1 -12
  106. package/lib/module/storage/utils/mmkvAvailability.js +1 -56
  107. package/lib/module/storage/utils/mmkvAvailability.web.js +1 -15
  108. package/lib/module/storage/utils/mmkvTypeDetection.js +1 -148
  109. package/lib/module/storage/utils/requiredStorageKeyScope.js +1 -13
  110. package/lib/module/storage/utils/setStorageValue.js +1 -209
  111. package/lib/module/storage/utils/snapshotProvider.js +1 -380
  112. package/lib/module/storage/utils/storageActionHelpers.js +1 -42
  113. package/lib/module/storage/utils/storageBrowserRefresh.js +1 -44
  114. package/lib/module/storage/utils/storageLabels.js +1 -9
  115. package/lib/module/storage/utils/storageLabels.web.js +1 -9
  116. package/lib/module/storage/utils/storageOps.js +1 -46
  117. package/lib/module/storage/utils/storageQueryUtils.js +1 -30
  118. package/lib/module/storage/utils/storageTimeTravelUtils.js +1 -281
  119. package/lib/module/storage/utils/valueType.js +1 -76
  120. package/lib/web/index.mjs +2 -3
  121. package/package.json +6 -10
  122. package/lib/typescript/index.d.ts.map +0 -1
  123. package/lib/typescript/preset.d.ts.map +0 -1
  124. package/lib/typescript/storage/components/DiffViewer/TreeDiffViewer.d.ts.map +0 -1
  125. package/lib/typescript/storage/components/DiffViewer/modes/ThemedSplitView.d.ts.map +0 -1
  126. package/lib/typescript/storage/components/DiffViewer/themes/diffThemes.d.ts.map +0 -1
  127. package/lib/typescript/storage/components/GameUIStorageBrowser.d.ts.map +0 -1
  128. package/lib/typescript/storage/components/MMKVInstanceInfoPanel.d.ts.map +0 -1
  129. package/lib/typescript/storage/components/MMKVInstanceSelector.d.ts.map +0 -1
  130. package/lib/typescript/storage/components/SelectionActionBar.d.ts.map +0 -1
  131. package/lib/typescript/storage/components/StorageActionButtons.d.ts.map +0 -1
  132. package/lib/typescript/storage/components/StorageBrowserMode.d.ts.map +0 -1
  133. package/lib/typescript/storage/components/StorageEventActionButton.d.ts.map +0 -1
  134. package/lib/typescript/storage/components/StorageEventCard.d.ts.map +0 -1
  135. package/lib/typescript/storage/components/StorageEventDetailContent.d.ts.map +0 -1
  136. package/lib/typescript/storage/components/StorageEventFilterView.d.ts.map +0 -1
  137. package/lib/typescript/storage/components/StorageEventsSection.d.ts.map +0 -1
  138. package/lib/typescript/storage/components/StorageFilterCards.d.ts.map +0 -1
  139. package/lib/typescript/storage/components/StorageKeyCard.d.ts.map +0 -1
  140. package/lib/typescript/storage/components/StorageKeyDetailScreen.d.ts.map +0 -1
  141. package/lib/typescript/storage/components/StorageKeyRow.d.ts.map +0 -1
  142. package/lib/typescript/storage/components/StorageKeySection.d.ts.map +0 -1
  143. package/lib/typescript/storage/components/StorageKeyStats.d.ts.map +0 -1
  144. package/lib/typescript/storage/components/StorageModalWithTabs.d.ts.map +0 -1
  145. package/lib/typescript/storage/components/StorageSaveNotice.d.ts.map +0 -1
  146. package/lib/typescript/storage/components/StorageSection.d.ts.map +0 -1
  147. package/lib/typescript/storage/components/StorageTypeFilterBar.d.ts.map +0 -1
  148. package/lib/typescript/storage/hooks/useAsyncStorageKeys.d.ts.map +0 -1
  149. package/lib/typescript/storage/hooks/useMMKVInstances.d.ts.map +0 -1
  150. package/lib/typescript/storage/hooks/useMMKVKeys.d.ts.map +0 -1
  151. package/lib/typescript/storage/hooks/useSecureStoreKeys.d.ts.map +0 -1
  152. package/lib/typescript/storage/hooks/useStorageEvents.d.ts.map +0 -1
  153. package/lib/typescript/storage/stores/storageEventStore.d.ts.map +0 -1
  154. package/lib/typescript/storage/sync/storageSyncAdapter.d.ts.map +0 -1
  155. package/lib/typescript/storage/types.d.ts.map +0 -1
  156. package/lib/typescript/storage/utils/AsyncStorageListener.d.ts.map +0 -1
  157. package/lib/typescript/storage/utils/AsyncStorageListener.web.d.ts.map +0 -1
  158. package/lib/typescript/storage/utils/MMKVInstanceRegistry.d.ts.map +0 -1
  159. package/lib/typescript/storage/utils/MMKVListener.d.ts.map +0 -1
  160. package/lib/typescript/storage/utils/SecureStoreRegistry.d.ts.map +0 -1
  161. package/lib/typescript/storage/utils/asyncStorageCompat.d.ts.map +0 -1
  162. package/lib/typescript/storage/utils/browserStorageLifecycle.d.ts.map +0 -1
  163. package/lib/typescript/storage/utils/browserStorageLifecycle.web.d.ts.map +0 -1
  164. package/lib/typescript/storage/utils/clearAllStorage.d.ts.map +0 -1
  165. package/lib/typescript/storage/utils/deleteStorageKeys.d.ts.map +0 -1
  166. package/lib/typescript/storage/utils/lineDiff.d.ts.map +0 -1
  167. package/lib/typescript/storage/utils/mmkvAvailability.d.ts.map +0 -1
  168. package/lib/typescript/storage/utils/mmkvAvailability.web.d.ts.map +0 -1
  169. package/lib/typescript/storage/utils/mmkvTypeDetection.d.ts.map +0 -1
  170. package/lib/typescript/storage/utils/requiredStorageKeyScope.d.ts.map +0 -1
  171. package/lib/typescript/storage/utils/setStorageValue.d.ts.map +0 -1
  172. package/lib/typescript/storage/utils/snapshotProvider.d.ts.map +0 -1
  173. package/lib/typescript/storage/utils/storageActionHelpers.d.ts.map +0 -1
  174. package/lib/typescript/storage/utils/storageBrowserRefresh.d.ts.map +0 -1
  175. package/lib/typescript/storage/utils/storageLabels.d.ts.map +0 -1
  176. package/lib/typescript/storage/utils/storageLabels.web.d.ts.map +0 -1
  177. package/lib/typescript/storage/utils/storageOps.d.ts.map +0 -1
  178. package/lib/typescript/storage/utils/storageQueryUtils.d.ts.map +0 -1
  179. package/lib/typescript/storage/utils/storageTimeTravelUtils.d.ts.map +0 -1
  180. package/lib/typescript/storage/utils/valueType.d.ts.map +0 -1
@@ -1,49 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.onStorageBrowserRefresh = onStorageBrowserRefresh;
7
- exports.requestStorageBrowserRefresh = requestStorageBrowserRefresh;
8
- /**
9
- * A "the underlying storage changed, re-read it" signal for the storage
10
- * browser.
11
- *
12
- * On device the browser refreshes itself from the AsyncStorage/MMKV listeners,
13
- * but those never fire in remote-mirror mode (the desktop dashboard suppresses
14
- * local capture and receives the device's events as snapshots instead). Without
15
- * this seam the browse tab is a one-shot read at mount — values stay frozen
16
- * until the panel remounts, which is exactly the "shows old data until I switch
17
- * tools and come back" behaviour.
18
- *
19
- * The dashboard calls {@link requestStorageBrowserRefresh} whenever a fresh
20
- * device snapshot lands; the browser re-reads all three backends (debounced).
21
- * It is a no-op when nothing is listening.
22
- */
23
-
24
- const listeners = new Set();
25
-
26
- /**
27
- * Subscribe to external refresh requests. Returns an unsubscribe function.
28
- * @internal — used by the storage browser.
29
- */
30
- function onStorageBrowserRefresh(listener) {
31
- listeners.add(listener);
32
- return () => {
33
- listeners.delete(listener);
34
- };
35
- }
36
-
37
- /**
38
- * Ask any mounted storage browser to re-read AsyncStorage, MMKV and
39
- * SecureStore. Safe to call at any rate — the browser debounces.
40
- */
41
- function requestStorageBrowserRefresh() {
42
- listeners.forEach(listener => {
43
- try {
44
- listener();
45
- } catch {
46
- // Listener errors are not ours
47
- }
48
- });
49
- }
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.onStorageBrowserRefresh=onStorageBrowserRefresh;exports.requestStorageBrowserRefresh=requestStorageBrowserRefresh;const listeners=new Set;function onStorageBrowserRefresh(e){listeners.add(e);return()=>{listeners.delete(e)}}function requestStorageBrowserRefresh(){listeners.forEach(e=>{try{e()}catch{}})}
@@ -1,13 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.storageLabels = void 0;
7
- const storageLabels = exports.storageLabels = {
8
- async: 'Async',
9
- asyncFull: 'AsyncStorage',
10
- mmkv: 'MMKV',
11
- secure: 'Secure',
12
- hasSecure: true
13
- };
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.storageLabels=void 0;const storageLabels=exports.storageLabels={async:"Async",asyncFull:"AsyncStorage",mmkv:"MMKV",secure:"Secure",hasSecure:true};
@@ -1,13 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.storageLabels = void 0;
7
- const storageLabels = exports.storageLabels = {
8
- async: 'Local',
9
- asyncFull: 'localStorage',
10
- mmkv: 'Session',
11
- secure: 'Secure',
12
- hasSecure: false
13
- };
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,53 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.STORAGE_OPS = void 0;
7
- exports.isInitialScan = isInitialScan;
8
- exports.storageOpDot = storageOpDot;
9
- exports.storageOpOf = storageOpOf;
10
- var _sharedUi = require("@buoy-gg/shared-ui");
11
- /**
12
- * The five operations a storage event can be, and how to recognise one.
13
- *
14
- * AsyncStorage and MMKV each have their own action union, and neither maps
15
- * cleanly onto what a reader wants to see — `multiRemove`, `removeItem` and
16
- * `delete` are one idea wearing three names. These collapse both onto a single
17
- * vocabulary so every surface labels, filters and colours events the same way.
18
- *
19
- * This is semantics, not presentation: it lives in `utils` rather than beside
20
- * any one view, so a view can be deleted without taking the vocabulary with it.
21
- */
22
-
23
- const STORAGE_OPS = exports.STORAGE_OPS = ["SET", "GET", "MERGE", "DELETE", "CLEAR"];
24
- const OP_DOT = {
25
- SET: _sharedUi.macOSColors.semantic.info,
26
- GET: _sharedUi.macOSColors.text.muted,
27
- MERGE: _sharedUi.macOSColors.semantic.debug,
28
- DELETE: _sharedUi.macOSColors.semantic.error,
29
- CLEAR: _sharedUi.macOSColors.semantic.warning
30
- };
31
- function storageOpDot(op) {
32
- return OP_DOT[op];
33
- }
34
-
35
- /** Both backends' action unions, collapsed onto the five display operations. */
36
- function storageOpOf(event) {
37
- const action = event.action;
38
- if (action === "clear" || action === "clearAll") return "CLEAR";
39
- if (action.startsWith("get.")) return "GET";
40
- if (action === "removeItem" || action === "multiRemove" || action === "delete") return "DELETE";
41
- if (action === "mergeItem" || action === "multiMerge") return "MERGE";
42
- return "SET";
43
- }
44
-
45
- /**
46
- * The store synthesises one event per existing key when it first subscribes, so
47
- * the list isn't empty on open. Those are a SNAPSHOT, not a write: the key
48
- * already held that value, so there is no "before" to diff against and showing
49
- * one would invent a change that never happened.
50
- */
51
- function isInitialScan(event) {
52
- return Boolean(event.data?.initialScan);
53
- }
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.STORAGE_OPS=void 0;exports.isInitialScan=isInitialScan;exports.storageOpDot=storageOpDot;exports.storageOpOf=storageOpOf;var _sharedUi=require("@buoy-gg/shared-ui");const STORAGE_OPS=exports.STORAGE_OPS=["SET","GET","MERGE","DELETE","CLEAR"];const OP_DOT={SET:_sharedUi.macOSColors.semantic.info,GET:_sharedUi.macOSColors.text.muted,MERGE:_sharedUi.macOSColors.semantic.debug,DELETE:_sharedUi.macOSColors.semantic.error,CLEAR:_sharedUi.macOSColors.semantic.warning};function storageOpDot(t){return OP_DOT[t]}function storageOpOf(t){const e=t.action;if(e==="clear"||e==="clearAll")return"CLEAR";if(e.startsWith("get."))return"GET";if(e==="removeItem"||e==="multiRemove"||e==="delete")return"DELETE";if(e==="mergeItem"||e==="multiMerge")return"MERGE";return"SET"}function isInitialScan(t){return Boolean(t.data?.initialScan)}
@@ -1,35 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.getStorageTypeHexColor = getStorageTypeHexColor;
7
- exports.getStorageTypeLabel = getStorageTypeLabel;
8
- var _sharedUi = require("@buoy-gg/shared-ui");
9
- /** Human readable label for a storage type id. */
10
- function getStorageTypeLabel(storageType) {
11
- switch (storageType) {
12
- case "mmkv":
13
- return "MMKV";
14
- case "async":
15
- return "Async";
16
- case "secure":
17
- return "Secure";
18
- default:
19
- return storageType;
20
- }
21
- }
22
-
23
- /** Preferred color token for rendering a given storage type. */
24
- function getStorageTypeHexColor(storageType) {
25
- switch (storageType) {
26
- case "mmkv":
27
- return _sharedUi.gameUIColors.info;
28
- case "async":
29
- return _sharedUi.gameUIColors.warning;
30
- case "secure":
31
- return _sharedUi.gameUIColors.success;
32
- default:
33
- return _sharedUi.gameUIColors.muted;
34
- }
35
- }
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,288 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.canUndo = canUndo;
7
- exports.jumpToState = jumpToState;
8
- exports.undoOperation = undoOperation;
9
- var _sharedUi = require("@buoy-gg/shared-ui");
10
- var _asyncStorage = _interopRequireDefault(require("@react-native-async-storage/async-storage"));
11
- var _asyncStorageCompat = require("./asyncStorageCompat");
12
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
- /**
14
- * Storage Time-Travel Utilities
15
- *
16
- * Provides jump and undo functionality for AsyncStorage operations.
17
- */
18
-
19
- function isOmittedStorageValue(value) {
20
- return !!value && typeof value === "object" && value.__buoyValueOnDevice === true;
21
- }
22
-
23
- /**
24
- * Undo a single storage operation
25
- *
26
- * Restores the previous value(s) before the operation occurred.
27
- *
28
- * The restore is deliberately NOT capture-paused. Pausing it meant the write
29
- * landed but emitted no event, so the modal's event list and current-value
30
- * panel never changed — UNDO looked like a dead button even though it had
31
- * worked. Letting the restore emit normally makes it visible and keeps the
32
- * history honest about what the storage actually did. There is no feedback
33
- * loop: a write emits an event, and an event never triggers a write.
34
- *
35
- * @param event - The storage event to undo
36
- */
37
- async function undoOperation(event) {
38
- const {
39
- action,
40
- data
41
- } = event;
42
- if (isOmittedStorageValue(data?.prevValue) || isOmittedStorageValue(data?.prevPairs)) {
43
- throw new Error("Cannot undo: previous value is still on the device — fetch getEventDetail first");
44
- }
45
- {
46
- switch (action) {
47
- case "setItem":
48
- case "mergeItem":
49
- if (data?.key) {
50
- if (data.prevValue === null || data.prevValue === undefined) {
51
- // Key didn't exist before, remove it
52
- await _asyncStorage.default.removeItem(data.key);
53
- } else {
54
- // Restore previous value
55
- await _asyncStorage.default.setItem(data.key, data.prevValue);
56
- }
57
- }
58
- break;
59
- case "removeItem":
60
- if (data?.key && data.prevValue !== null && data.prevValue !== undefined) {
61
- // Restore the removed value
62
- await _asyncStorage.default.setItem(data.key, data.prevValue);
63
- }
64
- break;
65
- case "multiSet":
66
- case "multiMerge":
67
- if (data?.prevPairs && data.prevPairs.length > 0) {
68
- // Restore all previous values
69
- for (const [key, value] of data.prevPairs) {
70
- if (value === null) {
71
- await _asyncStorage.default.removeItem(key);
72
- } else {
73
- await _asyncStorage.default.setItem(key, value);
74
- }
75
- }
76
- }
77
- break;
78
- case "multiRemove":
79
- if (data?.prevPairs && data.prevPairs.length > 0) {
80
- // Restore all removed values
81
- for (const [key, value] of data.prevPairs) {
82
- if (value !== null) {
83
- await _asyncStorage.default.setItem(key, value);
84
- }
85
- }
86
- }
87
- break;
88
- case "clear":
89
- if (data?.prevPairs && data.prevPairs.length > 0) {
90
- // Restore all cleared key-value pairs
91
- const pairsToRestore = data.prevPairs.filter(([, value]) => value !== null);
92
- if (pairsToRestore.length > 0) {
93
- await (0, _asyncStorageCompat.writeMany)(pairsToRestore);
94
- }
95
- }
96
- break;
97
- default:
98
- throw new Error(`Cannot undo unknown action type: ${action}`);
99
- }
100
- }
101
- }
102
-
103
- /**
104
- * Jump to a specific point in storage history
105
- *
106
- * Reconstructs the state as of `targetEventIndex` by replaying `events` up to
107
- * that point, then reconciling ONLY the keys that timeline governs.
108
- *
109
- * This used to begin with `AsyncStorage.clear()`, which was badly out of
110
- * proportion: the modal's JUMP button passes one key's history, so clearing
111
- * wiped every unrelated app key — and Buoy's own `@react_buoy*` settings with
112
- * them — to restore a single value. Now a jump touches exactly the keys that
113
- * appear in the events it was given, and never Buoy's own keys. Like
114
- * [undoOperation], the writes emit normally so the change is visible.
115
- *
116
- * @param events - All events in chronological order (oldest first)
117
- * @param targetEventIndex - The index of the event to jump to (0-based)
118
- */
119
- async function jumpToState(events, targetEventIndex) {
120
- if (targetEventIndex < 0 || targetEventIndex >= events.length) {
121
- throw new Error(`Invalid event index: ${targetEventIndex}`);
122
- }
123
- for (const event of events) {
124
- const data = event.data;
125
- if (isOmittedStorageValue(data?.value) || isOmittedStorageValue(data?.prevValue) || isOmittedStorageValue(data?.pairs) || isOmittedStorageValue(data?.prevPairs)) {
126
- throw new Error("Cannot jump: some event values are still on the device — fetch getEventDetail first");
127
- }
128
- }
129
-
130
- // Build up the state by applying each event up to and including the target.
131
- // We use the final values from each event, not the operations themselves.
132
- const stateMap = new Map();
133
- for (let i = 0; i <= targetEventIndex; i++) {
134
- applyEventToStateMap(events[i], stateMap);
135
- }
136
-
137
- // Every key the WHOLE timeline touches — including events after the target,
138
- // so a key created later is removed rather than left behind.
139
- const governedKeys = new Set();
140
- for (const event of events) {
141
- collectEventKeys(event, governedKeys);
142
- }
143
- const pairsToSet = [];
144
- const keysToRemove = [];
145
- for (const key of governedKeys) {
146
- // Buoy's own settings are never app state to travel through.
147
- if ((0, _sharedUi.isDevToolsStorageKey)(key)) continue;
148
- const value = stateMap.get(key);
149
- if (value === undefined || value === null) {
150
- keysToRemove.push(key);
151
- } else {
152
- pairsToSet.push([key, value]);
153
- }
154
- }
155
- if (keysToRemove.length > 0) {
156
- await (0, _asyncStorageCompat.removeMany)(keysToRemove);
157
- }
158
- if (pairsToSet.length > 0) {
159
- await (0, _asyncStorageCompat.writeMany)(pairsToSet);
160
- }
161
- }
162
-
163
- /**
164
- * Collect every key an event refers to, across all action shapes — including
165
- * `prevPairs`, so keys a `clear` removed are still governed by the timeline.
166
- */
167
- function collectEventKeys(event, into) {
168
- const {
169
- data
170
- } = event;
171
- if (!data) return;
172
- if (data.key) into.add(data.key);
173
- if (data.keys) for (const key of data.keys) into.add(key);
174
- if (data.pairs) for (const [key] of data.pairs) into.add(key);
175
- if (data.prevPairs) for (const [key] of data.prevPairs) into.add(key);
176
- }
177
-
178
- /**
179
- * Helper to apply an event's effects to a state map
180
- */
181
- function applyEventToStateMap(event, stateMap) {
182
- const {
183
- action,
184
- data
185
- } = event;
186
- switch (action) {
187
- case "setItem":
188
- if (data?.key && data?.value !== undefined) {
189
- stateMap.set(data.key, data.value);
190
- }
191
- break;
192
- case "removeItem":
193
- if (data?.key) {
194
- stateMap.set(data.key, null);
195
- }
196
- break;
197
- case "mergeItem":
198
- if (data?.key && data?.value !== undefined) {
199
- const existing = stateMap.get(data.key);
200
- if (existing) {
201
- try {
202
- // Merge JSON objects
203
- const existingObj = JSON.parse(existing);
204
- const newObj = JSON.parse(data.value);
205
- const merged = {
206
- ...existingObj,
207
- ...newObj
208
- };
209
- stateMap.set(data.key, JSON.stringify(merged));
210
- } catch {
211
- // If not valid JSON, just overwrite
212
- stateMap.set(data.key, data.value);
213
- }
214
- } else {
215
- stateMap.set(data.key, data.value);
216
- }
217
- }
218
- break;
219
- case "multiSet":
220
- if (data?.pairs) {
221
- for (const [key, value] of data.pairs) {
222
- stateMap.set(key, value);
223
- }
224
- }
225
- break;
226
- case "multiRemove":
227
- if (data?.keys) {
228
- for (const key of data.keys) {
229
- stateMap.set(key, null);
230
- }
231
- }
232
- break;
233
- case "multiMerge":
234
- if (data?.pairs) {
235
- for (const [key, value] of data.pairs) {
236
- const existing = stateMap.get(key);
237
- if (existing) {
238
- try {
239
- const existingObj = JSON.parse(existing);
240
- const newObj = JSON.parse(value);
241
- const merged = {
242
- ...existingObj,
243
- ...newObj
244
- };
245
- stateMap.set(key, JSON.stringify(merged));
246
- } catch {
247
- stateMap.set(key, value);
248
- }
249
- } else {
250
- stateMap.set(key, value);
251
- }
252
- }
253
- }
254
- break;
255
- case "clear":
256
- // Clear the entire state map
257
- stateMap.clear();
258
- break;
259
- }
260
- }
261
-
262
- /**
263
- * Check if an operation can be undone
264
- *
265
- * Some operations may not have the previous value captured.
266
- */
267
- function canUndo(event) {
268
- const {
269
- action,
270
- data
271
- } = event;
272
- switch (action) {
273
- case "setItem":
274
- case "mergeItem":
275
- case "removeItem":
276
- // Can undo if we have the key — but not while prevValue is still a
277
- // wire-form on-device marker (restoring that would write garbage).
278
- return !!data?.key && !isOmittedStorageValue(data.prevValue);
279
- case "multiSet":
280
- case "multiRemove":
281
- case "multiMerge":
282
- case "clear":
283
- // Can undo if we have previous pairs
284
- return !!data?.prevPairs && data.prevPairs.length > 0 && !isOmittedStorageValue(data.prevPairs);
285
- default:
286
- return false;
287
- }
288
- }
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,83 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.getValuePreview = getValuePreview;
7
- exports.getValueTypeLabel = getValueTypeLabel;
8
- exports.getValueTypeWithPreview = getValueTypeWithPreview;
9
- exports.parseStorageValue = parseStorageValue;
10
- /** Return a concise string describing the JavaScript type of the provided value. */
11
- function getValueTypeLabel(value) {
12
- if (value === null) return "null";
13
- if (value === undefined) return "undefined";
14
- if (Array.isArray(value)) return "array";
15
- const type = typeof value;
16
- if (type === "object") return "object";
17
- if (type === "boolean") return "boolean";
18
- if (type === "number") return "number";
19
- if (type === "string") return "string";
20
- return "unknown";
21
- }
22
-
23
- /**
24
- * A stored value as a tree can show it.
25
- *
26
- * AsyncStorage and SecureStore hold strings, so an object arrives as the text
27
- * `{"a":1}` — displaying that as a string is technically true and useless. Any
28
- * surface that renders or edits a value structurally has to do this same
29
- * un-stringify first, so it lives here rather than being re-derived (slightly
30
- * differently) in each one.
31
- *
32
- * A string that doesn't parse comes back untouched: it was just a string that
33
- * happened to start with a brace.
34
- */
35
- function parseStorageValue(value) {
36
- if (typeof value !== "string") return value;
37
- const trimmed = value.trim();
38
- if (!trimmed.startsWith("{") && !trimmed.startsWith("[")) return value;
39
- try {
40
- return JSON.parse(value);
41
- } catch {
42
- return value;
43
- }
44
- }
45
-
46
- /** Longest value preview rendered inline next to the type label. */
47
- const MAX_INLINE_PREVIEW = 40;
48
-
49
- /**
50
- * Short, human-readable preview of a value for inline display next to the type
51
- * label, or `null` when the value is too large/complex to preview (long
52
- * strings, objects, arrays). Lets the user read simple values without opening
53
- * the card.
54
- */
55
- function getValuePreview(value) {
56
- switch (typeof value) {
57
- case "boolean":
58
- return value ? "true" : "false";
59
- case "number":
60
- return Number.isFinite(value) ? String(value) : null;
61
- case "string":
62
- {
63
- if (value.length === 0) return '""';
64
- if (value.length > MAX_INLINE_PREVIEW) return null;
65
- // Collapse whitespace so multi-line/tabbed values stay on one line.
66
- return `"${value.replace(/\s+/g, " ")}"`;
67
- }
68
- default:
69
- return null;
70
- // objects, arrays, null, undefined
71
- }
72
- }
73
-
74
- /**
75
- * Type label optionally followed by a short value preview — e.g. `boolean · true`,
76
- * `number · 42`, `string · "hello"`. Falls back to just the type label when the
77
- * value is too large to preview.
78
- */
79
- function getValueTypeWithPreview(value) {
80
- const label = getValueTypeLabel(value);
81
- const preview = getValuePreview(value);
82
- return preview ? `${label} · ${preview}` : label;
83
- }
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.getValuePreview=getValuePreview;exports.getValueTypeLabel=getValueTypeLabel;exports.getValueTypeWithPreview=getValueTypeWithPreview;exports.parseStorageValue=parseStorageValue;function getValueTypeLabel(e){if(e===null)return"null";if(e===void 0)return"undefined";if(Array.isArray(e))return"array";const r=typeof e;if(r==="object")return"object";if(r==="boolean")return"boolean";if(r==="number")return"number";if(r==="string")return"string";return"unknown"}function parseStorageValue(e){if(typeof e!=="string")return e;const r=e.trim();if(!r.startsWith("{")&&!r.startsWith("["))return e;try{return JSON.parse(e)}catch{return e}}const MAX_INLINE_PREVIEW=40;function getValuePreview(e){switch(typeof e){case"boolean":return e?"true":"false";case"number":return Number.isFinite(e)?String(e):null;case"string":{if(e.length===0)return'""';if(e.length>MAX_INLINE_PREVIEW)return null;return`"${e.replace(/\s+/g," ")}"`}default:return null}}function getValueTypeWithPreview(e){const r=getValueTypeLabel(e);const t=getValuePreview(e);return t?`${r} \xB7 ${t}`:r}