diff --git a/package.json b/package.json index 80ab6c913..d5bc25907 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "devDependencies": { "@playwright/test": "^1.37.1", "@sveltejs/adapter-vercel": "3.0.3", - "@sveltejs/kit": "^1.24.1", + "@sveltejs/kit": "^1.27.0", "@sveltejs/site-kit": "6.0.0-next.39", "@types/diff": "^5.0.3", "@types/prismjs": "^1.26.0", @@ -27,8 +27,8 @@ "prettier": "^3.0.3", "prettier-plugin-svelte": "^3.0.3", "shiki-twoslash": "^3.1.2", - "svelte": "^4.2.0", - "svelte-check": "^3.5.1", + "svelte": "^5.0.0-next.31", + "svelte-check": "^3.6.0", "tiny-glob": "^0.2.9", "typescript": "^5.2.2", "vite": "^4.4.9" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 28661473c..789afc472 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -58,10 +58,10 @@ dependencies: version: 6.0.14(@codemirror/commands@6.2.5)(@codemirror/language@6.9.0)(@codemirror/search@6.5.2)(@codemirror/state@6.2.1)(@codemirror/view@6.17.1) '@rich_harris/svelte-split-pane': specifier: ^1.1.1 - version: 1.1.1(svelte@4.2.0) + version: 1.1.1(svelte@5.0.0-next.31) '@sveltejs/repl': specifier: ^0.6.0 - version: 0.6.0(@codemirror/lang-html@6.4.6)(@codemirror/search@6.5.2)(@lezer/common@1.0.4)(@lezer/javascript@1.4.7)(@lezer/lr@1.3.10)(@sveltejs/kit@1.24.1)(svelte@4.2.0) + version: 0.6.0(@codemirror/lang-html@6.4.6)(@codemirror/search@6.5.2)(@lezer/common@1.0.4)(@lezer/javascript@1.4.7)(@lezer/lr@1.3.10)(@sveltejs/kit@1.30.3)(svelte@5.0.0-next.31) '@webcontainer/api': specifier: ^1.1.5 version: 1.1.5 @@ -105,13 +105,13 @@ devDependencies: version: 1.37.1 '@sveltejs/adapter-vercel': specifier: 3.0.3 - version: 3.0.3(@sveltejs/kit@1.24.1) + version: 3.0.3(@sveltejs/kit@1.30.3) '@sveltejs/kit': - specifier: ^1.24.1 - version: 1.24.1(svelte@4.2.0)(vite@4.4.9) + specifier: ^1.27.0 + version: 1.30.3(svelte@5.0.0-next.31)(vite@4.4.9) '@sveltejs/site-kit': specifier: 6.0.0-next.39 - version: 6.0.0-next.39(@sveltejs/kit@1.24.1)(svelte@4.2.0) + version: 6.0.0-next.39(@sveltejs/kit@1.30.3)(svelte@5.0.0-next.31) '@types/diff': specifier: ^5.0.3 version: 5.0.3 @@ -138,16 +138,16 @@ devDependencies: version: 3.0.3 prettier-plugin-svelte: specifier: ^3.0.3 - version: 3.0.3(prettier@3.0.3)(svelte@4.2.0) + version: 3.0.3(prettier@3.0.3)(svelte@5.0.0-next.31) shiki-twoslash: specifier: ^3.1.2 version: 3.1.2(typescript@5.2.2) svelte: - specifier: ^4.2.0 - version: 4.2.0 + specifier: ^5.0.0-next.31 + version: 5.0.0-next.31 svelte-check: - specifier: ^3.5.1 - version: 3.5.1(svelte@4.2.0) + specifier: ^3.6.0 + version: 3.6.2(svelte@5.0.0-next.31) tiny-glob: specifier: ^0.2.9 version: 0.2.9 @@ -660,6 +660,10 @@ packages: dev: true optional: true + /@fastify/busboy@2.1.0: + resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==} + engines: {node: '>=14'} + /@fontsource/roboto-mono@5.0.8: resolution: {integrity: sha512-vjnNX8zQCSp4HadUJ3gpZiizCsK/ROjgGMpd4bcRxuyiTNGGMaznmKbhqdyVeFVap1sX8h2Qu380awaotey/mQ==} dev: false @@ -860,12 +864,12 @@ packages: '@codemirror/view': 6.17.1 dev: false - /@rich_harris/svelte-split-pane@1.1.1(svelte@4.2.0): + /@rich_harris/svelte-split-pane@1.1.1(svelte@5.0.0-next.31): resolution: {integrity: sha512-y2RRLyrN6DCeIgwA423aAIv/T5JqQeOl2XogBQ/21DvA2IF7oyrLUtXMxmQL2va2NFdeJO6MDx6nDX5X7kau7A==} peerDependencies: svelte: ^3.54.0 dependencies: - svelte: 4.2.0 + svelte: 5.0.0-next.31 dev: false /@rollup/browser@3.28.1: @@ -880,12 +884,12 @@ packages: picomatch: 2.3.1 dev: true - /@sveltejs/adapter-vercel@3.0.3(@sveltejs/kit@1.24.1): + /@sveltejs/adapter-vercel@3.0.3(@sveltejs/kit@1.30.3): resolution: {integrity: sha512-0FQMjR6klW4627ewdclSr0lUe/DqiiyOaRTfgb5cXgNbVMsZMOA2fQ77TYQnJdvMfSEWe6y8uznV48XqKh9+vA==} peerDependencies: '@sveltejs/kit': ^1.5.0 dependencies: - '@sveltejs/kit': 1.24.1(svelte@4.2.0)(vite@4.4.9) + '@sveltejs/kit': 1.30.3(svelte@5.0.0-next.31)(vite@4.4.9) '@vercel/nft': 0.23.1 esbuild: 0.18.20 transitivePeerDependencies: @@ -893,34 +897,34 @@ packages: - supports-color dev: true - /@sveltejs/kit@1.24.1(svelte@4.2.0)(vite@4.4.9): - resolution: {integrity: sha512-u2FO0q62Se9UZ0g9kXaWYi+54vTK70BKaPScOcx6jLMRou4CUZgDTNKnRhsbJgPMgaLkOH0j3o/fKlZ6jBfgSg==} + /@sveltejs/kit@1.30.3(svelte@5.0.0-next.31)(vite@4.4.9): + resolution: {integrity: sha512-0DzVXfU4h+tChFvoc8C61IqErCyskD4ydSIDjpKS2lYlEzIYrtYrY7juSqACFxqcvZAnOEXvSY+zZ8br0+ZMMg==} engines: {node: ^16.14 || >=18} hasBin: true requiresBuild: true peerDependencies: - svelte: ^3.54.0 || ^4.0.0-next.0 + svelte: ^3.54.0 || ^4.0.0-next.0 || ^5.0.0-next.0 vite: ^4.0.0 dependencies: - '@sveltejs/vite-plugin-svelte': 2.4.5(svelte@4.2.0)(vite@4.4.9) + '@sveltejs/vite-plugin-svelte': 2.5.3(svelte@5.0.0-next.31)(vite@4.4.9) '@types/cookie': 0.5.2 cookie: 0.5.0 devalue: 4.3.2 esm-env: 1.0.0 kleur: 4.1.5 magic-string: 0.30.3 - mime: 3.0.0 + mrmime: 1.0.1 sade: 1.8.1 set-cookie-parser: 2.6.0 sirv: 2.0.3 - svelte: 4.2.0 + svelte: 5.0.0-next.31 tiny-glob: 0.2.9 - undici: 5.23.0 + undici: 5.26.5 vite: 4.4.9(lightningcss@1.21.7) transitivePeerDependencies: - supports-color - /@sveltejs/repl@0.6.0(@codemirror/lang-html@6.4.6)(@codemirror/search@6.5.2)(@lezer/common@1.0.4)(@lezer/javascript@1.4.7)(@lezer/lr@1.3.10)(@sveltejs/kit@1.24.1)(svelte@4.2.0): + /@sveltejs/repl@0.6.0(@codemirror/lang-html@6.4.6)(@codemirror/search@6.5.2)(@lezer/common@1.0.4)(@lezer/javascript@1.4.7)(@lezer/lr@1.3.10)(@sveltejs/kit@1.30.3)(svelte@5.0.0-next.31): resolution: {integrity: sha512-NADKN0NZhLlSatTSh5CCsdzgf2KHJFRef/8krA/TVWAWos5kSwmZ5fF0UImuqs61Pu/SiMXksaWNTGTiOtr4fQ==} peerDependencies: svelte: ^3.54.0 || ^4.0.0-next.0 || ^4.0.0 @@ -940,17 +944,17 @@ packages: '@neocodemirror/svelte': 0.0.15(@codemirror/autocomplete@6.9.0)(@codemirror/commands@6.2.5)(@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) '@replit/codemirror-lang-svelte': 6.0.0(@codemirror/autocomplete@6.9.0)(@codemirror/lang-css@6.2.1)(@codemirror/lang-html@6.4.6)(@codemirror/lang-javascript@6.2.1)(@codemirror/language@6.9.0)(@codemirror/state@6.2.1)(@codemirror/view@6.17.1)(@lezer/common@1.0.4)(@lezer/highlight@1.1.6)(@lezer/javascript@1.4.7)(@lezer/lr@1.3.10) '@replit/codemirror-vim': 6.0.14(@codemirror/commands@6.2.5)(@codemirror/language@6.9.0)(@codemirror/search@6.5.2)(@codemirror/state@6.2.1)(@codemirror/view@6.17.1) - '@rich_harris/svelte-split-pane': 1.1.1(svelte@4.2.0) + '@rich_harris/svelte-split-pane': 1.1.1(svelte@5.0.0-next.31) '@rollup/browser': 3.28.1 - '@sveltejs/site-kit': 5.2.2(@sveltejs/kit@1.24.1)(svelte@4.2.0) + '@sveltejs/site-kit': 5.2.2(@sveltejs/kit@1.30.3)(svelte@5.0.0-next.31) acorn: 8.10.0 codemirror: 6.0.1(@lezer/common@1.0.4) esm-env: 1.0.0 estree-walker: 3.0.3 marked: 5.1.2 resolve.exports: 2.0.2 - svelte: 4.2.0 - svelte-json-tree: 2.1.0(svelte@4.2.0) + svelte: 5.0.0-next.31 + svelte-json-tree: 2.1.0(svelte@5.0.0-next.31) transitivePeerDependencies: - '@codemirror/lang-html' - '@codemirror/search' @@ -960,31 +964,31 @@ packages: - '@sveltejs/kit' dev: false - /@sveltejs/site-kit@5.2.2(@sveltejs/kit@1.24.1)(svelte@4.2.0): + /@sveltejs/site-kit@5.2.2(@sveltejs/kit@1.30.3)(svelte@5.0.0-next.31): resolution: {integrity: sha512-XLLxVUV/dYytCsUeODAkjtzlaIBSn1kdcH5U36OuN7gMsPEHDy5L/dsWjf1/vDln3JStH5lqZPEN8Fovm33KhA==} peerDependencies: '@sveltejs/kit': ^1.0.0 svelte: ^3.54.0 dependencies: - '@sveltejs/kit': 1.24.1(svelte@4.2.0)(vite@4.4.9) + '@sveltejs/kit': 1.30.3(svelte@5.0.0-next.31)(vite@4.4.9) esm-env: 1.0.0 - svelte: 4.2.0 - svelte-local-storage-store: 0.4.0(svelte@4.2.0) + svelte: 5.0.0-next.31 + svelte-local-storage-store: 0.4.0(svelte@5.0.0-next.31) dev: false - /@sveltejs/site-kit@6.0.0-next.39(@sveltejs/kit@1.24.1)(svelte@4.2.0): + /@sveltejs/site-kit@6.0.0-next.39(@sveltejs/kit@1.30.3)(svelte@5.0.0-next.31): resolution: {integrity: sha512-HARhb2WayjHL/3BFjffFO5cMJjbkPrN/01Tz8Oe3mZYmAUD4Cb3iUI34p415ASTIO6RAeDnClBZDwr2EsK6spg==} peerDependencies: '@sveltejs/kit': ^1.20.0 svelte: ^4.0.0 dependencies: - '@sveltejs/kit': 1.24.1(svelte@4.2.0)(vite@4.4.9) + '@sveltejs/kit': 1.30.3(svelte@5.0.0-next.31)(vite@4.4.9) esm-env: 1.0.0 - svelte: 4.2.0 - svelte-local-storage-store: 0.6.0(svelte@4.2.0) + svelte: 5.0.0-next.31 + svelte-local-storage-store: 0.6.0(svelte@5.0.0-next.31) dev: true - /@sveltejs/vite-plugin-svelte-inspector@1.0.4(@sveltejs/vite-plugin-svelte@2.4.5)(svelte@4.2.0)(vite@4.4.9): + /@sveltejs/vite-plugin-svelte-inspector@1.0.4(@sveltejs/vite-plugin-svelte@2.5.3)(svelte@5.0.0-next.31)(vite@4.4.9): resolution: {integrity: sha512-zjiuZ3yydBtwpF3bj0kQNV0YXe+iKE545QGZVTaylW3eAzFr+pJ/cwK8lZEaRp4JtaJXhD5DyWAV4AxLh6DgaQ==} engines: {node: ^14.18.0 || >= 16} peerDependencies: @@ -992,27 +996,27 @@ packages: svelte: ^3.54.0 || ^4.0.0 vite: ^4.0.0 dependencies: - '@sveltejs/vite-plugin-svelte': 2.4.5(svelte@4.2.0)(vite@4.4.9) + '@sveltejs/vite-plugin-svelte': 2.5.3(svelte@5.0.0-next.31)(vite@4.4.9) debug: 4.3.4 - svelte: 4.2.0 + svelte: 5.0.0-next.31 vite: 4.4.9(lightningcss@1.21.7) transitivePeerDependencies: - supports-color - /@sveltejs/vite-plugin-svelte@2.4.5(svelte@4.2.0)(vite@4.4.9): - resolution: {integrity: sha512-UJKsFNwhzCVuiZd06jM/psscyNJNDwjQC+qIeb7GBJK9iWeQCcIyfcPWDvbCudfcJggY9jtxJeeaZH7uny93FQ==} + /@sveltejs/vite-plugin-svelte@2.5.3(svelte@5.0.0-next.31)(vite@4.4.9): + resolution: {integrity: sha512-erhNtXxE5/6xGZz/M9eXsmI7Pxa6MS7jyTy06zN3Ck++ldrppOnOlJwHHTsMC7DHDQdgUp4NAc4cDNQ9eGdB/w==} engines: {node: ^14.18.0 || >= 16} peerDependencies: - svelte: ^3.54.0 || ^4.0.0 + svelte: ^3.54.0 || ^4.0.0 || ^5.0.0-next.0 vite: ^4.0.0 dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 1.0.4(@sveltejs/vite-plugin-svelte@2.4.5)(svelte@4.2.0)(vite@4.4.9) + '@sveltejs/vite-plugin-svelte-inspector': 1.0.4(@sveltejs/vite-plugin-svelte@2.5.3)(svelte@5.0.0-next.31)(vite@4.4.9) debug: 4.3.4 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.3 - svelte: 4.2.0 - svelte-hmr: 0.15.3(svelte@4.2.0) + svelte: 5.0.0-next.31 + svelte-hmr: 0.15.3(svelte@5.0.0-next.31) vite: 4.4.9(lightningcss@1.21.7) vitefu: 0.2.4(vite@4.4.9) transitivePeerDependencies: @@ -1105,6 +1109,13 @@ packages: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: true + /acorn-typescript@1.4.13(acorn@8.10.0): + resolution: {integrity: sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==} + peerDependencies: + acorn: '>=8.9.0' + dependencies: + acorn: 8.10.0 + /acorn@8.10.0: resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} engines: {node: '>=0.4.0'} @@ -1166,8 +1177,8 @@ packages: resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} dev: true - /axobject-query@3.2.1: - resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + /axobject-query@4.0.0: + resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==} dependencies: dequal: 2.0.3 @@ -1219,12 +1230,6 @@ packages: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} dev: true - /busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} - dependencies: - streamsearch: 1.1.0 - /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -1254,15 +1259,6 @@ packages: engines: {node: '>=10'} dev: true - /code-red@1.0.4: - resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - '@types/estree': 1.0.1 - acorn: 8.10.0 - estree-walker: 3.0.3 - periscopic: 3.1.0 - /codemirror@6.0.1(@lezer/common@1.0.4): resolution: {integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==} dependencies: @@ -1298,13 +1294,6 @@ packages: resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} dev: false - /css-tree@2.3.1: - resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - dependencies: - mdn-data: 2.0.30 - source-map-js: 1.0.2 - /csstype@3.1.2: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} dev: false @@ -1438,6 +1427,12 @@ packages: /esm-env@1.0.0: resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} + /esrap@1.2.1: + resolution: {integrity: sha512-dhkcOLfN/aDdMFI1iwPEcy/XqAZzGNfgfEJjZozy2tia6u0dQoZyXzkRshHTckuNsM+c0CYQndY+uRFe3N+AIQ==} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + '@types/estree': 1.0.1 + /estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} dev: true @@ -1446,6 +1441,7 @@ packages: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} dependencies: '@types/estree': 1.0.1 + dev: false /fast-glob@3.3.1: resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} @@ -1615,8 +1611,8 @@ packages: engines: {node: '>=0.12.0'} dev: true - /is-reference@3.0.1: - resolution: {integrity: sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w==} + /is-reference@3.0.2: + resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} dependencies: '@types/estree': 1.0.1 @@ -1731,15 +1727,14 @@ packages: hasBin: true dev: true - /magic-string@0.27.0: - resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} + /magic-string@0.30.3: + resolution: {integrity: sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==} engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - /magic-string@0.30.3: - resolution: {integrity: sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==} + /magic-string@0.30.5: + resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 @@ -1763,9 +1758,6 @@ packages: hasBin: true dev: false - /mdn-data@2.0.30: - resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} - /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -1779,11 +1771,6 @@ packages: picomatch: 2.3.1 dev: true - /mime@3.0.0: - resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} - engines: {node: '>=10.0.0'} - hasBin: true - /min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -1919,13 +1906,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /periscopic@3.1.0: - resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} - dependencies: - '@types/estree': 1.0.1 - estree-walker: 3.0.3 - is-reference: 3.0.1 - /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} @@ -1952,14 +1932,14 @@ packages: picocolors: 1.0.0 source-map-js: 1.0.2 - /prettier-plugin-svelte@3.0.3(prettier@3.0.3)(svelte@4.2.0): + /prettier-plugin-svelte@3.0.3(prettier@3.0.3)(svelte@5.0.0-next.31): resolution: {integrity: sha512-dLhieh4obJEK1hnZ6koxF+tMUrZbV5YGvRpf2+OADyanjya5j0z1Llo8iGwiHmFWZVG/hLEw/AJD5chXd9r3XA==} peerDependencies: prettier: ^3.0.0 svelte: ^3.2.0 || ^4.0.0-next.0 dependencies: prettier: 3.0.3 - svelte: 4.2.0 + svelte: 5.0.0-next.31 dev: true /prettier@3.0.3: @@ -2131,10 +2111,6 @@ packages: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} - /streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -2172,11 +2148,11 @@ packages: resolution: {integrity: sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==} dev: false - /svelte-check@3.5.1(svelte@4.2.0): - resolution: {integrity: sha512-+Zb4iHxAhdUtcUg/WJPRjlS1RJalIsWAe9Mz6G1zyznSs7dDkT7VUBdXc3q7Iwg49O/VrZgyJRvOJkjuBfKjFA==} + /svelte-check@3.6.2(svelte@5.0.0-next.31): + resolution: {integrity: sha512-E6iFh4aUCGJLRz6QZXH3gcN/VFfkzwtruWSRmlKrLWQTiO6VzLsivR6q02WYLGNAGecV3EocqZuCDrC2uttZ0g==} hasBin: true peerDependencies: - svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 + svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0 dependencies: '@jridgewell/trace-mapping': 0.3.19 chokidar: 3.5.3 @@ -2184,8 +2160,8 @@ packages: import-fresh: 3.3.0 picocolors: 1.0.0 sade: 1.8.1 - svelte: 4.2.0 - svelte-preprocess: 5.0.4(svelte@4.2.0)(typescript@5.2.2) + svelte: 5.0.0-next.31 + svelte-preprocess: 5.1.3(svelte@5.0.0-next.31)(typescript@5.2.2) typescript: 5.2.2 transitivePeerDependencies: - '@babel/core' @@ -2199,55 +2175,55 @@ packages: - sugarss dev: true - /svelte-hmr@0.15.3(svelte@4.2.0): + /svelte-hmr@0.15.3(svelte@5.0.0-next.31): resolution: {integrity: sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==} engines: {node: ^12.20 || ^14.13.1 || >= 16} peerDependencies: svelte: ^3.19.0 || ^4.0.0 dependencies: - svelte: 4.2.0 + svelte: 5.0.0-next.31 - /svelte-json-tree@2.1.0(svelte@4.2.0): + /svelte-json-tree@2.1.0(svelte@5.0.0-next.31): resolution: {integrity: sha512-IAU//hE5bIA0SoM9AuP7xOoD9PUcMh4fio0oI52r0XJ7iNDytW7AnBdkIn1QSYLUyWzvQX3tp59JfLYfhd7lTw==} peerDependencies: svelte: ^4.0.0 dependencies: - svelte: 4.2.0 + svelte: 5.0.0-next.31 dev: false - /svelte-local-storage-store@0.4.0(svelte@4.2.0): + /svelte-local-storage-store@0.4.0(svelte@5.0.0-next.31): resolution: {integrity: sha512-ctPykTt4S3BE5bF0mfV0jKiUR1qlmqLvnAkQvYHLeb9wRyO1MdIFDVI23X+TZEFleATHkTaOpYZswIvf3b2tWA==} engines: {node: '>=0.14'} peerDependencies: svelte: ^3.48.0 dependencies: - svelte: 4.2.0 + svelte: 5.0.0-next.31 dev: false - /svelte-local-storage-store@0.6.0(svelte@4.2.0): + /svelte-local-storage-store@0.6.0(svelte@5.0.0-next.31): resolution: {integrity: sha512-UbCY/yT/YUadU5IX/gZkoRQnA+ebFZHKKQjlJvfWHnBj3CPe9sNn8ndxYz/xy4LUzGjuBLq8+wH5RYK54ba3wA==} engines: {node: '>=0.14'} peerDependencies: svelte: ^3.48.0 || ^4.0.0 dependencies: - svelte: 4.2.0 + svelte: 5.0.0-next.31 dev: true - /svelte-preprocess@5.0.4(svelte@4.2.0)(typescript@5.2.2): - resolution: {integrity: sha512-ABia2QegosxOGsVlsSBJvoWeXy1wUKSfF7SWJdTjLAbx/Y3SrVevvvbFNQqrSJw89+lNSsM58SipmZJ5SRi5iw==} - engines: {node: '>= 14.10.0'} + /svelte-preprocess@5.1.3(svelte@5.0.0-next.31)(typescript@5.2.2): + resolution: {integrity: sha512-xxAkmxGHT+J/GourS5mVJeOXZzne1FR5ljeOUAMXUkfEhkLEllRreXpbl3dIYJlcJRfL1LO1uIAPpBpBfiqGPw==} + engines: {node: '>= 16.0.0', pnpm: ^8.0.0} requiresBuild: true peerDependencies: '@babel/core': ^7.10.2 coffeescript: ^2.5.1 less: ^3.11.3 || ^4.0.0 postcss: ^7 || ^8 - postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 + postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 pug: ^3.0.0 sass: ^1.26.8 stylus: ^0.55.0 sugarss: ^2.0.0 || ^3.0.0 || ^4.0.0 - svelte: ^3.23.0 || ^4.0.0-next.0 || ^4.0.0 + svelte: ^3.23.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0 typescript: '>=3.9.5 || ^4.0.0 || ^5.0.0' peerDependenciesMeta: '@babel/core': @@ -2273,30 +2249,29 @@ packages: dependencies: '@types/pug': 2.0.6 detect-indent: 6.1.0 - magic-string: 0.27.0 + magic-string: 0.30.5 sorcery: 0.11.0 strip-indent: 3.0.0 - svelte: 4.2.0 + svelte: 5.0.0-next.31 typescript: 5.2.2 dev: true - /svelte@4.2.0: - resolution: {integrity: sha512-kVsdPjDbLrv74SmLSUzAsBGquMs4MPgWGkGLpH+PjOYnFOziAvENVzgJmyOCV2gntxE32aNm8/sqNKD6LbIpeQ==} - engines: {node: '>=16'} + /svelte@5.0.0-next.31: + resolution: {integrity: sha512-8DksQKZ5HPNzUXvN/laq85Rf5G1d2/rXP1yodlLdJZBwmwmvuNS9l+bRvclOowH0wg1UO8kdr+3t4KFzRFlCtA==} + engines: {node: '>=18'} dependencies: '@ampproject/remapping': 2.2.1 '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.19 acorn: 8.10.0 + acorn-typescript: 1.4.13(acorn@8.10.0) aria-query: 5.3.0 - axobject-query: 3.2.1 - code-red: 1.0.4 - css-tree: 2.3.1 - estree-walker: 3.0.3 - is-reference: 3.0.1 + axobject-query: 4.0.0 + esm-env: 1.0.0 + esrap: 1.2.1 + is-reference: 3.0.2 locate-character: 3.0.0 - magic-string: 0.30.3 - periscopic: 3.1.0 + magic-string: 0.30.5 + zimmerframe: 1.1.0 /tar@6.1.15: resolution: {integrity: sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==} @@ -2337,11 +2312,11 @@ packages: hasBin: true dev: true - /undici@5.23.0: - resolution: {integrity: sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==} + /undici@5.26.5: + resolution: {integrity: sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==} engines: {node: '>=14.0'} dependencies: - busboy: 1.6.0 + '@fastify/busboy': 2.1.0 /update-browserslist-db@1.0.11(browserslist@4.21.10): resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} @@ -2456,3 +2431,6 @@ packages: /yootils@0.3.1: resolution: {integrity: sha512-A7AMeJfGefk317I/3tBoUYRcDcNavKEkpiPN/nQsBz/viI2GvT7BtrqdPD6rGqBFN8Ax7v4obf+Cl32JF9DDVw==} dev: false + + /zimmerframe@1.1.0: + resolution: {integrity: sha512-+AmV37r9NPUy7KcuG0Fde9AAFSD88kN5pnqvD7Pkp5WLLK0jct7hAtIDXXFDCRk3l5Mc1r2Sth3gfP2ZLE+/Qw==} diff --git a/src/lib/client/adapters/webcontainer/index.js b/src/lib/client/adapters/webcontainer/index.js index 274ef154d..cee53e921 100644 --- a/src/lib/client/adapters/webcontainer/index.js +++ b/src/lib/client/adapters/webcontainer/index.js @@ -6,7 +6,7 @@ import { escape_html, get_depth } from '../../../utils.js'; import { ready } from '../common/index.js'; /** - * @typedef {import("../../../../routes/tutorial/[slug]/state.js").CompilerWarning} CompilerWarning + * @typedef {import("../../../../routes/tutorial/[slug]/state.svelte.js").CompilerWarning} CompilerWarning */ const converter = new AnsiToHtml({ @@ -17,15 +17,11 @@ const converter = new AnsiToHtml({ let vm; /** - * @param {import('svelte/store').Writable} base - * @param {import('svelte/store').Writable} error - * @param {import('svelte/store').Writable<{ value: number, text: string }>} progress - * @param {import('svelte/store').Writable} logs - * @param {import('svelte/store').Writable>} warnings + * @param {typeof import('../../../../routes/tutorial/[slug]/adapter.svelte.js').a} state * @returns {Promise} */ -export async function create(base, error, progress, logs, warnings) { - progress.set({ value: 0, text: 'loading files' }); +export async function create(state) { + state.progress = { value: 0, text: 'loading files' }; const q = yootils.queue(1); /** @type {Map>} */ @@ -34,10 +30,10 @@ export async function create(base, error, progress, logs, warnings) { /** Paths and contents of the currently loaded file stubs */ let current_stubs = stubs_to_map([]); - progress.set({ value: 1 / 5, text: 'booting webcontainer' }); + state.progress = { value: 1 / 5, text: 'booting webcontainer' }; vm = await WebContainer.boot(); - progress.set({ value: 2 / 5, text: 'writing virtual files' }); + state.progress = { value: 2 / 5, text: 'writing virtual files' }; const common = await ready; await vm.mount({ 'common.zip': { @@ -48,48 +44,31 @@ export async function create(base, error, progress, logs, warnings) { } }); - /** @type {Record} */ - let $warnings; - warnings.subscribe((value) => $warnings = value); - - /** @type {any} */ - let timeout; - - /** @param {number} msec */ - function schedule_to_update_warning(msec) { - clearTimeout(timeout); - timeout = setTimeout(() => warnings.set($warnings), msec); - } - const log_stream = () => new WritableStream({ write(chunk) { if (chunk === '\x1B[1;1H') { // clear screen - logs.set([]); - + state.logs = []; } else if (chunk?.startsWith('svelte:warnings:')) { /** @type {CompilerWarning} */ const warn = JSON.parse(chunk.slice(16)); - const current = $warnings[warn.filename]; + const current = state.warnings[warn.filename]; if (!current) { - $warnings[warn.filename] = [warn]; - // the exact same warning may be given multiple times in a row - } else if (!current.some((s) => (s.code === warn.code && s.pos === warn.pos))) { + state.warnings[warn.filename] = [warn]; + // the exact same warning may be given multiple times in a row + } else if (!current.some((s) => s.code === warn.code && s.pos === warn.pos)) { current.push(warn); } - - schedule_to_update_warning(100); - } else { const log = converter.toHtml(escape_html(chunk)).replace(/\n/g, '
'); - logs.update(($logs) => [...$logs, log]); + state.logs = [...state.logs, log]; } } }); - progress.set({ value: 3 / 5, text: 'unzipping files' }); + state.progress = { value: 3 / 5, text: 'unzipping files' }; const unzip = await vm.spawn('node', ['unzip.cjs']); unzip.output.pipeTo(log_stream()); const code = await unzip.exit; @@ -101,11 +80,11 @@ export async function create(base, error, progress, logs, warnings) { await vm.spawn('chmod', ['a+x', 'node_modules/vite/bin/vite.js']); vm.on('server-ready', (_port, url) => { - base.set(url); + state.base = url; }); vm.on('error', ({ message }) => { - error.set(new Error(message)); + state.error = new Error(message); }); let launched = false; @@ -114,7 +93,7 @@ export async function create(base, error, progress, logs, warnings) { if (launched) return; launched = true; - progress.set({ value: 4 / 5, text: 'starting dev server' }); + state.progress = { value: 4 / 5, text: 'starting dev server' }; await new Promise(async (fulfil, reject) => { const error_unsub = vm.on('error', (error) => { @@ -124,7 +103,7 @@ export async function create(base, error, progress, logs, warnings) { const ready_unsub = vm.on('server-ready', (_port, base) => { ready_unsub(); - progress.set({ value: 5 / 5, text: 'ready' }); + state.progress = { value: 5 / 5, text: 'ready' }; fulfil(base); // this will be the last thing that happens if everything goes well }); @@ -179,30 +158,26 @@ export async function create(base, error, progress, logs, warnings) { // Don't delete the node_modules folder when switching from one exercise to another // where, as this crashes the dev server. const to_delete = [ - ...Array.from(current_stubs.keys()).filter( - (s) => !s.startsWith('/node_modules') - ), + ...Array.from(current_stubs.keys()).filter((s) => !s.startsWith('/node_modules')), ...force_delete ]; // initialize warnings of written files to_write - .filter((stub) => stub.type === 'file' && $warnings[stub.name]) - .forEach((stub) => $warnings[stub.name] = []); + .filter((stub) => stub.type === 'file' && state.warnings[stub.name]) + .forEach((stub) => (state.warnings[stub.name] = [])); // remove warnings of deleted files to_delete - .filter((stubname) => $warnings[stubname]) - .forEach((stubname) => delete $warnings[stubname]); - - warnings.set($warnings); + .filter((stubname) => state.warnings[stubname]) + .forEach((stubname) => delete state.warnings[stubname]); current_stubs = stubs_to_map(stubs); // For some reason, server-ready is fired again when the vite dev server is restarted. // We need to wait for it to finish before we can continue, else we might // request files from Vite before it's ready, leading to a timeout. - const will_restart = launched && - (to_write.some(is_config) || to_delete.some(is_config_path)); + const will_restart = + launched && (to_write.some(is_config) || to_delete.some(is_config_path)); const promise = will_restart ? wait_for_restart_vite() : Promise.resolve(); for (const file of to_delete) { @@ -223,14 +198,13 @@ export async function create(base, error, progress, logs, warnings) { }); }, update: (file) => { - let queue = q_per_file.get(file.name); if (queue) { queue.push(file); return Promise.resolve(false); } - q_per_file.set(file.name, queue = [file]); + q_per_file.set(file.name, (queue = [file])); return q.add(async () => { /** @type {import('@webcontainer/api').FileSystemTree} */ @@ -257,16 +231,14 @@ export async function create(base, error, progress, logs, warnings) { const will_restart = is_config(file); while (queue && queue.length > 0) { - // if the file is updated many times rapidly, get the most recently updated one const file = /** @type {import('$lib/types').FileStub} */ (queue.pop()); - queue.length = 0 + queue.length = 0; tree[basename] = to_file(file); // initialize warnings of this file - $warnings[file.name] = []; - schedule_to_update_warning(100); + state.warnings[file.name] = []; await vm.mount(root); @@ -280,7 +252,7 @@ export async function create(base, error, progress, logs, warnings) { await new Promise((f) => setTimeout(f, 50)); } - q_per_file.delete(file.name) + q_per_file.delete(file.name); return will_restart; }); diff --git a/src/lib/components/Modal.svelte b/src/lib/components/Modal.svelte index 8e3984273..6f666d589 100644 --- a/src/lib/components/Modal.svelte +++ b/src/lib/components/Modal.svelte @@ -1,6 +1,9 @@ @@ -46,7 +46,7 @@ - + {@render children()} {#if browser} diff --git a/src/routes/tutorial/[slug]/+page.svelte b/src/routes/tutorial/[slug]/+page.svelte index 144581bff..aa797bd6a 100644 --- a/src/routes/tutorial/[slug]/+page.svelte +++ b/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 { Icon } from '@sveltejs/site-kit/components'; - import { reset } from './adapter.js'; + import { reset } from './adapter.svelte.js'; import Editor from './Editor.svelte'; import ContextMenu from './filetree/ContextMenu.svelte'; import Filetree from './filetree/Filetree.svelte'; @@ -10,35 +10,34 @@ import Output from './Output.svelte'; import ScreenToggle from './ScreenToggle.svelte'; import Sidebar from './Sidebar.svelte'; - import { - create_directories, - creating, - files, - reset_files, - selected_file, - selected_name, - solution - } from './state.js'; - - export let data; + import { create_directories, reset_files, s } from './state.svelte.js'; + + let { data } = $props(); let path = data.exercise.path; - let show_editor = false; - let show_filetree = false; - let paused = false; - let w = 1000; + let show_editor = $state(false); + let show_filetree = $state(false); + let paused = $state(false); + let w = $state(1000); /** @type {import('$lib/types').Stub[]} */ let previous_files = []; - $: mobile = w < 800; // for the things we can't do with media queries - $: files.set(Object.values(data.exercise.a)); - $: solution.set(data.exercise.b); - $: selected_name.set(data.exercise.focus); - $: completed = is_completed($files, data.exercise.b); + let mobile = $derived(w < 800); // for the things we can't do with media queries + let completed = $derived(is_completed(s.files, data.exercise.b)); + + // meh: I have to duplicate this because $effect.pre doesn't run on the server + s.files = Object.values(data.exercise.a); + s.solution = data.exercise.b; + s.selected_name = data.exercise.focus; + $effect.pre(() => { + s.files = Object.values(data.exercise.a); + s.solution = data.exercise.b; + s.selected_name = data.exercise.focus; + }); beforeNavigate(() => { - previous_files = $files; + previous_files = s.files; }); afterNavigate(async () => { @@ -47,7 +46,7 @@ const will_delete = previous_files.some((file) => !(file.name in data.exercise.a)); if (data.exercise.path !== path || will_delete) paused = true; - await reset($files); + await reset(s.files); path = data.exercise.path; paused = false; @@ -85,41 +84,41 @@ /** @param {string | null} name */ function select_file(name) { - const file = name && $files.find((file) => file.name === name); + const file = name && s.files.find((file) => file.name === name); if (!file && name) { // trigger file creation input. first, create any intermediate directories - const new_directories = create_directories(name, $files); + const new_directories = create_directories(name, s.files); if (new_directories.length > 0) { - reset_files([...$files, ...new_directories]); + reset_files([...s.files, ...new_directories]); } // find the parent directory const parent = name.split('/').slice(0, -1).join('/'); - creating.set({ + s.creating = { parent, type: 'file' - }); + }; show_filetree = true; } else { show_filetree = false; - selected_name.set(name); + s.selected_name = name; } show_editor = true; } - /** @param {string} name */ + /** @param {string | null} name */ function navigate_to_file(name) { - if (name === $selected_name) return; + if (name === s.selected_name) return; select_file(name); if (mobile) { - const q = new URLSearchParams({ file: $selected_name || '' }); + const q = new URLSearchParams({ file: s.selected_name || '' }); history.pushState({}, '', `?${q}`); } } @@ -159,7 +158,7 @@ { + onpopstate={(e) => { const q = new URLSearchParams(location.search); const file = q.get('file'); @@ -182,8 +181,8 @@ bind:sidebar index={data.index} exercise={data.exercise} - on:select={(e) => { - navigate_to_file(e.detail.file); + on_select={(file) => { + navigate_to_file(file); }} /> @@ -200,8 +199,8 @@ >