Skip to content

Commit f791267

Browse files
committed
Add plugin and sequence renderer
1 parent 4585a65 commit f791267

File tree

2 files changed

+84
-13
lines changed

2 files changed

+84
-13
lines changed

packages/start/src/shared/server-function-inspector/SerovalViewer.css

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,12 @@
5252
color: oklch(62.3% 0.214 259.815);
5353
}
5454

55+
[data-start-seroval-value-wrapper] {
56+
display: inline-flex;
57+
gap: 0.25rem;
58+
align-items: center;
59+
}
60+
5561
[data-start-seroval-link] {
5662
display: inline-flex;
5763
gap: 0.25rem;

packages/start/src/shared/server-function-inspector/SerovalViewer.tsx

Lines changed: 78 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ import {
1111
import { SerovalChunkReader } from "../../server/serialization.ts";
1212
import { Badge } from "../ui/Badge.tsx";
1313
import { Cascade, CascadeOption } from "../ui/Cascade.tsx";
14+
import { PropertySeparator } from "../ui/Properties.tsx";
1415
import { Section } from "../ui/Section.tsx";
1516
import { HexViewer } from "./HexViewer.tsx";
1617
import { SerovalValue } from "./SerovalValue.tsx";
17-
import { PropertySeparator } from "../ui/Properties.tsx";
1818

1919
import "./SerovalViewer.css";
2020

@@ -153,6 +153,8 @@ function getNodeType(node: SerovalNode) {
153153
// StreamConstructor = 31,
154154
case 31:
155155
return "Stream";
156+
case 35:
157+
return "Sequence";
156158
}
157159
throw new Error("unsupported node type");
158160
}
@@ -266,7 +268,12 @@ function traverse(
266268
break;
267269
// Plugin = 25,
268270
case 25:
269-
// due to the nature of this node, we have to traverse it ourselves
271+
for (const key in node.s) {
272+
const current = node.s[key];
273+
if (current) {
274+
traverse(current, handler);
275+
}
276+
}
270277
break;
271278
// SpecialReference = 26,
272279
case 26:
@@ -304,6 +311,14 @@ function traverse(
304311
case 34:
305312
traverse(node.f, handler);
306313
break;
314+
case 35:
315+
// Traverse items
316+
for (const child of node.a) {
317+
if (child) {
318+
traverse(child, handler);
319+
}
320+
}
321+
break;
307322
}
308323
}
309324

@@ -442,17 +457,27 @@ function renderSerovalNode(
442457
// BigInt = 3,
443458
case 3:
444459
return (
445-
<>
460+
<div data-start-seroval-link>
446461
<Badge type="info">bigint</Badge>
447462
<SerovalValue value={node.s} />
448-
</>
463+
</div>
449464
);
450465
// Date = 5,
451466
case 5:
452-
return <SerovalValue value={node.s} />;
467+
return (
468+
<div data-start-seroval-link>
469+
<Badge type="info">Date</Badge>
470+
<SerovalValue value={node.s} />
471+
</div>
472+
);
453473
// RegExp = 6,
454474
case 6:
455-
return <SerovalValue value={`/${node.c}/${node.m}`} />;
475+
return (
476+
<div data-start-seroval-link>
477+
<Badge type="info">RegExp</Badge>
478+
<SerovalValue value={`/${node.c}/${node.m}`} />
479+
</div>
480+
);
456481
// Set = 7,
457482
case 7:
458483
return (
@@ -730,8 +755,34 @@ function renderSerovalNode(
730755
);
731756
// Plugin = 25
732757
case 25:
733-
// due to the nature of this node, we have to traverse it ourselves
734-
break;
758+
return (
759+
<>
760+
<Section title="Information" options={{ size: "xs" }}>
761+
<div data-start-seroval-property>
762+
<SerovalValue value="plugin" />
763+
<PropertySeparator />
764+
<SerovalValue value={node.c} />
765+
</div>
766+
</Section>
767+
<Section title="Properties" options={{ size: "xs" }}>
768+
<Cascade<number | undefined>
769+
data-start-seroval-properties
770+
defaultValue={undefined}
771+
onChange={onSelect}
772+
>
773+
<For each={Object.entries(node.s)}>
774+
{([key, value]) => (
775+
<div data-start-seroval-property>
776+
<SerovalValue value={key} />
777+
<PropertySeparator />
778+
{renderSerovalNode(ctx, value, onSelect, true)}
779+
</div>
780+
)}
781+
</For>
782+
</Cascade>
783+
</Section>
784+
</>
785+
);
735786
// IteratorFactory = 27,
736787
case 27:
737788
break;
@@ -770,6 +821,24 @@ function renderSerovalNode(
770821
})()}
771822
</>
772823
);
824+
case 35:
825+
return (
826+
<Cascade<number | undefined>
827+
data-start-seroval-properties
828+
defaultValue={undefined}
829+
onChange={onSelect}
830+
>
831+
<For each={node.a}>
832+
{(current, index) => (
833+
<div data-start-seroval-property>
834+
<SerovalValue value={index() === node.l ? 'return' : index() === node.s ? 'throw' : 'next'} />
835+
<PropertySeparator />
836+
{renderSerovalNode(ctx, current, onSelect, true)}
837+
</div>
838+
)}
839+
</For>
840+
</Cascade>
841+
);
773842
}
774843
}
775844

@@ -917,13 +986,9 @@ export function SerovalViewer(props: SerovalViewerProps): JSX.Element {
917986
case 27:
918987
case 29:
919988
case 31:
989+
case 35:
920990
references.write(node.i, node);
921991
break;
922-
case 28: {
923-
break;
924-
}
925-
case 30:
926-
break;
927992
}
928993
}
929994

0 commit comments

Comments
 (0)