@solidjs/start 2.0.2 → 2.0.4
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/CHANGELOG.md +19 -0
- package/dist/server/manifest/prod-ssr-manifest.js +3 -3
- package/dist/shared/dev-toolbar/error-viewer/CodeView.jsx +9 -4
- package/dist/shared/dev-toolbar/error-viewer/create-stack-frame.d.ts +2 -1
- package/dist/shared/dev-toolbar/error-viewer/create-stack-frame.js +29 -19
- package/dist/shared/dev-toolbar/error-viewer/get-source-map.d.ts +2 -2
- package/dist/shared/dev-toolbar/error-viewer/get-source-map.js +3 -2
- package/dist/shared/dev-toolbar/error-viewer/index.jsx +52 -35
- package/dist/shared/dev-toolbar/error-viewer/styles.css +91 -43
- package/dist/shared/dev-toolbar/functions/BlobViewer.css +50 -2
- package/dist/shared/dev-toolbar/functions/BlobViewer.jsx +23 -4
- package/dist/shared/dev-toolbar/functions/FormDataViewer.jsx +9 -6
- package/dist/shared/dev-toolbar/functions/HeadersViewer.css +0 -4
- package/dist/shared/dev-toolbar/functions/HeadersViewer.jsx +9 -7
- package/dist/shared/dev-toolbar/functions/HexViewer.css +36 -17
- package/dist/shared/dev-toolbar/functions/HexViewer.jsx +7 -6
- package/dist/shared/dev-toolbar/functions/SerovalValue.css +21 -0
- package/dist/shared/dev-toolbar/functions/SerovalValue.d.ts +1 -0
- package/dist/shared/dev-toolbar/functions/SerovalValue.jsx +4 -2
- package/dist/shared/dev-toolbar/functions/SerovalViewer.css +98 -36
- package/dist/shared/dev-toolbar/functions/SerovalViewer.jsx +268 -279
- package/dist/shared/dev-toolbar/functions/URLSearchParamsViewer.jsx +9 -6
- package/dist/shared/dev-toolbar/functions/index.jsx +96 -69
- package/dist/shared/dev-toolbar/functions/styles.css +143 -10
- package/dist/shared/dev-toolbar/index.css +54 -14
- package/dist/shared/dev-toolbar/index.jsx +8 -1
- package/dist/shared/ui/Badge.css +21 -10
- package/dist/shared/ui/Button.css +7 -6
- package/dist/shared/ui/IconButton.css +16 -10
- package/dist/shared/ui/Placeholder.css +2 -0
- package/dist/shared/ui/Section.css +42 -3
- package/dist/shared/ui/Section.d.ts +3 -1
- package/dist/shared/ui/Section.jsx +14 -6
- package/dist/shared/ui/Select.css +11 -4
- package/dist/shared/ui/Tabs.css +30 -16
- package/package.json +5 -5
- package/dist/shared/ui/Cascade.css +0 -29
- package/dist/shared/ui/Cascade.d.ts +0 -4
- package/dist/shared/ui/Cascade.jsx +0 -4
- package/dist/shared/ui/Dialog.css +0 -25
- package/dist/shared/ui/Dialog.d.ts +0 -5
- package/dist/shared/ui/Dialog.jsx +0 -5
- package/dist/shared/ui/Table.css +0 -22
- package/dist/shared/ui/Table.d.ts +0 -11
- package/dist/shared/ui/Table.jsx +0 -13
|
@@ -8,6 +8,15 @@ function DocumentIcon(props) {
|
|
|
8
8
|
<path stroke-linecap="round" stroke-linejoin="round" d="M19.5 14.25v-2.625a3.375 3.375 0 0 0-3.375-3.375h-1.5A1.125 1.125 0 0 1 13.5 7.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 0 0-9-9Z"/>
|
|
9
9
|
</svg>);
|
|
10
10
|
}
|
|
11
|
+
function formatSize(size) {
|
|
12
|
+
if (size < 1024) {
|
|
13
|
+
return `${size} B`;
|
|
14
|
+
}
|
|
15
|
+
if (size < 1024 * 1024) {
|
|
16
|
+
return `${(size / 1024).toFixed(1)} KB`;
|
|
17
|
+
}
|
|
18
|
+
return `${(size / (1024 * 1024)).toFixed(1)} MB`;
|
|
19
|
+
}
|
|
11
20
|
function BlobViewerInner(props) {
|
|
12
21
|
const fileURL = createMemo(() => URL.createObjectURL(props.source));
|
|
13
22
|
onCleanup(() => {
|
|
@@ -22,11 +31,21 @@ function BlobViewerInner(props) {
|
|
|
22
31
|
link.click();
|
|
23
32
|
document.body.removeChild(link);
|
|
24
33
|
}
|
|
34
|
+
const name = createMemo(() => {
|
|
35
|
+
if (props.source instanceof File) {
|
|
36
|
+
return props.source.name;
|
|
37
|
+
}
|
|
38
|
+
return props.source.type || "Blob";
|
|
39
|
+
});
|
|
25
40
|
return (<Button data-start-blob-viewer onClick={() => openFileInNewTab()}>
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
41
|
+
<DocumentIcon title={name()}/>
|
|
42
|
+
<span data-start-blob-viewer-info>
|
|
43
|
+
<span data-start-blob-viewer-name>{name()}</span>
|
|
44
|
+
<span data-start-blob-viewer-meta>
|
|
45
|
+
<Badge type="info">{props.source.type || "unknown"}</Badge>
|
|
46
|
+
<span>{formatSize(props.source.size)}</span>
|
|
47
|
+
</span>
|
|
48
|
+
</span>
|
|
30
49
|
</Button>);
|
|
31
50
|
}
|
|
32
51
|
export function BlobViewer(props) {
|
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import { createResource, For, Show, Suspense } from "solid-js";
|
|
2
2
|
import { Section } from "../../ui/Section.jsx";
|
|
3
|
+
import { Text } from "../../ui/Text.jsx";
|
|
3
4
|
import { BlobViewer } from "./BlobViewer.jsx";
|
|
4
|
-
import { PropertySeparator, SerovalValue } from "./SerovalValue.jsx";
|
|
5
5
|
function FormDataViewerInner(props) {
|
|
6
6
|
return (<Section title="FormData" options={{ size: "sm" }}>
|
|
7
|
-
<div data-start-form-data-viewer data-start-
|
|
7
|
+
<div data-start-form-data-viewer data-start-kv-table>
|
|
8
8
|
<For each={Array.from(props.source.entries())}>
|
|
9
|
-
{([key, value]) => (<div data-start-property>
|
|
10
|
-
<
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
{([key, value]) => (<div data-start-property data-start-kv-row>
|
|
10
|
+
<Text data-start-kv-key options={{ size: "xs", weight: "semibold", font: "mono", wrap: "nowrap" }}>
|
|
11
|
+
{key}
|
|
12
|
+
</Text>
|
|
13
|
+
{typeof value === "string" ? (<Text data-start-kv-value options={{ size: "xs", font: "mono", wrap: "wrap" }}>
|
|
14
|
+
{JSON.stringify(value)}
|
|
15
|
+
</Text>) : (<BlobViewer source={value}/>)}
|
|
13
16
|
</div>)}
|
|
14
17
|
</For>
|
|
15
18
|
</div>
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { For } from "solid-js";
|
|
2
|
-
import { PropertySeparator, SerovalValue } from "./SerovalValue.jsx";
|
|
3
|
-
import "./HeadersViewer.css";
|
|
4
2
|
import { Text } from "../../ui/Text.jsx";
|
|
3
|
+
import "./HeadersViewer.css";
|
|
5
4
|
export function HeadersViewer(props) {
|
|
6
|
-
return (<div data-start-headers-viewer data-start-
|
|
5
|
+
return (<div data-start-headers-viewer data-start-kv-table>
|
|
7
6
|
<For each={Array.from(props.headers.entries())}>
|
|
8
|
-
{([key, value]) => (<div data-start-property>
|
|
9
|
-
<Text options={{ size: "xs", weight: "semibold", wrap: "nowrap" }}>
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
{([key, value]) => (<div data-start-property data-start-kv-row>
|
|
8
|
+
<Text data-start-kv-key options={{ size: "xs", weight: "semibold", font: "mono", wrap: "nowrap" }}>
|
|
9
|
+
{key}
|
|
10
|
+
</Text>
|
|
11
|
+
<Text data-start-kv-value options={{ size: "xs", font: "mono", wrap: "wrap" }}>
|
|
12
|
+
{value}
|
|
13
|
+
</Text>
|
|
12
14
|
</div>)}
|
|
13
15
|
</For>
|
|
14
16
|
</div>);
|
|
@@ -1,34 +1,53 @@
|
|
|
1
1
|
[data-start-hex-viewer] {
|
|
2
|
-
display: flex;
|
|
3
|
-
border: 1px oklch(87% 0.065 274.039) solid;
|
|
4
|
-
overflow: auto;
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
[data-start-hex-viewer-bytes] {
|
|
8
|
-
flex: 1;
|
|
9
2
|
display: flex;
|
|
10
3
|
flex-direction: column;
|
|
11
|
-
gap: 0.5rem;
|
|
12
|
-
padding: 0.5rem;
|
|
13
|
-
}
|
|
14
4
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
5
|
+
border: 1px var(--start-dt-border-soft, oklch(87% 0.065 274.039)) solid;
|
|
6
|
+
border-radius: 0.5rem;
|
|
7
|
+
background-color: var(--start-dt-surface, transparent);
|
|
8
|
+
|
|
9
|
+
overflow: auto;
|
|
10
|
+
|
|
11
|
+
font-family:
|
|
12
|
+
ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New",
|
|
13
|
+
monospace;
|
|
22
14
|
}
|
|
23
15
|
|
|
24
16
|
[data-start-hex-row] {
|
|
25
17
|
display: flex;
|
|
26
18
|
align-items: center;
|
|
27
19
|
gap: 1rem;
|
|
20
|
+
|
|
21
|
+
padding: 0.125rem 0.625rem;
|
|
22
|
+
|
|
23
|
+
white-space: nowrap;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
[data-start-hex-row]:nth-child(even) {
|
|
27
|
+
background-color: oklch(1 0 0 / 0.03);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
[data-start-hex-row]:hover {
|
|
31
|
+
background-color: var(--start-dt-surface-hover, transparent);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
[data-start-hex-offset] {
|
|
35
|
+
color: var(--start-dt-text-muted, inherit);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
[data-start-hex-chunk] {
|
|
39
|
+
letter-spacing: 0.05em;
|
|
40
|
+
color: var(--start-dt-text, inherit);
|
|
28
41
|
}
|
|
29
42
|
|
|
30
43
|
[data-start-hex-text] {
|
|
31
44
|
display: flex;
|
|
32
45
|
align-items: center;
|
|
33
46
|
justify-content: start;
|
|
47
|
+
|
|
48
|
+
margin-left: auto;
|
|
49
|
+
padding-left: 1rem;
|
|
50
|
+
border-left: 1px var(--start-dt-border-soft, oklch(87% 0.065 274.039)) solid;
|
|
51
|
+
|
|
52
|
+
color: oklch(0.78 0.11 150);
|
|
34
53
|
}
|
|
@@ -22,10 +22,14 @@ function HexRow(props) {
|
|
|
22
22
|
const chunk3 = createMemo(() => props.bytes.subarray(8, 12));
|
|
23
23
|
const chunk4 = createMemo(() => props.bytes.subarray(12, 16));
|
|
24
24
|
return (<div data-start-hex-row>
|
|
25
|
+
<Text data-start-hex-offset options={{ size: "xs", weight: "semibold", wrap: "nowrap" }}>
|
|
26
|
+
{toHex(props.offset, 8)}
|
|
27
|
+
</Text>
|
|
25
28
|
<HexChunk bytes={chunk1()}/>
|
|
26
29
|
<HexChunk bytes={chunk2()}/>
|
|
27
30
|
<HexChunk bytes={chunk3()}/>
|
|
28
31
|
<HexChunk bytes={chunk4()}/>
|
|
32
|
+
<HexText bytes={props.bytes}/>
|
|
29
33
|
</div>);
|
|
30
34
|
}
|
|
31
35
|
function replaceString(string) {
|
|
@@ -54,12 +58,9 @@ export function HexViewerInner(props) {
|
|
|
54
58
|
return arrays;
|
|
55
59
|
});
|
|
56
60
|
return (<div data-start-hex-viewer>
|
|
57
|
-
<
|
|
58
|
-
|
|
59
|
-
</
|
|
60
|
-
<div data-start-hex-viewer-text>
|
|
61
|
-
<For each={rows()}>{current => <HexText bytes={current}/>}</For>
|
|
62
|
-
</div>
|
|
61
|
+
<For each={rows()}>
|
|
62
|
+
{(current, index) => <HexRow bytes={current} offset={index() * 16}/>}
|
|
63
|
+
</For>
|
|
63
64
|
</div>);
|
|
64
65
|
}
|
|
65
66
|
export function HexViewer(props) {
|
|
@@ -3,3 +3,24 @@
|
|
|
3
3
|
gap: 0.25rem;
|
|
4
4
|
align-items: center;
|
|
5
5
|
}
|
|
6
|
+
|
|
7
|
+
[data-start-seroval-value="key"] {
|
|
8
|
+
color: oklch(0.78 0.1 305);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
[data-start-seroval-value="string"] {
|
|
12
|
+
color: oklch(0.78 0.11 150);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
[data-start-seroval-value="number"] {
|
|
16
|
+
color: oklch(0.8 0.11 80);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
[data-start-seroval-value="keyword"] {
|
|
20
|
+
color: oklch(0.74 0.1 250);
|
|
21
|
+
font-style: italic;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
[data-start-seroval-separator] {
|
|
25
|
+
color: var(--start-dt-text-muted);
|
|
26
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import "./SerovalValue.css";
|
|
2
2
|
interface SerovalValueProps {
|
|
3
3
|
value: string | number | boolean | undefined | null;
|
|
4
|
+
kind?: "key" | "string" | "number" | "keyword";
|
|
4
5
|
}
|
|
5
6
|
export declare function SerovalValue(props: SerovalValueProps): import("solid-js").JSX.Element;
|
|
6
7
|
export declare function PropertySeparator(): import("solid-js").JSX.Element;
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { Text } from "../../ui/Text.jsx";
|
|
2
2
|
import "./SerovalValue.css";
|
|
3
3
|
export function SerovalValue(props) {
|
|
4
|
-
return (<Text data-start-seroval-value options={{ size: "xs", weight: "semibold", wrap: "nowrap" }}>
|
|
4
|
+
return (<Text data-start-seroval-value={props.kind ?? "plain"} options={{ size: "xs", weight: "semibold", font: "mono", wrap: "nowrap" }}>
|
|
5
5
|
{`${props.value}`}
|
|
6
6
|
</Text>);
|
|
7
7
|
}
|
|
8
8
|
export function PropertySeparator() {
|
|
9
|
-
return <Text options={{ size: "xs", weight: "semibold", wrap: "nowrap" }}
|
|
9
|
+
return (<Text data-start-seroval-separator options={{ size: "xs", weight: "semibold", wrap: "nowrap" }}>
|
|
10
|
+
:
|
|
11
|
+
</Text>);
|
|
10
12
|
}
|
|
@@ -1,70 +1,132 @@
|
|
|
1
1
|
[data-start-seroval-viewer] {
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
height: 100%;
|
|
3
|
+
min-height: 12rem;
|
|
4
|
+
|
|
5
|
+
overflow: auto;
|
|
6
|
+
|
|
7
|
+
padding: 0.375rem 0.5rem;
|
|
8
|
+
|
|
9
|
+
border: 1px var(--start-dt-border-soft, oklch(87% 0.065 274.039)) solid;
|
|
10
|
+
border-radius: 0.5rem;
|
|
11
|
+
background-color: var(--start-dt-surface, transparent);
|
|
12
|
+
|
|
13
|
+
color: var(--start-dt-text, rgb(249 250 251));
|
|
14
|
+
font-family:
|
|
15
|
+
ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New",
|
|
16
|
+
monospace;
|
|
4
17
|
}
|
|
5
18
|
|
|
6
|
-
[data-start-seroval-
|
|
19
|
+
[data-start-seroval-tree-node] {
|
|
7
20
|
display: flex;
|
|
8
|
-
|
|
9
|
-
align-items: center;
|
|
21
|
+
flex-direction: column;
|
|
10
22
|
}
|
|
11
23
|
|
|
12
|
-
[data-start-seroval-
|
|
24
|
+
[data-start-seroval-tree-row] {
|
|
13
25
|
display: flex;
|
|
14
|
-
|
|
15
|
-
|
|
26
|
+
align-items: center;
|
|
27
|
+
gap: 0.375rem;
|
|
28
|
+
|
|
29
|
+
padding: 0.125rem 0.25rem;
|
|
30
|
+
border-radius: 0.25rem;
|
|
31
|
+
|
|
32
|
+
min-width: 0;
|
|
33
|
+
width: 100%;
|
|
34
|
+
|
|
35
|
+
border: none;
|
|
36
|
+
background: none;
|
|
37
|
+
color: inherit;
|
|
38
|
+
font: inherit;
|
|
39
|
+
text-align: left;
|
|
40
|
+
outline: none;
|
|
16
41
|
}
|
|
17
42
|
|
|
18
|
-
[data-start-seroval-
|
|
19
|
-
|
|
43
|
+
button[data-start-seroval-tree-row] {
|
|
44
|
+
cursor: pointer;
|
|
20
45
|
}
|
|
21
46
|
|
|
22
|
-
[data-start-seroval-
|
|
23
|
-
|
|
47
|
+
button[data-start-seroval-tree-row]:hover,
|
|
48
|
+
button[data-start-seroval-tree-row]:focus-visible {
|
|
49
|
+
background-color: var(--start-dt-surface-hover, transparent);
|
|
24
50
|
}
|
|
25
51
|
|
|
26
|
-
[data-start-seroval-
|
|
27
|
-
display: flex;
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
padding: 0.25rem;
|
|
52
|
+
[data-start-seroval-tree-chevron] {
|
|
53
|
+
display: inline-flex;
|
|
54
|
+
align-items: center;
|
|
55
|
+
justify-content: center;
|
|
31
56
|
|
|
32
|
-
width:
|
|
33
|
-
|
|
57
|
+
width: 0.875rem;
|
|
58
|
+
flex-shrink: 0;
|
|
59
|
+
|
|
60
|
+
color: var(--start-dt-text-muted, inherit);
|
|
34
61
|
}
|
|
35
62
|
|
|
36
|
-
[data-start-seroval-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
63
|
+
[data-start-seroval-tree-chevron]::before {
|
|
64
|
+
content: "";
|
|
65
|
+
|
|
66
|
+
width: 0.3125rem;
|
|
67
|
+
height: 0.3125rem;
|
|
68
|
+
|
|
69
|
+
border-right: 1.5px currentColor solid;
|
|
70
|
+
border-bottom: 1.5px currentColor solid;
|
|
71
|
+
|
|
72
|
+
transform: rotate(-45deg);
|
|
73
|
+
transition: transform 150ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
[data-start-seroval-tree-chevron][data-leaf]::before {
|
|
77
|
+
content: none;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
[data-start-seroval-tree-row][data-expanded] > [data-start-seroval-tree-chevron]::before {
|
|
81
|
+
transform: rotate(45deg);
|
|
43
82
|
}
|
|
44
83
|
|
|
45
|
-
[data-start-seroval-
|
|
84
|
+
[data-start-seroval-tree-children] {
|
|
46
85
|
display: flex;
|
|
47
86
|
flex-direction: column;
|
|
48
|
-
gap: 0.25rem;
|
|
49
|
-
}
|
|
50
87
|
|
|
51
|
-
|
|
52
|
-
|
|
88
|
+
margin-left: 0.6875rem;
|
|
89
|
+
padding-left: 0.625rem;
|
|
90
|
+
|
|
91
|
+
border-left: 1px var(--start-dt-border-soft, oklch(87% 0.065 274.039)) solid;
|
|
53
92
|
}
|
|
54
93
|
|
|
55
|
-
[data-start-seroval-
|
|
94
|
+
[data-start-seroval-tree-key] {
|
|
56
95
|
display: inline-flex;
|
|
57
|
-
gap: 0.25rem;
|
|
58
96
|
align-items: center;
|
|
97
|
+
gap: 0.125rem;
|
|
98
|
+
|
|
99
|
+
flex-shrink: 0;
|
|
59
100
|
}
|
|
60
101
|
|
|
61
|
-
[data-start-seroval-
|
|
102
|
+
[data-start-seroval-tree-preview] {
|
|
103
|
+
color: var(--start-dt-text-muted, inherit);
|
|
104
|
+
font-size: 0.75rem;
|
|
105
|
+
line-height: 1rem;
|
|
106
|
+
|
|
107
|
+
min-width: 0;
|
|
108
|
+
overflow: hidden;
|
|
109
|
+
text-overflow: ellipsis;
|
|
110
|
+
white-space: nowrap;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
[data-start-seroval-tree-circular] {
|
|
62
114
|
display: inline-flex;
|
|
63
|
-
gap: 0.25rem;
|
|
64
115
|
align-items: center;
|
|
116
|
+
gap: 0.25rem;
|
|
65
117
|
}
|
|
66
118
|
|
|
67
|
-
[data-start-seroval-
|
|
119
|
+
[data-start-seroval-tree-circular] > svg {
|
|
68
120
|
width: 1rem;
|
|
69
121
|
height: 1rem;
|
|
122
|
+
|
|
123
|
+
color: var(--start-dt-accent, currentColor);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
[data-start-seroval-tree-raw] {
|
|
127
|
+
padding: 0.25rem 0;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
[data-start-seroval-value="plain"] {
|
|
131
|
+
color: var(--start-dt-text, rgb(249 250 251));
|
|
70
132
|
}
|