From 79690a46f91aaecdaa10bcf23b92eacaa8cf5d94 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 16 Oct 2024 07:47:52 -0400 Subject: [PATCH 1/6] move editor into separate package --- apps/svelte.dev/package.json | 14 +- apps/svelte.dev/src/lib/tutorial/index.d.ts | 3 + .../routes/tutorial/[...slug]/+page.svelte | 31 +++- .../routes/tutorial/[...slug]/Output.svelte | 2 +- .../[...slug]/filetree/Filetree.svelte | 9 +- .../tutorial/[...slug]/filetree/context.js | 2 +- .../routes/tutorial/[...slug]/state.svelte.ts | 44 +---- packages/editor/.gitignore | 22 +++ packages/editor/.npmrc | 1 + packages/editor/.prettierignore | 4 + packages/editor/.prettierrc | 8 + packages/editor/README.md | 58 +++++++ packages/editor/package.json | 62 +++++++ packages/editor/src/app.d.ts | 13 ++ packages/editor/src/app.html | 12 ++ .../editor/src/lib}/Editor.svelte | 9 +- packages/editor/src/lib/Workspace.svelte.ts | 71 ++++++++ .../editor/src/lib}/codemirror.css | 0 packages/editor/src/lib/index.ts | 2 + packages/editor/src/routes/+page.svelte | 3 + packages/editor/static/favicon.png | Bin 0 -> 1571 bytes packages/editor/svelte.config.js | 18 ++ packages/editor/tsconfig.json | 15 ++ packages/editor/vite.config.ts | 6 + pnpm-lock.yaml | 162 +++++++++++++----- 25 files changed, 458 insertions(+), 113 deletions(-) create mode 100644 packages/editor/.gitignore create mode 100644 packages/editor/.npmrc create mode 100644 packages/editor/.prettierignore create mode 100644 packages/editor/.prettierrc create mode 100644 packages/editor/README.md create mode 100644 packages/editor/package.json create mode 100644 packages/editor/src/app.d.ts create mode 100644 packages/editor/src/app.html rename {apps/svelte.dev/src/routes/tutorial/[...slug] => packages/editor/src/lib}/Editor.svelte (96%) create mode 100644 packages/editor/src/lib/Workspace.svelte.ts rename {apps/svelte.dev/src/routes/tutorial/[...slug] => packages/editor/src/lib}/codemirror.css (100%) create mode 100644 packages/editor/src/lib/index.ts create mode 100644 packages/editor/src/routes/+page.svelte create mode 100644 packages/editor/static/favicon.png create mode 100644 packages/editor/svelte.config.js create mode 100644 packages/editor/tsconfig.json create mode 100644 packages/editor/vite.config.ts diff --git a/apps/svelte.dev/package.json b/apps/svelte.dev/package.json index 74b90edc89..292812aa5c 100644 --- a/apps/svelte.dev/package.json +++ b/apps/svelte.dev/package.json @@ -16,23 +16,11 @@ "sync-docs": "tsx scripts/sync-docs/index.ts" }, "dependencies": { - "@codemirror/autocomplete": "^6.9.0", - "@codemirror/commands": "^6.2.5", - "@codemirror/lang-css": "^6.2.1", - "@codemirror/lang-html": "^6.4.6", - "@codemirror/lang-javascript": "^6.2.1", - "@codemirror/language": "^6.9.0", - "@codemirror/lint": "^6.4.1", - "@codemirror/search": "^6.5.2", - "@codemirror/state": "^6.2.1", - "@codemirror/view": "^6.17.1", "@jridgewell/sourcemap-codec": "^1.4.15", "@lezer/common": "^1.0.4", "@lezer/highlight": "^1.1.6", "@lezer/javascript": "^1.4.7", "@lezer/lr": "^1.3.10", - "@replit/codemirror-lang-svelte": "^6.0.0", - "@replit/codemirror-vim": "^6.0.14", "@rich_harris/svelte-split-pane": "^1.1.3", "@shikijs/twoslash": "^1.22.0", "@sveltejs/amp": "^1.1.3", @@ -46,10 +34,10 @@ "adm-zip": "^0.5.10", "ansi-to-html": "^0.7.2", "base64-js": "^1.5.1", - "codemirror": "^6.0.1", "cookie": "^0.7.0", "d3-geo": "^3.1.0", "d3-geo-projection": "^4.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/index.d.ts b/apps/svelte.dev/src/lib/tutorial/index.d.ts index 20b8f8fde2..1070da17d7 100644 --- a/apps/svelte.dev/src/lib/tutorial/index.d.ts +++ b/apps/svelte.dev/src/lib/tutorial/index.d.ts @@ -1,5 +1,6 @@ import type { Writable } from 'svelte/store'; +/** @deprecated import type { File } from 'editor' */ export interface FileStub { type: 'file'; name: string; @@ -8,12 +9,14 @@ export interface FileStub { text: boolean; } +/** @deprecated import type { Directory } from 'editor' */ export interface DirectoryStub { type: 'directory'; name: string; basename: string; } +/** @deprecated import type { Item } from 'editor' */ export type Stub = FileStub | DirectoryStub; export interface Adapter { diff --git a/apps/svelte.dev/src/routes/tutorial/[...slug]/+page.svelte b/apps/svelte.dev/src/routes/tutorial/[...slug]/+page.svelte index dc96f3c80c..f1b3a0773c 100644 --- a/apps/svelte.dev/src/routes/tutorial/[...slug]/+page.svelte +++ b/apps/svelte.dev/src/routes/tutorial/[...slug]/+page.svelte @@ -1,15 +1,15 @@ '; @@ -336,7 +337,7 @@ function to_file(file: FileStub) { }; } -function stubs_to_map(files: Stub[], map = new Map()) { +function stubs_to_map(files: Item[], map = new Map()) { for (const file of files) { map.set(file.name, file); } diff --git a/apps/svelte.dev/src/lib/tutorial/index.d.ts b/apps/svelte.dev/src/lib/tutorial/index.d.ts index 1070da17d7..900356b80b 100644 --- a/apps/svelte.dev/src/lib/tutorial/index.d.ts +++ b/apps/svelte.dev/src/lib/tutorial/index.d.ts @@ -1,28 +1,10 @@ import type { Writable } from 'svelte/store'; - -/** @deprecated import type { File } from 'editor' */ -export interface FileStub { - type: 'file'; - name: string; - basename: string; - contents: string; - text: boolean; -} - -/** @deprecated import type { Directory } from 'editor' */ -export interface DirectoryStub { - type: 'directory'; - name: string; - basename: string; -} - -/** @deprecated import type { Item } from 'editor' */ -export type Stub = FileStub | DirectoryStub; +import type { File, Directory, Item } from 'editor'; export interface Adapter { /** Returns `false` if the reset was in such a way that a reload of the iframe isn't needed */ - reset(files: Array): Promise; - update(file: FileStub): Promise; + reset(files: Array): Promise; + update(file: File): Promise; } export interface Scope { diff --git a/apps/svelte.dev/src/routes/tutorial/[...slug]/+page.svelte b/apps/svelte.dev/src/routes/tutorial/[...slug]/+page.svelte index f1b3a0773c..42cb7c3bf8 100644 --- a/apps/svelte.dev/src/routes/tutorial/[...slug]/+page.svelte +++ b/apps/svelte.dev/src/routes/tutorial/[...slug]/+page.svelte @@ -15,7 +15,7 @@ import OutputRollup from './OutputRollup.svelte'; import { page } from '$app/stores'; import Controls from './Controls.svelte'; - import type { Stub } from '$lib/tutorial'; + import type { Item } from 'editor'; import type { Snapshot } from './$types.js'; interface Props { @@ -30,10 +30,10 @@ let paused = $state(false); let w = $state(1000); - let previous_files: Stub[] = []; + let previous_files: Item[] = []; - function create_files(map: Record): Record { - const files: Record = {}; + function create_files(map: Record): Record { + const files: Record = {}; const to_delete: string[] = []; @@ -102,7 +102,7 @@ paused = false; }); - function is_completed(files: Stub[], solution: Record | null) { + function is_completed(files: Item[], solution: Record | null) { if (!solution) return true; for (const file of files) { diff --git a/apps/svelte.dev/src/routes/tutorial/[...slug]/adapter.svelte.ts b/apps/svelte.dev/src/routes/tutorial/[...slug]/adapter.svelte.ts index b192b96d29..86982e2af9 100644 --- a/apps/svelte.dev/src/routes/tutorial/[...slug]/adapter.svelte.ts +++ b/apps/svelte.dev/src/routes/tutorial/[...slug]/adapter.svelte.ts @@ -2,7 +2,8 @@ import { browser } from '$app/environment'; import { page } from '$app/stores'; import type { state as WCState } from '$lib/tutorial/adapters/webcontainer/index.svelte'; import type { state as RollupState } from '$lib/tutorial/adapters/rollup/index.svelte'; -import type { Adapter, FileStub, Stub } from '$lib/tutorial'; +import type { Adapter } from '$lib/tutorial'; +import type { File, Item } from 'editor'; import { needs_webcontainers } from './shared'; let initial_load = true; @@ -111,7 +112,7 @@ function publish(event: EventName) { subscriptions.get(event)?.forEach((fn) => fn()); } -export async function reset(files: Stub[]) { +export async function reset(files: Item[]) { try { const adapter = await get_adapter(); const should_reload = await adapter.reset(files); @@ -126,7 +127,7 @@ export async function reset(files: Stub[]) { } } -export async function update(file: FileStub) { +export async function update(file: File) { const adapter = await get_adapter(); const should_reload = await adapter.update(file); diff --git a/apps/svelte.dev/src/routes/tutorial/[...slug]/filetree/File.svelte b/apps/svelte.dev/src/routes/tutorial/[...slug]/filetree/File.svelte index 3873c8c44f..53cef27303 100644 --- a/apps/svelte.dev/src/routes/tutorial/[...slug]/filetree/File.svelte +++ b/apps/svelte.dev/src/routes/tutorial/[...slug]/filetree/File.svelte @@ -3,10 +3,11 @@ import Item from './Item.svelte'; import file_icon from '$lib/icons/file.svg'; import { solution } from '../state.svelte'; - import type { FileStub, MenuItem } from '$lib/tutorial'; + import type { MenuItem } from '$lib/tutorial'; + import type { File } from 'editor'; interface Props { - file: FileStub; + file: File; depth: number; } diff --git a/apps/svelte.dev/src/routes/tutorial/[...slug]/filetree/Folder.svelte b/apps/svelte.dev/src/routes/tutorial/[...slug]/filetree/Folder.svelte index 21f39c4367..9495998d21 100644 --- a/apps/svelte.dev/src/routes/tutorial/[...slug]/filetree/Folder.svelte +++ b/apps/svelte.dev/src/routes/tutorial/[...slug]/filetree/Folder.svelte @@ -7,13 +7,14 @@ import folder_closed from '$lib/icons/folder.svg'; import folder_open from '$lib/icons/folder-open.svg'; import { solution } from '../state.svelte'; - import type { DirectoryStub, FileStub, MenuItem, Stub } from '$lib/tutorial'; + import type { MenuItem } from '$lib/tutorial'; + import type { Directory, File as IFile, Item as IItem } from 'editor'; interface Props { - directory: DirectoryStub; + directory: Directory; prefix: string; depth: number; - contents: Stub[]; + contents: IItem[]; } let { directory, prefix, depth, contents }: Props = $props(); @@ -36,7 +37,7 @@ let child_files = $derived( children.filter((child) => get_depth(child.name) === segments && child.type === 'file') - ) as FileStub[]; + ) as IFile[]; const can_create = $derived.by(() => { const result = { @@ -156,7 +157,7 @@ {#each child_directories as directory} >; * add: (name: string, type: 'file' | 'directory') => Promise; - * rename: (stub: import('$lib/tutorial').Stub, name: string) => Promise; - * remove: (stub: import('$lib/tutorial').Stub) => Promise; + * rename: (stub: import('editor').Item, name: string) => Promise; + * remove: (stub: import('editor').Item) => Promise; * select: (name: string) => void; * workspace: import('editor').Workspace * }} FileTreeContext diff --git a/apps/svelte.dev/src/routes/tutorial/[...slug]/utils.ts b/apps/svelte.dev/src/routes/tutorial/[...slug]/utils.ts index 4bd257eaa9..a4b0e3ad61 100644 --- a/apps/svelte.dev/src/routes/tutorial/[...slug]/utils.ts +++ b/apps/svelte.dev/src/routes/tutorial/[...slug]/utils.ts @@ -1,6 +1,6 @@ -import type { DirectoryStub, Stub } from '$lib/tutorial'; +import type { Directory, Item } from 'editor'; -export function create_directories(name: string, files: Stub[]) { +export function create_directories(name: string, files: Item[]) { const existing = new Set(); for (const file of files) { @@ -9,7 +9,7 @@ export function create_directories(name: string, files: Stub[]) { } } - const directories: DirectoryStub[] = []; + const directories: Directory[] = []; const parts = name.split('/'); while (parts.length) { From d538779284d80d5755dcf4a796cc72475f2e9783 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 16 Oct 2024 08:08:43 -0400 Subject: [PATCH 3/6] try this --- packages/editor/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/editor/package.json b/packages/editor/package.json index d9a8ef7da9..413faaed92 100644 --- a/packages/editor/package.json +++ b/packages/editor/package.json @@ -11,7 +11,8 @@ "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", "lint": "prettier --check .", - "format": "prettier --write ." + "format": "prettier --write .", + "prepare": "svelte-kit sync" }, "exports": { ".": { From 0af162e989af2ba6f19095c9889195d4d0e4ac4d Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 16 Oct 2024 08:10:19 -0400 Subject: [PATCH 4/6] gah --- packages/editor/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/editor/package.json b/packages/editor/package.json index 413faaed92..ca21c790d3 100644 --- a/packages/editor/package.json +++ b/packages/editor/package.json @@ -24,6 +24,7 @@ "**/*.css" ], "files": [ + "src", "dist", "!dist/**/*.test.*", "!dist/**/*.spec.*" From 6f5d833ad2728f56aca5ebad7b12fe1b0888ecc1 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 16 Oct 2024 08:14:20 -0400 Subject: [PATCH 5/6] fix --- packages/editor/tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/editor/tsconfig.json b/packages/editor/tsconfig.json index 6f788f1603..d4a5412e42 100644 --- a/packages/editor/tsconfig.json +++ b/packages/editor/tsconfig.json @@ -10,6 +10,6 @@ "sourceMap": true, "strict": true, "module": "NodeNext", - "moduleResolution": "NodeNext" + "moduleResolution": "bundler" } } From dda9dfe87be32317b8548aee42584386a7733874 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 16 Oct 2024 08:21:49 -0400 Subject: [PATCH 6/6] oops --- .../svelte.dev/src/routes/tutorial/[...slug]/ImageViewer.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/svelte.dev/src/routes/tutorial/[...slug]/ImageViewer.svelte b/apps/svelte.dev/src/routes/tutorial/[...slug]/ImageViewer.svelte index ec7587e031..8d69298a05 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 @@