@buoy-gg/time-machine 7.0.40 → 7.0.42

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 (173) hide show
  1. package/README.md +4 -0
  2. package/lib/commonjs/components/HeaderActions.js +1 -91
  3. package/lib/commonjs/components/HeaderReloadButton.js +1 -58
  4. package/lib/commonjs/components/TimeMachineBody.js +1 -282
  5. package/lib/commonjs/components/TimeMachineModal.js +1 -74
  6. package/lib/commonjs/components/confirm.js +2 -38
  7. package/lib/commonjs/components/floating/NamePromptModal.js +1 -193
  8. package/lib/commonjs/components/floating/TimeMachineFloatingTool.js +1 -715
  9. package/lib/commonjs/components/floating/armedPoint.js +1 -92
  10. package/lib/commonjs/components/floating/barSettings.js +1 -66
  11. package/lib/commonjs/components/format.js +1 -24
  12. package/lib/commonjs/components/list/CaptureBar.js +1 -97
  13. package/lib/commonjs/components/list/RestoreOutcomeCard.js +1 -175
  14. package/lib/commonjs/components/list/SnapshotRow.js +1 -170
  15. package/lib/commonjs/components/list/SourcesStrip.js +1 -172
  16. package/lib/commonjs/components/list/UndoDeleteBar.js +1 -85
  17. package/lib/commonjs/components/list/WipeAllRow.js +1 -46
  18. package/lib/commonjs/components/preview/ItemDiffPanel.js +1 -79
  19. package/lib/commonjs/components/preview/PreviewFlow.js +1 -51
  20. package/lib/commonjs/components/preview/RestorePointNameRow.js +1 -83
  21. package/lib/commonjs/components/preview/RestorePreviewScreen.js +1 -1010
  22. package/lib/commonjs/components/preview/verdictMeta.js +1 -58
  23. package/lib/commonjs/components/sources.js +1 -83
  24. package/lib/commonjs/hooks/useTimeMachine.js +1 -24
  25. package/lib/commonjs/index.js +1 -161
  26. package/lib/commonjs/preset.js +1 -56
  27. package/lib/commonjs/store/routeRestore.js +1 -188
  28. package/lib/commonjs/store/snapshotVault.js +1 -186
  29. package/lib/commonjs/store/sourceIds.js +1 -9
  30. package/lib/commonjs/store/sourceSettings.js +1 -79
  31. package/lib/commonjs/store/timeMachineStore.js +1 -848
  32. package/lib/commonjs/sync/timeMachineSyncAdapter.js +1 -258
  33. package/lib/commonjs/ui/SwipeActionsRow.js +1 -178
  34. package/lib/commonjs/ui/primitives.js +1 -172
  35. package/lib/commonjs/ui/tmTheme.js +1 -118
  36. package/lib/module/components/HeaderActions.js +1 -85
  37. package/lib/module/components/HeaderReloadButton.js +1 -53
  38. package/lib/module/components/TimeMachineBody.js +1 -277
  39. package/lib/module/components/TimeMachineModal.js +1 -68
  40. package/lib/module/components/confirm.js +2 -33
  41. package/lib/module/components/floating/NamePromptModal.js +1 -188
  42. package/lib/module/components/floating/TimeMachineFloatingTool.js +1 -708
  43. package/lib/module/components/floating/armedPoint.js +1 -82
  44. package/lib/module/components/floating/barSettings.js +1 -57
  45. package/lib/module/components/format.js +1 -19
  46. package/lib/module/components/list/CaptureBar.js +1 -92
  47. package/lib/module/components/list/RestoreOutcomeCard.js +1 -169
  48. package/lib/module/components/list/SnapshotRow.js +1 -167
  49. package/lib/module/components/list/SourcesStrip.js +1 -169
  50. package/lib/module/components/list/UndoDeleteBar.js +1 -82
  51. package/lib/module/components/list/WipeAllRow.js +1 -41
  52. package/lib/module/components/preview/ItemDiffPanel.js +1 -74
  53. package/lib/module/components/preview/PreviewFlow.js +1 -46
  54. package/lib/module/components/preview/RestorePointNameRow.js +1 -78
  55. package/lib/module/components/preview/RestorePreviewScreen.js +1 -1005
  56. package/lib/module/components/preview/verdictMeta.js +1 -54
  57. package/lib/module/components/sources.js +1 -73
  58. package/lib/module/hooks/useTimeMachine.js +1 -19
  59. package/lib/module/index.js +1 -46
  60. package/lib/module/preset.js +1 -51
  61. package/lib/module/store/routeRestore.js +1 -176
  62. package/lib/module/store/snapshotVault.js +1 -170
  63. package/lib/module/store/sourceIds.js +1 -5
  64. package/lib/module/store/sourceSettings.js +1 -69
  65. package/lib/module/store/timeMachineStore.js +1 -839
  66. package/lib/module/sync/timeMachineSyncAdapter.js +1 -253
  67. package/lib/module/ui/SwipeActionsRow.js +1 -173
  68. package/lib/module/ui/primitives.js +1 -164
  69. package/lib/module/ui/tmTheme.js +1 -114
  70. package/lib/web/index.mjs +3 -0
  71. package/package.json +43 -10
  72. package/lib/commonjs/components/HeaderActions.js.map +0 -1
  73. package/lib/commonjs/components/HeaderReloadButton.js.map +0 -1
  74. package/lib/commonjs/components/TimeMachineBody.js.map +0 -1
  75. package/lib/commonjs/components/TimeMachineModal.js.map +0 -1
  76. package/lib/commonjs/components/confirm.js.map +0 -1
  77. package/lib/commonjs/components/floating/NamePromptModal.js.map +0 -1
  78. package/lib/commonjs/components/floating/TimeMachineFloatingTool.js.map +0 -1
  79. package/lib/commonjs/components/floating/armedPoint.js.map +0 -1
  80. package/lib/commonjs/components/floating/barSettings.js.map +0 -1
  81. package/lib/commonjs/components/format.js.map +0 -1
  82. package/lib/commonjs/components/list/CaptureBar.js.map +0 -1
  83. package/lib/commonjs/components/list/RestoreOutcomeCard.js.map +0 -1
  84. package/lib/commonjs/components/list/SnapshotRow.js.map +0 -1
  85. package/lib/commonjs/components/list/SourcesStrip.js.map +0 -1
  86. package/lib/commonjs/components/list/UndoDeleteBar.js.map +0 -1
  87. package/lib/commonjs/components/list/WipeAllRow.js.map +0 -1
  88. package/lib/commonjs/components/preview/ItemDiffPanel.js.map +0 -1
  89. package/lib/commonjs/components/preview/PreviewFlow.js.map +0 -1
  90. package/lib/commonjs/components/preview/RestorePointNameRow.js.map +0 -1
  91. package/lib/commonjs/components/preview/RestorePreviewScreen.js.map +0 -1
  92. package/lib/commonjs/components/preview/verdictMeta.js.map +0 -1
  93. package/lib/commonjs/components/sources.js.map +0 -1
  94. package/lib/commonjs/hooks/useTimeMachine.js.map +0 -1
  95. package/lib/commonjs/index.js.map +0 -1
  96. package/lib/commonjs/preset.js.map +0 -1
  97. package/lib/commonjs/store/routeRestore.js.map +0 -1
  98. package/lib/commonjs/store/snapshotVault.js.map +0 -1
  99. package/lib/commonjs/store/sourceIds.js.map +0 -1
  100. package/lib/commonjs/store/sourceSettings.js.map +0 -1
  101. package/lib/commonjs/store/timeMachineStore.js.map +0 -1
  102. package/lib/commonjs/sync/timeMachineSyncAdapter.js.map +0 -1
  103. package/lib/commonjs/ui/SwipeActionsRow.js.map +0 -1
  104. package/lib/commonjs/ui/primitives.js.map +0 -1
  105. package/lib/commonjs/ui/tmTheme.js.map +0 -1
  106. package/lib/module/components/HeaderActions.js.map +0 -1
  107. package/lib/module/components/HeaderReloadButton.js.map +0 -1
  108. package/lib/module/components/TimeMachineBody.js.map +0 -1
  109. package/lib/module/components/TimeMachineModal.js.map +0 -1
  110. package/lib/module/components/confirm.js.map +0 -1
  111. package/lib/module/components/floating/NamePromptModal.js.map +0 -1
  112. package/lib/module/components/floating/TimeMachineFloatingTool.js.map +0 -1
  113. package/lib/module/components/floating/armedPoint.js.map +0 -1
  114. package/lib/module/components/floating/barSettings.js.map +0 -1
  115. package/lib/module/components/format.js.map +0 -1
  116. package/lib/module/components/list/CaptureBar.js.map +0 -1
  117. package/lib/module/components/list/RestoreOutcomeCard.js.map +0 -1
  118. package/lib/module/components/list/SnapshotRow.js.map +0 -1
  119. package/lib/module/components/list/SourcesStrip.js.map +0 -1
  120. package/lib/module/components/list/UndoDeleteBar.js.map +0 -1
  121. package/lib/module/components/list/WipeAllRow.js.map +0 -1
  122. package/lib/module/components/preview/ItemDiffPanel.js.map +0 -1
  123. package/lib/module/components/preview/PreviewFlow.js.map +0 -1
  124. package/lib/module/components/preview/RestorePointNameRow.js.map +0 -1
  125. package/lib/module/components/preview/RestorePreviewScreen.js.map +0 -1
  126. package/lib/module/components/preview/verdictMeta.js.map +0 -1
  127. package/lib/module/components/sources.js.map +0 -1
  128. package/lib/module/hooks/useTimeMachine.js.map +0 -1
  129. package/lib/module/index.js.map +0 -1
  130. package/lib/module/preset.js.map +0 -1
  131. package/lib/module/store/routeRestore.js.map +0 -1
  132. package/lib/module/store/snapshotVault.js.map +0 -1
  133. package/lib/module/store/sourceIds.js.map +0 -1
  134. package/lib/module/store/sourceSettings.js.map +0 -1
  135. package/lib/module/store/timeMachineStore.js.map +0 -1
  136. package/lib/module/sync/timeMachineSyncAdapter.js.map +0 -1
  137. package/lib/module/ui/SwipeActionsRow.js.map +0 -1
  138. package/lib/module/ui/primitives.js.map +0 -1
  139. package/lib/module/ui/tmTheme.js.map +0 -1
  140. package/lib/typescript/components/HeaderActions.d.ts.map +0 -1
  141. package/lib/typescript/components/HeaderReloadButton.d.ts.map +0 -1
  142. package/lib/typescript/components/TimeMachineBody.d.ts.map +0 -1
  143. package/lib/typescript/components/TimeMachineModal.d.ts.map +0 -1
  144. package/lib/typescript/components/confirm.d.ts.map +0 -1
  145. package/lib/typescript/components/floating/NamePromptModal.d.ts.map +0 -1
  146. package/lib/typescript/components/floating/TimeMachineFloatingTool.d.ts.map +0 -1
  147. package/lib/typescript/components/floating/armedPoint.d.ts.map +0 -1
  148. package/lib/typescript/components/floating/barSettings.d.ts.map +0 -1
  149. package/lib/typescript/components/format.d.ts.map +0 -1
  150. package/lib/typescript/components/list/CaptureBar.d.ts.map +0 -1
  151. package/lib/typescript/components/list/RestoreOutcomeCard.d.ts.map +0 -1
  152. package/lib/typescript/components/list/SnapshotRow.d.ts.map +0 -1
  153. package/lib/typescript/components/list/SourcesStrip.d.ts.map +0 -1
  154. package/lib/typescript/components/list/UndoDeleteBar.d.ts.map +0 -1
  155. package/lib/typescript/components/list/WipeAllRow.d.ts.map +0 -1
  156. package/lib/typescript/components/preview/ItemDiffPanel.d.ts.map +0 -1
  157. package/lib/typescript/components/preview/PreviewFlow.d.ts.map +0 -1
  158. package/lib/typescript/components/preview/RestorePointNameRow.d.ts.map +0 -1
  159. package/lib/typescript/components/preview/RestorePreviewScreen.d.ts.map +0 -1
  160. package/lib/typescript/components/preview/verdictMeta.d.ts.map +0 -1
  161. package/lib/typescript/components/sources.d.ts.map +0 -1
  162. package/lib/typescript/hooks/useTimeMachine.d.ts.map +0 -1
  163. package/lib/typescript/index.d.ts.map +0 -1
  164. package/lib/typescript/preset.d.ts.map +0 -1
  165. package/lib/typescript/store/routeRestore.d.ts.map +0 -1
  166. package/lib/typescript/store/snapshotVault.d.ts.map +0 -1
  167. package/lib/typescript/store/sourceIds.d.ts.map +0 -1
  168. package/lib/typescript/store/sourceSettings.d.ts.map +0 -1
  169. package/lib/typescript/store/timeMachineStore.d.ts.map +0 -1
  170. package/lib/typescript/sync/timeMachineSyncAdapter.d.ts.map +0 -1
  171. package/lib/typescript/ui/SwipeActionsRow.d.ts.map +0 -1
  172. package/lib/typescript/ui/primitives.d.ts.map +0 -1
  173. package/lib/typescript/ui/tmTheme.d.ts.map +0 -1
@@ -1,58 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.VERDICT_META = void 0;
7
- var _tmTheme = require("../../ui/tmTheme");
8
- /**
9
- * One place for the verdict → glyph/color/label mapping. Color is ALWAYS
10
- * paired with a distinct glyph (true minus U+2212, approx U+2248) — the
11
- * repo-wide accessibility convention for diff surfaces.
12
- */
13
-
14
- const VERDICT_META = exports.VERDICT_META = {
15
- added: {
16
- glyph: "+",
17
- color: _tmTheme.tm.color.accent,
18
- label: "added",
19
- applies: true
20
- },
21
- removed: {
22
- glyph: "−",
23
- color: _tmTheme.tm.color.danger,
24
- label: "removed",
25
- applies: true
26
- },
27
- changed: {
28
- glyph: "≈",
29
- color: _tmTheme.tm.color.info,
30
- label: "changed",
31
- applies: true
32
- },
33
- "too-large": {
34
- glyph: "≈",
35
- color: _tmTheme.tm.color.warning,
36
- label: "changed (large)",
37
- applies: true
38
- },
39
- unchanged: {
40
- glyph: "=",
41
- color: _tmTheme.tm.color.labelTertiary,
42
- label: "unchanged",
43
- applies: false
44
- },
45
- "wont-apply": {
46
- glyph: "⊘",
47
- color: _tmTheme.tm.color.warning,
48
- label: "won't apply",
49
- applies: false
50
- },
51
- recomputes: {
52
- glyph: "↻",
53
- color: _tmTheme.tm.color.labelTertiary,
54
- label: "recomputes",
55
- applies: false
56
- }
57
- };
58
- //# sourceMappingURL=verdictMeta.js.map
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.VERDICT_META=void 0;var _tmTheme=require("../../ui/tmTheme");const VERDICT_META=exports.VERDICT_META={added:{glyph:"+",color:_tmTheme.tm.color.accent,label:"added",applies:true},removed:{glyph:"\u2212",color:_tmTheme.tm.color.danger,label:"removed",applies:true},changed:{glyph:"\u2248",color:_tmTheme.tm.color.info,label:"changed",applies:true},"too-large":{glyph:"\u2248",color:_tmTheme.tm.color.warning,label:"changed (large)",applies:true},unchanged:{glyph:"=",color:_tmTheme.tm.color.labelTertiary,label:"unchanged",applies:false},"wont-apply":{glyph:"\u2298",color:_tmTheme.tm.color.warning,label:"won't apply",applies:false},recomputes:{glyph:"\u21BB",color:_tmTheme.tm.color.labelTertiary,label:"recomputes",applies:false}};
@@ -1,83 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- Object.defineProperty(exports, "ROUTE_SOURCE_ID", {
7
- enumerable: true,
8
- get: function () {
9
- return _sourceIds.ROUTE_SOURCE_ID;
10
- }
11
- });
12
- exports.isAttached = isAttached;
13
- exports.sourceIcon = sourceIcon;
14
- exports.useSourceStatuses = useSourceStatuses;
15
- var _floatingToolsCore = require("@buoy-gg/floating-tools-core");
16
- var _react = require("react");
17
- var _useTimeMachine = require("../hooks/useTimeMachine");
18
- var _routeRestore = require("../store/routeRestore");
19
- var _sourceIds = require("../store/sourceIds");
20
- var _sourceSettings = require("../store/sourceSettings");
21
- /**
22
- * What Time Machine can capture from, and how healthy each source is.
23
- *
24
- * On device these are live registry probes; on Buoy Desktop the same shapes
25
- * arrive mirrored in the sync payload. Route is folded in as a source even
26
- * though it is a device capability rather than a registered provider — from
27
- * the user's side "can this snapshot take me back to that screen?" is the
28
- * same question as "will my Redux store come back".
29
- */
30
-
31
- /**
32
- * Buoy icons paint their knock-out parts with `fill: "bg"`, defaulting to a
33
- * near-black — so whatever surface an icon sits on has to be handed in as
34
- * `bgColor` or those cut-outs read as black holes (storage's floppy slot and
35
- * the route glyph are the two that use it).
36
- */
37
-
38
- const ICONS = {
39
- storage: _floatingToolsCore.StorageIcon,
40
- redux: _floatingToolsCore.ReduxIcon,
41
- zustand: _floatingToolsCore.ZustandIcon,
42
- jotai: _floatingToolsCore.JotaiIcon,
43
- query: _floatingToolsCore.QueryIcon,
44
- route: _floatingToolsCore.RoutesIcon
45
- };
46
- function sourceIcon(id) {
47
- return ICONS[id] ?? _floatingToolsCore.TimeMachineIcon;
48
- }
49
- function useSourceStatuses() {
50
- const {
51
- remoteProviders,
52
- remoteRoute
53
- } = (0, _useTimeMachine.useTimeMachineState)();
54
- const localProviders = (0, _useTimeMachine.useSnapshotProviders)();
55
- const disabled = (0, _react.useSyncExternalStore)(_sourceSettings.subscribeSourceSettings, _sourceSettings.getDisabledSources, _sourceSettings.getDisabledSources);
56
- const providers = remoteProviders ? remoteProviders.map(p => ({
57
- ...p,
58
- enabled: p.enabled !== false
59
- })) : localProviders.map(p => ({
60
- id: p.id,
61
- label: p.label,
62
- ...p.status(),
63
- enabled: !disabled.has(p.id)
64
- }));
65
- const routeAvailable = remoteProviders ? remoteRoute?.available === true : (0, _routeRestore.canNavigate)();
66
- return [...providers, {
67
- id: _sourceIds.ROUTE_SOURCE_ID,
68
- label: "Route",
69
- canCapture: routeAvailable,
70
- canRestore: routeAvailable,
71
- enabled: remoteProviders ? remoteRoute?.enabled !== false : !disabled.has(_sourceIds.ROUTE_SOURCE_ID),
72
- // No live pathname here: these screens only re-render on store changes,
73
- // so a route printed as status goes stale the moment you navigate with
74
- // the tool still open. Each restore point shows the route it holds.
75
- detail: routeAvailable ? "Recorded with every snapshot — a restore can take you back" : "No Expo Router detected — snapshots record no route"
76
- }];
77
- }
78
-
79
- /** A source is "attached" when a snapshot would actually pick it up. */
80
- function isAttached(source) {
81
- return source.canCapture && source.enabled;
82
- }
83
- //# sourceMappingURL=sources.js.map
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"ROUTE_SOURCE_ID",{enumerable:true,get:function(){return _sourceIds.ROUTE_SOURCE_ID}});exports.isAttached=isAttached;exports.sourceIcon=sourceIcon;exports.useSourceStatuses=useSourceStatuses;var _floatingToolsCore=require("@buoy-gg/floating-tools-core");var _react=require("react");var _useTimeMachine=require("../hooks/useTimeMachine");var _routeRestore=require("../store/routeRestore");var _sourceIds=require("../store/sourceIds");var _sourceSettings=require("../store/sourceSettings");const ICONS={storage:_floatingToolsCore.StorageIcon,redux:_floatingToolsCore.ReduxIcon,zustand:_floatingToolsCore.ZustandIcon,jotai:_floatingToolsCore.JotaiIcon,query:_floatingToolsCore.QueryIcon,route:_floatingToolsCore.RoutesIcon};function sourceIcon(e){return ICONS[e]??_floatingToolsCore.TimeMachineIcon}function useSourceStatuses(){const{remoteProviders:e,remoteRoute:o}=(0,_useTimeMachine.useTimeMachineState)();const a=(0,_useTimeMachine.useSnapshotProviders)();const s=(0,_react.useSyncExternalStore)(_sourceSettings.subscribeSourceSettings,_sourceSettings.getDisabledSources,_sourceSettings.getDisabledSources);const u=e?e.map(r=>({...r,enabled:r.enabled!==false})):a.map(r=>({id:r.id,label:r.label,...r.status(),enabled:!s.has(r.id)}));const t=e?o?.available===true:(0,_routeRestore.canNavigate)();return[...u,{id:_sourceIds.ROUTE_SOURCE_ID,label:"Route",canCapture:t,canRestore:t,enabled:e?o?.enabled!==false:!s.has(_sourceIds.ROUTE_SOURCE_ID),detail:t?"Recorded with every snapshot \u2014 a restore can take you back":"No Expo Router detected \u2014 snapshots record no route"}]}function isAttached(e){return e.canCapture&&e.enabled}
@@ -1,24 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.useSnapshotProviders = useSnapshotProviders;
7
- exports.useTimeMachineState = useTimeMachineState;
8
- var _react = require("react");
9
- var _sharedUi = require("@buoy-gg/shared-ui");
10
- var _timeMachineStore = require("../store/timeMachineStore");
11
- function useTimeMachineState() {
12
- return (0, _react.useSyncExternalStore)(_timeMachineStore.timeMachineStore.subscribe, () => _timeMachineStore.timeMachineStore.getState());
13
- }
14
-
15
- /** Registered snapshot providers (query registers late, hence the subscribe). */
16
- function useSnapshotProviders() {
17
- const [providers, setProviders] = (0, _react.useState)(_sharedUi.getStateSnapshotProviders);
18
- (0, _react.useEffect)(() => {
19
- setProviders((0, _sharedUi.getStateSnapshotProviders)());
20
- return (0, _sharedUi.subscribeToStateSnapshotProviders)(() => setProviders((0, _sharedUi.getStateSnapshotProviders)()));
21
- }, []);
22
- return providers;
23
- }
24
- //# sourceMappingURL=useTimeMachine.js.map
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.useSnapshotProviders=useSnapshotProviders;exports.useTimeMachineState=useTimeMachineState;var _react=require("react");var _sharedUi=require("@buoy-gg/shared-ui");var _timeMachineStore=require("../store/timeMachineStore");function useTimeMachineState(){return(0,_react.useSyncExternalStore)(_timeMachineStore.timeMachineStore.subscribe,()=>_timeMachineStore.timeMachineStore.getState())}function useSnapshotProviders(){const[t,e]=(0,_react.useState)(_sharedUi.getStateSnapshotProviders);(0,_react.useEffect)(()=>{e((0,_sharedUi.getStateSnapshotProviders)());return(0,_sharedUi.subscribeToStateSnapshotProviders)(()=>e((0,_sharedUi.getStateSnapshotProviders)()))},[]);return t}
@@ -1,161 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- Object.defineProperty(exports, "RESTORE_ORDER", {
7
- enumerable: true,
8
- get: function () {
9
- return _timeMachineStore.RESTORE_ORDER;
10
- }
11
- });
12
- Object.defineProperty(exports, "SAFETY_SNAPSHOT_NAME", {
13
- enumerable: true,
14
- get: function () {
15
- return _timeMachineStore.SAFETY_SNAPSHOT_NAME;
16
- }
17
- });
18
- Object.defineProperty(exports, "TIME_MACHINE_FLOATING_TOOL_ID", {
19
- enumerable: true,
20
- get: function () {
21
- return _TimeMachineFloatingTool.TIME_MACHINE_FLOATING_TOOL_ID;
22
- }
23
- });
24
- Object.defineProperty(exports, "TimeMachineModal", {
25
- enumerable: true,
26
- get: function () {
27
- return _TimeMachineModal.TimeMachineModal;
28
- }
29
- });
30
- Object.defineProperty(exports, "TimeMachineToolView", {
31
- enumerable: true,
32
- get: function () {
33
- return _TimeMachineModal.TimeMachineToolView;
34
- }
35
- });
36
- Object.defineProperty(exports, "armPendingRouteRestore", {
37
- enumerable: true,
38
- get: function () {
39
- return _routeRestore.armPendingRouteRestore;
40
- }
41
- });
42
- Object.defineProperty(exports, "canRestoreRoute", {
43
- enumerable: true,
44
- get: function () {
45
- return _routeRestore.canNavigate;
46
- }
47
- });
48
- Object.defineProperty(exports, "captureCurrentRoute", {
49
- enumerable: true,
50
- get: function () {
51
- return _routeRestore.captureCurrentRoute;
52
- }
53
- });
54
- Object.defineProperty(exports, "createTimeMachineTool", {
55
- enumerable: true,
56
- get: function () {
57
- return _preset.createTimeMachineTool;
58
- }
59
- });
60
- Object.defineProperty(exports, "isSourceEnabled", {
61
- enumerable: true,
62
- get: function () {
63
- return _sourceSettings.isSourceEnabled;
64
- }
65
- });
66
- Object.defineProperty(exports, "navigateToRoute", {
67
- enumerable: true,
68
- get: function () {
69
- return _routeRestore.navigateToRoute;
70
- }
71
- });
72
- Object.defineProperty(exports, "openTimeMachineFloatingTool", {
73
- enumerable: true,
74
- get: function () {
75
- return _TimeMachineFloatingTool.openTimeMachineFloatingTool;
76
- }
77
- });
78
- Object.defineProperty(exports, "replaceTimeMachineFromSnapshot", {
79
- enumerable: true,
80
- get: function () {
81
- return _timeMachineStore.replaceTimeMachineFromSnapshot;
82
- }
83
- });
84
- Object.defineProperty(exports, "setRemoteTimeMachineHandler", {
85
- enumerable: true,
86
- get: function () {
87
- return _timeMachineStore.setRemoteTimeMachineHandler;
88
- }
89
- });
90
- Object.defineProperty(exports, "setSourceEnabled", {
91
- enumerable: true,
92
- get: function () {
93
- return _sourceSettings.setSourceEnabled;
94
- }
95
- });
96
- Object.defineProperty(exports, "subscribeSourceSettings", {
97
- enumerable: true,
98
- get: function () {
99
- return _sourceSettings.subscribeSourceSettings;
100
- }
101
- });
102
- Object.defineProperty(exports, "timeMachineStore", {
103
- enumerable: true,
104
- get: function () {
105
- return _timeMachineStore.timeMachineStore;
106
- }
107
- });
108
- Object.defineProperty(exports, "timeMachineSyncAdapter", {
109
- enumerable: true,
110
- get: function () {
111
- return _timeMachineSyncAdapter.timeMachineSyncAdapter;
112
- }
113
- });
114
- Object.defineProperty(exports, "timeMachineToolPreset", {
115
- enumerable: true,
116
- get: function () {
117
- return _preset.timeMachineToolPreset;
118
- }
119
- });
120
- var _routeRestore = require("./store/routeRestore");
121
- var _preset = require("./preset");
122
- var _TimeMachineModal = require("./components/TimeMachineModal");
123
- var _TimeMachineFloatingTool = require("./components/floating/TimeMachineFloatingTool");
124
- var _timeMachineSyncAdapter = require("./sync/timeMachineSyncAdapter");
125
- var _timeMachineStore = require("./store/timeMachineStore");
126
- var _sourceSettings = require("./store/sourceSettings");
127
- /**
128
- * @buoy-gg/time-machine
129
- *
130
- * Time Machine — snapshot & restore app state for React Native DevTools.
131
- *
132
- * Capture the complete client-side state of the app (storage, Redux,
133
- * Zustand, Jotai, React Query) as a named snapshot; restore any snapshot in
134
- * one tap to iterate on multi-step test flows without rebuilding state.
135
- *
136
- * PUBLIC API - Only these exports are supported for external use.
137
- */
138
-
139
- // Tool preset for FloatingDevTools
140
-
141
- // Components
142
-
143
- // The floating restore bar (one armed point, one tap to restore)
144
-
145
- // External-sync adapter (auto-registered by @buoy-gg/core)
146
-
147
- // Programmatic snapshot control (also used by tests / power users)
148
-
149
- // Route capture / restore ("also take me back to the screen I was on")
150
-
151
- // Per-source on/off switches (the Sources strip); off = never captured or restored
152
-
153
- // Buoy Desktop remote-mirror seam
154
-
155
- // A reload-mode restore that also restores the route can't navigate itself —
156
- // the JS realm dies with the reload. It parks the route in storage; this picks
157
- // it up on the next boot. Core requires this module while mounting the
158
- // floating menu, which is the earliest point we're guaranteed to run.
159
- // Idempotent: repeated imports (or a host calling it explicitly) arm once.
160
- (0, _routeRestore.armPendingRouteRestore)();
161
- //# sourceMappingURL=index.js.map
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"RESTORE_ORDER",{enumerable:true,get:function(){return _timeMachineStore.RESTORE_ORDER}});Object.defineProperty(exports,"SAFETY_SNAPSHOT_NAME",{enumerable:true,get:function(){return _timeMachineStore.SAFETY_SNAPSHOT_NAME}});Object.defineProperty(exports,"TIME_MACHINE_FLOATING_TOOL_ID",{enumerable:true,get:function(){return _TimeMachineFloatingTool.TIME_MACHINE_FLOATING_TOOL_ID}});Object.defineProperty(exports,"TimeMachineModal",{enumerable:true,get:function(){return _TimeMachineModal.TimeMachineModal}});Object.defineProperty(exports,"TimeMachineToolView",{enumerable:true,get:function(){return _TimeMachineModal.TimeMachineToolView}});Object.defineProperty(exports,"armPendingRouteRestore",{enumerable:true,get:function(){return _routeRestore.armPendingRouteRestore}});Object.defineProperty(exports,"canRestoreRoute",{enumerable:true,get:function(){return _routeRestore.canNavigate}});Object.defineProperty(exports,"captureCurrentRoute",{enumerable:true,get:function(){return _routeRestore.captureCurrentRoute}});Object.defineProperty(exports,"createTimeMachineTool",{enumerable:true,get:function(){return _preset.createTimeMachineTool}});Object.defineProperty(exports,"isSourceEnabled",{enumerable:true,get:function(){return _sourceSettings.isSourceEnabled}});Object.defineProperty(exports,"navigateToRoute",{enumerable:true,get:function(){return _routeRestore.navigateToRoute}});Object.defineProperty(exports,"openTimeMachineFloatingTool",{enumerable:true,get:function(){return _TimeMachineFloatingTool.openTimeMachineFloatingTool}});Object.defineProperty(exports,"replaceTimeMachineFromSnapshot",{enumerable:true,get:function(){return _timeMachineStore.replaceTimeMachineFromSnapshot}});Object.defineProperty(exports,"setRemoteTimeMachineHandler",{enumerable:true,get:function(){return _timeMachineStore.setRemoteTimeMachineHandler}});Object.defineProperty(exports,"setSourceEnabled",{enumerable:true,get:function(){return _sourceSettings.setSourceEnabled}});Object.defineProperty(exports,"subscribeSourceSettings",{enumerable:true,get:function(){return _sourceSettings.subscribeSourceSettings}});Object.defineProperty(exports,"timeMachineStore",{enumerable:true,get:function(){return _timeMachineStore.timeMachineStore}});Object.defineProperty(exports,"timeMachineSyncAdapter",{enumerable:true,get:function(){return _timeMachineSyncAdapter.timeMachineSyncAdapter}});Object.defineProperty(exports,"timeMachineToolPreset",{enumerable:true,get:function(){return _preset.timeMachineToolPreset}});var _routeRestore=require("./store/routeRestore");var _preset=require("./preset");var _TimeMachineModal=require("./components/TimeMachineModal");var _TimeMachineFloatingTool=require("./components/floating/TimeMachineFloatingTool");var _timeMachineSyncAdapter=require("./sync/timeMachineSyncAdapter");var _timeMachineStore=require("./store/timeMachineStore");var _sourceSettings=require("./store/sourceSettings");(0,_routeRestore.armPendingRouteRestore)();
@@ -1,56 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.createTimeMachineTool = createTimeMachineTool;
7
- exports.timeMachineToolPreset = void 0;
8
- var _reactNative = require("react-native");
9
- var _sharedUi = require("@buoy-gg/shared-ui");
10
- var _TimeMachineBody = require("./components/TimeMachineBody");
11
- var _HeaderActions = require("./components/HeaderActions");
12
- var _jsxRuntime = require("react/jsx-runtime");
13
- /**
14
- * Pre-configured Time Machine tool for FloatingDevTools.
15
- *
16
- * @example
17
- * ```tsx
18
- * import { timeMachineToolPreset } from '@buoy-gg/time-machine';
19
- *
20
- * <FloatingDevTools apps={[timeMachineToolPreset]} />
21
- * ```
22
- */
23
-
24
- const timeMachineToolPreset = exports.timeMachineToolPreset = {
25
- id: "time-machine",
26
- name: "TIME MACHINE",
27
- description: "Snapshot & restore app state (storage, stores, query cache)",
28
- slot: "both",
29
- icon: ({
30
- size,
31
- color,
32
- slot
33
- }) => /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.TimeMachineIcon, {
34
- size: slot === "dial" && _reactNative.Platform.OS !== "web" ? size * 1.5 : size,
35
- color: color || _sharedUi.TIME_MACHINE_ICON_COLOR
36
- }),
37
- component: _TimeMachineBody.TimeMachineBody,
38
- // Declarative chrome: core's ToolModalShell provides the JsModal, the
39
- // managed header (screens override it via useToolHeader) and header search.
40
- modal: {
41
- subtitle: "snapshot & restore app state",
42
- searchable: true,
43
- searchPlaceholder: "Filter…",
44
- headerActions: /*#__PURE__*/(0, _jsxRuntime.jsx)(_HeaderActions.TimeMachineHeaderActions, {})
45
- }
46
- };
47
-
48
- /** Create a custom Time Machine tool configuration. */
49
- function createTimeMachineTool(options = {}) {
50
- return {
51
- ...timeMachineToolPreset,
52
- name: options.name ?? timeMachineToolPreset.name,
53
- description: options.description ?? timeMachineToolPreset.description
54
- };
55
- }
56
- //# sourceMappingURL=preset.js.map
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.createTimeMachineTool=createTimeMachineTool;exports.timeMachineToolPreset=void 0;var _reactNative=require("react-native");var _sharedUi=require("@buoy-gg/shared-ui");var _TimeMachineBody=require("./components/TimeMachineBody");var _HeaderActions=require("./components/HeaderActions");var _jsxRuntime=require("react/jsx-runtime");const timeMachineToolPreset=exports.timeMachineToolPreset={id:"time-machine",name:"TIME MACHINE",description:"Snapshot & restore app state (storage, stores, query cache)",slot:"both",icon:({size:e,color:r,slot:t})=>(0,_jsxRuntime.jsx)(_sharedUi.TimeMachineIcon,{size:t==="dial"&&_reactNative.Platform.OS!=="web"?e*1.5:e,color:r||_sharedUi.TIME_MACHINE_ICON_COLOR}),component:_TimeMachineBody.TimeMachineBody,modal:{subtitle:"snapshot & restore app state",searchable:true,searchPlaceholder:"Filter\u2026",headerActions:(0,_jsxRuntime.jsx)(_HeaderActions.TimeMachineHeaderActions,{})}};function createTimeMachineTool(e={}){return{...timeMachineToolPreset,name:e.name??timeMachineToolPreset.name,description:e.description??timeMachineToolPreset.description}}
@@ -1,188 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.PENDING_ROUTE_TTL_MS = void 0;
7
- exports.armPendingRouteRestore = armPendingRouteRestore;
8
- exports.canNavigate = canNavigate;
9
- exports.captureCurrentRoute = captureCurrentRoute;
10
- exports.clearPendingRoute = clearPendingRoute;
11
- exports.currentRoute = currentRoute;
12
- exports.navigateToRoute = navigateToRoute;
13
- exports.resetPendingRouteArm = resetPendingRouteArm;
14
- exports.savePendingRoute = savePendingRoute;
15
- var _sharedUi = require("@buoy-gg/shared-ui");
16
- /**
17
- * Route capture & restore for Time Machine.
18
- *
19
- * A restore point is only half the story: state without the screen you were
20
- * on drops you into the right data on the wrong page. Every snapshot records
21
- * the route it was captured on, and a restore can navigate back to it.
22
- *
23
- * Two navigation paths, because a "reload" restore kills the JS realm:
24
- * - LIVE restore: navigate immediately once the sources are applied.
25
- * - RELOAD restore: persist the route BEFORE the reload is scheduled, then
26
- * {@link armPendingRouteRestore} picks it up on the next boot, waits for the
27
- * router to come online, and navigates.
28
- *
29
- * Everything here is best-effort: apps without expo-router capture no route,
30
- * so the UI simply never offers the option.
31
- */
32
-
33
- /**
34
- * The route a snapshot was captured on. Only the URL is stored — imperative
35
- * params passed as objects (`navigate(path, { user })`) are not part of a
36
- * route and are not restored.
37
- */
38
-
39
- /** How a restore's route leg ended, reported back in the RestoreOutcome. */
40
-
41
- /**
42
- * Same `@react_buoy` family as the snapshot vault, so every tool's
43
- * isDevToolsStorageKey filter (and therefore every wipe/restore) leaves it
44
- * alone — a pending route must survive the storage restore that precedes the
45
- * reload it's waiting on.
46
- */
47
- const PENDING_KEY = "@react_buoy_time_machine:pending-route";
48
-
49
- /**
50
- * A pending route older than this belongs to a reload that never happened
51
- * (the app was killed, the user moved on). Boot-time navigation into a screen
52
- * someone left minutes ago is worse than doing nothing.
53
- */
54
- const PENDING_ROUTE_TTL_MS = exports.PENDING_ROUTE_TTL_MS = 60_000;
55
-
56
- /** How long to wait at boot for the router to come online. */
57
- const ROUTER_READY_TIMEOUT_MS = 8_000;
58
-
59
- /** Settle window after the router appears, so the initial route mounts first. */
60
- const ROUTER_SETTLE_MS = 250;
61
- function toSnapshotRoute(location) {
62
- return {
63
- pathname: location.pathname,
64
- href: location.href
65
- };
66
- }
67
-
68
- /** The route to stamp on a snapshot being captured, or null when unavailable. */
69
- function captureCurrentRoute() {
70
- const current = (0, _sharedUi.getSafeCurrentRoute)();
71
- return current ? toSnapshotRoute(current) : null;
72
- }
73
-
74
- /** The live route, for "you're already here" checks in the UI. */
75
- function currentRoute() {
76
- return captureCurrentRoute();
77
- }
78
-
79
- /** True when imperative navigation is possible on this device. */
80
- function canNavigate() {
81
- return (0, _sharedUi.getSafeRouter)() != null;
82
- }
83
-
84
- /**
85
- * Navigate to a captured route now. Uses `navigate` (not `push`) so restoring
86
- * the same route twice doesn't stack duplicate screens.
87
- */
88
- function navigateToRoute(route) {
89
- const base = {
90
- pathname: route.pathname,
91
- href: route.href
92
- };
93
- const router = (0, _sharedUi.getSafeRouter)();
94
- if (!router?.navigate) {
95
- return {
96
- ...base,
97
- status: "unavailable",
98
- error: "expo-router is not available on this device"
99
- };
100
- }
101
- try {
102
- router.navigate(route.href);
103
- return {
104
- ...base,
105
- status: "navigated"
106
- };
107
- } catch (e) {
108
- return {
109
- ...base,
110
- status: "failed",
111
- error: String(e)
112
- };
113
- }
114
- }
115
-
116
- // ── Pending route (survives the reload) ──────────────────────────────────────
117
-
118
- async function savePendingRoute(route, snapshotName) {
119
- const pending = {
120
- ...route,
121
- savedAt: Date.now(),
122
- ...(snapshotName ? {
123
- snapshotName
124
- } : {})
125
- };
126
- await _sharedUi.persistentStorage.setItem(PENDING_KEY, JSON.stringify(pending));
127
- }
128
- async function clearPendingRoute() {
129
- try {
130
- await _sharedUi.persistentStorage.removeItem(PENDING_KEY);
131
- } catch {
132
- // best-effort — a stale key is dropped by the TTL check anyway
133
- }
134
- }
135
- async function loadPendingRoute() {
136
- try {
137
- const raw = await _sharedUi.persistentStorage.getItem(PENDING_KEY);
138
- if (!raw) return null;
139
- const parsed = JSON.parse(raw);
140
- if (typeof parsed?.href !== "string" || !parsed.href) return null;
141
- if (typeof parsed.savedAt !== "number") return null;
142
- return {
143
- pathname: typeof parsed.pathname === "string" ? parsed.pathname : parsed.href,
144
- href: parsed.href,
145
- savedAt: parsed.savedAt,
146
- snapshotName: typeof parsed.snapshotName === "string" ? parsed.snapshotName : undefined
147
- };
148
- } catch {
149
- return null;
150
- }
151
- }
152
- let armed = false;
153
-
154
- /**
155
- * Boot-time consumer of a pending route: called once when the package loads
156
- * (core requires it while mounting the floating menu), it navigates to the
157
- * route a reload-mode restore asked for and clears the slot.
158
- *
159
- * Idempotent and self-limiting — the slot is cleared before navigating, so a
160
- * route that crashes the app on arrival can't put it in a boot loop.
161
- */
162
- function armPendingRouteRestore() {
163
- if (armed) return;
164
- armed = true;
165
- void (async () => {
166
- const pending = await loadPendingRoute();
167
- if (!pending) return;
168
- // Clear FIRST: whatever happens next, this route is spent.
169
- await clearPendingRoute();
170
- if (Date.now() - pending.savedAt > PENDING_ROUTE_TTL_MS) return;
171
- const deadline = Date.now() + ROUTER_READY_TIMEOUT_MS;
172
- while (!canNavigate() && Date.now() < deadline) {
173
- await new Promise(r => setTimeout(r, 100));
174
- }
175
- if (!canNavigate()) return;
176
- await new Promise(r => setTimeout(r, ROUTER_SETTLE_MS));
177
- navigateToRoute({
178
- pathname: pending.pathname,
179
- href: pending.href
180
- });
181
- })();
182
- }
183
-
184
- /** @internal test seam — re-arms the boot-time consumer. */
185
- function resetPendingRouteArm() {
186
- armed = false;
187
- }
188
- //# sourceMappingURL=routeRestore.js.map
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.PENDING_ROUTE_TTL_MS=void 0;exports.armPendingRouteRestore=armPendingRouteRestore;exports.canNavigate=canNavigate;exports.captureCurrentRoute=captureCurrentRoute;exports.clearPendingRoute=clearPendingRoute;exports.currentRoute=currentRoute;exports.navigateToRoute=navigateToRoute;exports.resetPendingRouteArm=resetPendingRouteArm;exports.savePendingRoute=savePendingRoute;var _sharedUi=require("@buoy-gg/shared-ui");const PENDING_KEY="@react_buoy_time_machine:pending-route";const PENDING_ROUTE_TTL_MS=exports.PENDING_ROUTE_TTL_MS=6e4;const ROUTER_READY_TIMEOUT_MS=8e3;const ROUTER_SETTLE_MS=250;function toSnapshotRoute(e){return{pathname:e.pathname,href:e.href}}function captureCurrentRoute(){const e=(0,_sharedUi.getSafeCurrentRoute)();return e?toSnapshotRoute(e):null}function currentRoute(){return captureCurrentRoute()}function canNavigate(){return(0,_sharedUi.getSafeRouter)()!=null}function navigateToRoute(e){const t={pathname:e.pathname,href:e.href};const n=(0,_sharedUi.getSafeRouter)();if(!n?.navigate){return{...t,status:"unavailable",error:"expo-router is not available on this device"}}try{n.navigate(e.href);return{...t,status:"navigated"}}catch(r){return{...t,status:"failed",error:String(r)}}}async function savePendingRoute(e,t){const n={...e,savedAt:Date.now(),...t?{snapshotName:t}:{}};await _sharedUi.persistentStorage.setItem(PENDING_KEY,JSON.stringify(n))}async function clearPendingRoute(){try{await _sharedUi.persistentStorage.removeItem(PENDING_KEY)}catch{}}async function loadPendingRoute(){try{const e=await _sharedUi.persistentStorage.getItem(PENDING_KEY);if(!e)return null;const t=JSON.parse(e);if(typeof t?.href!=="string"||!t.href)return null;if(typeof t.savedAt!=="number")return null;return{pathname:typeof t.pathname==="string"?t.pathname:t.href,href:t.href,savedAt:t.savedAt,snapshotName:typeof t.snapshotName==="string"?t.snapshotName:void 0}}catch{return null}}let armed=false;function armPendingRouteRestore(){if(armed)return;armed=true;void(async()=>{const e=await loadPendingRoute();if(!e)return;await clearPendingRoute();if(Date.now()-e.savedAt>PENDING_ROUTE_TTL_MS)return;const t=Date.now()+ROUTER_READY_TIMEOUT_MS;while(!canNavigate()&&Date.now()<t){await new Promise(n=>setTimeout(n,100))}if(!canNavigate())return;await new Promise(n=>setTimeout(n,ROUTER_SETTLE_MS));navigateToRoute({pathname:e.pathname,href:e.href})})()}function resetPendingRouteArm(){armed=false}