diff --git a/apps/svelte.dev/package.json b/apps/svelte.dev/package.json index 5efe141419..d78ba2ba66 100644 --- a/apps/svelte.dev/package.json +++ b/apps/svelte.dev/package.json @@ -38,7 +38,6 @@ "d3-geo": "^3.1.0", "d3-geo-projection": "^4.0.0", "do-not-zip": "^1.0.0", - "editor": "workspace:*", "flexsearch": "^0.7.43", "flru": "^1.0.2", "port-authority": "^2.0.1", diff --git a/apps/svelte.dev/src/lib/tutorial/adapters/rollup/index.svelte.ts b/apps/svelte.dev/src/lib/tutorial/adapters/rollup/index.svelte.ts index 53e59cfd97..6346a241a8 100644 --- a/apps/svelte.dev/src/lib/tutorial/adapters/rollup/index.svelte.ts +++ b/apps/svelte.dev/src/lib/tutorial/adapters/rollup/index.svelte.ts @@ -2,44 +2,31 @@ import Bundler from '@sveltejs/repl/bundler'; // @ts-ignore package exports don't have types import * as yootils from 'yootils'; import type { Adapter } from '$lib/tutorial'; -import type { File, Item } from 'editor'; +import type { File, Item } from '@sveltejs/repl/workspace'; -/** Rollup bundler singleton */ -let bundler: Bundler; +let done = false; export const state = new (class RollupState { progress = $state.raw({ value: 0, text: 'initialising' }); - bundle = $state.raw(null); -})(); - -/** - * @returns {Promise} - */ -export async function create(): Promise { - bundler?.destroy(); - - state.progress = { value: 0, text: 'loading files' }; - - let done = false; - bundler = new Bundler({ - packages_url: 'https://unpkg.com', svelte_version: 'latest', - onstatus(val) { + onstatus: (val) => { if (!done && val === null) { done = true; - state.progress = { value: 1, text: 'ready' }; + this.progress = { value: 1, text: 'ready' }; } } }); +})(); +export async function create(): Promise { state.progress = { value: 0.5, text: 'loading svelte compiler' }; /** Paths and contents of the currently loaded file stubs */ let current_files: Item[] = []; async function compile() { - state.bundle = await bundler.bundle( + state.bundler.bundle( current_files // TODO we can probably remove all the SvelteKit specific stuff from the tutorial content once this settles down .filter((f): f is File => f.name.startsWith('/src/lib/') && f.type === 'file') diff --git a/apps/svelte.dev/src/lib/tutorial/adapters/webcontainer/index.svelte.ts b/apps/svelte.dev/src/lib/tutorial/adapters/webcontainer/index.svelte.ts index 6580c581f0..7682697847 100644 --- a/apps/svelte.dev/src/lib/tutorial/adapters/webcontainer/index.svelte.ts +++ b/apps/svelte.dev/src/lib/tutorial/adapters/webcontainer/index.svelte.ts @@ -7,7 +7,7 @@ import { get_depth } from '../../../utils/path.js'; import { escape_html } from '../../../utils/escape.js'; import { ready } from '../common/index.js'; import type { Adapter } from '$lib/tutorial'; -import type { Item, File } from 'editor'; +import type { Item, File } from '@sveltejs/repl/workspace'; const converter = new AnsiToHtml({ fg: 'var(--sk-fg-3)' diff --git a/apps/svelte.dev/src/lib/tutorial/index.d.ts b/apps/svelte.dev/src/lib/tutorial/index.d.ts index efc4f9a43c..487d7c9c2c 100644 --- a/apps/svelte.dev/src/lib/tutorial/index.d.ts +++ b/apps/svelte.dev/src/lib/tutorial/index.d.ts @@ -1,5 +1,5 @@ import type { Writable } from 'svelte/store'; -import type { File, Directory, Item } from 'editor'; +import type { File, Directory, Item } from '@sveltejs/repl/workspace'; export interface Adapter { /** Returns `false` if the reset was in such a way that a reload of the iframe isn't needed */ 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 00579ed7a0..187436fd8f 100644 --- a/apps/svelte.dev/src/routes/(authed)/playground/[id]/+page.svelte +++ b/apps/svelte.dev/src/routes/(authed)/playground/[id]/+page.svelte @@ -10,7 +10,7 @@ import AppControls from './AppControls.svelte'; import { compress_and_encode_text, decode_and_decompress_text } from './gzip.js'; import { page } from '$app/state'; - import type { File } from 'editor'; + import type { File } from '@sveltejs/repl/workspace'; let { data } = $props(); @@ -23,30 +23,11 @@ // svelte-ignore non_reactive_update let version = page.url.searchParams.get('version') || 'latest'; - let is_pr_or_commit_version = version.startsWith('pr-') || version.startsWith('commit-'); // Hashed URLs are less safe (we can't delete malicious REPLs), therefore // don't allow links to escape the sandbox restrictions const can_escape = browser && !page.url.hash; - if (version !== 'local' && !is_pr_or_commit_version) { - $effect(() => { - fetch(`https://unpkg.com/svelte@${version}/package.json`) - .then((r) => r.json()) - .then((pkg) => { - if (pkg.version !== version) { - version = pkg.version; - - let url = `/playground/${data.gist.id}?version=${version}`; - if (location.hash) { - url += location.hash; - } - replaceState(url, {}); - } - }); - }); - } - afterNavigate(() => { name = data.gist.name; set_files(); @@ -244,6 +225,14 @@ {onchange} {download} previewTheme={theme.current} + onversion={(v) => { + if (version === (version = v)) return; + + const url = new URL(location.href); + url.searchParams.set('version', v); + + replaceState(url, {}); + }} /> {/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 c5f494c381..918b34fb32 100644 --- a/apps/svelte.dev/src/routes/(authed)/playground/[id]/AppControls.svelte +++ b/apps/svelte.dev/src/routes/(authed)/playground/[id]/AppControls.svelte @@ -7,9 +7,8 @@ import type { Gist, User } from '$lib/db/types'; import { browser } from '$app/environment'; import ModalDropdown from '$lib/components/ModalDropdown.svelte'; - import { untrack } from 'svelte'; import SecondaryNav from '$lib/components/SecondaryNav.svelte'; - import type { File } from 'editor'; + import type { File } from '@sveltejs/repl/workspace'; import type { Repl } from '@sveltejs/repl'; interface Props { diff --git a/apps/svelte.dev/src/routes/(authed)/playground/[id]/embed/+page.svelte b/apps/svelte.dev/src/routes/(authed)/playground/[id]/embed/+page.svelte index ab843d9ad3..0edfbedc7e 100644 --- a/apps/svelte.dev/src/routes/(authed)/playground/[id]/embed/+page.svelte +++ b/apps/svelte.dev/src/routes/(authed)/playground/[id]/embed/+page.svelte @@ -6,26 +6,13 @@ import { mapbox_setup } from '../../../../../config.js'; import { page } from '$app/state'; import { decode_and_decompress_text } from '../gzip.js'; - import type { File } from 'editor'; + import type { File } from '@sveltejs/repl/workspace'; let { data } = $props(); let repl = $state() as ReturnType; let version = page.url.searchParams.get('version') || 'latest'; - let is_pr_or_commit_version = version.startsWith('pr-') || version.startsWith('commit-'); - - if (version !== 'local' && !is_pr_or_commit_version) { - $effect(() => { - fetch(`https://unpkg.com/svelte@${version}/package.json`) - .then((r) => r.json()) - .then((pkg) => { - if (pkg.version !== data.version) { - replaceState(`/playground/${data.gist.id}/embed?version=${pkg.version}`, {}); - } - }); - }); - } // TODO make this munging unnecessary function munge(data: any): File { @@ -85,6 +72,14 @@ injectedJS={mapbox_setup} previewTheme={theme.current} embedded={page.url.searchParams.has('output-only') ? 'output-only' : true} + onversion={(v) => { + if (version === v) return; + + const url = new URL(location.href); + url.searchParams.set('version', v); + + replaceState(url, {}); + }} /> {/if} diff --git a/apps/svelte.dev/src/routes/tutorial/[...slug]/+page.svelte b/apps/svelte.dev/src/routes/tutorial/[...slug]/+page.svelte index af809395a3..ff5bdb9a5c 100644 --- a/apps/svelte.dev/src/routes/tutorial/[...slug]/+page.svelte +++ b/apps/svelte.dev/src/routes/tutorial/[...slug]/+page.svelte @@ -2,7 +2,7 @@ import { afterNavigate, beforeNavigate } from '$app/navigation'; import { SplitPane } from '@rich_harris/svelte-split-pane'; import * as adapter from './adapter.svelte'; - import { Editor, Workspace } from 'editor'; + import { Workspace, type Item } from '@sveltejs/repl/workspace'; import ContextMenu from './filetree/ContextMenu.svelte'; import Filetree from './filetree/Filetree.svelte'; import ImageViewer from './ImageViewer.svelte'; @@ -14,7 +14,7 @@ import OutputRollup from './OutputRollup.svelte'; import { page } from '$app/state'; import Controls from './Controls.svelte'; - import type { Item } from 'editor'; + import Editor from '@sveltejs/repl/editor'; import type { Snapshot } from './$types.js'; interface Props { diff --git a/apps/svelte.dev/src/routes/tutorial/[...slug]/Controls.svelte b/apps/svelte.dev/src/routes/tutorial/[...slug]/Controls.svelte index 003db02d6e..a825b1d990 100644 --- a/apps/svelte.dev/src/routes/tutorial/[...slug]/Controls.svelte +++ b/apps/svelte.dev/src/routes/tutorial/[...slug]/Controls.svelte @@ -4,7 +4,7 @@ import ModalDropdown from '$lib/components/ModalDropdown.svelte'; import type { Exercise, PartStub } from '$lib/tutorial'; import { Checkbox, Icon, Toolbox } from '@sveltejs/site-kit/components'; - import type { Workspace } from 'editor'; + import type { Workspace } from '@sveltejs/repl/workspace'; interface Props { index: PartStub[]; diff --git a/apps/svelte.dev/src/routes/tutorial/[...slug]/ImageViewer.svelte b/apps/svelte.dev/src/routes/tutorial/[...slug]/ImageViewer.svelte index 8d69298a05..65c65c8a3f 100644 --- a/apps/svelte.dev/src/routes/tutorial/[...slug]/ImageViewer.svelte +++ b/apps/svelte.dev/src/routes/tutorial/[...slug]/ImageViewer.svelte @@ -1,5 +1,5 @@ diff --git a/packages/repl/src/lib/Output/Output.svelte b/packages/repl/src/lib/Output/Output.svelte index 008511c753..bccdfc064b 100644 --- a/packages/repl/src/lib/Output/Output.svelte +++ b/packages/repl/src/lib/Output/Output.svelte @@ -5,8 +5,9 @@ import CompilerOptions from './CompilerOptions.svelte'; import PaneWithPanel from './PaneWithPanel.svelte'; import Viewer from './Viewer.svelte'; - import { Editor, Workspace, type File } from 'editor'; - import { tick, untrack } from 'svelte'; + import { Workspace, type File } from '../Workspace.svelte'; + import Editor from '../Editor/Editor.svelte'; + import { untrack } from 'svelte'; import { decode, type SourceMapSegment } from '@jridgewell/sourcemap-codec'; interface Props { @@ -279,10 +280,6 @@ } } - div[slot] { - height: 100%; - } - .tab-content { position: absolute; width: 100%; diff --git a/packages/repl/src/lib/Output/PaneWithPanel.svelte b/packages/repl/src/lib/Output/PaneWithPanel.svelte index 06820ac20c..d0750694ff 100644 --- a/packages/repl/src/lib/Output/PaneWithPanel.svelte +++ b/packages/repl/src/lib/Output/PaneWithPanel.svelte @@ -118,7 +118,6 @@ justify-content: space-between; align-items: center; padding: 0.5rem 0.5rem 0.5rem 1rem; - cursor: pointer; } .panel-body { diff --git a/packages/repl/src/lib/Output/Viewer.svelte b/packages/repl/src/lib/Output/Viewer.svelte index 9ab087e4a3..8f973970e6 100644 --- a/packages/repl/src/lib/Output/Viewer.svelte +++ b/packages/repl/src/lib/Output/Viewer.svelte @@ -1,7 +1,7 @@