Skip to content

Commit 6fe6f2b

Browse files
committed
add svelte version selector to REPL
1 parent 923674d commit 6fe6f2b

File tree

9 files changed

+94
-38
lines changed

9 files changed

+94
-38
lines changed

packages/repl/src/lib/Input/ComponentSelector.svelte

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,15 @@
177177

178178
<button disabled={!can_migrate} onclick={migrate}>Migrate to Svelte 5, if possible</button>
179179

180+
<label class="option">
181+
<span>Svelte version</span>
182+
<input
183+
value={workspace.svelte_version}
184+
placeholder="latest"
185+
onchange={(ev) => (workspace.svelte_version = ev.currentTarget.value)}
186+
/>
187+
</label>
188+
180189
{#if download}
181190
<button onclick={download}>Download app</button>
182191
{/if}
@@ -278,7 +287,7 @@
278287
}
279288
}
280289
281-
input {
290+
.file-tabs input {
282291
position: absolute;
283292
width: calc(100% - var(--padding-left) - var(--padding-right));
284293
border: none;
@@ -318,6 +327,18 @@
318327
justify-content: flex-end;
319328
}
320329
330+
.option input {
331+
background: transparent;
332+
border: 1px solid var(--sk-border);
333+
border-radius: var(--sk-border-radius);
334+
color: currentColor;
335+
width: 0;
336+
flex: 1;
337+
padding: 0.2rem 0.6rem;
338+
height: 3.2rem;
339+
font: var(--sk-font-ui-medium);
340+
}
341+
321342
svg {
322343
position: relative;
323344
overflow: hidden;

packages/repl/src/lib/Output/PaneWithPanel.svelte

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@
137137
}
138138
139139
section {
140+
position: relative;
140141
overflow: hidden;
141142
}
142143
</style>

packages/repl/src/lib/Output/Viewer.svelte

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -313,9 +313,15 @@
313313
srcdoc={BROWSER ? srcdoc : ''}
314314
></iframe>
315315

316-
{#if bundle?.error}
317-
<ErrorOverlay error={bundle.error} />
318-
{/if}
316+
<div class="overlay">
317+
{#if bundle?.error}
318+
<ErrorOverlay error={bundle.error} />
319+
{:else if error}
320+
<Message kind="error" details={error} />
321+
{:else if status || !bundle}
322+
<Message kind="info" truncate>{status || 'loading Svelte compiler...'}</Message>
323+
{/if}
324+
</div>
319325
{/snippet}
320326

321327
<div class="iframe-container">
@@ -344,14 +350,6 @@
344350
{:else}
345351
{@render main()}
346352
{/if}
347-
348-
<div class="overlay">
349-
{#if error}
350-
<Message kind="error" details={error} />
351-
{:else if status || !bundle}
352-
<Message kind="info" truncate>{status || 'loading Svelte compiler...'}</Message>
353-
{/if}
354-
</div>
355353
</div>
356354

357355
<style>

packages/repl/src/lib/Repl.svelte

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@
8787
8888
async function rebundle() {
8989
bundler!.bundle(workspace.files as File[], {
90+
svelte_version: workspace.svelte_version,
9091
tailwind: workspace.tailwind
9192
});
9293
}
@@ -112,7 +113,10 @@
112113
const bundler = BROWSER
113114
? new Bundler({
114115
svelte_version: svelteVersion,
115-
onversion,
116+
onversion: (version) => {
117+
workspace.svelte_version = version;
118+
onversion?.(version);
119+
},
116120
onstatus: (message) => {
117121
if (message) {
118122
// show bundler status, but only after time has elapsed, to
@@ -204,7 +208,7 @@
204208
{injectedCSS}
205209
{previewTheme}
206210
{workspace}
207-
runtimeError={status_visible ? runtime_error : null}
211+
runtimeError={runtime_error}
208212
/>
209213
</section>
210214
{/snippet}
@@ -229,13 +233,13 @@
229233
height: 100%;
230234
}
231235
232-
:global {
233-
section {
234-
position: relative;
235-
padding: var(--sk-pane-controls-height) 0 0 0;
236-
height: 100%;
237-
box-sizing: border-box;
236+
section {
237+
position: relative;
238+
padding: var(--sk-pane-controls-height) 0 0 0;
239+
height: 100%;
240+
box-sizing: border-box;
238241
242+
:global {
239243
& > :first-child {
240244
position: absolute;
241245
top: 0;
@@ -250,11 +254,11 @@
250254
height: 100%;
251255
}
252256
}
257+
}
253258
254-
[data-pane='main'] > svelte-split-pane-divider::after {
255-
height: calc(100% - var(--sk-pane-controls-height));
256-
top: var(--sk-pane-controls-height);
257-
}
259+
:global [data-pane='main'] > svelte-split-pane-divider::after {
260+
height: calc(100% - var(--sk-pane-controls-height));
261+
top: var(--sk-pane-controls-height);
258262
}
259263
}
260264

packages/repl/src/lib/Workspace.svelte.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ export class Workspace {
108108
});
109109
compiled = $state<Record<string, Compiled>>({});
110110

111-
#svelte_version: string;
111+
#svelte_version = $state('');
112112
#readonly = false; // TODO do we need workspaces for readonly stuff?
113113
#files = $state.raw<Item[]>([]);
114114
#current = $state.raw() as File;
@@ -479,6 +479,16 @@ export class Workspace {
479479
this.#onupdate(this.#current);
480480
}
481481

482+
get svelte_version() {
483+
return this.#svelte_version;
484+
}
485+
486+
set svelte_version(value) {
487+
this.#svelte_version = value;
488+
this.#update_file(this.#current);
489+
this.#reset_diagnostics();
490+
}
491+
482492
get vim() {
483493
return this.#vim;
484494
}

packages/repl/src/lib/workers/bundler/index.ts

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,25 +42,21 @@ const ESM_ENV = '__esm-env.js';
4242

4343
let current_id: number;
4444

45-
let ready: ReturnType<typeof load_svelte>;
46-
4745
self.addEventListener('message', async (event: MessageEvent<BundleMessageData>) => {
4846
switch (event.data.type) {
4947
case 'init': {
50-
ready = load_svelte(event.data.svelte_version, (version) => {
51-
self.postMessage({
52-
type: 'version',
53-
message: version
54-
});
55-
});
56-
48+
get_svelte(event.data.svelte_version);
5749
break;
5850
}
5951

6052
case 'bundle': {
6153
try {
62-
const { svelte, version: svelte_version, can_use_experimental_async } = await ready;
6354
const { uid, files, options } = event.data;
55+
const {
56+
svelte,
57+
version: svelte_version,
58+
can_use_experimental_async
59+
} = await get_svelte(options.svelte_version);
6460

6561
current_id = uid;
6662

@@ -92,6 +88,25 @@ self.addEventListener('message', async (event: MessageEvent<BundleMessageData>)
9288
}
9389
});
9490

91+
let ready: ReturnType<typeof load_svelte>;
92+
let ready_version: string;
93+
94+
function get_svelte(svelte_version: string) {
95+
if (ready_version === svelte_version) return ready;
96+
97+
self.postMessage({ type: 'status', message: `fetching svelte@${svelte_version}` });
98+
ready_version = svelte_version;
99+
ready = load_svelte(svelte_version || 'latest');
100+
ready.then(({ version }) => {
101+
ready_version = version;
102+
self.postMessage({
103+
type: 'version',
104+
message: version
105+
});
106+
});
107+
return ready;
108+
}
109+
95110
const ABORT = { aborted: true };
96111

97112
let previous: {

packages/repl/src/lib/workers/npm.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,17 @@ const packages = new Map<string, Promise<Package>>();
1313

1414
const pkg_pr_new_regex = /^(pr|commit|branch)-(.+)/;
1515

16-
export async function load_svelte(version: string, onresolve?: (resolved: string) => void) {
16+
export async function load_svelte(version: string) {
1717
if (version === 'local') {
1818
await import(/* @vite-ignore */ `${location.origin}/svelte/compiler/index.js`);
1919
} else {
2020
if (!pkg_pr_new_regex.test(version)) {
21-
version = await resolve_version('svelte', version);
22-
onresolve?.(version);
21+
const resolved_version = await resolve_version('svelte', version);
22+
if (resolved_version) {
23+
version = resolved_version;
24+
} else {
25+
throw new Error(`Failed to resolve svelte@${version}`);
26+
}
2327
}
2428

2529
const pkg = await fetch_package('svelte', version);

packages/repl/src/lib/workers/workers.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ export interface MigrateOutput {
5050
}
5151

5252
export interface BundleOptions {
53+
svelte_version: string;
5354
tailwind?: boolean;
5455
runes?: boolean;
5556
}

packages/site-kit/src/lib/styles/base.css

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,10 +157,12 @@ button {
157157
background-color: transparent;
158158
border: none;
159159
color: currentColor;
160+
cursor: pointer;
160161
}
161162

162163
button[disabled] {
163164
color: var(--sk-fg-4);
165+
cursor: not-allowed;
164166
}
165167

166168
/* links ------------------------------------- */

0 commit comments

Comments
 (0)