@solidjs/start 0.7.0 → 0.7.2
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/config/index.js +4 -4
- package/config/server-components.js +1 -1
- package/dist/client/StartClient.d.ts +3 -0
- package/{client/StartClient.tsx → dist/client/StartClient.jsx} +4 -9
- package/{client/index.ts → dist/client/index.d.ts} +0 -1
- package/dist/client/index.jsx +4 -0
- package/dist/client/islands.d.ts +3 -0
- package/{client/islands.ts → dist/client/islands.jsx} +1 -1
- package/dist/client/mount.d.ts +3 -0
- package/dist/client/mount.js +85 -0
- package/dist/client/spa/index.d.ts +5 -0
- package/dist/client/spa/index.jsx +6 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.jsx +5 -0
- package/dist/middleware/index.d.ts +18 -0
- package/dist/middleware/index.js +40 -0
- package/dist/router/FileRoutes.d.ts +2 -0
- package/dist/router/FileRoutes.js +25 -0
- package/dist/router/index.jsx +2 -0
- package/dist/router/lazyRoute.d.ts +6 -0
- package/dist/router/lazyRoute.js +48 -0
- package/dist/router/routes.d.ts +25 -0
- package/dist/router/routes.js +51 -0
- package/dist/runtime/server-fns-runtime.d.ts +1 -0
- package/dist/runtime/server-fns-runtime.js +30 -0
- package/dist/runtime/server-handler.d.ts +2 -0
- package/dist/runtime/server-handler.js +242 -0
- package/dist/runtime/server-runtime.d.ts +3 -0
- package/dist/runtime/server-runtime.js +185 -0
- package/dist/server/StartServer.d.ts +5 -0
- package/dist/server/StartServer.jsx +78 -0
- package/dist/server/fetchEvent.d.ts +6 -0
- package/dist/server/fetchEvent.js +88 -0
- package/dist/server/handler.d.ts +3 -0
- package/dist/server/handler.js +98 -0
- package/dist/server/index.jsx +5 -0
- package/dist/server/islands/index.d.ts +19 -0
- package/dist/server/islands/index.jsx +62 -0
- package/dist/server/islands/utils.d.ts +1 -0
- package/dist/server/islands/utils.jsx +85 -0
- package/dist/server/pageEvent.d.ts +2 -0
- package/dist/server/pageEvent.js +43 -0
- package/dist/server/renderAsset.d.ts +2 -0
- package/dist/server/renderAsset.jsx +13 -0
- package/dist/server/serverFunction.d.ts +2 -0
- package/dist/server/serverFunction.jsx +4 -0
- package/dist/server/spa/StartServer.d.ts +5 -0
- package/dist/server/spa/StartServer.jsx +18 -0
- package/dist/server/spa/handler.d.ts +3 -0
- package/dist/server/spa/handler.js +17 -0
- package/{server/spa/index.ts → dist/server/spa/index.d.ts} +0 -1
- package/dist/server/spa/index.jsx +4 -0
- package/dist/server/types.d.ts +79 -0
- package/dist/server/types.js +1 -0
- package/dist/shared/ErrorBoundary.d.ts +2 -0
- package/dist/shared/ErrorBoundary.jsx +16 -0
- package/dist/shared/GET.d.ts +1 -0
- package/dist/shared/GET.js +5 -0
- package/dist/shared/HttpHeader.d.ts +6 -0
- package/dist/shared/HttpHeader.jsx +32 -0
- package/dist/shared/HttpStatusCode.d.ts +5 -0
- package/dist/shared/HttpStatusCode.jsx +12 -0
- package/dist/shared/clientOnly.d.ts +6 -0
- package/dist/shared/clientOnly.jsx +19 -0
- package/dist/shared/dev-overlay/CodeView.d.ts +7 -0
- package/dist/shared/dev-overlay/CodeView.jsx +71 -0
- package/dist/shared/dev-overlay/DevOverlayDialog.d.ts +9 -0
- package/dist/shared/dev-overlay/DevOverlayDialog.jsx +209 -0
- package/dist/shared/dev-overlay/createStackFrame.d.ts +9 -0
- package/dist/shared/dev-overlay/createStackFrame.js +56 -0
- package/dist/shared/dev-overlay/download.d.ts +1 -0
- package/dist/shared/dev-overlay/download.js +6 -0
- package/dist/shared/dev-overlay/get-source-map.d.ts +2 -0
- package/dist/shared/dev-overlay/get-source-map.js +25 -0
- package/dist/shared/dev-overlay/icons.d.ts +28 -0
- package/{shared/dev-overlay/icons.tsx → dist/shared/dev-overlay/icons.jsx} +35 -173
- package/dist/shared/dev-overlay/index.d.ts +5 -0
- package/dist/shared/dev-overlay/index.jsx +37 -0
- package/package.json +20 -22
- package/client/mount.ts +0 -99
- package/client/spa/index.ts +0 -10
- package/config/server-fns-runtime.ts +0 -28
- package/config/server-handler.ts +0 -261
- package/config/server-runtime.ts +0 -229
- package/middleware/index.ts +0 -70
- package/router/FileRoutes.ts +0 -35
- package/router/lazyRoute.ts +0 -55
- package/router/routes.ts +0 -87
- package/server/StartServer.tsx +0 -126
- package/server/fetchEvent.ts +0 -113
- package/server/handler.ts +0 -112
- package/server/islands/index.tsx +0 -103
- package/server/islands/utils.tsx +0 -89
- package/server/pageEvent.ts +0 -50
- package/server/renderAsset.tsx +0 -23
- package/server/serverFunction.tsx +0 -6
- package/server/spa/StartServer.tsx +0 -52
- package/server/spa/handler.ts +0 -24
- package/server/types.ts +0 -81
- package/shared/ErrorBoundary.tsx +0 -23
- package/shared/GET.ts +0 -5
- package/shared/HttpHeader.tsx +0 -35
- package/shared/HttpStatusCode.tsx +0 -19
- package/shared/clientOnly.tsx +0 -29
- package/shared/dev-overlay/CodeView.tsx +0 -95
- package/shared/dev-overlay/DevOverlayDialog.tsx +0 -280
- package/shared/dev-overlay/createStackFrame.ts +0 -77
- package/shared/dev-overlay/download.ts +0 -6
- package/shared/dev-overlay/env.d.ts +0 -4
- package/shared/dev-overlay/get-source-map.ts +0 -35
- package/shared/dev-overlay/index.tsx +0 -61
- package/shared/index.ts +0 -5
- /package/{router/index.ts → dist/router/index.d.ts} +0 -0
- /package/{server/index.ts → dist/server/index.d.ts} +0 -0
- /package/{shared → dist/shared}/dev-overlay/styles.css +0 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { getHighlighterCore, loadWasm } from 'shikiji/core';
|
|
2
|
+
import { createEffect, createResource } from 'solid-js';
|
|
3
|
+
import url from 'shikiji/onig.wasm?url';
|
|
4
|
+
import langJS from 'shikiji/langs/javascript.mjs';
|
|
5
|
+
import langJSX from 'shikiji/langs/jsx.mjs';
|
|
6
|
+
import langTSX from 'shikiji/langs/tsx.mjs';
|
|
7
|
+
import langTS from 'shikiji/langs/typescript.mjs';
|
|
8
|
+
import darkPlus from 'shikiji/themes/dark-plus.mjs';
|
|
9
|
+
let HIGHLIGHTER;
|
|
10
|
+
async function loadHighlighter() {
|
|
11
|
+
if (!HIGHLIGHTER) {
|
|
12
|
+
await loadWasm(await fetch(url));
|
|
13
|
+
HIGHLIGHTER = await getHighlighterCore({
|
|
14
|
+
themes: [
|
|
15
|
+
darkPlus,
|
|
16
|
+
],
|
|
17
|
+
langs: [
|
|
18
|
+
langJS,
|
|
19
|
+
langJSX,
|
|
20
|
+
langTS,
|
|
21
|
+
langTSX,
|
|
22
|
+
],
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
return HIGHLIGHTER;
|
|
26
|
+
}
|
|
27
|
+
const RANGE = 8;
|
|
28
|
+
export function CodeView(props) {
|
|
29
|
+
const lines = () => props.content.split('\n').map((item, index) => ({
|
|
30
|
+
index: index + 1,
|
|
31
|
+
line: item,
|
|
32
|
+
}));
|
|
33
|
+
const minLine = () => Math.max(props.line - (1 + RANGE), 0);
|
|
34
|
+
const maxLine = () => Math.min(props.line + RANGE, lines().length - 1);
|
|
35
|
+
let ref;
|
|
36
|
+
const [data] = createResource(() => (lines()
|
|
37
|
+
.slice(minLine(), maxLine())
|
|
38
|
+
.map(item => item.line)
|
|
39
|
+
.join('\n')), async (value) => {
|
|
40
|
+
const highlighter = await loadHighlighter();
|
|
41
|
+
const fileExtension = props.fileName
|
|
42
|
+
.split(/[#?]/)[0]
|
|
43
|
+
.split('.')
|
|
44
|
+
.pop()
|
|
45
|
+
?.trim();
|
|
46
|
+
let lang = fileExtension;
|
|
47
|
+
if (fileExtension === 'mjs' || fileExtension === 'cjs') {
|
|
48
|
+
lang = 'js';
|
|
49
|
+
}
|
|
50
|
+
return highlighter.codeToHtml(value, {
|
|
51
|
+
theme: 'dark-plus',
|
|
52
|
+
lang,
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
createEffect(() => {
|
|
56
|
+
const result = data();
|
|
57
|
+
if (ref && result) {
|
|
58
|
+
ref.innerHTML = result;
|
|
59
|
+
const lines = ref.querySelectorAll('span[class="line"]');
|
|
60
|
+
for (let i = 0, len = lines.length; i < len; i++) {
|
|
61
|
+
const el = lines[i];
|
|
62
|
+
if ((props.line - minLine() - 1) === i) {
|
|
63
|
+
el.classList.add('dev-overlay-error-line');
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
return <div ref={ref} class="dev-overlay-code-view" style={{
|
|
69
|
+
'--dev-overlay-code-view-start': minLine() + 1,
|
|
70
|
+
}}/>;
|
|
71
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { JSX } from 'solid-js';
|
|
2
|
+
import './styles.css';
|
|
3
|
+
export declare function classNames(...classes: (string | boolean | undefined)[]): string;
|
|
4
|
+
interface DevOverlayDialogProps {
|
|
5
|
+
errors: any[];
|
|
6
|
+
resetError: () => void;
|
|
7
|
+
}
|
|
8
|
+
export default function DevOverlayDialog(props: DevOverlayDialogProps): JSX.Element;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
// @refresh skip
|
|
2
|
+
import ErrorStackParser from 'error-stack-parser';
|
|
3
|
+
import * as htmlToImage from 'html-to-image';
|
|
4
|
+
import { ErrorBoundary, For, Show, Suspense, createMemo, createSignal } from 'solid-js';
|
|
5
|
+
import { Portal } from 'solid-js/web';
|
|
6
|
+
import { Dialog, DialogOverlay, DialogPanel, Select, SelectOption } from 'terracotta';
|
|
7
|
+
import info from '../../../package.json';
|
|
8
|
+
import { CodeView } from './CodeView';
|
|
9
|
+
import { createStackFrame } from './createStackFrame';
|
|
10
|
+
import download from './download';
|
|
11
|
+
import { ArrowLeftIcon, ArrowRightIcon, CameraIcon, DiscordIcon, GithubIcon, RefreshIcon, SolidStartIcon, ViewCompiledIcon, ViewOriginalIcon } from './icons';
|
|
12
|
+
import './styles.css';
|
|
13
|
+
export function classNames(...classes) {
|
|
14
|
+
return classes.filter(Boolean).join(' ');
|
|
15
|
+
}
|
|
16
|
+
function ErrorInfo(props) {
|
|
17
|
+
return (<Show when={props.error instanceof Error && props.error} keyed fallback={<span>{props.error.toString()}</span>}>
|
|
18
|
+
{(current) => (<span class="dev-overlay-error-info">
|
|
19
|
+
<span class="dev-overlay-error-info-name">{current.name}</span>
|
|
20
|
+
<span class="dev-overlay-error-info-message">{current.message}</span>
|
|
21
|
+
</span>)}
|
|
22
|
+
</Show>);
|
|
23
|
+
}
|
|
24
|
+
function getFileName(source) {
|
|
25
|
+
try {
|
|
26
|
+
const path = source.startsWith('/') ? new URL(source, 'file://') : new URL(source);
|
|
27
|
+
const paths = path.pathname.split('/');
|
|
28
|
+
return paths[paths.length - 1];
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
return getFileName(`/${source}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function getFilePath(source) {
|
|
35
|
+
const line = source.line ? `:${source.line}` : '';
|
|
36
|
+
const column = source.column ? `:${source.column}` : '';
|
|
37
|
+
return `${getFileName(source.source)}${line}${column}`;
|
|
38
|
+
}
|
|
39
|
+
function CodeFallback() {
|
|
40
|
+
return <div class="dev-overlay-stack-frames-code-fallback">
|
|
41
|
+
<span>Source not available.</span>
|
|
42
|
+
</div>;
|
|
43
|
+
}
|
|
44
|
+
function StackFramesContent(props) {
|
|
45
|
+
const stackframes = ErrorStackParser.parse(props.error);
|
|
46
|
+
const [selectedFrame, setSelectedFrame] = createSignal(stackframes[0]);
|
|
47
|
+
return (<div class="dev-overlay-stack-frames-content">
|
|
48
|
+
<div class="dev-overlay-stack-frames-code">
|
|
49
|
+
<ErrorBoundary fallback={null}>
|
|
50
|
+
{(() => {
|
|
51
|
+
const data = createStackFrame(selectedFrame(), () => props.isCompiled);
|
|
52
|
+
return (<Suspense fallback={<CodeFallback />}>
|
|
53
|
+
<Show when={data()} keyed fallback={<CodeFallback />}>
|
|
54
|
+
{(source) => (<>
|
|
55
|
+
<span class="dev-overlay-stack-frames-code-source">{source.source}</span>
|
|
56
|
+
<div class="dev-overlay-stack-frames-code-container">
|
|
57
|
+
<CodeView fileName={source.source} line={source.line} content={source.content}/>
|
|
58
|
+
</div>
|
|
59
|
+
</>)}
|
|
60
|
+
</Show>
|
|
61
|
+
</Suspense>);
|
|
62
|
+
})()}
|
|
63
|
+
</ErrorBoundary>
|
|
64
|
+
</div>
|
|
65
|
+
<Select class="dev-overlay-stack-frames" value={selectedFrame()} onChange={setSelectedFrame}>
|
|
66
|
+
<For each={stackframes}>
|
|
67
|
+
{(current) => (<ErrorBoundary fallback={(<div class="dev-overlay-stack-frame">
|
|
68
|
+
<span class="dev-overlay-stack-frame-function">{current.functionName ?? '<anonymous>'}</span>
|
|
69
|
+
<span class="dev-overlay-stack-frame-file">{getFilePath({
|
|
70
|
+
source: current.getFileName(),
|
|
71
|
+
content: '',
|
|
72
|
+
line: current.getLineNumber(),
|
|
73
|
+
column: current.getColumnNumber(),
|
|
74
|
+
name: current.getFunctionName(),
|
|
75
|
+
})}</span>
|
|
76
|
+
</div>)}>
|
|
77
|
+
{(() => {
|
|
78
|
+
const data = createStackFrame(current, () => props.isCompiled);
|
|
79
|
+
return (<Suspense>
|
|
80
|
+
<Show when={data()} keyed>
|
|
81
|
+
{(source) => (<SelectOption class="dev-overlay-stack-frame" value={current}>
|
|
82
|
+
<span class="dev-overlay-stack-frame-function">{source.name ?? '<anonymous>'}</span>
|
|
83
|
+
<span class="dev-overlay-stack-frame-file">{getFilePath(source)}</span>
|
|
84
|
+
</SelectOption>)}
|
|
85
|
+
</Show>
|
|
86
|
+
</Suspense>);
|
|
87
|
+
})()}
|
|
88
|
+
</ErrorBoundary>)}
|
|
89
|
+
</For>
|
|
90
|
+
</Select>
|
|
91
|
+
</div>);
|
|
92
|
+
}
|
|
93
|
+
function StackFrames(props) {
|
|
94
|
+
return (<Show when={props.error instanceof Error && props.error} keyed>
|
|
95
|
+
{(current) => (<StackFramesContent error={current} isCompiled={props.isCompiled}/>)}
|
|
96
|
+
</Show>);
|
|
97
|
+
}
|
|
98
|
+
const ISSUE_THREAD = 'https://github.com/solidjs/solid-start/issues/new';
|
|
99
|
+
const DISCORD_INVITE = 'https://discord.com/invite/solidjs';
|
|
100
|
+
export default function DevOverlayDialog(props) {
|
|
101
|
+
const [currentPage, setCurrentPage] = createSignal(1);
|
|
102
|
+
const [isCompiled, setIsCompiled] = createSignal(false);
|
|
103
|
+
const length = createMemo(() => props.errors.length);
|
|
104
|
+
const truncated = createMemo(() => {
|
|
105
|
+
return Math.min(currentPage(), length());
|
|
106
|
+
});
|
|
107
|
+
function goPrev() {
|
|
108
|
+
setCurrentPage((c) => {
|
|
109
|
+
if (c > 1) {
|
|
110
|
+
return c - 1;
|
|
111
|
+
}
|
|
112
|
+
return length();
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
function goNext() {
|
|
116
|
+
setCurrentPage((c) => {
|
|
117
|
+
if (c < length()) {
|
|
118
|
+
return c + 1;
|
|
119
|
+
}
|
|
120
|
+
return 1;
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
function toggleIsCompiled() {
|
|
124
|
+
setIsCompiled((c) => !c);
|
|
125
|
+
}
|
|
126
|
+
const [panel, setPanel] = createSignal();
|
|
127
|
+
function downloadScreenshot() {
|
|
128
|
+
const current = panel();
|
|
129
|
+
if (current) {
|
|
130
|
+
htmlToImage.toPng(current, {
|
|
131
|
+
style: {
|
|
132
|
+
transform: 'scale(0.75)',
|
|
133
|
+
},
|
|
134
|
+
}).then((url) => {
|
|
135
|
+
download(url, 'start-screenshot.png');
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
function redirectToGithub() {
|
|
140
|
+
const url = new URL(ISSUE_THREAD);
|
|
141
|
+
url.searchParams.append('labels', 'bug');
|
|
142
|
+
url.searchParams.append('labels', 'needs+triage');
|
|
143
|
+
url.searchParams.append('template', 'bug.yml');
|
|
144
|
+
url.searchParams.append('title', `[Bug?]:` + props.errors[truncated() - 1].toString());
|
|
145
|
+
window.open(url, '_blank').focus();
|
|
146
|
+
}
|
|
147
|
+
function redirectToDiscord() {
|
|
148
|
+
window.open(DISCORD_INVITE, '_blank').focus();
|
|
149
|
+
}
|
|
150
|
+
return (<Portal>
|
|
151
|
+
<Dialog class="dev-overlay" isOpen>
|
|
152
|
+
<div>
|
|
153
|
+
<DialogOverlay class="dev-overlay-background"/>
|
|
154
|
+
<DialogPanel ref={setPanel} class="dev-overlay-panel-container">
|
|
155
|
+
<div class="dev-overlay-panel">
|
|
156
|
+
<div class="dev-overlay-navbar">
|
|
157
|
+
<div class="dev-overlay-navbar-left">
|
|
158
|
+
<div class="dev-overlay-version">
|
|
159
|
+
<div>
|
|
160
|
+
<SolidStartIcon title="Solid Start Version"/>
|
|
161
|
+
</div>
|
|
162
|
+
<span>{info.version}</span>
|
|
163
|
+
</div>
|
|
164
|
+
<Show when={props.errors.length > 1}>
|
|
165
|
+
<div class="dev-overlay-pagination">
|
|
166
|
+
<button class="dev-overlay-button" onClick={goPrev} type="button">
|
|
167
|
+
<ArrowLeftIcon title="Go Previous"/>
|
|
168
|
+
</button>
|
|
169
|
+
<div class="dev-overlay-page-counter">
|
|
170
|
+
{`${truncated()} of ${props.errors.length}`}
|
|
171
|
+
</div>
|
|
172
|
+
<button class="dev-overlay-button" onClick={goNext} type="button">
|
|
173
|
+
<ArrowRightIcon title="Go Next"/>
|
|
174
|
+
</button>
|
|
175
|
+
</div>
|
|
176
|
+
</Show>
|
|
177
|
+
</div>
|
|
178
|
+
<div class="dev-overlay-controls">
|
|
179
|
+
<button class="dev-overlay-button" onClick={redirectToGithub} type="button">
|
|
180
|
+
<GithubIcon title="Create an issue thread on Github"/>
|
|
181
|
+
</button>
|
|
182
|
+
<button class="dev-overlay-button" onClick={redirectToDiscord} type="button">
|
|
183
|
+
<DiscordIcon title="Join our Discord Channel"/>
|
|
184
|
+
</button>
|
|
185
|
+
<button class="dev-overlay-button" onClick={downloadScreenshot} type="button">
|
|
186
|
+
<CameraIcon title="Capture Error Overlay"/>
|
|
187
|
+
</button>
|
|
188
|
+
<button class="dev-overlay-button" onClick={toggleIsCompiled} type="button">
|
|
189
|
+
<Show when={isCompiled()} fallback={(<ViewOriginalIcon title="View Original Source"/>)}>
|
|
190
|
+
<ViewCompiledIcon title="View Compiled Source"/>
|
|
191
|
+
</Show>
|
|
192
|
+
</button>
|
|
193
|
+
<button class="dev-overlay-button" onClick={props.resetError} type="button">
|
|
194
|
+
<RefreshIcon title="Reset Error"/>
|
|
195
|
+
</button>
|
|
196
|
+
</div>
|
|
197
|
+
</div>
|
|
198
|
+
<Show when={props.errors[truncated() - 1]} keyed>
|
|
199
|
+
{(current) => (<div class="dev-overlay-content">
|
|
200
|
+
<ErrorInfo error={current}/>
|
|
201
|
+
<StackFrames error={current} isCompiled={isCompiled()}/>
|
|
202
|
+
</div>)}
|
|
203
|
+
</Show>
|
|
204
|
+
</div>
|
|
205
|
+
</DialogPanel>
|
|
206
|
+
</div>
|
|
207
|
+
</Dialog>
|
|
208
|
+
</Portal>);
|
|
209
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type Accessor } from "solid-js";
|
|
2
|
+
export interface StackFrameSource {
|
|
3
|
+
content: string;
|
|
4
|
+
source: string;
|
|
5
|
+
name?: string;
|
|
6
|
+
line: number;
|
|
7
|
+
column: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function createStackFrame(stackframe: StackFrame, isCompiled: () => boolean): Accessor<StackFrameSource>;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { createMemo, createResource } from "solid-js";
|
|
2
|
+
import getSourceMap from "./get-source-map";
|
|
3
|
+
function getActualFileSource(path) {
|
|
4
|
+
if (path.startsWith('file://')) {
|
|
5
|
+
return '/_build/@fs' + path.substring('file://'.length);
|
|
6
|
+
}
|
|
7
|
+
return path;
|
|
8
|
+
}
|
|
9
|
+
export function createStackFrame(stackframe, isCompiled) {
|
|
10
|
+
const [data] = createResource(() => ({
|
|
11
|
+
fileName: stackframe.fileName,
|
|
12
|
+
line: stackframe.lineNumber,
|
|
13
|
+
column: stackframe.columnNumber,
|
|
14
|
+
functionName: stackframe.functionName,
|
|
15
|
+
}), async (source) => {
|
|
16
|
+
if (!source.fileName) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
const response = await fetch(getActualFileSource(source.fileName));
|
|
20
|
+
if (!response.ok) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
const content = await response.text();
|
|
24
|
+
const sourceMap = await getSourceMap(source.fileName, content);
|
|
25
|
+
return {
|
|
26
|
+
source,
|
|
27
|
+
content,
|
|
28
|
+
sourceMap,
|
|
29
|
+
};
|
|
30
|
+
});
|
|
31
|
+
const info = createMemo(() => {
|
|
32
|
+
const current = data();
|
|
33
|
+
if (!current) {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
const { source, content, sourceMap } = current;
|
|
37
|
+
if (!isCompiled() && source.line && source.column && sourceMap) {
|
|
38
|
+
const result = sourceMap.originalPositionFor({
|
|
39
|
+
line: source.line,
|
|
40
|
+
column: source.column,
|
|
41
|
+
});
|
|
42
|
+
return {
|
|
43
|
+
...result,
|
|
44
|
+
content: sourceMap.sourceContentFor(result.source),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
source: source.fileName,
|
|
49
|
+
line: source.line,
|
|
50
|
+
column: source.column,
|
|
51
|
+
name: source.functionName,
|
|
52
|
+
content,
|
|
53
|
+
};
|
|
54
|
+
});
|
|
55
|
+
return info;
|
|
56
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function download(dataurl: string, filename: string): void;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { SourceMapConsumer } from 'source-map-js';
|
|
2
|
+
const INLINE_SOURCEMAP_REGEX = /^data:application\/json[^,]+base64,/;
|
|
3
|
+
const SOURCEMAP_REGEX = /(?:\/\/[@#][ \t]+sourceMappingURL=([^\s'"]+?)[ \t]*$)|(?:\/\*[@#][ \t]+sourceMappingURL=([^*]+?)[ \t]*(?:\*\/)[ \t]*$)/;
|
|
4
|
+
export default async function getSourceMap(url, content) {
|
|
5
|
+
const lines = content.split('\n');
|
|
6
|
+
let sourceMapUrl;
|
|
7
|
+
for (let i = lines.length - 1; i >= 0 && !sourceMapUrl; i--) {
|
|
8
|
+
const result = lines[i].match(SOURCEMAP_REGEX);
|
|
9
|
+
if (result) {
|
|
10
|
+
sourceMapUrl = result[1];
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
if (!sourceMapUrl) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
if (!(INLINE_SOURCEMAP_REGEX.test(sourceMapUrl) || sourceMapUrl.startsWith('/'))) {
|
|
17
|
+
// Resolve path if it's a relative access
|
|
18
|
+
const parsedURL = url.split('/');
|
|
19
|
+
parsedURL[parsedURL.length - 1] = sourceMapUrl;
|
|
20
|
+
sourceMapUrl = parsedURL.join('/');
|
|
21
|
+
}
|
|
22
|
+
const response = await fetch(sourceMapUrl);
|
|
23
|
+
const rawSourceMap = await response.json();
|
|
24
|
+
return new SourceMapConsumer(rawSourceMap);
|
|
25
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { JSX } from 'solid-js';
|
|
2
|
+
export declare function ArrowRightIcon(props: JSX.IntrinsicElements['svg'] & {
|
|
3
|
+
title: string;
|
|
4
|
+
}): JSX.Element;
|
|
5
|
+
export declare function ArrowLeftIcon(props: JSX.IntrinsicElements['svg'] & {
|
|
6
|
+
title: string;
|
|
7
|
+
}): JSX.Element;
|
|
8
|
+
export declare function RefreshIcon(props: JSX.IntrinsicElements['svg'] & {
|
|
9
|
+
title: string;
|
|
10
|
+
}): JSX.Element;
|
|
11
|
+
export declare function ViewCompiledIcon(props: JSX.IntrinsicElements['svg'] & {
|
|
12
|
+
title: string;
|
|
13
|
+
}): JSX.Element;
|
|
14
|
+
export declare function ViewOriginalIcon(props: JSX.IntrinsicElements['svg'] & {
|
|
15
|
+
title: string;
|
|
16
|
+
}): JSX.Element;
|
|
17
|
+
export declare function CameraIcon(props: JSX.IntrinsicElements['svg'] & {
|
|
18
|
+
title: string;
|
|
19
|
+
}): JSX.Element;
|
|
20
|
+
export declare function DiscordIcon(props: JSX.IntrinsicElements['svg'] & {
|
|
21
|
+
title: string;
|
|
22
|
+
}): JSX.Element;
|
|
23
|
+
export declare function GithubIcon(props: JSX.IntrinsicElements['svg'] & {
|
|
24
|
+
title: string;
|
|
25
|
+
}): JSX.Element;
|
|
26
|
+
export declare function SolidStartIcon(props: JSX.IntrinsicElements['svg'] & {
|
|
27
|
+
title: string;
|
|
28
|
+
}): JSX.Element;
|
|
@@ -1,191 +1,55 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export function ArrowRightIcon(
|
|
5
|
-
props: JSX.IntrinsicElements['svg'] & { title: string },
|
|
6
|
-
): JSX.Element {
|
|
7
|
-
return (
|
|
8
|
-
<svg
|
|
9
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
10
|
-
fill="none"
|
|
11
|
-
viewBox="0 0 24 24"
|
|
12
|
-
stroke="currentColor"
|
|
13
|
-
{...props}
|
|
14
|
-
>
|
|
1
|
+
export function ArrowRightIcon(props) {
|
|
2
|
+
return (<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" {...props}>
|
|
15
3
|
<title>{props.title}</title>
|
|
16
|
-
<path
|
|
17
|
-
|
|
18
|
-
stroke-linejoin="round"
|
|
19
|
-
stroke-width="2"
|
|
20
|
-
d="M14 5l7 7m0 0l-7 7m7-7H3"
|
|
21
|
-
/>
|
|
22
|
-
</svg>
|
|
23
|
-
);
|
|
4
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 5l7 7m0 0l-7 7m7-7H3"/>
|
|
5
|
+
</svg>);
|
|
24
6
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
props: JSX.IntrinsicElements['svg'] & { title: string },
|
|
28
|
-
): JSX.Element {
|
|
29
|
-
return (
|
|
30
|
-
<svg
|
|
31
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
32
|
-
fill="none"
|
|
33
|
-
viewBox="0 0 24 24"
|
|
34
|
-
stroke="currentColor"
|
|
35
|
-
{...props}
|
|
36
|
-
>
|
|
7
|
+
export function ArrowLeftIcon(props) {
|
|
8
|
+
return (<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" {...props}>
|
|
37
9
|
<title>{props.title}</title>
|
|
38
|
-
<path
|
|
39
|
-
|
|
40
|
-
stroke-linejoin="round"
|
|
41
|
-
stroke-width="2"
|
|
42
|
-
d="M10 19l-7-7m0 0l7-7m-7 7h18"
|
|
43
|
-
/>
|
|
44
|
-
</svg>
|
|
45
|
-
);
|
|
10
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 19l-7-7m0 0l7-7m-7 7h18"/>
|
|
11
|
+
</svg>);
|
|
46
12
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
props: JSX.IntrinsicElements['svg'] & { title: string },
|
|
50
|
-
): JSX.Element {
|
|
51
|
-
return (
|
|
52
|
-
<svg
|
|
53
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
54
|
-
fill="none"
|
|
55
|
-
viewBox="0 0 24 24"
|
|
56
|
-
stroke="currentColor"
|
|
57
|
-
{...props}
|
|
58
|
-
>
|
|
13
|
+
export function RefreshIcon(props) {
|
|
14
|
+
return (<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" {...props}>
|
|
59
15
|
<title>{props.title}</title>
|
|
60
|
-
<path
|
|
61
|
-
|
|
62
|
-
stroke-linejoin="round"
|
|
63
|
-
stroke-width="2"
|
|
64
|
-
d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"
|
|
65
|
-
/>
|
|
66
|
-
</svg>
|
|
67
|
-
);
|
|
16
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"/>
|
|
17
|
+
</svg>);
|
|
68
18
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
props: JSX.IntrinsicElements['svg'] & { title: string },
|
|
72
|
-
): JSX.Element {
|
|
73
|
-
return (
|
|
74
|
-
<svg
|
|
75
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
76
|
-
fill="none"
|
|
77
|
-
viewBox="0 0 24 24"
|
|
78
|
-
stroke="currentColor"
|
|
79
|
-
{...props}
|
|
80
|
-
>
|
|
19
|
+
export function ViewCompiledIcon(props) {
|
|
20
|
+
return (<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" {...props}>
|
|
81
21
|
<title>{props.title}</title>
|
|
82
|
-
<path
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
stroke-width="2"
|
|
86
|
-
d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"
|
|
87
|
-
/>
|
|
88
|
-
<path
|
|
89
|
-
stroke-linecap="round"
|
|
90
|
-
stroke-linejoin="round"
|
|
91
|
-
stroke-width="2"
|
|
92
|
-
d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"
|
|
93
|
-
/>
|
|
94
|
-
</svg>
|
|
95
|
-
);
|
|
22
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"/>
|
|
23
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"/>
|
|
24
|
+
</svg>);
|
|
96
25
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
props: JSX.IntrinsicElements['svg'] & { title: string },
|
|
100
|
-
): JSX.Element {
|
|
101
|
-
return (
|
|
102
|
-
<svg
|
|
103
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
104
|
-
fill="none"
|
|
105
|
-
viewBox="0 0 24 24"
|
|
106
|
-
stroke="currentColor"
|
|
107
|
-
{...props}
|
|
108
|
-
>
|
|
26
|
+
export function ViewOriginalIcon(props) {
|
|
27
|
+
return (<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" {...props}>
|
|
109
28
|
<title>{props.title}</title>
|
|
110
|
-
<path
|
|
111
|
-
|
|
112
|
-
stroke-linejoin="round"
|
|
113
|
-
stroke-width="2"
|
|
114
|
-
d="M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21"
|
|
115
|
-
/>
|
|
116
|
-
</svg>
|
|
117
|
-
);
|
|
29
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21"/>
|
|
30
|
+
</svg>);
|
|
118
31
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
props: JSX.IntrinsicElements['svg'] & { title: string },
|
|
122
|
-
): JSX.Element {
|
|
123
|
-
return (
|
|
124
|
-
<svg
|
|
125
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
126
|
-
fill="currentColor"
|
|
127
|
-
viewBox="0 0 24 24"
|
|
128
|
-
stroke="none"
|
|
129
|
-
{...props}
|
|
130
|
-
>
|
|
32
|
+
export function CameraIcon(props) {
|
|
33
|
+
return (<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24" stroke="none" {...props}>
|
|
131
34
|
<title>{props.title}</title>
|
|
132
|
-
<path
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
<path
|
|
136
|
-
fill-rule="evenodd"
|
|
137
|
-
d="M9.344 3.071a49.52 49.52 0 0 1 5.312 0c.967.052 1.83.585 2.332 1.39l.821 1.317c.24.383.645.643 1.11.71.386.054.77.113 1.152.177 1.432.239 2.429 1.493 2.429 2.909V18a3 3 0 0 1-3 3h-15a3 3 0 0 1-3-3V9.574c0-1.416.997-2.67 2.429-2.909.382-.064.766-.123 1.151-.178a1.56 1.56 0 0 0 1.11-.71l.822-1.315a2.942 2.942 0 0 1 2.332-1.39ZM6.75 12.75a5.25 5.25 0 1 1 10.5 0 5.25 5.25 0 0 1-10.5 0Zm12-1.5a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z"
|
|
138
|
-
clip-rule="evenodd"
|
|
139
|
-
/>
|
|
140
|
-
</svg>
|
|
141
|
-
);
|
|
35
|
+
<path d="M12 9a3.75 3.75 0 1 0 0 7.5A3.75 3.75 0 0 0 12 9Z"/>
|
|
36
|
+
<path fill-rule="evenodd" d="M9.344 3.071a49.52 49.52 0 0 1 5.312 0c.967.052 1.83.585 2.332 1.39l.821 1.317c.24.383.645.643 1.11.71.386.054.77.113 1.152.177 1.432.239 2.429 1.493 2.429 2.909V18a3 3 0 0 1-3 3h-15a3 3 0 0 1-3-3V9.574c0-1.416.997-2.67 2.429-2.909.382-.064.766-.123 1.151-.178a1.56 1.56 0 0 0 1.11-.71l.822-1.315a2.942 2.942 0 0 1 2.332-1.39ZM6.75 12.75a5.25 5.25 0 1 1 10.5 0 5.25 5.25 0 0 1-10.5 0Zm12-1.5a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z" clip-rule="evenodd"/>
|
|
37
|
+
</svg>);
|
|
142
38
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
export function DiscordIcon(
|
|
146
|
-
props: JSX.IntrinsicElements['svg'] & { title: string },
|
|
147
|
-
): JSX.Element {
|
|
148
|
-
return (
|
|
149
|
-
<svg
|
|
150
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
151
|
-
fill="currentColor"
|
|
152
|
-
viewBox="0 0 24 24"
|
|
153
|
-
stroke="none"
|
|
154
|
-
{...props}
|
|
155
|
-
>
|
|
39
|
+
export function DiscordIcon(props) {
|
|
40
|
+
return (<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24" stroke="none" {...props}>
|
|
156
41
|
<title>{props.title}</title>
|
|
157
42
|
<path d="M14.82 4.26a10.14 10.14 0 0 0-.53 1.1 14.66 14.66 0 0 0-4.58 0 10.14 10.14 0 0 0-.53-1.1 16 16 0 0 0-4.13 1.3 17.33 17.33 0 0 0-3 11.59 16.6 16.6 0 0 0 5.07 2.59A12.89 12.89 0 0 0 8.23 18a9.65 9.65 0 0 1-1.71-.83 3.39 3.39 0 0 0 .42-.33 11.66 11.66 0 0 0 10.12 0q.21.18.42.33a10.84 10.84 0 0 1-1.71.84 12.41 12.41 0 0 0 1.08 1.78 16.44 16.44 0 0 0 5.06-2.59 17.22 17.22 0 0 0-3-11.59 16.09 16.09 0 0 0-4.09-1.35zM8.68 14.81a1.94 1.94 0 0 1-1.8-2 1.93 1.93 0 0 1 1.8-2 1.93 1.93 0 0 1 1.8 2 1.93 1.93 0 0 1-1.8 2zm6.64 0a1.94 1.94 0 0 1-1.8-2 1.93 1.93 0 0 1 1.8-2 1.92 1.92 0 0 1 1.8 2 1.92 1.92 0 0 1-1.8 2z"></path>
|
|
158
|
-
</svg>
|
|
159
|
-
);
|
|
43
|
+
</svg>);
|
|
160
44
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
props: JSX.IntrinsicElements['svg'] & { title: string },
|
|
164
|
-
): JSX.Element {
|
|
165
|
-
return (
|
|
166
|
-
<svg
|
|
167
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
168
|
-
fill="currentColor"
|
|
169
|
-
viewBox="0 0 24 24"
|
|
170
|
-
stroke="none"
|
|
171
|
-
{...props}
|
|
172
|
-
>
|
|
45
|
+
export function GithubIcon(props) {
|
|
46
|
+
return (<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24" stroke="none" {...props}>
|
|
173
47
|
<title>{props.title}</title>
|
|
174
48
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.026 2c-5.509 0-9.974 4.465-9.974 9.974 0 4.406 2.857 8.145 6.821 9.465.499.09.679-.217.679-.481 0-.237-.008-.865-.011-1.696-2.775.602-3.361-1.338-3.361-1.338-.452-1.152-1.107-1.459-1.107-1.459-.905-.619.069-.605.069-.605 1.002.07 1.527 1.028 1.527 1.028.89 1.524 2.336 1.084 2.902.829.091-.645.351-1.085.635-1.334-2.214-.251-4.542-1.107-4.542-4.93 0-1.087.389-1.979 1.024-2.675-.101-.253-.446-1.268.099-2.64 0 0 .837-.269 2.742 1.021a9.582 9.582 0 0 1 2.496-.336 9.554 9.554 0 0 1 2.496.336c1.906-1.291 2.742-1.021 2.742-1.021.545 1.372.203 2.387.099 2.64.64.696 1.024 1.587 1.024 2.675 0 3.833-2.33 4.675-4.552 4.922.355.308.675.916.675 1.846 0 1.334-.012 2.41-.012 2.737 0 .267.178.577.687.479C19.146 20.115 22 16.379 22 11.974 22 6.465 17.535 2 12.026 2z"></path>
|
|
175
|
-
</svg>
|
|
176
|
-
);
|
|
49
|
+
</svg>);
|
|
177
50
|
}
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
props: JSX.IntrinsicElements['svg'] & { title: string },
|
|
181
|
-
): JSX.Element {
|
|
182
|
-
return (
|
|
183
|
-
<svg
|
|
184
|
-
viewBox="0 0 701 701"
|
|
185
|
-
fill="none"
|
|
186
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
187
|
-
{...props}
|
|
188
|
-
>
|
|
51
|
+
export function SolidStartIcon(props) {
|
|
52
|
+
return (<svg viewBox="0 0 701 701" fill="none" xmlns="http://www.w3.org/2000/svg" {...props}>
|
|
189
53
|
<title>{props.title}</title>
|
|
190
54
|
<g filter="url(#filter0_d_1_2)">
|
|
191
55
|
<rect width="693" height="693" transform="translate(4)" fill="white"/>
|
|
@@ -282,7 +146,5 @@ export function SolidStartIcon(
|
|
|
282
146
|
<stop offset="1" stop-color="#79CFFF"/>
|
|
283
147
|
</linearGradient>
|
|
284
148
|
</defs>
|
|
285
|
-
</svg>
|
|
286
|
-
);
|
|
149
|
+
</svg>);
|
|
287
150
|
}
|
|
288
|
-
|