Skip to content

Commit 75d2cbd

Browse files
authored
Merge pull request #71 from thetarnav/serialize-values
Improve Signal value previews
2 parents e442284 + ee516b2 commit 75d2cbd

33 files changed

Lines changed: 553 additions & 284 deletions

.changeset/real-bottles-collect.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
"solid-devtools-extension": minor
3+
"@solid-devtools/ui": minor
4+
"@solid-devtools/debugger": patch
5+
"@solid-devtools/shared": patch
6+
---
7+
8+
Add UI components for displaying signal value previews. Display signalvalue previews in the owener details panel.

.changeset/red-hairs-poke.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"solid-devtools-extension": patch
3+
"@solid-devtools/extension-adapter": patch
4+
---
5+
6+
Fix missing graph after reopening devtools.

.changeset/wise-needles-camp.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@solid-devtools/shared": patch
3+
---
4+
5+
Add encodePreview for encoding preview values of signals.

packages/debugger/src/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ export {
3939
onOwnerCleanup,
4040
onParentCleanup,
4141
getFunctionSources,
42-
getSafeValue,
4342
createUnownedRoot,
4443
createInternalRoot,
4544
} from "./utils"

packages/debugger/src/plugin.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,11 @@ import {
2222
ComputationUpdate,
2323
SignalUpdate,
2424
} from "@solid-devtools/shared/graph"
25-
import { createConsumers, createInternalRoot, getSafeValue } from "./utils"
25+
import { createConsumers, createInternalRoot } from "./utils"
2626
import { clearOwnerObservers, ComputationUpdateHandler, SignalUpdateHandler } from "./walker"
2727
import { forceRootUpdate } from "./roots"
2828
import { throttle } from "@solid-primitives/scheduled"
29+
import { encodePreview } from "@solid-devtools/shared/serialize"
2930

3031
/*
3132
DETAILS:
@@ -206,9 +207,9 @@ const exported = createInternalRoot(() => {
206207
emitSignalUpdates(updates)
207208
})
208209

209-
const pushComputationUpdate: SignalUpdateHandler = ({ id, value }) => {
210+
const pushComputationUpdate: SignalUpdateHandler = (id, value) => {
210211
if (!untrack(focusedId)) return
211-
signalUpdates.push({ id, value: getSafeValue(value) })
212+
signalUpdates.push({ id, value: encodePreview(value) })
212213
triggerComputationUpdateEmit()
213214
}
214215

packages/debugger/src/server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { createRoot } from "solid-js"
66

77
export { NodeType, getOwner } from "@solid-devtools/shared/graph"
88

9-
export { getSafeValue, createUnownedRoot } from "./index"
9+
export { createUnownedRoot } from "./index"
1010

1111
export const Debugger: typeof API.Debugger = props => props.children
1212

packages/debugger/src/utils.ts

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import {
66
createSignal,
77
runWithOwner,
88
} from "solid-js"
9-
import { JsonValue } from "type-fest"
109
import { AnyFunction, AnyObject, noop, warn } from "@solid-primitives/utils"
1110
import {
1211
DebuggerContext,
@@ -25,7 +24,8 @@ import { Owner, RootFunction } from "@solid-devtools/shared/solid"
2524

2625
export const isSolidComputation = (o: Readonly<SolidOwner>): o is SolidComputation => "fn" in o
2726

28-
export const isSolidMemo = (o: Readonly<SolidOwner>): o is SolidMemo => _isMemo(o)
27+
export const isSolidMemo = (o: Readonly<SolidOwner>): o is SolidMemo =>
28+
"sdtType" in o ? o.sdtType === NodeType.Memo : _isMemo(o) && !fnMatchesRefresh(o.fn!)
2929

3030
export const isSolidOwner = (o: Readonly<SolidOwner> | SolidSignal): o is SolidOwner => "owned" in o
3131

@@ -67,7 +67,7 @@ export const getOwnerType = (o: Readonly<SolidOwner>): NodeType => {
6767
// Precompiled components do not start with "_Hot$$"
6868
// we need a way to identify imported (3rd party) vs user components
6969
if (_isComponent(o)) return NodeType.Component
70-
if (isSolidMemo(o)) {
70+
if (_isMemo(o)) {
7171
if (fnMatchesRefresh(o.fn)) return NodeType.Refresh
7272
return NodeType.Memo
7373
}
@@ -79,13 +79,6 @@ export const getOwnerType = (o: Readonly<SolidOwner>): NodeType => {
7979
return NodeType.Computation
8080
}
8181

82-
const literalTypes = ["bigint", "number", "boolean", "string", "undefined"]
83-
84-
export function getSafeValue(value: unknown): JsonValue {
85-
if (literalTypes.includes(typeof value)) return value as JsonValue
86-
return value + ""
87-
}
88-
8982
/**
9083
* helper to getting to an owner that you want — walking downwards
9184
*/

packages/debugger/src/walker.ts

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ import {
99
MappedOwnerDetails,
1010
NodeID,
1111
} from "@solid-devtools/shared/graph"
12+
import { encodePreview } from "@solid-devtools/shared/serialize"
1213
import {
1314
getNodeName,
1415
getNodeType,
15-
getSafeValue,
1616
isSolidComputation,
1717
isSolidMemo,
1818
markNodeID,
@@ -22,11 +22,7 @@ import {
2222
} from "./utils"
2323
import { observeComputationUpdate, observeValueUpdate, removeValueUpdateObserver } from "./update"
2424

25-
export type SignalUpdateHandler = (payload: {
26-
value: unknown
27-
oldValue: unknown
28-
id: NodeID
29-
}) => void
25+
export type SignalUpdateHandler = (nodeId: NodeID, value: unknown) => void
3026
export type ComputationUpdateHandler = (rootId: NodeID, nodeId: NodeID) => void
3127

3228
// Globals set before each walker cycle
@@ -50,7 +46,7 @@ function observeValue(node: SolidSignal) {
5046
const id = markNodeID(node)
5147
// OnSignalUpdate will change
5248
const handler = OnSignalUpdate
53-
observeValueUpdate(node, (value, oldValue) => handler({ id, value, oldValue }), WALKER)
49+
observeValueUpdate(node, value => handler(id, value), WALKER)
5450
}
5551

5652
function createSignalNode(node: SolidSignal): MappedSignal {
@@ -59,7 +55,7 @@ function createSignalNode(node: SolidSignal): MappedSignal {
5955
name: getNodeName(node),
6056
id: markNodeID(node),
6157
observers: markNodesID(node.observers),
62-
value: getSafeValue(node.value),
58+
value: encodePreview(node.value),
6359
}
6460
}
6561

@@ -112,7 +108,7 @@ function collectOwnerDetails(owner: SolidOwner): void {
112108
}
113109

114110
if (isSolidComputation(owner)) {
115-
details.value = getSafeValue(owner.value)
111+
details.value = encodePreview(owner.value)
116112
details.sources = markNodesID(owner.sources)
117113
if (isSolidMemo(owner)) {
118114
details.observers = markNodesID(owner.observers)

packages/debugger/test/walker.test.tsx

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { getOwner, NodeType, SolidOwner } from "@solid-devtools/shared/graph"
2+
import { ValueType } from "@solid-devtools/shared/serialize"
23
import { UNNAMED } from "@solid-devtools/shared/variables"
34
import {
45
createComputed,
@@ -248,10 +249,22 @@ describe("walkSolidTree", () => {
248249
type: NodeType.Memo,
249250
path: ["0", "1"],
250251
signals: [
251-
{ type: NodeType.Signal, id: "2", name: "count", observers: [], value: 0 },
252-
{ type: NodeType.Memo, id: "3", name: "memo", observers: ["4"], value: 0 },
252+
{
253+
type: NodeType.Signal,
254+
id: "2",
255+
name: "count",
256+
observers: [],
257+
value: { type: ValueType.Number, value: 0 },
258+
},
259+
{
260+
type: NodeType.Memo,
261+
id: "3",
262+
name: "memo",
263+
observers: ["4"],
264+
value: { type: ValueType.Number, value: 0 },
265+
},
253266
],
254-
value: "value",
267+
value: { type: ValueType.String, value: "value" },
255268
sources: ["5"],
256269
observers: ["1"],
257270
})

packages/extension-adapter/src/index.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,13 @@ const extensionAdapterFactory: PluginFactory = ({
2222
postWindowMessage("SolidOnPage")
2323

2424
// update the graph only if the devtools panel is in view
25-
onWindowMessage("PanelVisibility", setEnabled)
25+
onWindowMessage("PanelVisibility", v => {
26+
if (!v) return setEnabled(false)
27+
const current = enabled()
28+
// the panel might have been closed and opened again—in that case we want to update the graph
29+
if (current) forceTriggerUpdate()
30+
else setEnabled(true)
31+
})
2632
onWindowMessage("ForceUpdate", forceTriggerUpdate)
2733
onWindowMessage("SetFocusedOwner", setFocusedOwner)
2834

0 commit comments

Comments
 (0)