From 2890e27b400c32d68ea43a78b8d6dc979d57508c Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Mon, 7 Oct 2024 22:36:56 +0200 Subject: [PATCH] feat: add hash-based REPL state on top of id-based state - when present, the hash takes precedence - when saving, the hash is removed for a clean url (also indicates that you're now in fact sharing what you saved) - to not pollute the browser history, changes are only written to the hash when the editor loses focus --- apps/svelte.dev/package.json | 2 +- .../(authed)/playground/[id]/+page.server.js | 2 +- .../(authed)/playground/[id]/+page.svelte | 121 ++++++++++++------ .../playground/[id]/AppControls.svelte | 11 +- .../routes/(authed)/playground/[id]/gzip.js | 29 +++++ packages/repl/package.json | 2 +- .../src/lib/Input/ComponentSelector.svelte | 21 ++- .../repl/src/lib/Input/ModuleEditor.svelte | 3 +- packages/repl/src/lib/Repl.svelte | 17 ++- packages/site-kit/package.json | 2 +- pnpm-lock.yaml | 46 +++---- 11 files changed, 164 insertions(+), 92 deletions(-) create mode 100644 apps/svelte.dev/src/routes/(authed)/playground/[id]/gzip.js diff --git a/apps/svelte.dev/package.json b/apps/svelte.dev/package.json index 692ce2005d..698338e5ff 100644 --- a/apps/svelte.dev/package.json +++ b/apps/svelte.dev/package.json @@ -65,7 +65,7 @@ "@supabase/supabase-js": "^2.43.4", "@sveltejs/adapter-vercel": "^5.4.3", "@sveltejs/enhanced-img": "^0.3.4", - "@sveltejs/kit": "^2.5.25", + "@sveltejs/kit": "^2.6.3", "@sveltejs/site-kit": "workspace:*", "@sveltejs/vite-plugin-svelte": "4.0.0-next.6", "@types/cookie": "^0.6.0", diff --git a/apps/svelte.dev/src/routes/(authed)/playground/[id]/+page.server.js b/apps/svelte.dev/src/routes/(authed)/playground/[id]/+page.server.js index 53c3a5716a..08f29118db 100644 --- a/apps/svelte.dev/src/routes/(authed)/playground/[id]/+page.server.js +++ b/apps/svelte.dev/src/routes/(authed)/playground/[id]/+page.server.js @@ -11,6 +11,6 @@ export async function load({ fetch, params, url }) { return { gist, - version: url.searchParams.get('version') || 'next' + version: url.searchParams.get('version') || 'next' // TODO replace with 'latest' when 5.0 is released }; } diff --git a/apps/svelte.dev/src/routes/(authed)/playground/[id]/+page.svelte b/apps/svelte.dev/src/routes/(authed)/playground/[id]/+page.svelte index eb250a9963..6c17f996ad 100644 --- a/apps/svelte.dev/src/routes/(authed)/playground/[id]/+page.svelte +++ b/apps/svelte.dev/src/routes/(authed)/playground/[id]/+page.svelte @@ -1,66 +1,95 @@ @@ -73,15 +102,24 @@ + { + if (!setting_hash) { + set_files(); + } + }} +/> +
{#if browser} @@ -93,9 +131,16 @@ injectedJS={mapbox_setup} showModified showAst - on:change={handle_change} - on:add={handle_change} - on:remove={handle_change} + change={handle_change} + add={handle_change} + remove={handle_change} + blur={() => { + // Only change hash on editor blur to not pollute everyone's browser history + if (modified_count !== 0) { + const json = JSON.stringify({ files: repl.toJSON().files }); + change_hash(json); + } + }} previewTheme={$theme.current} /> {/if} diff --git a/apps/svelte.dev/src/routes/(authed)/playground/[id]/AppControls.svelte b/apps/svelte.dev/src/routes/(authed)/playground/[id]/AppControls.svelte index 13dc9ee920..ea9c8c68fa 100644 --- a/apps/svelte.dev/src/routes/(authed)/playground/[id]/AppControls.svelte +++ b/apps/svelte.dev/src/routes/(authed)/playground/[id]/AppControls.svelte @@ -1,5 +1,4 @@ -
+
void = () => {}; + export let add: (value: { files: File[]; diff: File }) => void = () => {}; + export let change: (value: { files: File[] }) => void = () => {}; + export let blur: () => void = () => {}; let runes = false; @@ -58,17 +61,13 @@ // after having loaded the files externally populate_editor_state(); - dispatch('change', { files: $files }); + change({ files: $files }); } export function markSaved() { $files = $files.map((val) => ({ ...val, modified: false })); } - const dispatch: ReturnType< - typeof createEventDispatcher<{ change: { files: import('./types').File[] } }> - > = createEventDispatcher(); - const DEFAULT_COMPILE_OPTIONS: CompileOptions = { generate: 'client', dev: false @@ -195,7 +194,7 @@ EDITOR_STATE_MAP.set(get_full_filename($selected), $module_editor?.getEditorState()); - dispatch('change', { + change({ files: $files }); @@ -304,8 +303,8 @@ max="-4.1rem" >
- - + +
diff --git a/packages/site-kit/package.json b/packages/site-kit/package.json index 63bf61f45d..7b4660668b 100644 --- a/packages/site-kit/package.json +++ b/packages/site-kit/package.json @@ -31,7 +31,7 @@ "svelte-persisted-store": "^0.9.2" }, "devDependencies": { - "@sveltejs/kit": "^2.5.25", + "@sveltejs/kit": "^2.6.3", "@types/node": "^20.12.11", "flexsearch": "^0.7.43", "magic-string": "^0.30.11", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ced5b0e6d5..c173f98800 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -85,7 +85,7 @@ importers: version: 3.1.0 '@vercel/speed-insights': specifier: ^1.0.0 - version: 1.0.11(@sveltejs/kit@2.5.25(@sveltejs/vite-plugin-svelte@4.0.0-next.6(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))(svelte@5.0.0-next.260) + version: 1.0.11(@sveltejs/kit@2.6.3(@sveltejs/vite-plugin-svelte@4.0.0-next.6(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))(svelte@5.0.0-next.260) '@webcontainer/api': specifier: ^1.1.5 version: 1.1.9 @@ -112,7 +112,7 @@ importers: version: 4.0.0 devalue: specifier: ^5.0.0 - version: 5.0.0 + version: 5.1.1 do-not-zip: specifier: ^1.0.0 version: 1.0.0 @@ -152,13 +152,13 @@ importers: version: 2.43.4 '@sveltejs/adapter-vercel': specifier: ^5.4.3 - version: 5.4.3(@sveltejs/kit@2.5.25(@sveltejs/vite-plugin-svelte@4.0.0-next.6(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1))) + version: 5.4.3(@sveltejs/kit@2.6.3(@sveltejs/vite-plugin-svelte@4.0.0-next.6(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1))) '@sveltejs/enhanced-img': specifier: ^0.3.4 version: 0.3.4(rollup@4.21.2)(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)) '@sveltejs/kit': - specifier: ^2.5.25 - version: 2.5.25(@sveltejs/vite-plugin-svelte@4.0.0-next.6(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)) + specifier: ^2.6.3 + version: 2.6.3(@sveltejs/vite-plugin-svelte@4.0.0-next.6(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)) '@sveltejs/site-kit': specifier: workspace:* version: link:../../packages/site-kit @@ -324,10 +324,10 @@ importers: version: 1.2.2 '@sveltejs/adapter-auto': specifier: ^3.0.0 - version: 3.2.0(@sveltejs/kit@2.5.25(@sveltejs/vite-plugin-svelte@4.0.0-next.6(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1))) + version: 3.2.0(@sveltejs/kit@2.6.3(@sveltejs/vite-plugin-svelte@4.0.0-next.6(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1))) '@sveltejs/kit': - specifier: ^2.0.0 - version: 2.5.25(@sveltejs/vite-plugin-svelte@4.0.0-next.6(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)) + specifier: ^2.6.3 + version: 2.6.3(@sveltejs/vite-plugin-svelte@4.0.0-next.6(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)) '@sveltejs/package': specifier: ^2.0.0 version: 2.3.1(svelte@5.0.0-next.260)(typescript@5.5.4) @@ -381,8 +381,8 @@ importers: version: 0.9.4(svelte@5.0.0-next.260) devDependencies: '@sveltejs/kit': - specifier: ^2.5.25 - version: 2.5.25(@sveltejs/vite-plugin-svelte@4.0.0-next.6(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)) + specifier: ^2.6.3 + version: 2.6.3(@sveltejs/vite-plugin-svelte@4.0.0-next.6(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)) '@types/node': specifier: ^20.12.11 version: 20.14.2 @@ -1354,8 +1354,8 @@ packages: svelte: ^4.0.0 || ^5.0.0-next.0 vite: '>= 5.0.0' - '@sveltejs/kit@2.5.25': - resolution: {integrity: sha512-5hBSEN8XEjDZ5+2bHkFh8Z0QyOk0C187cyb12aANe1c8aeKbfu5ZD5XaC2vEH4h0alJFDXPdUkXQBmeeXeMr1A==} + '@sveltejs/kit@2.6.3': + resolution: {integrity: sha512-baIAnmfMqAISrPtTC/22w6ay5kTEIQ/vq9bctiaQgRIoLCPBNhb6LEidTuWQS7OzPYCDBMuMX1t/fMvi4r3q/g==} engines: {node: '>=18.13'} hasBin: true peerDependencies: @@ -1827,8 +1827,8 @@ packages: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} - devalue@5.0.0: - resolution: {integrity: sha512-gO+/OMXF7488D+u3ue+G7Y4AA3ZmUnB3eHJXmBTgNHvr4ZNzl36A0ZtG+XCRNYCkYx/bFmw4qtkoFLa+wSrwAA==} + devalue@5.1.1: + resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==} dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} @@ -4025,14 +4025,14 @@ snapshots: - bufferutil - utf-8-validate - '@sveltejs/adapter-auto@3.2.0(@sveltejs/kit@2.5.25(@sveltejs/vite-plugin-svelte@4.0.0-next.6(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))': + '@sveltejs/adapter-auto@3.2.0(@sveltejs/kit@2.6.3(@sveltejs/vite-plugin-svelte@4.0.0-next.6(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))': dependencies: - '@sveltejs/kit': 2.5.25(@sveltejs/vite-plugin-svelte@4.0.0-next.6(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)) + '@sveltejs/kit': 2.6.3(@sveltejs/vite-plugin-svelte@4.0.0-next.6(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)) import-meta-resolve: 4.1.0 - '@sveltejs/adapter-vercel@5.4.3(@sveltejs/kit@2.5.25(@sveltejs/vite-plugin-svelte@4.0.0-next.6(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))': + '@sveltejs/adapter-vercel@5.4.3(@sveltejs/kit@2.6.3(@sveltejs/vite-plugin-svelte@4.0.0-next.6(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))': dependencies: - '@sveltejs/kit': 2.5.25(@sveltejs/vite-plugin-svelte@4.0.0-next.6(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)) + '@sveltejs/kit': 2.6.3(@sveltejs/vite-plugin-svelte@4.0.0-next.6(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)) '@vercel/nft': 0.27.2 esbuild: 0.21.5 transitivePeerDependencies: @@ -4049,12 +4049,12 @@ snapshots: transitivePeerDependencies: - rollup - '@sveltejs/kit@2.5.25(@sveltejs/vite-plugin-svelte@4.0.0-next.6(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1))': + '@sveltejs/kit@2.6.3(@sveltejs/vite-plugin-svelte@4.0.0-next.6(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1))': dependencies: '@sveltejs/vite-plugin-svelte': 4.0.0-next.6(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)) '@types/cookie': 0.6.0 cookie: 0.6.0 - devalue: 5.0.0 + devalue: 5.1.1 esm-env: 1.0.0 import-meta-resolve: 4.1.0 kleur: 4.1.5 @@ -4199,9 +4199,9 @@ snapshots: - encoding - supports-color - '@vercel/speed-insights@1.0.11(@sveltejs/kit@2.5.25(@sveltejs/vite-plugin-svelte@4.0.0-next.6(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))(svelte@5.0.0-next.260)': + '@vercel/speed-insights@1.0.11(@sveltejs/kit@2.6.3(@sveltejs/vite-plugin-svelte@4.0.0-next.6(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))(svelte@5.0.0-next.260)': optionalDependencies: - '@sveltejs/kit': 2.5.25(@sveltejs/vite-plugin-svelte@4.0.0-next.6(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)) + '@sveltejs/kit': 2.6.3(@sveltejs/vite-plugin-svelte@4.0.0-next.6(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)))(svelte@5.0.0-next.260)(vite@5.4.7(@types/node@20.14.2)(lightningcss@1.25.1)) svelte: 5.0.0-next.260 '@vitest/expect@2.1.2': @@ -4507,7 +4507,7 @@ snapshots: detect-libc@2.0.3: {} - devalue@5.0.0: {} + devalue@5.1.1: {} dir-glob@3.0.1: dependencies: