Skip to content

Commit 3e917fb

Browse files
feat: add templating mode selector (#1214)
* feat: add templating mode selector * Update packages/repl/src/lib/Output/Viewer.svelte * fix: rename option and add version checking * fix: revert version to fix link * fix: update everything to latest * chore: remove unused ignore * fix: `html` default checked ad min height * fix: also show option with `latest` * tweak --------- Co-authored-by: Rich Harris <rich.harris@vercel.com>
1 parent 0485be4 commit 3e917fb

File tree

13 files changed

+177
-144
lines changed

13 files changed

+177
-144
lines changed

apps/svelte.dev/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@
7272
"satori": "^0.10.13",
7373
"satori-html": "^0.3.2",
7474
"sv": "^0.6.8",
75-
"svelte": "5.23.0",
75+
"svelte": "^5.33.0",
7676
"svelte-check": "^4.1.1",
7777
"svelte-preprocess": "^6.0.3",
7878
"tiny-glob": "^0.2.9",

apps/svelte.dev/src/routes/(authed)/playground/[id]/+page.svelte

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@
2121
let modified = $state(false);
2222
let setting_hash: any = null;
2323
24-
// svelte-ignore non_reactive_update
25-
let version = page.url.searchParams.get('version') || 'latest';
24+
let version = $derived(page.url.searchParams.get('version') || 'latest');
2625
2726
// Hashed URLs are less safe (we can't delete malicious REPLs), therefore
2827
// don't allow links to escape the sandbox restrictions

apps/svelte.dev/src/routes/(authed)/playground/[id]/embed/+page.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
1313
let repl = $state() as ReturnType<typeof Repl>;
1414
15-
let version = page.url.searchParams.get('version') || 'latest';
15+
let version = $derived(page.url.searchParams.get('version') || 'latest');
1616
1717
// TODO make this munging unnecessary
1818
function munge(data: any): File {

packages/repl/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@
100100
"locate-character": "^3.0.0",
101101
"marked": "^14.1.2",
102102
"resolve.exports": "^2.0.2",
103-
"svelte": "5.23.0",
103+
"svelte": "5.33.0",
104104
"tailwindcss": "^4.0.15",
105105
"tarparser": "^0.0.4",
106106
"ts-blank-space": "^0.6.1",

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

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,19 @@
11
<script lang="ts">
22
import { Checkbox } from '@sveltejs/site-kit/components';
33
import type { Workspace } from '../Workspace.svelte';
4+
import { get_repl_context } from '../../lib/context.js';
5+
6+
const { svelteVersion } = $derived(get_repl_context());
7+
8+
const is_fragments_available = $derived.by(() => {
9+
const [major, minor] = svelteVersion.split('.');
10+
// if the version is 5.33.0 or greater, fragments are available
11+
if (+major >= 5 && +minor >= 33) {
12+
return true;
13+
}
14+
// we assume they are available if work with local or latest
15+
return svelteVersion === 'local' || svelteVersion === 'latest';
16+
});
417
518
let { workspace }: { workspace: Workspace } = $props();
619
</script>
@@ -24,6 +37,25 @@
2437
{/each},
2538
</div>
2639

40+
{#if is_fragments_available}
41+
<div class="option">
42+
<span class="key">fragments:</span>
43+
44+
{#each ['html', 'tree'] as const as fragments}
45+
<input
46+
id={fragments}
47+
type="radio"
48+
checked={(workspace.compiler_options.fragments ?? 'html') === fragments}
49+
value={fragments}
50+
onchange={() => {
51+
workspace.update_compiler_options({ fragments });
52+
}}
53+
/>
54+
<label for={fragments}><span class="string">"{fragments}"</span></label>
55+
{/each},
56+
</div>
57+
{/if}
58+
2759
<!-- svelte-ignore a11y_label_has_associated_control (TODO this warning should probably be disabled if there's a component)-->
2860
<label class="option">
2961
<span class="key">dev:</span>
@@ -55,7 +87,7 @@
5587
5688
.key {
5789
display: inline-block;
58-
width: 6em;
90+
width: 10em;
5991
}
6092
6193
.string {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@
215215
{#if embedded}
216216
<Editor workspace={js_workspace} />
217217
{:else}
218-
<PaneWithPanel min="-18rem" pos="-18rem" panel="Compiler options">
218+
<PaneWithPanel min="-27rem" pos="-27rem" panel="Compiler options">
219219
{#snippet main()}
220220
<Editor workspace={js_workspace} />
221221
{/snippet}

packages/repl/src/lib/Repl.svelte

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@
8787
8888
async function rebundle() {
8989
bundler!.bundle(workspace.files as File[], {
90-
tailwind: workspace.tailwind
90+
tailwind: workspace.tailwind,
91+
fragments: workspace.compiler_options.fragments
9192
});
9293
}
9394
@@ -139,7 +140,11 @@
139140
bundler,
140141
toggleable,
141142
workspace,
142-
svelteVersion
143+
get svelteVersion() {
144+
// we want this to be reactive since we are checking in
145+
// the compiler options
146+
return svelteVersion;
147+
}
143148
});
144149
145150
function before_unload(event: BeforeUnloadEvent) {

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ export interface ExposedCompilerOptions {
9494
generate: 'client' | 'server';
9595
dev: boolean;
9696
modernAst: boolean;
97+
fragments: 'html' | 'tree' | undefined;
9798
}
9899

99100
export class Workspace {
@@ -104,7 +105,10 @@ export class Workspace {
104105
#compiler_options = $state.raw<ExposedCompilerOptions>({
105106
generate: 'client',
106107
dev: false,
107-
modernAst: true
108+
modernAst: true,
109+
// default to undefined so it's removed if the current version
110+
// doesn't support it
111+
fragments: undefined
108112
});
109113
compiled = $state<Record<string, Compiled>>({});
110114

@@ -455,6 +459,11 @@ export class Workspace {
455459
update_compiler_options(options: Partial<ExposedCompilerOptions>) {
456460
this.#compiler_options = { ...this.#compiler_options, ...options };
457461
this.#reset_diagnostics();
462+
for (let file of this.#files) {
463+
if (is_file(file)) {
464+
this.#onupdate(file);
465+
}
466+
}
458467
}
459468

460469
update_file(file: File) {

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,8 @@ async function get_bundle(
307307
const compilerOptions: any = {
308308
filename: name + '.svelte',
309309
generate: is_gt_5 ? 'client' : 'dom',
310-
dev: true
310+
dev: true,
311+
fragments: options.fragments
311312
};
312313

313314
if (is_gt_5) {
@@ -318,6 +319,12 @@ async function get_bundle(
318319
compilerOptions.experimental = { async: true };
319320
}
320321

322+
if (compilerOptions.fragments == null) {
323+
// if fragments is not set it probably means we are using
324+
// a version that doesn't support it, so we need to remove it
325+
delete compilerOptions.fragments;
326+
}
327+
321328
result = svelte.compile(code, compilerOptions);
322329

323330
walk(result.ast.html as import('svelte/compiler').AST.TemplateNode, null, {

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ addEventListener('message', async (event) => {
5858
: 'ssr'
5959
: options.generate,
6060
dev: options.dev,
61-
filename: file.name
61+
filename: file.name,
62+
fragments: options.fragments
6263
};
6364

6465
if (!is_svelte_3_or_4) {
@@ -69,6 +70,12 @@ addEventListener('message', async (event) => {
6970
compilerOptions.experimental = { async: true };
7071
}
7172

73+
if (compilerOptions.fragments == null) {
74+
// if fragments is not set it probably means we are using
75+
// a version that doesn't support it, so we need to remove it
76+
delete compilerOptions.fragments;
77+
}
78+
7279
result = svelte.compile(file.contents, compilerOptions);
7380
} else {
7481
const compilerOptions: any = {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ export interface MigrateOutput {
5252
export interface BundleOptions {
5353
tailwind?: boolean;
5454
runes?: boolean;
55+
fragments?: 'html' | 'tree';
5556
}
5657

5758
export type BundleMessageData = {

packages/site-kit/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353
"marked": "^14.1.2",
5454
"prettier": "^3.3.2",
5555
"prettier-plugin-svelte": "^3.3.2",
56-
"svelte": "5.23.0",
56+
"svelte": "5.33.0",
5757
"svelte-check": "^4.1.1",
5858
"typescript": "^5.5.4",
5959
"vite": "^5.4.3"

0 commit comments

Comments
 (0)