@buoy-gg/time-machine 7.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +58 -0
- package/README.md +55 -0
- package/lib/commonjs/components/TimeMachineBody.js +420 -0
- package/lib/commonjs/components/TimeMachineBody.js.map +1 -0
- package/lib/commonjs/components/TimeMachineModal.js +74 -0
- package/lib/commonjs/components/TimeMachineModal.js.map +1 -0
- package/lib/commonjs/hooks/useTimeMachine.js +24 -0
- package/lib/commonjs/hooks/useTimeMachine.js.map +1 -0
- package/lib/commonjs/index.js +64 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/preset.js +45 -0
- package/lib/commonjs/preset.js.map +1 -0
- package/lib/commonjs/store/snapshotVault.js +83 -0
- package/lib/commonjs/store/snapshotVault.js.map +1 -0
- package/lib/commonjs/store/timeMachineStore.js +335 -0
- package/lib/commonjs/store/timeMachineStore.js.map +1 -0
- package/lib/commonjs/sync/timeMachineSyncAdapter.js +139 -0
- package/lib/commonjs/sync/timeMachineSyncAdapter.js.map +1 -0
- package/lib/module/components/TimeMachineBody.js +415 -0
- package/lib/module/components/TimeMachineBody.js.map +1 -0
- package/lib/module/components/TimeMachineModal.js +68 -0
- package/lib/module/components/TimeMachineModal.js.map +1 -0
- package/lib/module/hooks/useTimeMachine.js +19 -0
- package/lib/module/hooks/useTimeMachine.js.map +1 -0
- package/lib/module/index.js +29 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/preset.js +40 -0
- package/lib/module/preset.js.map +1 -0
- package/lib/module/store/snapshotVault.js +74 -0
- package/lib/module/store/snapshotVault.js.map +1 -0
- package/lib/module/store/timeMachineStore.js +327 -0
- package/lib/module/store/timeMachineStore.js.map +1 -0
- package/lib/module/sync/timeMachineSyncAdapter.js +134 -0
- package/lib/module/sync/timeMachineSyncAdapter.js.map +1 -0
- package/lib/typescript/components/TimeMachineBody.d.ts +2 -0
- package/lib/typescript/components/TimeMachineBody.d.ts.map +1 -0
- package/lib/typescript/components/TimeMachineModal.d.ts +12 -0
- package/lib/typescript/components/TimeMachineModal.d.ts.map +1 -0
- package/lib/typescript/hooks/useTimeMachine.d.ts +6 -0
- package/lib/typescript/hooks/useTimeMachine.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +18 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/preset.d.ts +38 -0
- package/lib/typescript/preset.d.ts.map +1 -0
- package/lib/typescript/store/snapshotVault.d.ts +46 -0
- package/lib/typescript/store/snapshotVault.d.ts.map +1 -0
- package/lib/typescript/store/timeMachineStore.d.ts +97 -0
- package/lib/typescript/store/timeMachineStore.d.ts.map +1 -0
- package/lib/typescript/sync/timeMachineSyncAdapter.d.ts +59 -0
- package/lib/typescript/sync/timeMachineSyncAdapter.d.ts.map +1 -0
- package/package.json +59 -0
- package/src/components/TimeMachineBody.tsx +455 -0
- package/src/components/TimeMachineModal.tsx +75 -0
- package/src/hooks/useTimeMachine.ts +26 -0
- package/src/index.tsx +45 -0
- package/src/preset.tsx +38 -0
- package/src/store/snapshotVault.ts +117 -0
- package/src/store/timeMachineStore.ts +368 -0
- package/src/sync/timeMachineSyncAdapter.ts +128 -0
|
@@ -0,0 +1,64 @@
|
|
|
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, "TimeMachineModal", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function () {
|
|
15
|
+
return _TimeMachineModal.TimeMachineModal;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
Object.defineProperty(exports, "TimeMachineToolView", {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get: function () {
|
|
21
|
+
return _TimeMachineModal.TimeMachineToolView;
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
Object.defineProperty(exports, "createTimeMachineTool", {
|
|
25
|
+
enumerable: true,
|
|
26
|
+
get: function () {
|
|
27
|
+
return _preset.createTimeMachineTool;
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
Object.defineProperty(exports, "replaceTimeMachineFromSnapshot", {
|
|
31
|
+
enumerable: true,
|
|
32
|
+
get: function () {
|
|
33
|
+
return _timeMachineStore.replaceTimeMachineFromSnapshot;
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
Object.defineProperty(exports, "setRemoteTimeMachineHandler", {
|
|
37
|
+
enumerable: true,
|
|
38
|
+
get: function () {
|
|
39
|
+
return _timeMachineStore.setRemoteTimeMachineHandler;
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
Object.defineProperty(exports, "timeMachineStore", {
|
|
43
|
+
enumerable: true,
|
|
44
|
+
get: function () {
|
|
45
|
+
return _timeMachineStore.timeMachineStore;
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
Object.defineProperty(exports, "timeMachineSyncAdapter", {
|
|
49
|
+
enumerable: true,
|
|
50
|
+
get: function () {
|
|
51
|
+
return _timeMachineSyncAdapter.timeMachineSyncAdapter;
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
Object.defineProperty(exports, "timeMachineToolPreset", {
|
|
55
|
+
enumerable: true,
|
|
56
|
+
get: function () {
|
|
57
|
+
return _preset.timeMachineToolPreset;
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
var _preset = require("./preset");
|
|
61
|
+
var _TimeMachineModal = require("./components/TimeMachineModal");
|
|
62
|
+
var _timeMachineSyncAdapter = require("./sync/timeMachineSyncAdapter");
|
|
63
|
+
var _timeMachineStore = require("./store/timeMachineStore");
|
|
64
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_preset","require","_TimeMachineModal","_timeMachineSyncAdapter","_timeMachineStore"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,IAAAA,OAAA,GAAAC,OAAA;AAGA,IAAAC,iBAAA,GAAAD,OAAA;AAOA,IAAAE,uBAAA,GAAAF,OAAA;AAGA,IAAAG,iBAAA,GAAAH,OAAA","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"commonjs"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createTimeMachineTool = createTimeMachineTool;
|
|
7
|
+
exports.timeMachineToolPreset = void 0;
|
|
8
|
+
var _sharedUi = require("@buoy-gg/shared-ui");
|
|
9
|
+
var _TimeMachineModal = require("./components/TimeMachineModal");
|
|
10
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
11
|
+
/**
|
|
12
|
+
* Pre-configured Time Machine tool for FloatingDevTools.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```tsx
|
|
16
|
+
* import { timeMachineToolPreset } from '@buoy-gg/time-machine';
|
|
17
|
+
*
|
|
18
|
+
* <FloatingDevTools apps={[timeMachineToolPreset]} />
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
const timeMachineToolPreset = exports.timeMachineToolPreset = {
|
|
23
|
+
id: "time-machine",
|
|
24
|
+
name: "TIME MACHINE",
|
|
25
|
+
description: "Snapshot & restore app state (storage, stores, query cache)",
|
|
26
|
+
slot: "both",
|
|
27
|
+
icon: ({
|
|
28
|
+
size,
|
|
29
|
+
color
|
|
30
|
+
}) => /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.TimeMachineIcon, {
|
|
31
|
+
size: size,
|
|
32
|
+
color: color || _sharedUi.TIME_MACHINE_ICON_COLOR
|
|
33
|
+
}),
|
|
34
|
+
component: _TimeMachineModal.TimeMachineModal
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/** Create a custom Time Machine tool configuration. */
|
|
38
|
+
function createTimeMachineTool(options = {}) {
|
|
39
|
+
return {
|
|
40
|
+
...timeMachineToolPreset,
|
|
41
|
+
name: options.name ?? timeMachineToolPreset.name,
|
|
42
|
+
description: options.description ?? timeMachineToolPreset.description
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=preset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_sharedUi","require","_TimeMachineModal","_jsxRuntime","timeMachineToolPreset","exports","id","name","description","slot","icon","size","color","jsx","TimeMachineIcon","TIME_MACHINE_ICON_COLOR","component","TimeMachineModal","createTimeMachineTool","options"],"sourceRoot":"../../src","sources":["preset.tsx"],"mappings":";;;;;;;AAWA,IAAAA,SAAA,GAAAC,OAAA;AAIA,IAAAC,iBAAA,GAAAD,OAAA;AAAiE,IAAAE,WAAA,GAAAF,OAAA;AAfjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAQO,MAAMG,qBAAqB,GAAAC,OAAA,CAAAD,qBAAA,GAAG;EACnCE,EAAE,EAAE,cAAc;EAClBC,IAAI,EAAE,cAAc;EACpBC,WAAW,EAAE,6DAA6D;EAC1EC,IAAI,EAAE,MAAe;EACrBC,IAAI,EAAEA,CAAC;IAAEC,IAAI;IAAEC;EAAwC,CAAC,kBACtD,IAAAT,WAAA,CAAAU,GAAA,EAACb,SAAA,CAAAc,eAAe;IAACH,IAAI,EAAEA,IAAK;IAACC,KAAK,EAAEA,KAAK,IAAIG;EAAwB,CAAE,CACxE;EACDC,SAAS,EAAEC;AACb,CAAC;;AAED;AACO,SAASC,qBAAqBA,CACnCC,OAAgD,GAAG,CAAC,CAAC,EACrD;EACA,OAAO;IACL,GAAGf,qBAAqB;IACxBG,IAAI,EAAEY,OAAO,CAACZ,IAAI,IAAIH,qBAAqB,CAACG,IAAI;IAChDC,WAAW,EAAEW,OAAO,CAACX,WAAW,IAAIJ,qBAAqB,CAACI;EAC5D,CAAC;AACH","ignoreList":[]}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.deleteSnapshot = deleteSnapshot;
|
|
7
|
+
exports.loadIndex = loadIndex;
|
|
8
|
+
exports.loadSnapshot = loadSnapshot;
|
|
9
|
+
exports.renameSnapshot = renameSnapshot;
|
|
10
|
+
exports.saveSnapshot = saveSnapshot;
|
|
11
|
+
var _sharedUi = require("@buoy-gg/shared-ui");
|
|
12
|
+
/**
|
|
13
|
+
* Snapshot persistence for Time Machine.
|
|
14
|
+
*
|
|
15
|
+
* Snapshots live ON-DEVICE in persistentStorage (FileSystem → AsyncStorage →
|
|
16
|
+
* localStorage → Memory fallback): no size caps, survives restarts, and never
|
|
17
|
+
* crosses the 2MB external-sync snapshot budget — only metadata does.
|
|
18
|
+
*
|
|
19
|
+
* Layout: ONE storage key per snapshot (persistentStorage's FileSystem
|
|
20
|
+
* backend writes one file per key, and its multiGet is sequential — a single
|
|
21
|
+
* big key beats many small ones), plus one index key holding the metadata
|
|
22
|
+
* list for cheap listing.
|
|
23
|
+
*
|
|
24
|
+
* Keys use the `@react_buoy` family so every tool's isDevToolsStorageKey
|
|
25
|
+
* filter (including our own storage provider) excludes the vault itself from
|
|
26
|
+
* snapshots — a snapshot must never contain snapshots.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
const INDEX_KEY = "@react_buoy_time_machine:index";
|
|
30
|
+
const SNAP_PREFIX = "@react_buoy_time_machine:snap:";
|
|
31
|
+
async function loadIndex() {
|
|
32
|
+
try {
|
|
33
|
+
const raw = await _sharedUi.persistentStorage.getItem(INDEX_KEY);
|
|
34
|
+
if (!raw) return [];
|
|
35
|
+
const parsed = JSON.parse(raw);
|
|
36
|
+
return Array.isArray(parsed) ? parsed : [];
|
|
37
|
+
} catch {
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async function saveIndex(metas) {
|
|
42
|
+
await _sharedUi.persistentStorage.setItem(INDEX_KEY, JSON.stringify(metas));
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Persists the snapshot, stamps meta.sizeBytes, and updates the index. */
|
|
46
|
+
async function saveSnapshot(snapshot, metas) {
|
|
47
|
+
const serialized = JSON.stringify(snapshot);
|
|
48
|
+
snapshot.meta.sizeBytes = serialized.length;
|
|
49
|
+
await _sharedUi.persistentStorage.setItem(SNAP_PREFIX + snapshot.meta.id,
|
|
50
|
+
// Re-stringify so the persisted copy carries the final sizeBytes.
|
|
51
|
+
JSON.stringify(snapshot));
|
|
52
|
+
const next = [snapshot.meta, ...metas.filter(m => m.id !== snapshot.meta.id)];
|
|
53
|
+
await saveIndex(next);
|
|
54
|
+
return next;
|
|
55
|
+
}
|
|
56
|
+
async function loadSnapshot(id) {
|
|
57
|
+
try {
|
|
58
|
+
const raw = await _sharedUi.persistentStorage.getItem(SNAP_PREFIX + id);
|
|
59
|
+
return raw ? JSON.parse(raw) : null;
|
|
60
|
+
} catch {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async function deleteSnapshot(id, metas) {
|
|
65
|
+
await _sharedUi.persistentStorage.removeItem(SNAP_PREFIX + id);
|
|
66
|
+
const next = metas.filter(m => m.id !== id);
|
|
67
|
+
await saveIndex(next);
|
|
68
|
+
return next;
|
|
69
|
+
}
|
|
70
|
+
async function renameSnapshot(id, name, metas) {
|
|
71
|
+
const next = metas.map(m => m.id === id ? {
|
|
72
|
+
...m,
|
|
73
|
+
name
|
|
74
|
+
} : m);
|
|
75
|
+
await saveIndex(next);
|
|
76
|
+
const stored = await loadSnapshot(id);
|
|
77
|
+
if (stored) {
|
|
78
|
+
stored.meta.name = name;
|
|
79
|
+
await _sharedUi.persistentStorage.setItem(SNAP_PREFIX + id, JSON.stringify(stored));
|
|
80
|
+
}
|
|
81
|
+
return next;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=snapshotVault.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_sharedUi","require","INDEX_KEY","SNAP_PREFIX","loadIndex","raw","persistentStorage","getItem","parsed","JSON","parse","Array","isArray","saveIndex","metas","setItem","stringify","saveSnapshot","snapshot","serialized","meta","sizeBytes","length","id","next","filter","m","loadSnapshot","deleteSnapshot","removeItem","renameSnapshot","name","map","stored"],"sourceRoot":"../../../src","sources":["store/snapshotVault.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.RESTORE_ORDER = void 0;
|
|
7
|
+
exports.replaceTimeMachineFromSnapshot = replaceTimeMachineFromSnapshot;
|
|
8
|
+
exports.setRemoteTimeMachineHandler = setRemoteTimeMachineHandler;
|
|
9
|
+
exports.timeMachineStore = void 0;
|
|
10
|
+
var _sharedUi = require("@buoy-gg/shared-ui");
|
|
11
|
+
var _snapshotVault = require("./snapshotVault");
|
|
12
|
+
/**
|
|
13
|
+
* Time Machine orchestrator — snapshot CRUD + capture/restore across every
|
|
14
|
+
* registered StateSnapshotProvider (storage, redux, zustand, jotai, query,
|
|
15
|
+
* plus any custom providers the app registers).
|
|
16
|
+
*
|
|
17
|
+
* Restore ordering is fixed: persisted storage FIRST (so store persist
|
|
18
|
+
* middleware writing through after an in-memory restore converges with what
|
|
19
|
+
* we just wrote), then redux → zustand → jotai, query LAST (restored queries
|
|
20
|
+
* may derive from store state). Custom providers run after, in data order.
|
|
21
|
+
*
|
|
22
|
+
* Two restore modes:
|
|
23
|
+
* - "live": in-place state replacement, capability-gated per source.
|
|
24
|
+
* - "reload": restore ONLY persisted storage, then reload the JS bundle —
|
|
25
|
+
* in-memory stores rebuild themselves from the restored storage.
|
|
26
|
+
* Baseline snapshots always use this path (clear + reload).
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
const RESTORE_ORDER = exports.RESTORE_ORDER = ["storage", "redux", "zustand", "jotai", "query"];
|
|
30
|
+
|
|
31
|
+
/** Provider capability row as mirrored to a remote dashboard. */
|
|
32
|
+
|
|
33
|
+
let remoteHandler = null;
|
|
34
|
+
function skippedResult(reason) {
|
|
35
|
+
return {
|
|
36
|
+
ok: false,
|
|
37
|
+
applied: 0,
|
|
38
|
+
skipped: [{
|
|
39
|
+
id: "*",
|
|
40
|
+
reason
|
|
41
|
+
}],
|
|
42
|
+
warnings: []
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
let idCounter = 0;
|
|
46
|
+
function nextId() {
|
|
47
|
+
idCounter += 1;
|
|
48
|
+
return `snap_${Date.now().toString(36)}_${idCounter.toString(36)}`;
|
|
49
|
+
}
|
|
50
|
+
class TimeMachineStore {
|
|
51
|
+
state = {
|
|
52
|
+
snapshots: [],
|
|
53
|
+
hasLoaded: false,
|
|
54
|
+
busy: null,
|
|
55
|
+
lastOutcome: null,
|
|
56
|
+
remoteProviders: null
|
|
57
|
+
};
|
|
58
|
+
listeners = new Set();
|
|
59
|
+
loadPromise = null;
|
|
60
|
+
getState() {
|
|
61
|
+
return this.state;
|
|
62
|
+
}
|
|
63
|
+
subscribe = listener => {
|
|
64
|
+
this.listeners.add(listener);
|
|
65
|
+
void this.ensureLoaded();
|
|
66
|
+
return () => {
|
|
67
|
+
this.listeners.delete(listener);
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
setState(patch) {
|
|
71
|
+
this.state = {
|
|
72
|
+
...this.state,
|
|
73
|
+
...patch
|
|
74
|
+
};
|
|
75
|
+
this.listeners.forEach(l => {
|
|
76
|
+
try {
|
|
77
|
+
l();
|
|
78
|
+
} catch {
|
|
79
|
+
// listener errors must not break the store
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
ensureLoaded() {
|
|
84
|
+
if (remoteHandler) return Promise.resolve(); // mirror mode — device owns the vault
|
|
85
|
+
if (!this.loadPromise) {
|
|
86
|
+
this.loadPromise = (0, _snapshotVault.loadIndex)().then(snapshots => {
|
|
87
|
+
if (remoteHandler) return;
|
|
88
|
+
this.setState({
|
|
89
|
+
snapshots,
|
|
90
|
+
hasLoaded: true
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
return this.loadPromise;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** @internal Buoy Desktop: mirror the device's synced metadata payload. */
|
|
98
|
+
replaceFromSnapshot(payload) {
|
|
99
|
+
this.setState({
|
|
100
|
+
snapshots: payload.snapshots ?? [],
|
|
101
|
+
busy: payload.busy ?? null,
|
|
102
|
+
lastOutcome: payload.lastOutcome ?? null,
|
|
103
|
+
remoteProviders: payload.providers ?? [],
|
|
104
|
+
hasLoaded: true
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** Capture all capturable sources (or a subset) into a named snapshot. */
|
|
109
|
+
async capture(name, sourceIds) {
|
|
110
|
+
if (remoteHandler) {
|
|
111
|
+
const result = await remoteHandler("capture", {
|
|
112
|
+
name,
|
|
113
|
+
sourceIds
|
|
114
|
+
});
|
|
115
|
+
return result.snapshot;
|
|
116
|
+
}
|
|
117
|
+
await this.ensureLoaded();
|
|
118
|
+
this.setState({
|
|
119
|
+
busy: "capture"
|
|
120
|
+
});
|
|
121
|
+
try {
|
|
122
|
+
const providers = (0, _sharedUi.getStateSnapshotProviders)().filter(p => p.status().canCapture && (!sourceIds || sourceIds.includes(p.id)));
|
|
123
|
+
const data = {};
|
|
124
|
+
const sources = {};
|
|
125
|
+
for (const provider of providers) {
|
|
126
|
+
try {
|
|
127
|
+
const captured = await provider.capture();
|
|
128
|
+
data[provider.id] = (0, _sharedUi.superJsonSerialize)(captured.data);
|
|
129
|
+
sources[provider.id] = {
|
|
130
|
+
warnings: captured.warnings
|
|
131
|
+
};
|
|
132
|
+
} catch (e) {
|
|
133
|
+
sources[provider.id] = {
|
|
134
|
+
warnings: [`capture failed: ${String(e)}`]
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
const snapshot = {
|
|
139
|
+
meta: {
|
|
140
|
+
id: nextId(),
|
|
141
|
+
name: name.trim() || "Untitled snapshot",
|
|
142
|
+
createdAt: Date.now(),
|
|
143
|
+
sizeBytes: 0,
|
|
144
|
+
sources
|
|
145
|
+
},
|
|
146
|
+
data
|
|
147
|
+
};
|
|
148
|
+
const snapshots = await (0, _snapshotVault.saveSnapshot)(snapshot, this.state.snapshots);
|
|
149
|
+
this.setState({
|
|
150
|
+
snapshots
|
|
151
|
+
});
|
|
152
|
+
return snapshot.meta;
|
|
153
|
+
} finally {
|
|
154
|
+
this.setState({
|
|
155
|
+
busy: null
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Capture the fresh-install baseline: an EMPTY snapshot whose restore
|
|
162
|
+
* wipes app state (clear + reload) — regardless of what state the app is
|
|
163
|
+
* in when the button is pressed.
|
|
164
|
+
*/
|
|
165
|
+
async captureBaseline() {
|
|
166
|
+
if (remoteHandler) {
|
|
167
|
+
const result = await remoteHandler("captureBaseline", {});
|
|
168
|
+
return result.snapshot;
|
|
169
|
+
}
|
|
170
|
+
await this.ensureLoaded();
|
|
171
|
+
const snapshot = {
|
|
172
|
+
meta: {
|
|
173
|
+
id: nextId(),
|
|
174
|
+
name: "Fresh install",
|
|
175
|
+
createdAt: Date.now(),
|
|
176
|
+
sizeBytes: 0,
|
|
177
|
+
baseline: true,
|
|
178
|
+
sources: {}
|
|
179
|
+
},
|
|
180
|
+
data: {}
|
|
181
|
+
};
|
|
182
|
+
const snapshots = await (0, _snapshotVault.saveSnapshot)(snapshot, this.state.snapshots);
|
|
183
|
+
this.setState({
|
|
184
|
+
snapshots
|
|
185
|
+
});
|
|
186
|
+
return snapshot.meta;
|
|
187
|
+
}
|
|
188
|
+
async restore(id, mode) {
|
|
189
|
+
if (remoteHandler) {
|
|
190
|
+
const outcome = await remoteHandler("restore", {
|
|
191
|
+
id,
|
|
192
|
+
mode
|
|
193
|
+
});
|
|
194
|
+
this.setState({
|
|
195
|
+
lastOutcome: outcome
|
|
196
|
+
});
|
|
197
|
+
return outcome;
|
|
198
|
+
}
|
|
199
|
+
await this.ensureLoaded();
|
|
200
|
+
this.setState({
|
|
201
|
+
busy: "restore"
|
|
202
|
+
});
|
|
203
|
+
try {
|
|
204
|
+
const stored = await (0, _snapshotVault.loadSnapshot)(id);
|
|
205
|
+
if (!stored) throw new Error(`No snapshot with id "${id}"`);
|
|
206
|
+
const outcome = {
|
|
207
|
+
snapshotId: id,
|
|
208
|
+
snapshotName: stored.meta.name,
|
|
209
|
+
mode,
|
|
210
|
+
at: Date.now(),
|
|
211
|
+
willReload: false,
|
|
212
|
+
results: {}
|
|
213
|
+
};
|
|
214
|
+
if (stored.meta.baseline) {
|
|
215
|
+
// Fresh install: wipe every clearable source, then reload so all
|
|
216
|
+
// in-memory state rebuilds from nothing.
|
|
217
|
+
for (const provider of (0, _sharedUi.getStateSnapshotProviders)()) {
|
|
218
|
+
if (provider.clear) {
|
|
219
|
+
try {
|
|
220
|
+
outcome.results[provider.id] = await provider.clear();
|
|
221
|
+
} catch (e) {
|
|
222
|
+
outcome.results[provider.id] = skippedResult(String(e));
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
outcome.willReload = this.scheduleReload("buoy time-machine baseline");
|
|
227
|
+
this.setState({
|
|
228
|
+
lastOutcome: outcome
|
|
229
|
+
});
|
|
230
|
+
return outcome;
|
|
231
|
+
}
|
|
232
|
+
const sourceIds = [...RESTORE_ORDER.filter(sid => sid in stored.data), ...Object.keys(stored.data).filter(sid => !RESTORE_ORDER.includes(sid))];
|
|
233
|
+
if (mode === "reload") {
|
|
234
|
+
// Storage only; everything in-memory rebuilds after the reload.
|
|
235
|
+
if (stored.data.storage) {
|
|
236
|
+
outcome.results.storage = await this.restoreSource("storage", stored.data.storage);
|
|
237
|
+
}
|
|
238
|
+
outcome.willReload = this.scheduleReload("buoy time-machine restore");
|
|
239
|
+
this.setState({
|
|
240
|
+
lastOutcome: outcome
|
|
241
|
+
});
|
|
242
|
+
return outcome;
|
|
243
|
+
}
|
|
244
|
+
for (const sid of sourceIds) {
|
|
245
|
+
outcome.results[sid] = await this.restoreSource(sid, stored.data[sid]);
|
|
246
|
+
}
|
|
247
|
+
this.setState({
|
|
248
|
+
lastOutcome: outcome
|
|
249
|
+
});
|
|
250
|
+
return outcome;
|
|
251
|
+
} finally {
|
|
252
|
+
this.setState({
|
|
253
|
+
busy: null
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
async restoreSource(sourceId, payload) {
|
|
258
|
+
const provider = (0, _sharedUi.getStateSnapshotProvider)(sourceId);
|
|
259
|
+
if (!provider) {
|
|
260
|
+
return skippedResult("provider not available (package missing or not initialized)");
|
|
261
|
+
}
|
|
262
|
+
const status = provider.status();
|
|
263
|
+
if (!status.canRestore) {
|
|
264
|
+
return skippedResult(status.detail ?? "restore unavailable");
|
|
265
|
+
}
|
|
266
|
+
try {
|
|
267
|
+
return await provider.restore((0, _sharedUi.superJsonDeserialize)(payload));
|
|
268
|
+
} catch (e) {
|
|
269
|
+
return skippedResult(String(e));
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
scheduleReload(reason) {
|
|
273
|
+
try {
|
|
274
|
+
(0, _sharedUi.scheduleReloadApp)({
|
|
275
|
+
reason
|
|
276
|
+
});
|
|
277
|
+
return true;
|
|
278
|
+
} catch {
|
|
279
|
+
// No reload mechanism (bare production build?) — restore still stands.
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
async delete(id) {
|
|
284
|
+
if (remoteHandler) {
|
|
285
|
+
await remoteHandler("delete", {
|
|
286
|
+
id
|
|
287
|
+
});
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
await this.ensureLoaded();
|
|
291
|
+
const snapshots = await (0, _snapshotVault.deleteSnapshot)(id, this.state.snapshots);
|
|
292
|
+
this.setState({
|
|
293
|
+
snapshots
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
async rename(id, name) {
|
|
297
|
+
if (remoteHandler) {
|
|
298
|
+
await remoteHandler("rename", {
|
|
299
|
+
id,
|
|
300
|
+
name
|
|
301
|
+
});
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
await this.ensureLoaded();
|
|
305
|
+
const snapshots = await (0, _snapshotVault.renameSnapshot)(id, name, this.state.snapshots);
|
|
306
|
+
this.setState({
|
|
307
|
+
snapshots
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
clearLastOutcome() {
|
|
311
|
+
this.setState({
|
|
312
|
+
lastOutcome: null
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
const timeMachineStore = exports.timeMachineStore = new TimeMachineStore();
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* Buoy Desktop: route every Time Machine operation through a remote handler
|
|
320
|
+
* (the device's sync adapter actions) instead of running locally. Pass null
|
|
321
|
+
* to detach. While attached, feed device payloads to
|
|
322
|
+
* {@link replaceTimeMachineFromSnapshot}.
|
|
323
|
+
*/
|
|
324
|
+
function setRemoteTimeMachineHandler(handler) {
|
|
325
|
+
remoteHandler = handler;
|
|
326
|
+
if (!handler) {
|
|
327
|
+
timeMachineStore.replaceFromSnapshot({});
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/** Buoy Desktop: mirror a device's synced Time Machine metadata payload. */
|
|
332
|
+
function replaceTimeMachineFromSnapshot(payload) {
|
|
333
|
+
timeMachineStore.replaceFromSnapshot(payload);
|
|
334
|
+
}
|
|
335
|
+
//# sourceMappingURL=timeMachineStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_sharedUi","require","_snapshotVault","RESTORE_ORDER","exports","remoteHandler","skippedResult","reason","ok","applied","skipped","id","warnings","idCounter","nextId","Date","now","toString","TimeMachineStore","state","snapshots","hasLoaded","busy","lastOutcome","remoteProviders","listeners","Set","loadPromise","getState","subscribe","listener","add","ensureLoaded","delete","setState","patch","forEach","l","Promise","resolve","loadIndex","then","replaceFromSnapshot","payload","providers","capture","name","sourceIds","result","snapshot","getStateSnapshotProviders","filter","p","status","canCapture","includes","data","sources","provider","captured","superJsonSerialize","e","String","meta","trim","createdAt","sizeBytes","saveSnapshot","captureBaseline","baseline","restore","mode","outcome","stored","loadSnapshot","Error","snapshotId","snapshotName","at","willReload","results","clear","scheduleReload","sid","Object","keys","storage","restoreSource","sourceId","getStateSnapshotProvider","canRestore","detail","superJsonDeserialize","scheduleReloadApp","deleteSnapshot","rename","renameSnapshot","clearLastOutcome","timeMachineStore","setRemoteTimeMachineHandler","handler","replaceTimeMachineFromSnapshot"],"sourceRoot":"../../../src","sources":["store/timeMachineStore.ts"],"mappings":";;;;;;;;;AAgBA,IAAAA,SAAA,GAAAC,OAAA;AASA,IAAAC,cAAA,GAAAD,OAAA;AAzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAoBO,MAAME,aAAa,GAAAC,OAAA,CAAAD,aAAA,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC;;AAc9E;;AA2BA,IAAIE,aAAmC,GAAG,IAAI;AAE9C,SAASC,aAAaA,CAACC,MAAc,EAA8B;EACjE,OAAO;IAAEC,EAAE,EAAE,KAAK;IAAEC,OAAO,EAAE,CAAC;IAAEC,OAAO,EAAE,CAAC;MAAEC,EAAE,EAAE,GAAG;MAAEJ;IAAO,CAAC,CAAC;IAAEK,QAAQ,EAAE;EAAG,CAAC;AAChF;AAEA,IAAIC,SAAS,GAAG,CAAC;AACjB,SAASC,MAAMA,CAAA,EAAW;EACxBD,SAAS,IAAI,CAAC;EACd,OAAO,QAAQE,IAAI,CAACC,GAAG,CAAC,CAAC,CAACC,QAAQ,CAAC,EAAE,CAAC,IAAIJ,SAAS,CAACI,QAAQ,CAAC,EAAE,CAAC,EAAE;AACpE;AAEA,MAAMC,gBAAgB,CAAC;EACbC,KAAK,GAAqB;IAChCC,SAAS,EAAE,EAAE;IACbC,SAAS,EAAE,KAAK;IAChBC,IAAI,EAAE,IAAI;IACVC,WAAW,EAAE,IAAI;IACjBC,eAAe,EAAE;EACnB,CAAC;EACOC,SAAS,GAAG,IAAIC,GAAG,CAAa,CAAC;EACjCC,WAAW,GAAyB,IAAI;EAEhDC,QAAQA,CAAA,EAAqB;IAC3B,OAAO,IAAI,CAACT,KAAK;EACnB;EAEAU,SAAS,GAAIC,QAAoB,IAAmB;IAClD,IAAI,CAACL,SAAS,CAACM,GAAG,CAACD,QAAQ,CAAC;IAC5B,KAAK,IAAI,CAACE,YAAY,CAAC,CAAC;IACxB,OAAO,MAAM;MACX,IAAI,CAACP,SAAS,CAACQ,MAAM,CAACH,QAAQ,CAAC;IACjC,CAAC;EACH,CAAC;EAEOI,QAAQA,CAACC,KAAgC,EAAE;IACjD,IAAI,CAAChB,KAAK,GAAG;MAAE,GAAG,IAAI,CAACA,KAAK;MAAE,GAAGgB;IAAM,CAAC;IACxC,IAAI,CAACV,SAAS,CAACW,OAAO,CAAEC,CAAC,IAAK;MAC5B,IAAI;QACFA,CAAC,CAAC,CAAC;MACL,CAAC,CAAC,MAAM;QACN;MAAA;IAEJ,CAAC,CAAC;EACJ;EAEAL,YAAYA,CAAA,EAAkB;IAC5B,IAAI3B,aAAa,EAAE,OAAOiC,OAAO,CAACC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7C,IAAI,CAAC,IAAI,CAACZ,WAAW,EAAE;MACrB,IAAI,CAACA,WAAW,GAAG,IAAAa,wBAAS,EAAC,CAAC,CAACC,IAAI,CAAErB,SAAS,IAAK;QACjD,IAAIf,aAAa,EAAE;QACnB,IAAI,CAAC6B,QAAQ,CAAC;UAAEd,SAAS;UAAEC,SAAS,EAAE;QAAK,CAAC,CAAC;MAC/C,CAAC,CAAC;IACJ;IACA,OAAO,IAAI,CAACM,WAAW;EACzB;;EAEA;EACAe,mBAAmBA,CAACC,OAKnB,EAAQ;IACP,IAAI,CAACT,QAAQ,CAAC;MACZd,SAAS,EAAEuB,OAAO,CAACvB,SAAS,IAAI,EAAE;MAClCE,IAAI,EAAEqB,OAAO,CAACrB,IAAI,IAAI,IAAI;MAC1BC,WAAW,EAAEoB,OAAO,CAACpB,WAAW,IAAI,IAAI;MACxCC,eAAe,EAAEmB,OAAO,CAACC,SAAS,IAAI,EAAE;MACxCvB,SAAS,EAAE;IACb,CAAC,CAAC;EACJ;;EAEA;EACA,MAAMwB,OAAOA,CAACC,IAAY,EAAEC,SAAoB,EAAyB;IACvE,IAAI1C,aAAa,EAAE;MACjB,MAAM2C,MAAM,GAAI,MAAM3C,aAAa,CAAC,SAAS,EAAE;QAAEyC,IAAI;QAAEC;MAAU,CAAC,CAEjE;MACD,OAAOC,MAAM,CAACC,QAAQ;IACxB;IACA,MAAM,IAAI,CAACjB,YAAY,CAAC,CAAC;IACzB,IAAI,CAACE,QAAQ,CAAC;MAAEZ,IAAI,EAAE;IAAU,CAAC,CAAC;IAClC,IAAI;MACF,MAAMsB,SAAS,GAAG,IAAAM,mCAAyB,EAAC,CAAC,CAACC,MAAM,CACjDC,CAAC,IACAA,CAAC,CAACC,MAAM,CAAC,CAAC,CAACC,UAAU,KAAK,CAACP,SAAS,IAAIA,SAAS,CAACQ,QAAQ,CAACH,CAAC,CAACzC,EAAE,CAAC,CACpE,CAAC;MACD,MAAM6C,IAAqC,GAAG,CAAC,CAAC;MAChD,MAAMC,OAAgC,GAAG,CAAC,CAAC;MAC3C,KAAK,MAAMC,QAAQ,IAAId,SAAS,EAAE;QAChC,IAAI;UACF,MAAMe,QAAQ,GAAG,MAAMD,QAAQ,CAACb,OAAO,CAAC,CAAC;UACzCW,IAAI,CAACE,QAAQ,CAAC/C,EAAE,CAAC,GAAG,IAAAiD,4BAAkB,EAACD,QAAQ,CAACH,IAAI,CAAC;UACrDC,OAAO,CAACC,QAAQ,CAAC/C,EAAE,CAAC,GAAG;YAAEC,QAAQ,EAAE+C,QAAQ,CAAC/C;UAAS,CAAC;QACxD,CAAC,CAAC,OAAOiD,CAAC,EAAE;UACVJ,OAAO,CAACC,QAAQ,CAAC/C,EAAE,CAAC,GAAG;YACrBC,QAAQ,EAAE,CAAC,mBAAmBkD,MAAM,CAACD,CAAC,CAAC,EAAE;UAC3C,CAAC;QACH;MACF;MACA,MAAMZ,QAAwB,GAAG;QAC/Bc,IAAI,EAAE;UACJpD,EAAE,EAAEG,MAAM,CAAC,CAAC;UACZgC,IAAI,EAAEA,IAAI,CAACkB,IAAI,CAAC,CAAC,IAAI,mBAAmB;UACxCC,SAAS,EAAElD,IAAI,CAACC,GAAG,CAAC,CAAC;UACrBkD,SAAS,EAAE,CAAC;UACZT;QACF,CAAC;QACDD;MACF,CAAC;MACD,MAAMpC,SAAS,GAAG,MAAM,IAAA+C,2BAAY,EAAClB,QAAQ,EAAE,IAAI,CAAC9B,KAAK,CAACC,SAAS,CAAC;MACpE,IAAI,CAACc,QAAQ,CAAC;QAAEd;MAAU,CAAC,CAAC;MAC5B,OAAO6B,QAAQ,CAACc,IAAI;IACtB,CAAC,SAAS;MACR,IAAI,CAAC7B,QAAQ,CAAC;QAAEZ,IAAI,EAAE;MAAK,CAAC,CAAC;IAC/B;EACF;;EAEA;AACF;AACA;AACA;AACA;EACE,MAAM8C,eAAeA,CAAA,EAA0B;IAC7C,IAAI/D,aAAa,EAAE;MACjB,MAAM2C,MAAM,GAAI,MAAM3C,aAAa,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAExD;MACD,OAAO2C,MAAM,CAACC,QAAQ;IACxB;IACA,MAAM,IAAI,CAACjB,YAAY,CAAC,CAAC;IACzB,MAAMiB,QAAwB,GAAG;MAC/Bc,IAAI,EAAE;QACJpD,EAAE,EAAEG,MAAM,CAAC,CAAC;QACZgC,IAAI,EAAE,eAAe;QACrBmB,SAAS,EAAElD,IAAI,CAACC,GAAG,CAAC,CAAC;QACrBkD,SAAS,EAAE,CAAC;QACZG,QAAQ,EAAE,IAAI;QACdZ,OAAO,EAAE,CAAC;MACZ,CAAC;MACDD,IAAI,EAAE,CAAC;IACT,CAAC;IACD,MAAMpC,SAAS,GAAG,MAAM,IAAA+C,2BAAY,EAAClB,QAAQ,EAAE,IAAI,CAAC9B,KAAK,CAACC,SAAS,CAAC;IACpE,IAAI,CAACc,QAAQ,CAAC;MAAEd;IAAU,CAAC,CAAC;IAC5B,OAAO6B,QAAQ,CAACc,IAAI;EACtB;EAEA,MAAMO,OAAOA,CAAC3D,EAAU,EAAE4D,IAAiB,EAA2B;IACpE,IAAIlE,aAAa,EAAE;MACjB,MAAMmE,OAAO,GAAI,MAAMnE,aAAa,CAAC,SAAS,EAAE;QAAEM,EAAE;QAAE4D;MAAK,CAAC,CAAoB;MAChF,IAAI,CAACrC,QAAQ,CAAC;QAAEX,WAAW,EAAEiD;MAAQ,CAAC,CAAC;MACvC,OAAOA,OAAO;IAChB;IACA,MAAM,IAAI,CAACxC,YAAY,CAAC,CAAC;IACzB,IAAI,CAACE,QAAQ,CAAC;MAAEZ,IAAI,EAAE;IAAU,CAAC,CAAC;IAClC,IAAI;MACF,MAAMmD,MAAM,GAAG,MAAM,IAAAC,2BAAY,EAAC/D,EAAE,CAAC;MACrC,IAAI,CAAC8D,MAAM,EAAE,MAAM,IAAIE,KAAK,CAAC,wBAAwBhE,EAAE,GAAG,CAAC;MAE3D,MAAM6D,OAAuB,GAAG;QAC9BI,UAAU,EAAEjE,EAAE;QACdkE,YAAY,EAAEJ,MAAM,CAACV,IAAI,CAACjB,IAAI;QAC9ByB,IAAI;QACJO,EAAE,EAAE/D,IAAI,CAACC,GAAG,CAAC,CAAC;QACd+D,UAAU,EAAE,KAAK;QACjBC,OAAO,EAAE,CAAC;MACZ,CAAC;MAED,IAAIP,MAAM,CAACV,IAAI,CAACM,QAAQ,EAAE;QACxB;QACA;QACA,KAAK,MAAMX,QAAQ,IAAI,IAAAR,mCAAyB,EAAC,CAAC,EAAE;UAClD,IAAIQ,QAAQ,CAACuB,KAAK,EAAE;YAClB,IAAI;cACFT,OAAO,CAACQ,OAAO,CAACtB,QAAQ,CAAC/C,EAAE,CAAC,GAAG,MAAM+C,QAAQ,CAACuB,KAAK,CAAC,CAAC;YACvD,CAAC,CAAC,OAAOpB,CAAC,EAAE;cACVW,OAAO,CAACQ,OAAO,CAACtB,QAAQ,CAAC/C,EAAE,CAAC,GAAGL,aAAa,CAACwD,MAAM,CAACD,CAAC,CAAC,CAAC;YACzD;UACF;QACF;QACAW,OAAO,CAACO,UAAU,GAAG,IAAI,CAACG,cAAc,CAAC,4BAA4B,CAAC;QACtE,IAAI,CAAChD,QAAQ,CAAC;UAAEX,WAAW,EAAEiD;QAAQ,CAAC,CAAC;QACvC,OAAOA,OAAO;MAChB;MAEA,MAAMzB,SAAS,GAAG,CAChB,GAAG5C,aAAa,CAACgD,MAAM,CAAEgC,GAAG,IAAKA,GAAG,IAAIV,MAAM,CAACjB,IAAI,CAAC,EACpD,GAAG4B,MAAM,CAACC,IAAI,CAACZ,MAAM,CAACjB,IAAI,CAAC,CAACL,MAAM,CAAEgC,GAAG,IAAK,CAAChF,aAAa,CAACoD,QAAQ,CAAC4B,GAAG,CAAC,CAAC,CAC1E;MAED,IAAIZ,IAAI,KAAK,QAAQ,EAAE;QACrB;QACA,IAAIE,MAAM,CAACjB,IAAI,CAAC8B,OAAO,EAAE;UACvBd,OAAO,CAACQ,OAAO,CAACM,OAAO,GAAG,MAAM,IAAI,CAACC,aAAa,CAChD,SAAS,EACTd,MAAM,CAACjB,IAAI,CAAC8B,OACd,CAAC;QACH;QACAd,OAAO,CAACO,UAAU,GAAG,IAAI,CAACG,cAAc,CAAC,2BAA2B,CAAC;QACrE,IAAI,CAAChD,QAAQ,CAAC;UAAEX,WAAW,EAAEiD;QAAQ,CAAC,CAAC;QACvC,OAAOA,OAAO;MAChB;MAEA,KAAK,MAAMW,GAAG,IAAIpC,SAAS,EAAE;QAC3ByB,OAAO,CAACQ,OAAO,CAACG,GAAG,CAAC,GAAG,MAAM,IAAI,CAACI,aAAa,CAACJ,GAAG,EAAEV,MAAM,CAACjB,IAAI,CAAC2B,GAAG,CAAC,CAAC;MACxE;MACA,IAAI,CAACjD,QAAQ,CAAC;QAAEX,WAAW,EAAEiD;MAAQ,CAAC,CAAC;MACvC,OAAOA,OAAO;IAChB,CAAC,SAAS;MACR,IAAI,CAACtC,QAAQ,CAAC;QAAEZ,IAAI,EAAE;MAAK,CAAC,CAAC;IAC/B;EACF;EAEA,MAAciE,aAAaA,CACzBC,QAAgB,EAChB7C,OAAwB,EACa;IACrC,MAAMe,QAAQ,GAAG,IAAA+B,kCAAwB,EAACD,QAAQ,CAAC;IACnD,IAAI,CAAC9B,QAAQ,EAAE;MACb,OAAOpD,aAAa,CAAC,6DAA6D,CAAC;IACrF;IACA,MAAM+C,MAAM,GAAGK,QAAQ,CAACL,MAAM,CAAC,CAAC;IAChC,IAAI,CAACA,MAAM,CAACqC,UAAU,EAAE;MACtB,OAAOpF,aAAa,CAAC+C,MAAM,CAACsC,MAAM,IAAI,qBAAqB,CAAC;IAC9D;IACA,IAAI;MACF,OAAO,MAAMjC,QAAQ,CAACY,OAAO,CAAC,IAAAsB,8BAAoB,EAACjD,OAAO,CAAC,CAAC;IAC9D,CAAC,CAAC,OAAOkB,CAAC,EAAE;MACV,OAAOvD,aAAa,CAACwD,MAAM,CAACD,CAAC,CAAC,CAAC;IACjC;EACF;EAEQqB,cAAcA,CAAC3E,MAAc,EAAW;IAC9C,IAAI;MACF,IAAAsF,2BAAiB,EAAC;QAAEtF;MAAO,CAAC,CAAC;MAC7B,OAAO,IAAI;IACb,CAAC,CAAC,MAAM;MACN;MACA,OAAO,KAAK;IACd;EACF;EAEA,MAAM0B,MAAMA,CAACtB,EAAU,EAAiB;IACtC,IAAIN,aAAa,EAAE;MACjB,MAAMA,aAAa,CAAC,QAAQ,EAAE;QAAEM;MAAG,CAAC,CAAC;MACrC;IACF;IACA,MAAM,IAAI,CAACqB,YAAY,CAAC,CAAC;IACzB,MAAMZ,SAAS,GAAG,MAAM,IAAA0E,6BAAc,EAACnF,EAAE,EAAE,IAAI,CAACQ,KAAK,CAACC,SAAS,CAAC;IAChE,IAAI,CAACc,QAAQ,CAAC;MAAEd;IAAU,CAAC,CAAC;EAC9B;EAEA,MAAM2E,MAAMA,CAACpF,EAAU,EAAEmC,IAAY,EAAiB;IACpD,IAAIzC,aAAa,EAAE;MACjB,MAAMA,aAAa,CAAC,QAAQ,EAAE;QAAEM,EAAE;QAAEmC;MAAK,CAAC,CAAC;MAC3C;IACF;IACA,MAAM,IAAI,CAACd,YAAY,CAAC,CAAC;IACzB,MAAMZ,SAAS,GAAG,MAAM,IAAA4E,6BAAc,EAACrF,EAAE,EAAEmC,IAAI,EAAE,IAAI,CAAC3B,KAAK,CAACC,SAAS,CAAC;IACtE,IAAI,CAACc,QAAQ,CAAC;MAAEd;IAAU,CAAC,CAAC;EAC9B;EAEA6E,gBAAgBA,CAAA,EAAS;IACvB,IAAI,CAAC/D,QAAQ,CAAC;MAAEX,WAAW,EAAE;IAAK,CAAC,CAAC;EACtC;AACF;AAEO,MAAM2E,gBAAgB,GAAA9F,OAAA,CAAA8F,gBAAA,GAAG,IAAIhF,gBAAgB,CAAC,CAAC;;AAEtD;AACA;AACA;AACA;AACA;AACA;AACO,SAASiF,2BAA2BA,CAACC,OAA6B,EAAQ;EAC/E/F,aAAa,GAAG+F,OAAO;EACvB,IAAI,CAACA,OAAO,EAAE;IACZF,gBAAgB,CAACxD,mBAAmB,CAAC,CAAC,CAAC,CAAC;EAC1C;AACF;;AAEA;AACO,SAAS2D,8BAA8BA,CAAC1D,OAK9C,EAAQ;EACPuD,gBAAgB,CAACxD,mBAAmB,CAACC,OAAO,CAAC;AAC/C","ignoreList":[]}
|