@solidjs/start 2.0.0-rc.1 → 2.0.0-rc.10

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 (118) hide show
  1. package/CHANGELOG.md +123 -0
  2. package/dist/config/app-root-alias.d.ts +7 -0
  3. package/dist/config/app-root-alias.js +58 -0
  4. package/dist/config/constants.d.ts +2 -0
  5. package/dist/config/constants.js +2 -0
  6. package/dist/config/env.js +2 -2
  7. package/dist/config/fs-routes/index.js +3 -3
  8. package/dist/config/fs-routes/tree-shake.d.ts +27 -0
  9. package/dist/config/fs-routes/tree-shake.js +51 -1
  10. package/dist/config/index.d.ts +154 -5
  11. package/dist/config/index.js +16 -8
  12. package/dist/config/lazy.js +7 -2
  13. package/dist/config/manifest.d.ts +3 -0
  14. package/dist/config/manifest.js +26 -4
  15. package/dist/directives/remove-unused-variables.js +15 -3
  16. package/dist/directives/xxhash32.js +5 -13
  17. package/dist/fns/client.js +14 -5
  18. package/dist/fns/error-handler.d.ts +34 -0
  19. package/dist/fns/error-handler.js +10 -0
  20. package/dist/fns/handler.d.ts +1 -1
  21. package/dist/fns/handler.js +45 -10
  22. package/dist/fns/plugins.d.ts +34 -0
  23. package/dist/fns/plugins.js +33 -0
  24. package/dist/fns/serialization.d.ts +15 -0
  25. package/dist/fns/serialization.js +36 -6
  26. package/dist/server/assets/render.jsx +1 -1
  27. package/dist/server/collect-styles.d.ts +3 -1
  28. package/dist/server/collect-styles.js +8 -5
  29. package/dist/server/handler.d.ts +3 -4
  30. package/dist/server/handler.js +16 -46
  31. package/dist/server/index.d.ts +2 -1
  32. package/dist/server/manifest/dev-client-manifest.js +1 -1
  33. package/dist/server/manifest/dev-ssr-manifest.js +1 -1
  34. package/dist/server/spa/StartServer.jsx +1 -1
  35. package/dist/server/spa/handler.d.ts +2 -3
  36. package/dist/server/spa/handler.js +2 -2
  37. package/dist/server/types.d.ts +12 -1
  38. package/dist/server/web-stream.d.ts +1 -1
  39. package/dist/server/web-stream.js +5 -2
  40. package/dist/shared/ErrorBoundary.jsx +3 -3
  41. package/dist/shared/clientOnly.js +3 -1
  42. package/dist/shared/{dev-overlay → dev-toolbar/error-viewer}/CodeView.jsx +3 -3
  43. package/dist/shared/{dev-overlay/DevOverlayDialog.d.ts → dev-toolbar/error-viewer/index.d.ts} +3 -2
  44. package/dist/shared/{dev-overlay/DevOverlayDialog.jsx → dev-toolbar/error-viewer/index.jsx} +66 -77
  45. package/dist/shared/dev-toolbar/error-viewer/styles.css +224 -0
  46. package/dist/shared/dev-toolbar/functions/BlobViewer.css +4 -0
  47. package/dist/shared/dev-toolbar/functions/BlobViewer.d.ts +6 -0
  48. package/dist/shared/dev-toolbar/functions/BlobViewer.jsx +37 -0
  49. package/dist/shared/dev-toolbar/functions/FormDataViewer.d.ts +5 -0
  50. package/dist/shared/dev-toolbar/functions/FormDataViewer.jsx +23 -0
  51. package/dist/shared/dev-toolbar/functions/HeadersViewer.css +8 -0
  52. package/dist/shared/dev-toolbar/functions/HeadersViewer.d.ts +6 -0
  53. package/dist/shared/dev-toolbar/functions/HeadersViewer.jsx +15 -0
  54. package/dist/shared/dev-toolbar/functions/HexViewer.css +34 -0
  55. package/dist/shared/dev-toolbar/functions/HexViewer.d.ts +11 -0
  56. package/dist/shared/dev-toolbar/functions/HexViewer.jsx +70 -0
  57. package/dist/shared/dev-toolbar/functions/SerovalValue.css +5 -0
  58. package/dist/shared/dev-toolbar/functions/SerovalValue.d.ts +7 -0
  59. package/dist/shared/dev-toolbar/functions/SerovalValue.jsx +10 -0
  60. package/dist/shared/dev-toolbar/functions/SerovalViewer.css +70 -0
  61. package/dist/shared/dev-toolbar/functions/SerovalViewer.d.ts +6 -0
  62. package/dist/shared/dev-toolbar/functions/SerovalViewer.jsx +796 -0
  63. package/dist/shared/dev-toolbar/functions/URLSearchParamsViewer.d.ts +5 -0
  64. package/dist/shared/dev-toolbar/functions/URLSearchParamsViewer.jsx +22 -0
  65. package/dist/shared/dev-toolbar/functions/index.d.ts +13 -0
  66. package/dist/shared/dev-toolbar/functions/index.jsx +216 -0
  67. package/dist/shared/dev-toolbar/functions/styles.css +109 -0
  68. package/dist/shared/dev-toolbar/functions/tracker.d.ts +19 -0
  69. package/dist/shared/dev-toolbar/functions/tracker.js +29 -0
  70. package/dist/shared/{dev-overlay → dev-toolbar}/icons.d.ts +9 -0
  71. package/dist/shared/{dev-overlay → dev-toolbar}/icons.jsx +19 -1
  72. package/dist/shared/dev-toolbar/index.css +88 -0
  73. package/dist/shared/dev-toolbar/index.d.ts +6 -0
  74. package/dist/shared/dev-toolbar/index.jsx +179 -0
  75. package/dist/shared/ui/Badge.css +33 -0
  76. package/dist/shared/ui/Badge.d.ts +7 -0
  77. package/dist/shared/ui/Badge.jsx +7 -0
  78. package/dist/shared/ui/Button.css +32 -0
  79. package/dist/shared/ui/Button.d.ts +4 -0
  80. package/dist/shared/ui/Button.jsx +4 -0
  81. package/dist/shared/ui/Cascade.css +29 -0
  82. package/dist/shared/ui/Cascade.d.ts +4 -0
  83. package/dist/shared/ui/Cascade.jsx +4 -0
  84. package/dist/shared/ui/Dialog.css +25 -0
  85. package/dist/shared/ui/Dialog.d.ts +5 -0
  86. package/dist/shared/ui/Dialog.jsx +5 -0
  87. package/dist/shared/ui/IconButton.css +39 -0
  88. package/dist/shared/ui/IconButton.d.ts +4 -0
  89. package/dist/shared/ui/IconButton.jsx +4 -0
  90. package/dist/shared/ui/Placeholder.css +12 -0
  91. package/dist/shared/ui/Placeholder.d.ts +6 -0
  92. package/dist/shared/ui/Placeholder.jsx +4 -0
  93. package/dist/shared/ui/Section.css +18 -0
  94. package/dist/shared/ui/Section.d.ts +9 -0
  95. package/dist/shared/ui/Section.jsx +10 -0
  96. package/dist/shared/ui/Select.css +37 -0
  97. package/dist/shared/ui/Select.d.ts +4 -0
  98. package/dist/shared/ui/Select.jsx +4 -0
  99. package/dist/shared/ui/Table.css +22 -0
  100. package/dist/shared/ui/Table.d.ts +11 -0
  101. package/dist/shared/ui/Table.jsx +13 -0
  102. package/dist/shared/ui/Tabs.css +51 -0
  103. package/dist/shared/ui/Tabs.d.ts +6 -0
  104. package/dist/shared/ui/Tabs.jsx +6 -0
  105. package/dist/shared/ui/Text.css +73 -0
  106. package/dist/shared/ui/Text.d.ts +12 -0
  107. package/dist/shared/ui/Text.jsx +17 -0
  108. package/package.json +36 -29
  109. package/dist/shared/dev-overlay/index.d.ts +0 -5
  110. package/dist/shared/dev-overlay/index.jsx +0 -39
  111. package/dist/shared/dev-overlay/styles.css +0 -292
  112. /package/dist/shared/{dev-overlay → dev-toolbar/error-viewer}/CodeView.d.ts +0 -0
  113. /package/dist/shared/{dev-overlay/createStackFrame.d.ts → dev-toolbar/error-viewer/create-stack-frame.d.ts} +0 -0
  114. /package/dist/shared/{dev-overlay/createStackFrame.js → dev-toolbar/error-viewer/create-stack-frame.js} +0 -0
  115. /package/dist/shared/{dev-overlay → dev-toolbar/error-viewer}/download.d.ts +0 -0
  116. /package/dist/shared/{dev-overlay → dev-toolbar/error-viewer}/download.js +0 -0
  117. /package/dist/shared/{dev-overlay → dev-toolbar/error-viewer}/get-source-map.d.ts +0 -0
  118. /package/dist/shared/{dev-overlay → dev-toolbar/error-viewer}/get-source-map.js +0 -0
@@ -0,0 +1,796 @@
1
+ import { createEffect, createSignal, For, Show, splitProps } from "solid-js";
2
+ import { Badge } from "../../ui/Badge.jsx";
3
+ import { Cascade, CascadeOption } from "../../ui/Cascade.jsx";
4
+ import { Section } from "../../ui/Section.jsx";
5
+ import { HexViewer } from "./HexViewer.jsx";
6
+ import { PropertySeparator, SerovalValue } from "./SerovalValue.jsx";
7
+ import { SerovalChunkReader } from "../../../fns/serialization.js";
8
+ import "./SerovalViewer.css";
9
+ function LinkIcon(props) {
10
+ return (<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" {...props}>
11
+ <title>{props.title}</title>
12
+ <path stroke-linecap="round" stroke-linejoin="round" d="M13.19 8.688a4.5 4.5 0 0 1 1.242 7.244l-4.5 4.5a4.5 4.5 0 0 1-6.364-6.364l1.757-1.757m13.35-.622 1.757-1.757a4.5 4.5 0 0 0-6.364-6.364l-4.5 4.5a4.5 4.5 0 0 0 1.242 7.244"/>
13
+ </svg>);
14
+ }
15
+ function getNodeType(node) {
16
+ switch (node.t) {
17
+ // Number = 0,
18
+ case 0:
19
+ return "number";
20
+ // String = 1,
21
+ case 1:
22
+ return "string";
23
+ // Constant = 2,
24
+ case 2:
25
+ switch (node.s) {
26
+ case 0:
27
+ return "null";
28
+ case 1:
29
+ return "undefined";
30
+ case 2:
31
+ return "true";
32
+ case 3:
33
+ return "false";
34
+ case 4:
35
+ return "-0";
36
+ case 5:
37
+ return "Infinity";
38
+ case 6:
39
+ return "-Infinity";
40
+ case 7:
41
+ return "NaN";
42
+ }
43
+ break;
44
+ // BigInt = 3,
45
+ case 3:
46
+ return "bigint";
47
+ // Date = 5,
48
+ case 5:
49
+ return "Date";
50
+ // RegExp = 6,
51
+ case 6:
52
+ return "RegExp";
53
+ // Set = 7,
54
+ case 7:
55
+ return "Set";
56
+ // Map = 8,
57
+ case 8:
58
+ return "Map";
59
+ // Array = 9,
60
+ case 9:
61
+ return "Array";
62
+ // Object = 10,
63
+ case 10:
64
+ // NullConstructor = 11,
65
+ case 11:
66
+ return "Object";
67
+ // Promise = 12,
68
+ case 12:
69
+ return "Promise";
70
+ // Error = 13,
71
+ case 13:
72
+ switch (node.s) {
73
+ case 0:
74
+ return "Error";
75
+ case 1:
76
+ return "EvalError";
77
+ case 2:
78
+ return "RangeError";
79
+ case 3:
80
+ return "ReferenceError";
81
+ case 4:
82
+ return "SyntaxError";
83
+ case 5:
84
+ return "TypeError";
85
+ case 6:
86
+ return "URIError";
87
+ }
88
+ return "Error";
89
+ // AggregateError = 14,
90
+ case 14:
91
+ return "AggregateError";
92
+ // TypedArray = 15,
93
+ case 15:
94
+ // BigIntTypedArray = 16,
95
+ case 16:
96
+ return node.c;
97
+ // WKSymbol = 17,
98
+ case 17:
99
+ return "symbol";
100
+ // ArrayBuffer = 19,
101
+ case 19:
102
+ return "ArrayBuffer";
103
+ // DataView = 20,
104
+ case 20:
105
+ return "DataView";
106
+ // Boxed = 21,
107
+ case 21:
108
+ return "Boxed";
109
+ // PromiseConstructor = 22,
110
+ case 22:
111
+ return "Promise";
112
+ // Plugin = 25,
113
+ case 25:
114
+ // due to the nature of this node, we have to traverse it ourselves
115
+ return "Plugin";
116
+ // IteratorFactoryInstance = 28,
117
+ case 28:
118
+ return "Iterator";
119
+ // AsyncIteratorFactoryInstance = 30,
120
+ case 30:
121
+ return "AsyncIterator";
122
+ // StreamConstructor = 31,
123
+ case 31:
124
+ return "Stream";
125
+ case 35:
126
+ return "Sequence";
127
+ }
128
+ throw new Error("unsupported node type");
129
+ }
130
+ function traverse(node, handler) {
131
+ handler(node);
132
+ switch (node.t) {
133
+ // Number = 0,
134
+ case 0:
135
+ // String = 1,
136
+ case 1:
137
+ // Constant = 2,
138
+ case 2:
139
+ // BigInt = 3,
140
+ case 3:
141
+ // IndexedValue = 4,
142
+ case 4:
143
+ // Date = 5,
144
+ case 5:
145
+ // RegExp = 6,
146
+ case 6:
147
+ break;
148
+ // Set = 7,
149
+ case 7:
150
+ // Traverse items
151
+ for (const child of node.a) {
152
+ traverse(child, handler);
153
+ }
154
+ break;
155
+ // Map = 8,
156
+ case 8:
157
+ // Traverse keys
158
+ for (const key of node.e.k) {
159
+ traverse(key, handler);
160
+ }
161
+ for (const value of node.e.v) {
162
+ traverse(value, handler);
163
+ }
164
+ break;
165
+ // Array = 9,
166
+ case 9:
167
+ // Traverse items
168
+ for (const child of node.a) {
169
+ if (child) {
170
+ traverse(child, handler);
171
+ }
172
+ }
173
+ break;
174
+ // Object = 10,
175
+ case 10:
176
+ // NullConstructor = 11,
177
+ case 11:
178
+ for (const child of node.p.k) {
179
+ if (typeof child !== "string") {
180
+ traverse(child, handler);
181
+ }
182
+ }
183
+ for (const child of node.p.v) {
184
+ traverse(child, handler);
185
+ }
186
+ break;
187
+ // Promise = 12,
188
+ case 12:
189
+ traverse(node.f, handler);
190
+ break;
191
+ // Error = 13,
192
+ case 13:
193
+ // AggregateError = 14,
194
+ case 14:
195
+ if (node.p) {
196
+ for (const child of node.p.k) {
197
+ if (typeof child !== "string") {
198
+ traverse(child, handler);
199
+ }
200
+ }
201
+ for (const child of node.p.v) {
202
+ traverse(child, handler);
203
+ }
204
+ }
205
+ break;
206
+ // TypedArray = 15,
207
+ case 15:
208
+ // BigIntTypedArray = 16,
209
+ case 16:
210
+ traverse(node.f, handler);
211
+ break;
212
+ // WKSymbol = 17,
213
+ case 17:
214
+ // Reference = 18,
215
+ case 18:
216
+ break;
217
+ // ArrayBuffer = 19,
218
+ case 19:
219
+ // DataView = 20,
220
+ case 20:
221
+ // Boxed = 21,
222
+ case 21:
223
+ traverse(node.f, handler);
224
+ break;
225
+ // PromiseConstructor = 22,
226
+ case 22:
227
+ break;
228
+ // PromiseSuccess = 23,
229
+ case 23:
230
+ // PromiseFailure = 24,
231
+ case 24:
232
+ traverse(node.a[1], handler);
233
+ break;
234
+ // Plugin = 25,
235
+ case 25:
236
+ for (const key in node.s) {
237
+ const current = node.s[key];
238
+ if (current) {
239
+ traverse(current, handler);
240
+ }
241
+ }
242
+ break;
243
+ // SpecialReference = 26,
244
+ case 26:
245
+ break;
246
+ // IteratorFactory = 27,
247
+ case 27:
248
+ traverse(node.f, handler);
249
+ break;
250
+ // IteratorFactoryInstance = 28,
251
+ case 28:
252
+ traverse(node.a[0], handler);
253
+ traverse(node.a[1], handler);
254
+ break;
255
+ // AsyncIteratorFactory = 29,
256
+ case 29:
257
+ traverse(node.a[1], handler);
258
+ break;
259
+ // AsyncIteratorFactoryInstance = 30,
260
+ case 30:
261
+ traverse(node.a[0], handler);
262
+ traverse(node.a[1], handler);
263
+ break;
264
+ // StreamConstructor = 31,
265
+ case 31:
266
+ // Traverse items
267
+ for (const child of node.a) {
268
+ traverse(child, handler);
269
+ }
270
+ break;
271
+ // StreamNext = 32,
272
+ case 32:
273
+ // StreamThrow = 33,
274
+ case 33:
275
+ // StreamReturn = 34
276
+ case 34:
277
+ traverse(node.f, handler);
278
+ break;
279
+ case 35:
280
+ // Traverse items
281
+ for (const child of node.a) {
282
+ if (child) {
283
+ traverse(child, handler);
284
+ }
285
+ }
286
+ break;
287
+ }
288
+ }
289
+ function getConstantValue(value) {
290
+ switch (value) {
291
+ case 0:
292
+ return "null";
293
+ case 1:
294
+ return "undefined";
295
+ case 2:
296
+ return "true";
297
+ case 3:
298
+ return "false";
299
+ case 4:
300
+ return "-0";
301
+ case 5:
302
+ return "Infinity";
303
+ case 6:
304
+ return "-Infinity";
305
+ case 7:
306
+ return "NaN";
307
+ }
308
+ return "";
309
+ }
310
+ function getSymbolValue(value) {
311
+ switch (value) {
312
+ case 0:
313
+ return "Symbol.asyncIterator";
314
+ case 1:
315
+ return "Symbol.hasInstance";
316
+ case 2:
317
+ return "Symbol.isConcatSpreadable";
318
+ case 3:
319
+ return "Symbol.iterator";
320
+ case 4:
321
+ return "Symbol.match";
322
+ case 5:
323
+ return "Symbol.matchAll";
324
+ case 6:
325
+ return "Symbol.replace";
326
+ case 7:
327
+ return "Symbol.search";
328
+ case 8:
329
+ return "Symbol.species";
330
+ case 9:
331
+ return "Symbol.toPrimitive";
332
+ case 10:
333
+ return "Symbol.toStringTag";
334
+ case 11:
335
+ return "Symbol.unscopables";
336
+ }
337
+ return "";
338
+ }
339
+ function getObjectFlag(value) {
340
+ switch (value) {
341
+ case 1:
342
+ return "non-extensible";
343
+ case 2:
344
+ return "sealed";
345
+ case 3:
346
+ return "frozen";
347
+ default:
348
+ return "none";
349
+ }
350
+ }
351
+ function zip(keys, values) {
352
+ const zipped = [];
353
+ for (let i = 0, len = keys.length; i < len; i++) {
354
+ zipped[i] = [keys[i], values[i]];
355
+ }
356
+ return zipped;
357
+ }
358
+ function getStreamKeyword(t) {
359
+ switch (t) {
360
+ case 32:
361
+ return "next";
362
+ case 33:
363
+ return "throw";
364
+ case 34:
365
+ return "return";
366
+ }
367
+ }
368
+ function renderSerovalNode(ctx, node, onSelect, inner) {
369
+ if (node.t >= 4 &&
370
+ (inner || node.t === 4) &&
371
+ node.i != null &&
372
+ !(node.t === 5 || node.t === 6 || node.t === 17)) {
373
+ const index = node.i;
374
+ const description = `id: ${index}`;
375
+ const lookup = ctx.getNode(index);
376
+ return (<CascadeOption data-start-seroval-link value={index}>
377
+ <LinkIcon title={description}/>
378
+ <Badge type="info">{getNodeType(lookup)}</Badge>
379
+ <Badge type="info">{description}</Badge>
380
+ </CascadeOption>);
381
+ }
382
+ switch (node.t) {
383
+ // Number = 0,
384
+ case 0:
385
+ return <SerovalValue value={node.s}/>;
386
+ // String = 1,
387
+ case 1:
388
+ return <SerovalValue value={`"${node.s}"`}/>;
389
+ // Constant = 2,
390
+ case 2:
391
+ return <SerovalValue value={getConstantValue(node.s)}/>;
392
+ // BigInt = 3,
393
+ case 3:
394
+ return (<div data-start-seroval-link>
395
+ <Badge type="info">bigint</Badge>
396
+ <SerovalValue value={node.s}/>
397
+ </div>);
398
+ // Date = 5,
399
+ case 5:
400
+ return (<div data-start-seroval-link>
401
+ <Badge type="info">Date</Badge>
402
+ <SerovalValue value={node.s}/>
403
+ </div>);
404
+ // RegExp = 6,
405
+ case 6:
406
+ return (<div data-start-seroval-link>
407
+ <Badge type="info">RegExp</Badge>
408
+ <SerovalValue value={`/${node.c}/${node.m}`}/>
409
+ </div>);
410
+ // Set = 7,
411
+ case 7:
412
+ return (<>
413
+ <Section title="Information" options={{ size: "xs" }}>
414
+ <div data-start-property>
415
+ <SerovalValue value="size"/>
416
+ <PropertySeparator />
417
+ <SerovalValue value={`${node.a.length}`}/>
418
+ </div>
419
+ </Section>
420
+ <Section title="Items" options={{ size: "xs" }}>
421
+ <Cascade data-start-properties defaultValue={undefined} onChange={onSelect}>
422
+ <For each={node.a.map((node, index) => [index, node])}>
423
+ {([key, value]) => (<div data-start-property>
424
+ <SerovalValue value={key}/>
425
+ <PropertySeparator />
426
+ {renderSerovalNode(ctx, value, onSelect, true)}
427
+ </div>)}
428
+ </For>
429
+ </Cascade>
430
+ </Section>
431
+ </>);
432
+ // Map = 8,
433
+ case 8:
434
+ return (<>
435
+ <Section title="Information" options={{ size: "xs" }}>
436
+ <div data-start-property>
437
+ <SerovalValue value="size"/>
438
+ <PropertySeparator />
439
+ <SerovalValue value={`${node.e.k.length}`}/>
440
+ </div>
441
+ </Section>
442
+ <Section title="Items" options={{ size: "xs" }}>
443
+ <Cascade data-start-properties defaultValue={undefined} onChange={onSelect}>
444
+ <For each={zip(node.e.k, node.e.v)} fallback={<SerovalValue value="none"/>}>
445
+ {([key, value]) => (<div data-start-property>
446
+ {renderSerovalNode(ctx, key, onSelect, true)}
447
+ <PropertySeparator />
448
+ {renderSerovalNode(ctx, value, onSelect, true)}
449
+ </div>)}
450
+ </For>
451
+ </Cascade>
452
+ </Section>
453
+ </>);
454
+ // Array = 9,
455
+ case 9:
456
+ return (<>
457
+ <Section title="Information" options={{ size: "xs" }}>
458
+ <div data-start-property>
459
+ <SerovalValue value="length"/>
460
+ <PropertySeparator />
461
+ <SerovalValue value={`${node.a.length}`}/>
462
+ </div>
463
+ <div data-start-property>
464
+ <SerovalValue value="state"/>
465
+ <PropertySeparator />
466
+ <Badge type="info">{getObjectFlag(node.o)}</Badge>
467
+ </div>
468
+ </Section>
469
+ <Section title="Items" options={{ size: "xs" }}>
470
+ <Cascade data-start-properties defaultValue={undefined} onChange={onSelect}>
471
+ <For each={node.a.map((node, index) => [index, node])} fallback={<SerovalValue value="none"/>}>
472
+ {([key, value]) => (<div data-start-property>
473
+ <SerovalValue value={key}/>
474
+ <PropertySeparator />
475
+ {value === 0 ? (<SerovalValue value="empty"/>) : (renderSerovalNode(ctx, value, onSelect, true))}
476
+ </div>)}
477
+ </For>
478
+ </Cascade>
479
+ </Section>
480
+ </>);
481
+ // Object = 10,
482
+ case 10:
483
+ // NullConstructor = 11,
484
+ case 11:
485
+ return (<>
486
+ <Section title="Information" options={{ size: "xs" }}>
487
+ <div data-start-property>
488
+ <SerovalValue value="size"/>
489
+ <PropertySeparator />
490
+ <SerovalValue value={`${node.p.k.length}`}/>
491
+ </div>
492
+ <div data-start-property>
493
+ <SerovalValue value="state"/>
494
+ <PropertySeparator />
495
+ <Badge type="info">{getObjectFlag(node.o)}</Badge>
496
+ </div>
497
+ </Section>
498
+ <Section title="Properties" options={{ size: "xs" }}>
499
+ <Cascade data-start-properties defaultValue={undefined} onChange={onSelect}>
500
+ <For each={zip(node.p.k, node.p.v)} fallback={<SerovalValue value="none"/>}>
501
+ {([key, value]) => (<div data-start-property>
502
+ {typeof key === "string" ? (<SerovalValue value={`"${key}"`}/>) : (renderSerovalNode(ctx, key, onSelect, true))}
503
+ <PropertySeparator />
504
+ {renderSerovalNode(ctx, value, onSelect, true)}
505
+ </div>)}
506
+ </For>
507
+ </Cascade>
508
+ </Section>
509
+ </>);
510
+ // Promise = 12,
511
+ case 12:
512
+ return (<Cascade data-start-properties defaultValue={undefined} onChange={onSelect}>
513
+ {renderSerovalNode(ctx, node.f, onSelect, true)}
514
+ </Cascade>);
515
+ // Error = 13,
516
+ case 13:
517
+ // AggregateError = 14,
518
+ case 14:
519
+ return (<>
520
+ <Section title="Information" options={{ size: "xs" }}>
521
+ <div data-start-property>
522
+ <SerovalValue value="message"/>
523
+ <PropertySeparator />
524
+ <SerovalValue value={`"${node.m}"`}/>
525
+ </div>
526
+ </Section>
527
+ <Show when={node.p}>
528
+ {current => (<Section title="Properties" options={{ size: "xs" }}>
529
+ <Cascade data-start-properties defaultValue={undefined} onChange={onSelect}>
530
+ <For each={zip(current().k, current().v)} fallback={<SerovalValue value="none"/>}>
531
+ {([key, value]) => (<div data-start-property>
532
+ {typeof key === "string" ? (<SerovalValue value={`"${key}"`}/>) : (renderSerovalNode(ctx, key, onSelect, true))}
533
+ <PropertySeparator />
534
+ {renderSerovalNode(ctx, value, onSelect, true)}
535
+ </div>)}
536
+ </For>
537
+ </Cascade>
538
+ </Section>)}
539
+ </Show>
540
+ </>);
541
+ // WKSymbol = 17,
542
+ case 17:
543
+ return <SerovalValue value={getSymbolValue(node.s)}/>;
544
+ // Reference = 18,
545
+ case 18:
546
+ break;
547
+ // ArrayBuffer = 19,
548
+ case 19: {
549
+ const data = atob(node.s);
550
+ const result = new TextEncoder().encode(data);
551
+ return <HexViewer bytes={result}/>;
552
+ }
553
+ // TypedArray = 15,
554
+ case 15:
555
+ // BigIntTypedArray = 16,
556
+ case 16:
557
+ // DataView = 20,
558
+ case 20:
559
+ return (<>
560
+ <Section title="Information" options={{ size: "xs" }}>
561
+ <div data-start-property>
562
+ <SerovalValue value="byteLength"/>
563
+ <PropertySeparator />
564
+ <SerovalValue value={node.l}/>
565
+ </div>
566
+ <div data-start-property>
567
+ <SerovalValue value="byteOffset"/>
568
+ <PropertySeparator />
569
+ <SerovalValue value={node.b}/>
570
+ </div>
571
+ </Section>
572
+ <Section title="Buffer" options={{ size: "xs" }}>
573
+ <Cascade data-start-properties defaultValue={undefined} onChange={onSelect}>
574
+ {renderSerovalNode(ctx, node.f, onSelect, true)}
575
+ </Cascade>
576
+ </Section>
577
+ </>);
578
+ // Boxed = 21,
579
+ case 21:
580
+ return (<Cascade data-start-properties defaultValue={undefined} onChange={onSelect}>
581
+ {renderSerovalNode(ctx, node.f, onSelect, true)}
582
+ </Cascade>);
583
+ case 22:
584
+ return (<>
585
+ {(() => {
586
+ const result = ctx.getPromise(node.s);
587
+ if (result) {
588
+ const status = result.t === 23 ? "success" : "failure";
589
+ return (<Cascade data-start-properties defaultValue={undefined} onChange={onSelect}>
590
+ <div data-start-property>
591
+ <SerovalValue value="status"/>
592
+ <PropertySeparator />
593
+ <Badge type={status}>{status}</Badge>
594
+ </div>
595
+ <span data-start-property>
596
+ <SerovalValue value="value"/>
597
+ <PropertySeparator />
598
+ {renderSerovalNode(ctx, result.a[1], onSelect, true)}
599
+ </span>
600
+ </Cascade>);
601
+ }
602
+ return <Badge type="warning">pending</Badge>;
603
+ })()}
604
+ </>);
605
+ // Plugin = 25
606
+ case 25:
607
+ return (<>
608
+ <Section title="Information" options={{ size: "xs" }}>
609
+ <div data-start-property>
610
+ <SerovalValue value="plugin"/>
611
+ <PropertySeparator />
612
+ <SerovalValue value={node.c}/>
613
+ </div>
614
+ </Section>
615
+ <Section title="Properties" options={{ size: "xs" }}>
616
+ <Cascade data-start-properties defaultValue={undefined} onChange={onSelect}>
617
+ <For each={Object.entries(node.s)} fallback={<SerovalValue value="none"/>}>
618
+ {([key, value]) => (<div data-start-property>
619
+ <SerovalValue value={key}/>
620
+ <PropertySeparator />
621
+ {renderSerovalNode(ctx, value, onSelect, true)}
622
+ </div>)}
623
+ </For>
624
+ </Cascade>
625
+ </Section>
626
+ </>);
627
+ // IteratorFactory = 27,
628
+ case 27:
629
+ break;
630
+ // IteratorFactoryInstance = 28,
631
+ case 28:
632
+ return renderSerovalNode(ctx, node.a[1], onSelect, true);
633
+ // AsyncIteratorFactory = 29,
634
+ case 29:
635
+ break;
636
+ // AsyncIteratorFactoryInstance = 30,
637
+ case 30:
638
+ return renderSerovalNode(ctx, node.a[1], onSelect, true);
639
+ // StreamConstructor = 31,
640
+ case 31:
641
+ return (<>
642
+ {(() => {
643
+ const result = ctx.getStream(node.i) || [];
644
+ return (<Cascade data-start-properties defaultValue={undefined} onChange={onSelect}>
645
+ <For each={result} fallback={<SerovalValue value="none"/>}>
646
+ {current => (<div data-start-property>
647
+ <SerovalValue value={getStreamKeyword(current.t)}/>
648
+ <PropertySeparator />
649
+ {renderSerovalNode(ctx, current.f, onSelect, true)}
650
+ </div>)}
651
+ </For>
652
+ </Cascade>);
653
+ })()}
654
+ </>);
655
+ case 35:
656
+ return (<Cascade data-start-properties defaultValue={undefined} onChange={onSelect}>
657
+ <For each={node.a} fallback={<SerovalValue value="none"/>}>
658
+ {(current, index) => (<div data-start-property>
659
+ <SerovalValue value={index() === node.l ? "return" : index() === node.s ? "throw" : "next"}/>
660
+ <PropertySeparator />
661
+ {renderSerovalNode(ctx, current, onSelect, true)}
662
+ </div>)}
663
+ </For>
664
+ </Cascade>);
665
+ }
666
+ }
667
+ function SerovalNodeRenderer(props) {
668
+ const [, rest] = splitProps(props, ["node"]);
669
+ const [next, setNext] = createSignal();
670
+ function onSelect(index) {
671
+ if (index == null) {
672
+ setNext(undefined);
673
+ }
674
+ else {
675
+ setNext(props.getNode(index));
676
+ }
677
+ }
678
+ return (<>
679
+ <div data-start-seroval-node>
680
+ <div data-start-seroval-node-header>
681
+ <Badge type="info">{getNodeType(props.node)}</Badge>
682
+ {props.node.i != null && <Badge type="info">{`id: ${props.node.i}`}</Badge>}
683
+ </div>
684
+ <div data-start-seroval-node-content>{renderSerovalNode(props, props.node, onSelect)}</div>
685
+ </div>
686
+ <Show when={next()} keyed>
687
+ {current => <SerovalNodeRenderer node={current} {...rest}/>}
688
+ </Show>
689
+ </>);
690
+ }
691
+ function SerovalRenderer(props) {
692
+ const [, rest] = splitProps(props, ["node"]);
693
+ return (<div data-start-seroval-renderer>
694
+ <Show when={props.node}>{current => <SerovalNodeRenderer node={current()} {...rest}/>}</Show>
695
+ </div>);
696
+ }
697
+ function createSimpleStore(initial) {
698
+ const [state, setState] = createSignal(initial);
699
+ return {
700
+ get() {
701
+ return state();
702
+ },
703
+ read(key) {
704
+ return state()[key];
705
+ },
706
+ write(key, value) {
707
+ setState(current => ({
708
+ ...current,
709
+ [key]: value,
710
+ }));
711
+ },
712
+ update(key, value) {
713
+ setState(current => ({
714
+ ...current,
715
+ [key]: value(current[key]),
716
+ }));
717
+ },
718
+ };
719
+ }
720
+ export function SerovalViewer(props) {
721
+ const [selected, setSelected] = createSignal();
722
+ const references = createSimpleStore({});
723
+ const streams = createSimpleStore({});
724
+ const promises = createSimpleStore({});
725
+ createEffect(async () => {
726
+ setSelected(undefined);
727
+ if (!props.stream.body) {
728
+ throw new Error("missing body");
729
+ }
730
+ const reader = new SerovalChunkReader(props.stream.body);
731
+ const result = await reader.next();
732
+ if (!result.done) {
733
+ function traverseNode(node) {
734
+ // Check for promises
735
+ switch (node.t) {
736
+ case 0:
737
+ case 1:
738
+ case 2:
739
+ case 3:
740
+ case 4:
741
+ break;
742
+ case 23:
743
+ case 24:
744
+ promises.write(node.i, node);
745
+ break;
746
+ case 32:
747
+ case 33:
748
+ case 34:
749
+ streams.update(node.i, current => {
750
+ if (current) {
751
+ return [...current, node];
752
+ }
753
+ return [node];
754
+ });
755
+ break;
756
+ case 5:
757
+ case 6:
758
+ case 7:
759
+ case 8:
760
+ case 9:
761
+ case 10:
762
+ case 11:
763
+ case 12:
764
+ case 13:
765
+ case 14:
766
+ case 15:
767
+ case 16:
768
+ case 17:
769
+ case 18:
770
+ case 19:
771
+ case 20:
772
+ case 21:
773
+ case 25:
774
+ case 26:
775
+ case 27:
776
+ case 29:
777
+ case 31:
778
+ case 35:
779
+ references.write(node.i, node);
780
+ break;
781
+ }
782
+ }
783
+ function interpretChunk(chunk) {
784
+ const result = JSON.parse(chunk);
785
+ traverse(result, traverseNode);
786
+ return result;
787
+ }
788
+ void reader.drain(interpretChunk);
789
+ const root = interpretChunk(result.value);
790
+ setSelected(root);
791
+ }
792
+ });
793
+ return (<div data-start-seroval-viewer>
794
+ <SerovalRenderer node={selected()} getNode={index => references.read(index)} getPromise={index => promises.read(index)} getStream={index => streams.read(index)}/>
795
+ </div>);
796
+ }