@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.
Files changed (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +78 -0
  3. package/dist/ValueTree.d.ts +38 -0
  4. package/dist/ValueTree.d.ts.map +1 -0
  5. package/dist/ValueTree.js +178 -0
  6. package/dist/ValueTree.js.map +1 -0
  7. package/dist/helpers.d.ts +59 -0
  8. package/dist/helpers.d.ts.map +1 -0
  9. package/dist/helpers.js +110 -0
  10. package/dist/helpers.js.map +1 -0
  11. package/dist/hookRecorder.d.ts +72 -0
  12. package/dist/hookRecorder.d.ts.map +1 -0
  13. package/dist/hookRecorder.js +142 -0
  14. package/dist/hookRecorder.js.map +1 -0
  15. package/dist/index.d.ts +10 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +16 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/invoke.d.ts +35 -0
  20. package/dist/invoke.d.ts.map +1 -0
  21. package/dist/invoke.js +67 -0
  22. package/dist/invoke.js.map +1 -0
  23. package/dist/model.d.ts +99 -0
  24. package/dist/model.d.ts.map +1 -0
  25. package/dist/model.js +160 -0
  26. package/dist/model.js.map +1 -0
  27. package/dist/panel.d.ts +17 -0
  28. package/dist/panel.d.ts.map +1 -0
  29. package/dist/panel.js +438 -0
  30. package/dist/panel.js.map +1 -0
  31. package/dist/routerWatcher.d.ts +47 -0
  32. package/dist/routerWatcher.d.ts.map +1 -0
  33. package/dist/routerWatcher.js +51 -0
  34. package/dist/routerWatcher.js.map +1 -0
  35. package/dist/serialize.d.ts +38 -0
  36. package/dist/serialize.d.ts.map +1 -0
  37. package/dist/serialize.js +217 -0
  38. package/dist/serialize.js.map +1 -0
  39. package/dist/storeRecorder.d.ts +25 -0
  40. package/dist/storeRecorder.d.ts.map +1 -0
  41. package/dist/storeRecorder.js +94 -0
  42. package/dist/storeRecorder.js.map +1 -0
  43. package/dist/storeWatcher.d.ts +26 -0
  44. package/dist/storeWatcher.d.ts.map +1 -0
  45. package/dist/storeWatcher.js +24 -0
  46. package/dist/storeWatcher.js.map +1 -0
  47. package/dist/styles.d.ts +5 -0
  48. package/dist/styles.d.ts.map +1 -0
  49. package/dist/styles.js +288 -0
  50. package/dist/styles.js.map +1 -0
  51. package/dist/tabs/router.d.ts +10 -0
  52. package/dist/tabs/router.d.ts.map +1 -0
  53. package/dist/tabs/router.js +48 -0
  54. package/dist/tabs/router.js.map +1 -0
  55. package/dist/tabs/stores.d.ts +14 -0
  56. package/dist/tabs/stores.d.ts.map +1 -0
  57. package/dist/tabs/stores.js +167 -0
  58. package/dist/tabs/stores.js.map +1 -0
  59. package/dist/tabs/timeTravel.d.ts +46 -0
  60. package/dist/tabs/timeTravel.d.ts.map +1 -0
  61. package/dist/tabs/timeTravel.js +322 -0
  62. package/dist/tabs/timeTravel.js.map +1 -0
  63. 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
+ }