@reactra/devtools 0.1.0-alpha.0
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 +21 -0
- package/README.md +78 -0
- package/dist/ValueTree.d.ts +38 -0
- package/dist/ValueTree.d.ts.map +1 -0
- package/dist/ValueTree.js +178 -0
- package/dist/ValueTree.js.map +1 -0
- package/dist/helpers.d.ts +59 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/helpers.js +110 -0
- package/dist/helpers.js.map +1 -0
- package/dist/hookRecorder.d.ts +72 -0
- package/dist/hookRecorder.d.ts.map +1 -0
- package/dist/hookRecorder.js +142 -0
- package/dist/hookRecorder.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/invoke.d.ts +35 -0
- package/dist/invoke.d.ts.map +1 -0
- package/dist/invoke.js +67 -0
- package/dist/invoke.js.map +1 -0
- package/dist/model.d.ts +99 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +160 -0
- package/dist/model.js.map +1 -0
- package/dist/panel.d.ts +17 -0
- package/dist/panel.d.ts.map +1 -0
- package/dist/panel.js +438 -0
- package/dist/panel.js.map +1 -0
- package/dist/routerWatcher.d.ts +47 -0
- package/dist/routerWatcher.d.ts.map +1 -0
- package/dist/routerWatcher.js +51 -0
- package/dist/routerWatcher.js.map +1 -0
- package/dist/serialize.d.ts +38 -0
- package/dist/serialize.d.ts.map +1 -0
- package/dist/serialize.js +217 -0
- package/dist/serialize.js.map +1 -0
- package/dist/storeRecorder.d.ts +25 -0
- package/dist/storeRecorder.d.ts.map +1 -0
- package/dist/storeRecorder.js +94 -0
- package/dist/storeRecorder.js.map +1 -0
- package/dist/storeWatcher.d.ts +26 -0
- package/dist/storeWatcher.d.ts.map +1 -0
- package/dist/storeWatcher.js +24 -0
- package/dist/storeWatcher.js.map +1 -0
- package/dist/styles.d.ts +5 -0
- package/dist/styles.d.ts.map +1 -0
- package/dist/styles.js +288 -0
- package/dist/styles.js.map +1 -0
- package/dist/tabs/router.d.ts +10 -0
- package/dist/tabs/router.d.ts.map +1 -0
- package/dist/tabs/router.js +48 -0
- package/dist/tabs/router.js.map +1 -0
- package/dist/tabs/stores.d.ts +14 -0
- package/dist/tabs/stores.d.ts.map +1 -0
- package/dist/tabs/stores.js +167 -0
- package/dist/tabs/stores.js.map +1 -0
- package/dist/tabs/timeTravel.d.ts +46 -0
- package/dist/tabs/timeTravel.d.ts.map +1 -0
- package/dist/tabs/timeTravel.js +322 -0
- package/dist/tabs/timeTravel.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
// @reactra/devtools — the Time Travel tab (Devtools spec §7, hybrid).
|
|
2
|
+
//
|
|
3
|
+
// One timeline, two capability levels: PASSIVE history (the panel's own hook
|
|
4
|
+
// ring — every reporting component, view-only) and LIVE re-drive (components
|
|
5
|
+
// with `uses replayable` re-drive the running UI via `applyReplayState`). The
|
|
6
|
+
// timeline source is the passive ring folded into a Replay §3 `SessionBundle`
|
|
7
|
+
// (helpers.passiveBundle); `ReplayPlayer.statesAt` folds it and the
|
|
8
|
+
// `@reactra/replay-devtools/timeline` track/transport primitives navigate it —
|
|
9
|
+
// all shipped, no new compiler emission. createElement (no JSX); browser
|
|
10
|
+
// globals only in handlers/effects.
|
|
11
|
+
import { createElement as h, useEffect, useMemo, useState, useRef } from "react";
|
|
12
|
+
import { applyReplayState, enterReplayMode, exitReplayMode } from "@reactra/behaviours/replayable";
|
|
13
|
+
import { replayStoreState } from "@reactra/store";
|
|
14
|
+
import { ReplayPlayer } from "@reactra/replay";
|
|
15
|
+
import { Timeline, diffKeys, ensureStyles as ensureTimelineStyles, eventStops, formatOffset, playbackDelay, stopIndexAt, } from "@reactra/replay-devtools/timeline";
|
|
16
|
+
import { passiveBundle } from "../helpers.js";
|
|
17
|
+
import { navigate } from "../routerWatcher.js";
|
|
18
|
+
import { listStores } from "../storeWatcher.js";
|
|
19
|
+
import { serializeBindings } from "../serialize.js";
|
|
20
|
+
import { ValueTree } from "../ValueTree.js";
|
|
21
|
+
/** The synthetic component id the panel records route snapshots under (§7). */
|
|
22
|
+
const ROUTE_ID = "Route";
|
|
23
|
+
/**
|
|
24
|
+
* The id prefix store snapshots fold under (`store:<name>#1`). The colon is
|
|
25
|
+
* load-bearing: it guarantees a component literally named `store` (id
|
|
26
|
+
* `store#1`) does not collide with the store branch (architect C5).
|
|
27
|
+
*/
|
|
28
|
+
const STORE_PREFIX = "store:";
|
|
29
|
+
/**
|
|
30
|
+
* Drive folded `statesAt` entries back into the live app, **route-first** (architect
|
|
31
|
+
* C2). Pass A re-drives every `Route` navigation — which fires the router's `onEnter`
|
|
32
|
+
* synchronously → `StoreRegistry.instantiate` for the target route's stores. Pass B
|
|
33
|
+
* then restores stores (incl. the route stores Pass A just instantiated) + replayable
|
|
34
|
+
* components. A route store on a middleware-gated / not-yet-loaded route instantiates
|
|
35
|
+
* asynchronously, so it's still absent in Pass B → `replayStoreState` returns 0 →
|
|
36
|
+
* `view` (clean degrade, no settle-tick — C1). Pure but for the injected side effects,
|
|
37
|
+
* so the ordering invariant is unit-testable.
|
|
38
|
+
*/
|
|
39
|
+
export const driveEntriesRouteFirst = (entries, absT, deps) => {
|
|
40
|
+
const live = [];
|
|
41
|
+
const view = [];
|
|
42
|
+
// Pass A — route navigations (instantiate route stores before Pass B restores them).
|
|
43
|
+
for (const [componentId, state] of entries) {
|
|
44
|
+
if ((componentId.split("#")[0] ?? componentId) !== ROUTE_ID)
|
|
45
|
+
continue;
|
|
46
|
+
const path = state.path;
|
|
47
|
+
// Navigate only when the URL differs — avoids re-firing route bindings (and
|
|
48
|
+
// route-store dispose/instantiate) on same-route steps.
|
|
49
|
+
if (typeof path === "string" && deps.currentLocation() !== path)
|
|
50
|
+
deps.navigate(path);
|
|
51
|
+
if (!live.includes(ROUTE_ID))
|
|
52
|
+
live.push(ROUTE_ID);
|
|
53
|
+
}
|
|
54
|
+
// Pass B — stores (incl. just-instantiated route stores) + replayable components.
|
|
55
|
+
for (const [componentId, state] of entries) {
|
|
56
|
+
const name = componentId.split("#")[0] ?? componentId;
|
|
57
|
+
if (name === ROUTE_ID)
|
|
58
|
+
continue;
|
|
59
|
+
if (componentId.startsWith(STORE_PREFIX)) {
|
|
60
|
+
// slice(6) strips `store:` BEFORE the `#` split (C5) so a component literally
|
|
61
|
+
// named `store` (id `store#1`, no colon) can't reach here.
|
|
62
|
+
const storeName = componentId.slice(STORE_PREFIX.length).split("#")[0] ?? "";
|
|
63
|
+
// Re-drive from the RAW snapshot, not the lossy serialized ring value
|
|
64
|
+
// (reviewer Critical). 0 when no raw / not registered / route store not yet
|
|
65
|
+
// live (async route) → view, never a ⟲ live lie (devil RISK 5).
|
|
66
|
+
const raw = deps.rawStoreStateAt(componentId, absT);
|
|
67
|
+
const n = raw ? deps.replayStoreState(storeName, raw) : 0;
|
|
68
|
+
const bucket = n > 0 ? live : view;
|
|
69
|
+
if (!bucket.includes(name))
|
|
70
|
+
bucket.push(name);
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
const n = deps.applyReplayState(state, name);
|
|
74
|
+
const bucket = n > 0 ? live : view;
|
|
75
|
+
if (!bucket.includes(name))
|
|
76
|
+
bucket.push(name);
|
|
77
|
+
}
|
|
78
|
+
return { live, view };
|
|
79
|
+
};
|
|
80
|
+
/** Time Travel tab — passive history + replayable live re-drive (§7). */
|
|
81
|
+
export const TimeTravelTab = (props) => {
|
|
82
|
+
const { recorder, hookState, onReplayingChange } = props;
|
|
83
|
+
ensureTimelineStyles();
|
|
84
|
+
const [, force] = useState(0);
|
|
85
|
+
const [offset, setOffset] = useState(0);
|
|
86
|
+
const [playing, setPlaying] = useState(false);
|
|
87
|
+
const [speed, setSpeed] = useState(1);
|
|
88
|
+
const [win, setWin] = useState(null);
|
|
89
|
+
// A frozen snapshot while scrubbing the past — null = live (pinned to the
|
|
90
|
+
// present, recorder armed). Freezing stops the ring growing so a re-driven
|
|
91
|
+
// re-render's own commits don't pollute the history being navigated.
|
|
92
|
+
const [frozen, setFrozen] = useState(null);
|
|
93
|
+
const [driven, setDriven] = useState({ live: [], view: [] });
|
|
94
|
+
// The arm state to restore when travel ends (the user's pre-travel choice).
|
|
95
|
+
const armRef = useRef({
|
|
96
|
+
saved: recorder.recording(),
|
|
97
|
+
touched: false,
|
|
98
|
+
});
|
|
99
|
+
const traveling = frozen !== null;
|
|
100
|
+
// T3.3: notify the parent panel when replay mode transitions so it can
|
|
101
|
+
// apply the `rdt-panel--replaying` class. On unmount (tab switch) always
|
|
102
|
+
// report false so the panel clears the class.
|
|
103
|
+
useEffect(() => {
|
|
104
|
+
onReplayingChange?.(traveling);
|
|
105
|
+
return () => onReplayingChange?.(false);
|
|
106
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
107
|
+
}, [traveling]);
|
|
108
|
+
const liveBundle = useMemo(() => passiveBundle(recorder.events()),
|
|
109
|
+
// Recomputed on every panel commit (the panel re-renders this child); the
|
|
110
|
+
// recorder's event count is the real input.
|
|
111
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
112
|
+
[recorder.events().length, frozen]);
|
|
113
|
+
const bundle = frozen ?? liveBundle;
|
|
114
|
+
const player = useMemo(() => (bundle ? new ReplayPlayer(bundle) : null), [bundle]);
|
|
115
|
+
const stops = useMemo(() => (bundle ? eventStops(bundle) : []), [bundle]);
|
|
116
|
+
// Live → the playhead is pinned to the present (the latest event); traveling
|
|
117
|
+
// → it sits where the user scrubbed.
|
|
118
|
+
const curOffset = traveling ? offset : bundle ? bundle.duration : 0;
|
|
119
|
+
const stepIndex = stopIndexAt(stops, curOffset);
|
|
120
|
+
const states = useMemo(() => (player && bundle ? player.statesAt(bundle.startTime + curOffset) : null), [player, bundle, curOffset]);
|
|
121
|
+
const prevStates = useMemo(() => {
|
|
122
|
+
if (!player || !bundle || !traveling || stepIndex < 1)
|
|
123
|
+
return null;
|
|
124
|
+
return player.statesAt(bundle.startTime + stops[stepIndex - 1]);
|
|
125
|
+
}, [player, bundle, traveling, stepIndex, stops]);
|
|
126
|
+
// Drive every store/component/route to its folded state at `atOffset` (route
|
|
127
|
+
// first — see driveEntriesRouteFirst), and record which NAMES drove live vs view.
|
|
128
|
+
const driveAt = (b, atOffset) => {
|
|
129
|
+
const p = new ReplayPlayer(b);
|
|
130
|
+
const absT = b.startTime + atOffset;
|
|
131
|
+
setDriven(driveEntriesRouteFirst([...p.statesAt(absT)], absT, {
|
|
132
|
+
rawStoreStateAt: recorder.rawStoreStateAt,
|
|
133
|
+
navigate,
|
|
134
|
+
currentLocation: () => typeof location !== "undefined" ? location.pathname + location.search : undefined,
|
|
135
|
+
replayStoreState,
|
|
136
|
+
applyReplayState,
|
|
137
|
+
}));
|
|
138
|
+
};
|
|
139
|
+
// Freeze on the first travel gesture: pause the ring, enter replay mode.
|
|
140
|
+
const freezeIfLive = () => {
|
|
141
|
+
if (frozen)
|
|
142
|
+
return frozen;
|
|
143
|
+
if (!liveBundle)
|
|
144
|
+
return null;
|
|
145
|
+
if (!armRef.current.touched) {
|
|
146
|
+
armRef.current.saved = recorder.recording();
|
|
147
|
+
armRef.current.touched = true;
|
|
148
|
+
}
|
|
149
|
+
recorder.setRecording(false);
|
|
150
|
+
enterReplayMode();
|
|
151
|
+
setFrozen(liveBundle);
|
|
152
|
+
return liveBundle;
|
|
153
|
+
};
|
|
154
|
+
const scrub = (atOffset) => {
|
|
155
|
+
const b = freezeIfLive();
|
|
156
|
+
if (!b)
|
|
157
|
+
return;
|
|
158
|
+
setOffset(atOffset);
|
|
159
|
+
driveAt(b, atOffset);
|
|
160
|
+
};
|
|
161
|
+
const stepTo = (i) => {
|
|
162
|
+
const b = frozen ?? liveBundle;
|
|
163
|
+
if (!b)
|
|
164
|
+
return;
|
|
165
|
+
const s = eventStops(b);
|
|
166
|
+
const t = s[Math.max(0, Math.min(s.length - 1, i))];
|
|
167
|
+
if (t !== undefined)
|
|
168
|
+
scrub(t);
|
|
169
|
+
};
|
|
170
|
+
const returnToLive = () => {
|
|
171
|
+
// Re-drive every replayable instance back to the present BEFORE leaving
|
|
172
|
+
// replay mode. `applyReplayState` mutates the live component destructively
|
|
173
|
+
// (the whole point of ⟲ live), so without this a component scrubbed into
|
|
174
|
+
// the past is stranded there — the running UI would show the last-scrubbed
|
|
175
|
+
// value while the panel says "present". Driving to the latest passive
|
|
176
|
+
// snapshot reconciles the app with the panel. Non-replayable instances have
|
|
177
|
+
// no setters and are unaffected. (exitReplayMode only toggles the
|
|
178
|
+
// recording-suspend flag; it does not restore state — replayable.ts §5.)
|
|
179
|
+
//
|
|
180
|
+
// Fix 4: wrap driveAt in try/finally so exitReplayMode() + recording-restore
|
|
181
|
+
// always run even if driveAt throws (e.g. a misbehaving applyReplayState).
|
|
182
|
+
// Ordering preserved per disc-v3: drive-to-present BEFORE exitReplayMode.
|
|
183
|
+
try {
|
|
184
|
+
if (liveBundle)
|
|
185
|
+
driveAt(liveBundle, liveBundle.duration);
|
|
186
|
+
}
|
|
187
|
+
finally {
|
|
188
|
+
exitReplayMode();
|
|
189
|
+
if (armRef.current.touched) {
|
|
190
|
+
recorder.setRecording(armRef.current.saved);
|
|
191
|
+
armRef.current.touched = false;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
setFrozen(null);
|
|
195
|
+
setPlaying(false);
|
|
196
|
+
setWin(null);
|
|
197
|
+
setOffset(0);
|
|
198
|
+
setDriven({ live: [], view: [] });
|
|
199
|
+
};
|
|
200
|
+
// Auto-playback walks the frozen stops at recorded pacing / speed.
|
|
201
|
+
useEffect(() => {
|
|
202
|
+
if (!playing || !frozen)
|
|
203
|
+
return;
|
|
204
|
+
const s = eventStops(frozen);
|
|
205
|
+
const i = stopIndexAt(s, offset);
|
|
206
|
+
if (i >= s.length - 1) {
|
|
207
|
+
setPlaying(false);
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
const cur = s[Math.max(0, i)] ?? 0;
|
|
211
|
+
const next = s[i + 1];
|
|
212
|
+
const id = setTimeout(() => scrub(next), playbackDelay(cur, next, speed));
|
|
213
|
+
return () => clearTimeout(id);
|
|
214
|
+
});
|
|
215
|
+
// Travel must not outlive the tab — restore recording + exit replay mode.
|
|
216
|
+
useEffect(() => () => {
|
|
217
|
+
exitReplayMode();
|
|
218
|
+
if (armRef.current.touched)
|
|
219
|
+
recorder.setRecording(armRef.current.saved);
|
|
220
|
+
}, [recorder]);
|
|
221
|
+
const togglePlay = () => {
|
|
222
|
+
const b = frozen ?? liveBundle;
|
|
223
|
+
if (!b)
|
|
224
|
+
return;
|
|
225
|
+
if (playing) {
|
|
226
|
+
setPlaying(false);
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
const s = eventStops(b);
|
|
230
|
+
if (s.length === 0)
|
|
231
|
+
return;
|
|
232
|
+
const i = stopIndexAt(s, traveling ? offset : b.duration);
|
|
233
|
+
if (i >= s.length - 1)
|
|
234
|
+
scrub(s[0]); // at the end → restart from the first
|
|
235
|
+
setPlaying(true);
|
|
236
|
+
};
|
|
237
|
+
const toggleArm = () => {
|
|
238
|
+
recorder.setRecording(!recorder.recording());
|
|
239
|
+
force((n) => n + 1);
|
|
240
|
+
};
|
|
241
|
+
// ---- DVT001 / DVT002 empty paths ----------------------------------------
|
|
242
|
+
if (hookState === "occupied") {
|
|
243
|
+
return h("div", { className: "rdt-main" }, h("div", { className: "rdt-warn" }, "DVT001: passive history is disabled — __REACTRA_TEST__ is held by another consumer. (replayable components still drive live once history is available.)"));
|
|
244
|
+
}
|
|
245
|
+
if (!bundle) {
|
|
246
|
+
return h("div", { className: "rdt-main" }, h("div", { className: "rdt-hint" }, recorder.recording()
|
|
247
|
+
? "DVT002: time travel armed — interact with the app to record history, then scrub back here."
|
|
248
|
+
: "DVT002: recording paused — press ⏺ to arm, then interact with the app."), h("button", { className: "rdt-btn rdt-mini", onClick: toggleArm, title: "Arm / pause passive recording" }, recorder.recording() ? "⏺ recording" : "⏸ paused"));
|
|
249
|
+
}
|
|
250
|
+
// ---- Transport + timeline + cards ---------------------------------------
|
|
251
|
+
const transport = h("div", { className: "rdt-transport" }, h("button", {
|
|
252
|
+
className: "rdt-btn rdt-mini",
|
|
253
|
+
disabled: stops.length === 0 || stepIndex <= 0,
|
|
254
|
+
onClick: () => stepTo(0),
|
|
255
|
+
title: "Rewind to the first event",
|
|
256
|
+
}, "⏮"), h("button", {
|
|
257
|
+
className: "rdt-btn rdt-mini",
|
|
258
|
+
disabled: !traveling || stepIndex <= 0,
|
|
259
|
+
onClick: () => stepTo(stepIndex - 1),
|
|
260
|
+
title: "Previous event",
|
|
261
|
+
}, "⏴"), h("button", { className: "rdt-btn rdt-mini", onClick: togglePlay, title: "Play / pause" }, playing ? "⏸" : "▶"), h("button", {
|
|
262
|
+
className: "rdt-btn rdt-mini",
|
|
263
|
+
disabled: stepIndex >= stops.length - 1,
|
|
264
|
+
onClick: () => stepTo(stepIndex + 1),
|
|
265
|
+
title: "Next event",
|
|
266
|
+
}, "⏵"), h("select", {
|
|
267
|
+
className: "rdt-select",
|
|
268
|
+
value: String(speed),
|
|
269
|
+
onChange: (e) => setSpeed(Number(e.target.value)),
|
|
270
|
+
title: "Playback speed",
|
|
271
|
+
}, h("option", { value: "0.5" }, "0.5×"), h("option", { value: "1" }, "1×"), h("option", { value: "2" }, "2×"), h("option", { value: "4" }, "4×")), traveling
|
|
272
|
+
? h("button", {
|
|
273
|
+
// T3.3: primary accent button — `⏎ live` is the most important
|
|
274
|
+
// action during replay; the accent class makes it visually primary.
|
|
275
|
+
className: "rdt-btn rdt-mini rdt-btn--accent",
|
|
276
|
+
onClick: returnToLive,
|
|
277
|
+
title: "Exit replay, return to the present, re-arm recording",
|
|
278
|
+
}, "⏎ live")
|
|
279
|
+
: h("button", {
|
|
280
|
+
className: "rdt-btn rdt-mini",
|
|
281
|
+
onClick: toggleArm,
|
|
282
|
+
title: "Arm / pause passive recording",
|
|
283
|
+
}, recorder.recording() ? h("span", { className: "rdt-rec" }, "⏺ rec") : "⏸ paused"), h("span", { className: "rdt-pos" }, `event ${Math.max(0, stepIndex) + 1}/${stops.length} · ${formatOffset(curOffset)}`), traveling && h("span", { className: "rdt-banner" }, "REPLAYING"), recorder.evicted() &&
|
|
284
|
+
h("span", { className: "rdt-warn", title: "DVT005" }, "history full — oldest evicted"));
|
|
285
|
+
const timeline = h(Timeline, {
|
|
286
|
+
bundle,
|
|
287
|
+
offset: curOffset,
|
|
288
|
+
window: win,
|
|
289
|
+
onScrub: scrub,
|
|
290
|
+
onWindowChange: setWin,
|
|
291
|
+
onGrab: () => setPlaying(false),
|
|
292
|
+
});
|
|
293
|
+
// Teaching chip when nothing re-drove live (DVT003 territory).
|
|
294
|
+
const teach = traveling && driven.live.length === 0
|
|
295
|
+
? h("div", { className: "rdt-hint" }, "DVT003: nothing re-drove the live app here — these cards are read-only history. Stores rewind once instantiated (a route store on a middleware-gated or not-yet-loaded route rewinds only after its route is live); components rewind with `uses replayable`. Plain-React interop and `resource` data are always view-only.")
|
|
296
|
+
: null;
|
|
297
|
+
// Kind chip for store cards (§4): mirror the Stores-tab `route+subtree`/kind
|
|
298
|
+
// text. Looked up by store name (the id with `store:` stripped, `#1` dropped).
|
|
299
|
+
const storeKinds = new Map(listStores().map((r) => [r.name, r.subtreePath ? "route+subtree" : r.kind]));
|
|
300
|
+
const cards = states &&
|
|
301
|
+
h("div", { className: "rdt-states" }, [...states.entries()].map(([componentId, state]) => {
|
|
302
|
+
// `name` is the live/view bucket key — keeps the `store:` prefix so the
|
|
303
|
+
// badge match below works. `display` is the user-facing label (prefix
|
|
304
|
+
// stripped for stores; a store kind chip rendered alongside it).
|
|
305
|
+
const name = componentId.split("#")[0] ?? componentId;
|
|
306
|
+
const isStore = componentId.startsWith(STORE_PREFIX);
|
|
307
|
+
const storeName = isStore ? name.slice(STORE_PREFIX.length) : name;
|
|
308
|
+
const display = isStore ? storeName : componentId;
|
|
309
|
+
const prev = prevStates?.get(componentId);
|
|
310
|
+
const changed = new Set(traveling ? diffKeys(prev, state) : []);
|
|
311
|
+
return h("div", { key: componentId, className: "rdt-card" }, h("div", { className: "rdt-card-id" }, display, isStore &&
|
|
312
|
+
h("span", { className: "rdt-badge rdt-badge--kind", "aria-label": "store kind" }, storeKinds.get(storeName) ?? "store"), traveling &&
|
|
313
|
+
(driven.live.includes(name)
|
|
314
|
+
? h("span", { className: "rdt-badge rdt-badge--live" }, "⟲ live")
|
|
315
|
+
: h("span", { className: "rdt-badge rdt-badge--view" }, "view"))), h(ValueTree, {
|
|
316
|
+
data: serializeBindings(state),
|
|
317
|
+
changed,
|
|
318
|
+
}));
|
|
319
|
+
}));
|
|
320
|
+
return h("div", { className: "rdt-main" }, transport, timeline, teach, cards);
|
|
321
|
+
};
|
|
322
|
+
//# sourceMappingURL=timeTravel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeTravel.js","sourceRoot":"","sources":["../../src/tabs/timeTravel.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@reactra/devtools",
|
|
3
|
+
"version": "0.1.0-alpha.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": {
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"default": "./dist/index.js"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"@reactra/behaviours": "^0.1.0-alpha.0",
|
|
14
|
+
"@reactra/replay": "^0.1.0-alpha.0",
|
|
15
|
+
"@reactra/replay-devtools": "^0.1.0-alpha.0",
|
|
16
|
+
"@reactra/router": "^0.1.0-alpha.0",
|
|
17
|
+
"@reactra/store": "^0.1.0-alpha.0"
|
|
18
|
+
},
|
|
19
|
+
"peerDependencies": {
|
|
20
|
+
"react": "^19.2.0",
|
|
21
|
+
"react-dom": "^19.2.0"
|
|
22
|
+
},
|
|
23
|
+
"types": "./dist/index.d.ts",
|
|
24
|
+
"files": [
|
|
25
|
+
"dist"
|
|
26
|
+
],
|
|
27
|
+
"publishConfig": {
|
|
28
|
+
"access": "public",
|
|
29
|
+
"tag": "alpha",
|
|
30
|
+
"provenance": false
|
|
31
|
+
},
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "git+https://github.com/akhilshastri/reactra.git",
|
|
35
|
+
"directory": "packages/devtools"
|
|
36
|
+
},
|
|
37
|
+
"homepage": "https://reactra-docs.vercel.app",
|
|
38
|
+
"license": "MIT",
|
|
39
|
+
"engines": {
|
|
40
|
+
"node": ">=22.18"
|
|
41
|
+
},
|
|
42
|
+
"description": "Reactra devtools — in-page developer panel with time-travel, stores, router, and components tabs."
|
|
43
|
+
}
|