From 5b8870c15d9b84b320e7b1e6ba55613ac30baaba Mon Sep 17 00:00:00 2001 From: Dee Grant Date: Tue, 18 Apr 2023 03:06:48 -0500 Subject: [PATCH 001/106] fix: filename typo (#369) fixes #368 --- .../07-composition/03-slot-fallbacks/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/tutorial/02-advanced-svelte/07-composition/03-slot-fallbacks/README.md b/content/tutorial/02-advanced-svelte/07-composition/03-slot-fallbacks/README.md index cb6169707..a65b270de 100644 --- a/content/tutorial/02-advanced-svelte/07-composition/03-slot-fallbacks/README.md +++ b/content/tutorial/02-advanced-svelte/07-composition/03-slot-fallbacks/README.md @@ -5,7 +5,7 @@ title: Slot fallbacks A component can specify _fallbacks_ for any slots that are left empty, by putting content inside the `` element: ```svelte -/// file: Box.svelte +/// file: Card.svelte
From 5cc3d078d098a4cf436509c69cdb4b5044655c7f Mon Sep 17 00:00:00 2001 From: tomoam <29677552+tomoam@users.noreply.github.com> Date: Tue, 18 Apr 2023 17:16:43 +0900 Subject: [PATCH 002/106] fix: improve styles inside the editor (#366) Fixes #360 --- src/routes/tutorial/[slug]/codemirror.css | 81 ++++++++++++++--------- 1 file changed, 51 insertions(+), 30 deletions(-) diff --git a/src/routes/tutorial/[slug]/codemirror.css b/src/routes/tutorial/[slug]/codemirror.css index 7eb066a01..ca9c74c37 100644 --- a/src/routes/tutorial/[slug]/codemirror.css +++ b/src/routes/tutorial/[slug]/codemirror.css @@ -6,10 +6,6 @@ height: 100%; } -.cm-editor ::selection { - color: revert; -} - .cm-editor .cm-scroller { font-family: var(--font-mono); font-size: 1.3rem; @@ -23,6 +19,10 @@ width: 5rem; } +.cm-editor .cm-activeLine { + background: var(--sk-back-translucent); +} + .cm-editor .cm-activeLineGutter { background-color: var(--sk-back-3); } @@ -53,18 +53,31 @@ } .cm-editor .cm-selectionMatch { - background: rgba(0,0,0,0.2); + background: var(--selection-color); color: var(--sk-text-2); } +.cm-editor.cm-focused .cm-selectionBackground, +.cm-editor .cm-selectionBackground, +.cm-editor .cm-content ::selection { + background: var(--sk-theme-3); + opacity: .3; +} + .cm-editor .cm-tooltip { + background: var(--sk-back-2); + color: var(--sk-text-1); border: none; border-radius: 2px; overflow: hidden; margin: 0.4rem 0; filter: drop-shadow(1px 2px 5px rgba(0,0,0,0.1)); } -.cm-editor .cm-tooltip-hover {} + +.cm-editor .cm-tooltip-hover { + border: none; +} + .cm-editor .cm-tooltip-below {} .cm-editor .cm-tooltip-lint {} .cm-editor .cm-tooltip-section {} @@ -72,9 +85,12 @@ border: none; padding: 0.2rem 0.8rem; } + .cm-editor .cm-diagnostic-warning { - background: hsl(39, 100%, 70%); + background: var(--sk-theme-1-variant); + color: white; } + .cm-editor .cm-diagnosticText {} .cm-editor .cm-tooltip.cm-tooltip-autocomplete > ul { @@ -82,32 +98,37 @@ font-size: 1.3rem; } +.cm-editor .cm-panels { + background: var(--sk-back-4); + color: var(--sk-text-1); +} -@media (prefers-color-scheme: dark) { - .cm-editor .cm-activeLineGutter { - background-color: var(--sk-back-3); - } +.cm-editor .cm-panels.cm-panels-top, +.cm-editor .cm-panels.cm-panels-bottom { + border-top: 1px solid var(--sk-back-5); + border-bottom: 1px solid var(--sk-back-5); +} - .cm-editor .cm-activeLine { - background-color: hsl(0, 0%, 40%, 0.2); - } +.cm-editor .cm-button { + background: var(--sk-back-5); + border: 2px solid transparent; +} - .cm-editor .cm-diagnostic-warning { - background: hsl(39, 100%, 20%); - } +.cm-editor .cm-button:active { + background: var(--sk-theme-2-variant); +} - .cm-editor .cm-diagnostic-warning { - background: hsl(39, 100%, 10%); - } +.cm-editor .cm-textfield { + background: var(--sk-back-1); + color: var(--sk-text-1); + border: 2px solid transparent; +} - .cm-editor.cm-focused .cm-selectionBackground, - .cm-editor .cm-selectionBackground, - .cm-editor .cm-content ::selection { - background: var(--sk-theme-3); - opacity: .3; - } +.cm-editor .cm-search button:focus-visible, +.cm-editor .cm-search input:focus-visible { + border: 2px solid var(--flash); +} - .cm-editor .cm-selectionMatch { - background: rgba(255, 255, 255, 0.2); - } -} \ No newline at end of file +.cm-editor .cm-search input[type='checkbox']:focus-visible { + outline: 2px solid var(--flash); +} From 1b6ac6af2b87e65e7f710fc2129f418c79c2df31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=BDanas=20Stundys?= <40335772+zstundys@users.noreply.github.com> Date: Tue, 2 May 2023 10:38:12 +0300 Subject: [PATCH 003/106] docs: remove alert about the page store (#375) Already covered in a previous chapter "Part 3 / Stores / page" --- .../09-errors-and-redirects/02-error-pages/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/content/tutorial/03-sveltekit/09-errors-and-redirects/02-error-pages/README.md b/content/tutorial/03-sveltekit/09-errors-and-redirects/02-error-pages/README.md index 544d777e5..7465985cd 100644 --- a/content/tutorial/03-sveltekit/09-errors-and-redirects/02-error-pages/README.md +++ b/content/tutorial/03-sveltekit/09-errors-and-redirects/02-error-pages/README.md @@ -19,8 +19,6 @@ The default error page is somewhat bland. We can customize it by creating a `src ``` -> We're using the `page` store, which we'll learn more about in a later chapter. - Notice that the `+error.svelte` component is rendered inside the root `+layout.svelte`. We can create more granular `+error.svelte` boundaries: ```svelte From 3e10f22493e2e07e2f7ffd761fe2f585c8550a23 Mon Sep 17 00:00:00 2001 From: Alexey Zaytsev Date: Thu, 4 May 2023 15:00:01 +0700 Subject: [PATCH 004/106] Update file name App.svelte -> +page.svelte (#380) --- .../03-sveltekit/06-forms/05-customizing-use-enhance/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/tutorial/03-sveltekit/06-forms/05-customizing-use-enhance/README.md b/content/tutorial/03-sveltekit/06-forms/05-customizing-use-enhance/README.md index a29366f18..3e8e0e82d 100644 --- a/content/tutorial/03-sveltekit/06-forms/05-customizing-use-enhance/README.md +++ b/content/tutorial/03-sveltekit/06-forms/05-customizing-use-enhance/README.md @@ -67,7 +67,7 @@ When we create or delete items, it now takes a full second before the UI updates We can then show a message while we're saving data: ```svelte -/// file: App.svelte +/// file: src/routes/+page.svelte
From b424e1b9b009e3193f82f504d90a1311166403f3 Mon Sep 17 00:00:00 2001 From: Moritz Hertler Date: Thu, 4 May 2023 10:13:08 +0200 Subject: [PATCH 005/106] Fix typo in handleerror lesson (#378) you way want to -> you may want to --- .../04-advanced-sveltekit/01-hooks/04-handleerror/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/tutorial/04-advanced-sveltekit/01-hooks/04-handleerror/README.md b/content/tutorial/04-advanced-sveltekit/01-hooks/04-handleerror/README.md index b9396e9aa..304b0a8da 100644 --- a/content/tutorial/04-advanced-sveltekit/01-hooks/04-handleerror/README.md +++ b/content/tutorial/04-advanced-sveltekit/01-hooks/04-handleerror/README.md @@ -24,7 +24,7 @@ Notice that we're _not_ showing the error message to the user. That's because er } ``` -In some situations you way want to customise this object. To do so, you can return an object from `handleError`: +In some situations you may want to customise this object. To do so, you can return an object from `handleError`: ```js /// file: src/hooks.server.js @@ -49,4 +49,4 @@ You can now reference properties other than `message` in a custom error page. Cr

{$page.status}

{$page.error.message}

error code: {$page.error.code}

-``` \ No newline at end of file +``` From f6a7000d1abfbe99ab5dd8a1cb76c5866bbd0d35 Mon Sep 17 00:00:00 2001 From: tomoam <29677552+tomoam@users.noreply.github.com> Date: Thu, 4 May 2023 17:19:26 +0900 Subject: [PATCH 006/106] fix: correct display for warnings (#376) fixes #322 --- content/tutorial/common/src/__client.js | 4 -- content/tutorial/common/svelte.config.js | 9 ++-- src/lib/client/adapters/webcontainer/index.js | 50 ++++++++++++++++++- src/routes/tutorial/[slug]/Editor.svelte | 3 +- src/routes/tutorial/[slug]/Output.svelte | 6 --- src/routes/tutorial/[slug]/adapter.js | 5 +- src/routes/tutorial/[slug]/state.js | 3 -- 7 files changed, 60 insertions(+), 20 deletions(-) diff --git a/content/tutorial/common/src/__client.js b/content/tutorial/common/src/__client.js index f0116998a..06d49d7b4 100644 --- a/content/tutorial/common/src/__client.js +++ b/content/tutorial/common/src/__client.js @@ -97,8 +97,4 @@ if (import.meta.hot) { import.meta.hot.on('vite:beforeUpdate', (event) => { post({ type: 'hmr', data: event.updates }); }); - - import.meta.hot.on('svelte:warnings', (data) => { - post({ type: 'warnings', data }); - }); } diff --git a/content/tutorial/common/svelte.config.js b/content/tutorial/common/svelte.config.js index 7be8a9694..d2deb768b 100644 --- a/content/tutorial/common/svelte.config.js +++ b/content/tutorial/common/svelte.config.js @@ -8,10 +8,11 @@ const config = { }, vitePlugin: { - experimental: { - // This feature enables compile-time warnings to be - // visible in the learn.svelte.dev editor - sendWarningsToBrowser: true + // This enables compile-time warnings to be + // visible in the learn.svelte.dev editor + onwarn: (warning, defaultHandler) => { + console.log('svelte:warnings:%s', JSON.stringify(warning)); + defaultHandler(warning); } } }; diff --git a/src/lib/client/adapters/webcontainer/index.js b/src/lib/client/adapters/webcontainer/index.js index 701ad8aca..f3e2f4cb1 100644 --- a/src/lib/client/adapters/webcontainer/index.js +++ b/src/lib/client/adapters/webcontainer/index.js @@ -5,6 +5,10 @@ import * as yootils from 'yootils'; import { escape_html, get_depth } from '../../../utils.js'; import { ready } from '../common/index.js'; +/** + * @typedef {import("../../../../routes/tutorial/[slug]/state.js").CompilerWarning} CompilerWarning + */ + const converter = new AnsiToHtml({ fg: 'var(--sk-text-3)' }); @@ -17,9 +21,10 @@ let vm; * @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 * @returns {Promise} */ -export async function create(base, error, progress, logs) { +export async function create(base, error, progress, logs, warnings) { if (/safari/i.test(navigator.userAgent) && !/chrome/i.test(navigator.userAgent)) { throw new Error('WebContainers are not supported by Safari'); } @@ -45,12 +50,40 @@ export async function create(base, error, progress, logs) { } }); + /** @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([]); + + } else if (chunk?.startsWith('svelte:warnings:')) { + /** @type {CompilerWarning} */ + const warn = JSON.parse(chunk.slice(16)); + const current = $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))) { + current.push(warn); + } + + schedule_to_update_warning(100); + } else { const log = converter.toHtml(escape_html(chunk)).replace(/\n/g, '
'); logs.update(($logs) => [...$logs, log]); @@ -154,6 +187,17 @@ export async function create(base, error, progress, logs) { ...force_delete ]; + // initialize warnings of written files + to_write + .filter((stub) => stub.type === 'file' && $warnings[stub.name]) + .forEach((stub) => $warnings[stub.name] = []); + // remove warnings of deleted files + to_delete + .filter((stubname) => $warnings[stubname]) + .forEach((stubname) => delete $warnings[stubname]); + + warnings.set($warnings); + current_stubs = stubs_to_map(stubs); // For some reason, server-ready is fired again when the vite dev server is restarted. @@ -221,6 +265,10 @@ export async function create(base, error, progress, logs) { tree[basename] = to_file(file); + // initialize warnings of this file + $warnings[file.name] = []; + schedule_to_update_warning(100); + await vm.mount(root); current_stubs.set(file.name, file); diff --git a/src/routes/tutorial/[slug]/Editor.svelte b/src/routes/tutorial/[slug]/Editor.svelte index caa01f7bc..982ece3c7 100644 --- a/src/routes/tutorial/[slug]/Editor.svelte +++ b/src/routes/tutorial/[slug]/Editor.svelte @@ -15,7 +15,8 @@ import { HighlightStyle } from '@codemirror/language'; import { syntaxHighlighting } from '@codemirror/language'; import { afterNavigate, beforeNavigate } from '$app/navigation'; - import { files, selected_file, selected_name, update_file, warnings } from './state.js'; + import { files, selected_file, selected_name, update_file } from './state.js'; + import { warnings } from './adapter.js'; import './codemirror.css'; /** @type {HTMLDivElement} */ diff --git a/src/routes/tutorial/[slug]/Output.svelte b/src/routes/tutorial/[slug]/Output.svelte index 3ae01fc91..a633b8d84 100644 --- a/src/routes/tutorial/[slug]/Output.svelte +++ b/src/routes/tutorial/[slug]/Output.svelte @@ -5,7 +5,6 @@ import Chrome from './Chrome.svelte'; import Loading from './Loading.svelte'; import { base, error, logs, progress, subscribe } from './adapter'; - import { warnings } from './state'; /** @type {import('$lib/types').Exercise} */ export let exercise; @@ -63,11 +62,6 @@ }, 1000); } else if (e.data.type === 'ping-pause') { clearTimeout(timeout); - } else if (e.data.type === 'warnings') { - warnings.update(($warnings) => ({ - ...$warnings, - [e.data.data.normalizedFilename]: e.data.data.allWarnings - })); } } diff --git a/src/routes/tutorial/[slug]/adapter.js b/src/routes/tutorial/[slug]/adapter.js index 27057dab4..cca55d3ad 100644 --- a/src/routes/tutorial/[slug]/adapter.js +++ b/src/routes/tutorial/[slug]/adapter.js @@ -15,6 +15,9 @@ export const error = writable(null); /** @type {import('svelte/store').Writable} */ export const logs = writable([]); +/** @type {import('svelte/store').Writable>} */ +export const warnings = writable({}); + /** @type {Promise} */ let ready = new Promise(() => {}); @@ -22,7 +25,7 @@ if (browser) { ready = new Promise(async (fulfil, reject) => { try { const module = await import('$lib/client/adapters/webcontainer/index.js'); - const adapter = await module.create(base, error, progress, logs); + const adapter = await module.create(base, error, progress, logs, warnings); fulfil(adapter); } catch (error) { diff --git a/src/routes/tutorial/[slug]/state.js b/src/routes/tutorial/[slug]/state.js index ba74403f4..629a4d863 100644 --- a/src/routes/tutorial/[slug]/state.js +++ b/src/routes/tutorial/[slug]/state.js @@ -25,9 +25,6 @@ export const files = writable([]); /** @type {Writable>} */ export const solution = writable({}); -/** @type {Writable>} */ -export const warnings = writable({}); - /** @type {Writable<{ parent: string, type: 'file' | 'directory' } | null>} */ export const creating = writable(null); From b76ff523cb042dd454b7c9a0dee68f415126fb39 Mon Sep 17 00:00:00 2001 From: tomoam <29677552+tomoam@users.noreply.github.com> Date: Thu, 4 May 2023 22:42:10 +0900 Subject: [PATCH 007/106] fix: contrast of diff display in dark mode (#381) Fixes #377 --- src/routes/tutorial/[slug]/Sidebar.svelte | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/routes/tutorial/[slug]/Sidebar.svelte b/src/routes/tutorial/[slug]/Sidebar.svelte index de958f24b..21f70752c 100644 --- a/src/routes/tutorial/[slug]/Sidebar.svelte +++ b/src/routes/tutorial/[slug]/Sidebar.svelte @@ -142,6 +142,10 @@ --color: rgba(255, 0, 0, 0.1); } + :global(body.dark) .text :global(pre) :global(.highlight.remove) { + --color: rgba(255, 0, 0, 0.27); + } + /** this probably belongs in site-kit */ .text :global(p) :global(a) :global(code) { color: var(--sk-theme-1); From dea7abb9d0dea96d43ca192a0e55f609e8afbbee Mon Sep 17 00:00:00 2001 From: Enrico Sacchetti Date: Thu, 4 May 2023 10:58:48 -0400 Subject: [PATCH 008/106] docs(tutorial): add note on reactive statements (#382) Note to learner that reactive statements run after script code, to complement documentation at https://svelte.dev/docs#component-format-script-3-$-marks-a-statement-as-reactive --- .../01-svelte/02-reactivity/02-reactive-declarations/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/tutorial/01-svelte/02-reactivity/02-reactive-declarations/README.md b/content/tutorial/01-svelte/02-reactivity/02-reactive-declarations/README.md index 16fb5dfb1..a6a1d9dcd 100644 --- a/content/tutorial/01-svelte/02-reactivity/02-reactive-declarations/README.md +++ b/content/tutorial/01-svelte/02-reactivity/02-reactive-declarations/README.md @@ -24,3 +24,5 @@ Let's use `doubled` in our markup: ``` Of course, you could just write `{count * 2}` in the markup instead — you don't have to use reactive values. Reactive values become particularly valuable (no pun intended) when you need to reference them multiple times, or you have values that depend on _other_ reactive values. + +> Note that reactive declarations and statements will run after other script code and before component markup is rendered. From a9c544d4f99389c75686c04cfe4a8ca3daed517c Mon Sep 17 00:00:00 2001 From: JabSYsEmb <32222578+JabSYsEmb@users.noreply.github.com> Date: Mon, 8 May 2023 18:28:43 +0300 Subject: [PATCH 009/106] fix: add style to button and remove unused css (#383) --- .../app-b/src/routes/+page.svelte | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/content/tutorial/03-sveltekit/06-forms/04-progressive-enhancement/app-b/src/routes/+page.svelte b/content/tutorial/03-sveltekit/06-forms/04-progressive-enhancement/app-b/src/routes/+page.svelte index 88dd03d93..02f648ab4 100644 --- a/content/tutorial/03-sveltekit/06-forms/04-progressive-enhancement/app-b/src/routes/+page.svelte +++ b/content/tutorial/03-sveltekit/06-forms/04-progressive-enhancement/app-b/src/routes/+page.svelte @@ -56,7 +56,14 @@ flex: 1; } - .saving { + button { + border: none; + background: url(http://github.com/remove.svg) no-repeat 50% 50%; + background-size: 1rem 1rem; + cursor: pointer; + height: 100%; + aspect-ratio: 1; opacity: 0.5; + transition: opacity 0.2s; } From 436007b59410f91734210a9a2449c6f37d5ea931 Mon Sep 17 00:00:00 2001 From: tomoam <29677552+tomoam@users.noreply.github.com> Date: Thu, 11 May 2023 16:12:46 +0900 Subject: [PATCH 010/106] feat: autocompletion (#384) Fixes part of #291 - {#each}, {#if}, {#await}, {#key} - @html, @debug, @const - data-sveltekit- attributes - on: directives - bind: directives autocompletion of import source has not yet been implemented. --- src/routes/tutorial/[slug]/Editor.svelte | 9 +- src/routes/tutorial/[slug]/autocompletion.js | 235 +++++++++ .../[slug]/autocompletionDataProvider.js | 475 ++++++++++++++++++ 3 files changed, 715 insertions(+), 4 deletions(-) create mode 100644 src/routes/tutorial/[slug]/autocompletion.js create mode 100644 src/routes/tutorial/[slug]/autocompletionDataProvider.js diff --git a/src/routes/tutorial/[slug]/Editor.svelte b/src/routes/tutorial/[slug]/Editor.svelte index 982ece3c7..4778bdcdb 100644 --- a/src/routes/tutorial/[slug]/Editor.svelte +++ b/src/routes/tutorial/[slug]/Editor.svelte @@ -17,6 +17,7 @@ import { afterNavigate, beforeNavigate } from '$app/navigation'; import { files, selected_file, selected_name, update_file } from './state.js'; import { warnings } from './adapter.js'; + import { autocomplete_for_svelte } from './autocompletion.js'; import './codemirror.css'; /** @type {HTMLDivElement} */ @@ -127,16 +128,16 @@ let lang; if (file.name.endsWith('.js') || file.name.endsWith('.json')) { - lang = javascript(); + lang = [javascript()]; } else if (file.name.endsWith('.html')) { - lang = html(); + lang = [html()]; } else if (file.name.endsWith('.svelte')) { - lang = svelte(); + lang = [svelte(), ...autocomplete_for_svelte()]; } state = EditorState.create({ doc: file.contents, - extensions: lang ? [...extensions, lang] : extensions + extensions: lang ? [...extensions, ...lang] : extensions }); editor_states.set(file.name, state); diff --git a/src/routes/tutorial/[slug]/autocompletion.js b/src/routes/tutorial/[slug]/autocompletion.js new file mode 100644 index 000000000..ce9aa0c5c --- /dev/null +++ b/src/routes/tutorial/[slug]/autocompletion.js @@ -0,0 +1,235 @@ +import { svelteLanguage } from '@replit/codemirror-lang-svelte'; +import { javascriptLanguage } from '@codemirror/lang-javascript'; +import { syntaxTree } from '@codemirror/language'; +import { snippetCompletion } from '@codemirror/autocomplete'; +import { + addAttributes, + svelteAttributes, + svelteTags, + sveltekitAttributes, + svelteEvents +} from './autocompletionDataProvider.js'; + +const logic_block_snippets = [ + snippetCompletion('#if ${}}\n\n{/if', { label: '#if', type: 'keyword' }), + snippetCompletion('#each ${} as }\n\n{/each', { + label: '#each', + type: 'keyword' + }), + snippetCompletion('#await ${} then }\n\n{/await', { + label: '#await then', + type: 'keyword' + }), + snippetCompletion('#await ${}}\n\n{:then }\n\n{/await', { + label: '#await :then', + type: 'keyword' + }), + snippetCompletion('#key ${}}\n\n{/key', { label: '#key', type: 'keyword' }) +]; + +const special_tag_snippets = [ + snippetCompletion('@html ${}', { label: '@html', type: 'keyword' }), + snippetCompletion('@debug ${}', { label: '@debug', type: 'keyword' }), + snippetCompletion('@const ${}', { label: '@const', type: 'keyword' }) +]; + +/** + * @param {import('@codemirror/autocomplete').CompletionContext} context + * @param {import("@lezer/common").SyntaxNode} node + */ +function completion_for_block(context, node) { + const prefix = context.state.doc.sliceString(node.from, node.from + 1); + + const from = node.from; + const to = context.pos; + + const type = 'keyword'; + + if (prefix === '/') { + /** @param {string} label */ + const completion = (label) => ({ from, to, options: [{ label, type }], validFor: /^\/\w*$/ }); + + const parent = node.parent; + const block = node.parent?.parent; + + if (parent?.name === 'EachBlockClose' || block?.name === 'EachBlock') { + return completion('/each'); + } else if (parent?.name === 'IfBlockClose' || block?.name === 'IfBlock') { + return completion('/if'); + } else if (parent?.name === 'AwaitBlockClose' || block?.name === 'AwaitBlock') { + return completion('/await'); + } else if (parent?.name === 'KeyBlockClose' || block?.name === 'KeyBlock') { + return completion('/key'); + } + } else if (prefix === ':') { + /** @param {import('@codemirror/autocomplete').Completion[]} options */ + const completion = (options) => ({ from, to, options, validFor: /^\:\w*$/ }); + + const parent = node.parent; + const block = node.parent?.parent; + + if (parent?.name === 'ElseBlock' || block?.name === 'IfBlock') { + return completion([ + { label: ':else', type }, + { label: ':else if ', type } + ]); + } else if (parent?.name === 'ThenBlock' || block?.name === 'AwaitBlock') { + return completion([ + { label: ':then', type }, + { label: ':catch', type } + ]); + } + } else if (prefix === '#') { + return { from, to, options: logic_block_snippets, validFor: /^#(\w)*$/ }; + } else if (prefix === '@') { + return { from, to, options: special_tag_snippets, validFor: /^@(\w)*$/ }; + } + + return null; +} + +const options_for_svelte_events = svelteEvents.map((event) => + snippetCompletion(event.name + '={${}}', { + label: event.name, + info: event.description, + type: 'keyword' + }) +); + +const options_for_sveltekit_attributes = sveltekitAttributes.map((attr) => ({ + label: attr.name, + info: attr.description, + type: 'keyword' +})); + +const options_for_sveltekit_attr_values = sveltekitAttributes.reduce((prev, cur) => { + prev[cur.name] = cur.values.map((value) => ({ label: value.name, type: 'keyword' })); + return prev; +}, /** @type {Record} */ ({})); + +/** + * @param {{ name: string, description?: string}[]} attributes + */ +function snippet_for_attribute(attributes) { + return attributes.map((attr) => + snippetCompletion(attr.name + '={${}}', { + label: attr.name, + info: attr.description, + type: 'keyword' + }) + ); +} + +const options_for_svelte_attributes = snippet_for_attribute(svelteAttributes); + +const options_for_svelte_tags = svelteTags.reduce((tags, tag) => { + tags[tag.name] = snippet_for_attribute(tag.attributes); + return tags; +}, /** @type {Record} */ ({})); + +/** + * @param {import('@codemirror/autocomplete').CompletionContext} context + * @param {import("@lezer/common").SyntaxNode} node + */ +function completion_for_attributes(context, node) { + /** @param {import('@codemirror/autocomplete').Completion[]} options */ + const completion = (options) => { + return { from: node.from, to: context.pos, options, validFor: /^\w*$/ }; + }; + + const global_options = [ + ...options_for_svelte_events, + ...options_for_svelte_attributes, + ...options_for_sveltekit_attributes + ]; + + if (node.parent?.parent?.firstChild?.nextSibling?.name === 'SvelteElementName') { + const tag_node = node.parent.parent.firstChild.nextSibling; + const tag = context.state.doc.sliceString(tag_node.from, tag_node.to); + return completion([...global_options, ...options_for_svelte_tags[tag]]); + } else if (node.parent?.parent?.firstChild?.nextSibling?.name === 'TagName') { + const tag_node = node.parent.parent.firstChild.nextSibling; + const tag = context.state.doc.sliceString(tag_node.from, tag_node.to); + if (addAttributes[tag]) { + const completions_attributes = snippet_for_attribute(addAttributes[tag]); + return completion([...global_options, ...completions_attributes]); + } + } + + return completion(global_options); +} + +/** + * @param {import('@codemirror/autocomplete').CompletionContext} context + * @param {import("@lezer/common").SyntaxNode} node + * @param {string} attr + */ +function completion_for_sveltekit_attr_values(context, node, attr) { + const options = options_for_sveltekit_attr_values[attr]; + if (options) { + return { + from: node.name === 'AttributeValueContent' ? node.from : node.from + 1, + to: context.pos, + options, + validFor: /^\w*$/ + }; + } + + return null; +} + +/** + * @param {import('@codemirror/autocomplete').CompletionContext} context + * @returns {import('@codemirror/autocomplete').CompletionResult | null} + */ +function completion_for_markup(context) { + const node_before = syntaxTree(context.state).resolveInner(context.pos, -1); + + if (node_before.name === 'BlockPrefix') { + return completion_for_block(context, node_before); + } else if (node_before.prevSibling?.name === 'BlockPrefix') { + return completion_for_block(context, node_before.prevSibling); + } else if (node_before.name === 'AttributeName') { + return completion_for_attributes(context, node_before); + } else if ( + node_before.name === 'DirectiveOn' || + node_before.name === 'DirectiveBind' || + node_before.name === 'DirectiveTarget' + ) { + if (node_before.parent) { + return completion_for_attributes(context, node_before.parent); + } + } else if (node_before.parent?.name === 'AttributeValue') { + if (node_before.parent?.parent?.firstChild) { + const attr_name_node = node_before.parent.parent.firstChild; + const attr_name = context.state.doc.sliceString(attr_name_node.from, attr_name_node.to); + + if (attr_name.startsWith('data-sveltekit-')) { + return completion_for_sveltekit_attr_values(context, node_before, attr_name); + } + } + } + + return null; +} + +/** + * @param {import('@codemirror/autocomplete').CompletionContext} context + * @returns {import('@codemirror/autocomplete').CompletionResult | null} + */ +function completion_for_javascript(context) { + // TODO autocompletion for import source + + return null; +} + +export function autocomplete_for_svelte() { + return [ + svelteLanguage.data.of({ + autocomplete: completion_for_markup + }), + javascriptLanguage.data.of({ + autocomplete: completion_for_javascript + }) + ]; +} diff --git a/src/routes/tutorial/[slug]/autocompletionDataProvider.js b/src/routes/tutorial/[slug]/autocompletionDataProvider.js new file mode 100644 index 000000000..d91e627c8 --- /dev/null +++ b/src/routes/tutorial/[slug]/autocompletionDataProvider.js @@ -0,0 +1,475 @@ +/** + * this file is based on [dataProvider.ts from sveltejs/language-tools](https://github.com/sveltejs/language-tools/blob/master/packages/language-server/src/plugins/html/dataProvider.ts) + */ + +export const globalEvents = [ + { name: 'on:abort' }, + { name: 'on:animationcancel' }, + { name: 'on:animationend' }, + { name: 'on:animationiteration' }, + { name: 'on:animationstart' }, + { name: 'on:auxclick' }, + { name: 'on:beforeinput' }, + { name: 'on:blur' }, + { name: 'on:cancel' }, + { name: 'on:canplay' }, + { name: 'on:canplaythrough' }, + { name: 'on:change' }, + { name: 'on:click' }, + { name: 'on:close' }, + { name: 'on:contextmenu' }, + { name: 'on:copy' }, + { name: 'on:cuechange' }, + { name: 'on:cut' }, + { name: 'on:dblclick' }, + { name: 'on:drag' }, + { name: 'on:dragend' }, + { name: 'on:dragenter' }, + { name: 'on:dragleave' }, + { name: 'on:dragover' }, + { name: 'on:dragstart' }, + { name: 'on:drop' }, + { name: 'on:durationchange' }, + { name: 'on:emptied' }, + { name: 'on:ended' }, + { name: 'on:error' }, + { name: 'on:focus' }, + { name: 'on:formdata' }, + { name: 'on:gotpointercapture' }, + { name: 'on:input' }, + { name: 'on:invalid' }, + { name: 'on:keydown' }, + { name: 'on:keypress' }, + { name: 'on:keyup' }, + { name: 'on:load' }, + { name: 'on:loadeddata' }, + { name: 'on:loadedmetadata' }, + { name: 'on:loadstart' }, + { name: 'on:lostpointercapture' }, + { name: 'on:mousedown' }, + { name: 'on:mouseenter' }, + { name: 'on:mouseleave' }, + { name: 'on:mousemove' }, + { name: 'on:mouseout' }, + { name: 'on:mouseover' }, + { name: 'on:mouseup' }, + { name: 'on:paste' }, + { name: 'on:pause' }, + { name: 'on:play' }, + { name: 'on:playing' }, + { name: 'on:pointercancel' }, + { name: 'on:pointerdown' }, + { name: 'on:pointerenter' }, + { name: 'on:pointerleave' }, + { name: 'on:pointermove' }, + { name: 'on:pointerout' }, + { name: 'on:pointerover' }, + { name: 'on:pointerup' }, + { name: 'on:progress' }, + { name: 'on:ratechange' }, + { name: 'on:reset' }, + { name: 'on:resize' }, + { name: 'on:scroll' }, + { name: 'on:securitypolicyviolation' }, + { name: 'on:seeked' }, + { name: 'on:seeking' }, + { name: 'on:select' }, + { name: 'on:selectionchange' }, + { name: 'on:selectstart' }, + { name: 'on:slotchange' }, + { name: 'on:stalled' }, + { name: 'on:submit' }, + { name: 'on:suspend' }, + { name: 'on:timeupdate' }, + { name: 'on:toggle' }, + { name: 'on:touchcancel' }, + { name: 'on:touchend' }, + { name: 'on:touchmove' }, + { name: 'on:touchstart' }, + { name: 'on:transitioncancel' }, + { name: 'on:transitionend' }, + { name: 'on:transitionrun' }, + { name: 'on:transitionstart' }, + { name: 'on:volumechange' }, + { name: 'on:waiting' }, + { name: 'on:webkitanimationend' }, + { name: 'on:webkitanimationiteration' }, + { name: 'on:webkitanimationstart' }, + { name: 'on:webkittransitionend' }, + { name: 'on:wheel' } +]; + +/** @type {{ name: string, description?: string }[]} */ +export const svelteEvents = [ + ...globalEvents, + { + name: 'on:introstart', + description: 'Available when element has transition' + }, + { + name: 'on:introend', + description: 'Available when element has transition' + }, + { + name: 'on:outrostart', + description: 'Available when element has transition' + }, + { + name: 'on:outroend', + description: 'Available when element has transition' + } +]; + +export const svelteAttributes = [ + { + name: 'bind:innerHTML', + description: 'Available when contenteditable=true' + }, + { + name: 'bind:textContent', + description: 'Available when contenteditable=true' + }, + { + name: 'bind:innerText', + description: 'Available when contenteditable=true' + }, + { + name: 'bind:clientWidth', + description: 'Available for block level elements. (read-only)' + }, + { + name: 'bind:clientHeight', + description: 'Available for block level elements. (read-only)' + }, + { + name: 'bind:offsetWidth', + description: 'Available for block level elements. (read-only)' + }, + { + name: 'bind:offsetHeight', + description: 'Available for block level elements. (read-only)' + }, + { + name: 'bind:this', + description: + 'To get a reference to a DOM node, use bind:this. If used on a component, gets a reference to that component instance.' + } +]; + +export const sveltekitAttributes = [ + { + name: 'data-sveltekit-keepfocus', + description: + 'SvelteKit-specific attribute. Currently focused element will retain focus after navigation. Otherwise, focus will be reset to the body.', + valueSet: 'v', + values: [{ name: 'off' }] + }, + { + name: 'data-sveltekit-noscroll', + description: 'SvelteKit-specific attribute. Will prevent scrolling after the link is clicked.', + valueSet: 'v', + values: [{ name: 'off' }] + }, + { + name: 'data-sveltekit-preload-code', + description: + "SvelteKit-specific attribute. Will cause SvelteKit to run the page's load function as soon as the user hovers over the link (on a desktop) or touches it (on mobile), rather than waiting for the click event to trigger navigation.", + valueSet: 'v', + values: [ + { name: 'eager' }, + { name: 'viewport' }, + { name: 'hover' }, + { name: 'tap' }, + { name: 'off' } + ] + }, + { + name: 'data-sveltekit-preload-data', + description: + "SvelteKit-specific attribute. Will cause SvelteKit to run the page's load function as soon as the user hovers over the link (on a desktop) or touches it (on mobile), rather than waiting for the click event to trigger navigation.", + valueSet: 'v', + values: [{ name: 'hover' }, { name: 'tap' }, { name: 'off' }] + }, + { + name: 'data-sveltekit-reload', + description: + 'SvelteKit-specific attribute. Will cause SvelteKit to do a normal browser navigation which results in a full page reload.', + valueSet: 'v', + values: [{ name: 'off' }] + }, + { + name: 'data-sveltekit-replacestate', + description: + 'SvelteKit-specific attribute. Will replace the current `history` entry rather than creating a new one with `pushState` when the link is clicked.', + valueSet: 'v', + values: [{ name: 'off' }] + } +]; + +export const svelteTags = [ + { + name: 'svelte:self', + description: + 'Allows a component to include itself, recursively.\n\nIt cannot appear at the top level of your markup; it must be inside an if or each block to prevent an infinite loop.', + attributes: [] + }, + { + name: 'svelte:component', + description: + 'Renders a component dynamically, using the component constructor specified as the this property. When the property changes, the component is destroyed and recreated.\n\nIf this is falsy, no component is rendered.', + attributes: [ + { + name: 'this', + description: + 'Component to render.\n\nWhen this property changes, the component is destroyed and recreated.\nIf this is falsy, no component is rendered.' + } + ] + }, + { + name: 'svelte:element', + description: + 'Renders a DOM element dynamically, using the string as the this property. When the property changes, the element is destroyed and recreated.\n\nIf this is falsy, no element is rendered.', + attributes: [ + { + name: 'this', + description: + 'DOM element to render.\n\nWhen this property changes, the element is destroyed and recreated.\nIf this is falsy, no element is rendered.' + } + ] + }, + { + name: 'svelte:window', + description: + 'Allows you to add event listeners to the window object without worrying about removing them when the component is destroyed, or checking for the existence of window when server-side rendering.', + attributes: [ + { + name: 'bind:innerWidth', + description: 'Bind to the inner width of the window. (read-only)' + }, + { + name: 'bind:innerHeight', + description: 'Bind to the inner height of the window. (read-only)' + }, + { + name: 'bind:outerWidth', + description: 'Bind to the outer width of the window. (read-only)' + }, + { + name: 'bind:outerHeight', + description: 'Bind to the outer height of the window. (read-only)' + }, + { + name: 'bind:scrollX', + description: 'Bind to the scroll x position of the window.' + }, + { + name: 'bind:scrollY', + description: 'Bind to the scroll y position of the window.' + }, + { + name: 'bind:online', + description: 'An alias for window.navigator.onLine' + }, + // window events + { name: 'on:afterprint' }, + { name: 'on:beforeprint' }, + { name: 'on:beforeunload' }, + { name: 'on:gamepadconnected' }, + { name: 'on:gamepaddisconnected' }, + { name: 'on:hashchange' }, + { name: 'on:languagechange' }, + { name: 'on:message' }, + { name: 'on:messageerror' }, + { name: 'on:offline' }, + { name: 'on:online' }, + { name: 'on:pagehide' }, + { name: 'on:pageshow' }, + { name: 'on:popstate' }, + { name: 'on:rejectionhandled' }, + { name: 'on:storage' }, + { name: 'on:unhandledrejection' }, + { name: 'on:unload' } + ] + }, + { + name: 'svelte:document', + description: + "As with , this element allows you to add listeners to events on document, such as visibilitychange, which don't fire on window.", + attributes: [ + // document events + { name: 'on:fullscreenchange' }, + { name: 'on:fullscreenerror' }, + { name: 'on:pointerlockchange' }, + { name: 'on:pointerlockerror' }, + { name: 'on:readystatechange' }, + { name: 'on:visibilitychange' } + ] + }, + { + name: 'svelte:body', + description: + "As with , this element allows you to add listeners to events on document.body, such as mouseenter and mouseleave which don't fire on window.", + attributes: [] + }, + { + name: 'svelte:head', + description: + 'This element makes it possible to insert elements into document.head. During server-side rendering, head content exposed separately to the main html content.', + attributes: [] + }, + { + name: 'svelte:options', + description: 'Provides a place to specify per-component compiler options', + attributes: [ + { + name: 'immutable', + description: + 'If true, tells the compiler that you promise not to mutate any objects. This allows it to be less conservative about checking whether values have changed.', + values: [ + { + name: '{true}', + description: + 'You never use mutable data, so the compiler can do simple referential equality checks to determine if values have changed' + }, + { + name: '{false}', + description: + 'The default. Svelte will be more conservative about whether or not mutable objects have changed' + } + ] + }, + { + name: 'accessors', + description: + "If true, getters and setters will be created for the component's props. If false, they will only be created for readonly exported values (i.e. those declared with const, class and function). If compiling with customElement: true this option defaults to true.", + values: [ + { + name: '{true}', + description: "Adds getters and setters for the component's props" + }, + { + name: '{false}', + description: 'The default.' + } + ] + }, + { + name: 'namespace', + description: 'The namespace where this component will be used, most commonly "svg"' + }, + { + name: 'tag', + description: 'The name to use when compiling this component as a custom element' + } + ] + }, + { + name: 'svelte:fragment', + description: + 'This element is useful if you want to assign a component to a named slot without creating a wrapper DOM element.', + attributes: [ + { + name: 'slot', + description: 'The name of the named slot that should be targeted.' + } + ] + }, + { + name: 'slot', + description: + 'Components can have child content, in the same way that elements can.\n\nThe content is exposed in the child component using the element, which can contain fallback content that is rendered if no children are provided.', + attributes: [ + { + name: 'name', + description: + 'Named slots allow consumers to target specific areas. They can also have fallback content.' + } + ] + } +]; + +const mediaAttributes = [ + { + name: 'bind:duration', + description: 'The total duration of the video, in seconds. (readonly)' + }, + { + name: 'bind:buffered', + description: 'An array of {start, end} objects. (readonly)' + }, + { + name: 'bind:seekable', + description: 'An array of {start, end} objects. (readonly)' + }, + { + name: 'bind:played', + description: 'An array of {start, end} objects. (readonly)' + }, + { + name: 'bind:seeking', + description: 'boolean. (readonly)' + }, + { + name: 'bind:ended', + description: 'boolean. (readonly)' + }, + { + name: 'bind:currentTime', + description: 'The current point in the video, in seconds.' + }, + { + name: 'bind:playbackRate', + description: "how fast or slow to play the video, where 1 is 'normal'" + }, + { + name: 'bind:paused' + }, + { + name: 'bind:volume', + description: 'A value between 0 and 1' + }, + { + name: 'bind:muted' + }, + { + name: 'bind:readyState' + } +]; + +const videoAttributes = [ + { + name: 'bind:videoWidth', + description: 'readonly' + }, + { + name: 'bind:videoHeight', + description: 'readonly' + } +]; + +const indeterminateAttribute = { + name: 'indeterminate', + description: 'Available for type="checkbox"' +}; + +/** @type {Record} */ +export const addAttributes = { + select: [{ name: 'bind:value' }], + input: [ + { name: 'bind:value' }, + { name: 'bind:group', description: 'Available for type="radio" and type="checkbox"' }, + { name: 'bind:checked', description: 'Available for type="checkbox"' }, + { name: 'bind:files', description: 'Available for type="file" (readonly)' }, + indeterminateAttribute, + { ...indeterminateAttribute, name: 'bind:indeterminate' } + ], + img: [{ name: 'bind:naturalWidth' }, { name: 'bind:naturalHeight' }], + textarea: [{ name: 'bind:value' }], + video: [...mediaAttributes, ...videoAttributes], + audio: [...mediaAttributes], + details: [ + { + name: 'bind:open' + } + ] +}; From ef74eac3fd9e016d5828d014bafe57ab250480f0 Mon Sep 17 00:00:00 2001 From: tomoam <29677552+tomoam@users.noreply.github.com> Date: Thu, 11 May 2023 16:29:37 +0900 Subject: [PATCH 011/106] fix: correct behaviour when .env file is updated or removed (#363) Fixes #341 This PR fixes the behavior of .env files when they are updated and when they are deleted, and includes the mechanism shown in #341 --- src/lib/client/adapters/webcontainer/index.js | 101 ++++++++++++------ 1 file changed, 66 insertions(+), 35 deletions(-) diff --git a/src/lib/client/adapters/webcontainer/index.js b/src/lib/client/adapters/webcontainer/index.js index f3e2f4cb1..eb204ca26 100644 --- a/src/lib/client/adapters/webcontainer/index.js +++ b/src/lib/client/adapters/webcontainer/index.js @@ -32,6 +32,8 @@ export async function create(base, error, progress, logs, warnings) { progress.set({ value: 0, text: 'loading files' }); const q = yootils.queue(1); + /** @type {Map>} */ + const q_per_file = new Map(); /** Paths and contents of the currently loaded file stubs */ let current_stubs = stubs_to_map([]); @@ -203,25 +205,9 @@ export async function create(base, error, progress, logs, warnings) { // 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(will_restart_vite_dev_server); - const promise = will_restart - ? new Promise((fulfil, reject) => { - const error_unsub = vm.on('error', (error) => { - error_unsub(); - reject(new Error(error.message)); - }); - - const ready_unsub = vm.on('server-ready', (port, base) => { - ready_unsub(); - console.log(`server ready on port ${port} at ${performance.now()}: ${base}`); - fulfil(undefined); - }); - - setTimeout(() => { - reject(new Error('Timed out resetting WebContainer')); - }, 10000); - }) - : Promise.resolve(); + 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) { await vm.fs.rm(file, { force: true, recursive: true }); @@ -241,6 +227,15 @@ 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]); + return q.add(async () => { /** @type {import('@webcontainer/api').FileSystemTree} */ const root = {}; @@ -263,22 +258,35 @@ export async function create(base, error, progress, logs, warnings) { tree = /** @type {import('@webcontainer/api').DirectoryNode} */ (tree[part]).directory; } - tree[basename] = to_file(file); + const will_restart = is_config(file); + + while (queue && queue.length > 0) { - // initialize warnings of this file - $warnings[file.name] = []; - schedule_to_update_warning(100); + // 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 - await vm.mount(root); + tree[basename] = to_file(file); - current_stubs.set(file.name, file); + // initialize warnings of this file + $warnings[file.name] = []; + schedule_to_update_warning(100); + + await vm.mount(root); + + if (will_restart) await wait_for_restart_vite(); + + current_stubs.set(file.name, file); + + // we need to stagger sequential updates, just enough that the HMR + // wires don't get crossed. 50ms seems to be enough of a delay + // to avoid glitches without noticeably affecting update speed + await new Promise((f) => setTimeout(f, 50)); + } - // we need to stagger sequential updates, just enough that the HMR - // wires don't get crossed. 50ms seems to be enough of a delay - // to avoid glitches without noticeably affecting update speed - await new Promise((f) => setTimeout(f, 50)); + q_per_file.delete(file.name) - return will_restart_vite_dev_server(file); + return will_restart; }); } }; @@ -287,11 +295,34 @@ export async function create(base, error, progress, logs, warnings) { /** * @param {import('$lib/types').Stub} file */ -function will_restart_vite_dev_server(file) { - return ( - file.type === 'file' && - (file.name === '/vite.config.js' || file.name === '/svelte.config.js' || file.name === '/.env') - ); +function is_config(file) { + return file.type === 'file' && is_config_path(file.name); +} + +/** + * @param {string} path + */ +function is_config_path(path) { + return ['/vite.config.js', '/svelte.config.js', '/.env'].includes(path); +} + +function wait_for_restart_vite() { + return new Promise((fulfil, reject) => { + const error_unsub = vm.on('error', (error) => { + error_unsub(); + reject(new Error(error.message)); + }); + + const ready_unsub = vm.on('server-ready', (port, base) => { + ready_unsub(); + console.log(`server ready on port ${port} at ${performance.now()}: ${base}`); + fulfil(undefined); + }); + + setTimeout(() => { + reject(new Error('Timed out resetting WebContainer')); + }, 10000); + }); } /** From 1cb7d1cf599487e2b69e195ef7b1ceea0bef62fc Mon Sep 17 00:00:00 2001 From: tomoam <29677552+tomoam@users.noreply.github.com> Date: Thu, 11 May 2023 20:54:03 +0900 Subject: [PATCH 012/106] chore: safari support (#385) #306 --- src/lib/client/adapters/webcontainer/index.js | 5 ++-- src/lib/client/adapters/webcontainer/utils.js | 30 +++++++++++++++++++ src/routes/tutorial/[slug]/Loading.svelte | 4 ++- 3 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 src/lib/client/adapters/webcontainer/utils.js diff --git a/src/lib/client/adapters/webcontainer/index.js b/src/lib/client/adapters/webcontainer/index.js index eb204ca26..3b98cd5ca 100644 --- a/src/lib/client/adapters/webcontainer/index.js +++ b/src/lib/client/adapters/webcontainer/index.js @@ -4,6 +4,7 @@ import AnsiToHtml from 'ansi-to-html'; import * as yootils from 'yootils'; import { escape_html, get_depth } from '../../../utils.js'; import { ready } from '../common/index.js'; +import { isWebContainerSupported } from './utils.js'; /** * @typedef {import("../../../../routes/tutorial/[slug]/state.js").CompilerWarning} CompilerWarning @@ -25,8 +26,8 @@ let vm; * @returns {Promise} */ export async function create(base, error, progress, logs, warnings) { - if (/safari/i.test(navigator.userAgent) && !/chrome/i.test(navigator.userAgent)) { - throw new Error('WebContainers are not supported by Safari'); + if (!isWebContainerSupported()) { + throw new Error('WebContainers are not supported by Safari 16.3 or earlier'); } progress.set({ value: 0, text: 'loading files' }); diff --git a/src/lib/client/adapters/webcontainer/utils.js b/src/lib/client/adapters/webcontainer/utils.js new file mode 100644 index 000000000..1d6c6a569 --- /dev/null +++ b/src/lib/client/adapters/webcontainer/utils.js @@ -0,0 +1,30 @@ +/** + * Checks if WebContainer is supported on the current browser. + * This function is borrowed from [stackblitz/webcontainer-docs](https://github.com/stackblitz/webcontainer-docs/blob/369dd58b2749b085ed7642f22108a9bcbcd68fc4/docs/.vitepress/theme/components/Examples/WCEmbed/utils.ts#L4-L29) + */ +export function isWebContainerSupported() { + const hasSharedArrayBuffer = 'SharedArrayBuffer' in window; + const looksLikeChrome = navigator.userAgent.toLowerCase().includes('chrome'); + const looksLikeFirefox = navigator.userAgent.includes('Firefox'); + const looksLikeSafari = navigator.userAgent.includes('Safari'); + + if (hasSharedArrayBuffer && (looksLikeChrome || looksLikeFirefox)) { + return true; + } + + if (hasSharedArrayBuffer && looksLikeSafari) { + // we only support Safari 16.4 and up so we check for the version here + const match = navigator.userAgent.match(/Version\/(\d+)\.(\d+) (?:Mobile\/.*?)?Safari/); + const majorVersion = match ? Number(match?.[1]) : 0; + const minorVersion = match ? Number(match?.[2]) : 0; + + return majorVersion > 16 || (majorVersion === 16 && minorVersion >= 4); + } + + // Allow overriding the support check with localStorage.webcontainer_any_ua = 1 + try { + return Boolean(localStorage.getItem('webcontainer_any_ua')); + } catch { + return false; + } +} diff --git a/src/routes/tutorial/[slug]/Loading.svelte b/src/routes/tutorial/[slug]/Loading.svelte index cddea05a3..7563a6514 100644 --- a/src/routes/tutorial/[slug]/Loading.svelte +++ b/src/routes/tutorial/[slug]/Loading.svelte @@ -1,4 +1,6 @@ diff --git a/jsconfig.json b/jsconfig.json index 8da51681b..2bef324e1 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -6,7 +6,7 @@ "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "lib": ["es2020", "DOM"], - "moduleResolution": "node", + "moduleResolution": "bundler", "module": "es2022", "resolveJsonModule": true, "skipLibCheck": true, diff --git a/package.json b/package.json index 91789b7b7..3d6a9522c 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "@playwright/test": "^1.31.2", "@sveltejs/adapter-vercel": "2.3.1", "@sveltejs/kit": "^1.15.4", - "@sveltejs/site-kit": "^4.0.1", + "@sveltejs/site-kit": "^5.0.4", "@types/diff": "^5.0.2", "@types/marked": "^4.0.8", "@types/prismjs": "^1.26.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 80b24323d..3e3aa4ccd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,106 +1,150 @@ -lockfileVersion: 5.4 - -specifiers: - '@codemirror/autocomplete': ^6.4.2 - '@codemirror/commands': ^6.2.2 - '@codemirror/lang-css': ^6.1.1 - '@codemirror/lang-html': ^6.4.2 - '@codemirror/lang-javascript': ^6.1.4 - '@codemirror/language': ^6.6.0 - '@codemirror/lint': ^6.2.0 - '@codemirror/search': ^6.3.0 - '@codemirror/state': ^6.2.0 - '@codemirror/view': ^6.9.2 - '@fontsource/roboto-mono': ^4.5.10 - '@lezer/common': ^1.0.2 - '@lezer/highlight': ^1.1.3 - '@lezer/javascript': ^1.4.1 - '@lezer/lr': ^1.3.3 - '@playwright/test': ^1.31.2 - '@replit/codemirror-lang-svelte': ^6.0.0 - '@replit/codemirror-vim': ^6.0.9 - '@rich_harris/svelte-split-pane': ^1.1.0 - '@sveltejs/adapter-vercel': 2.3.1 - '@sveltejs/kit': ^1.15.4 - '@sveltejs/site-kit': ^4.0.1 - '@types/diff': ^5.0.2 - '@types/marked': ^4.0.8 - '@types/prismjs': ^1.26.0 - '@types/ws': ^8.5.4 - '@webcontainer/api': ^1.1.0 - adm-zip: ^0.5.10 - ansi-to-html: ^0.7.2 - base64-js: ^1.5.1 - codemirror: ^6.0.1 - diff: ^5.1.0 - esbuild: ^0.17.12 - marked: ^4.2.12 - port-authority: ^2.0.1 - prettier: ^2.8.5 - prettier-plugin-svelte: ^2.9.0 - prism-svelte: ^0.5.0 - prismjs: ^1.29.0 - svelte: ^3.57.0 - svelte-check: ^3.1.4 - tiny-glob: ^0.2.9 - typescript: ~4.9.5 - vite: ^4.2.1 - ws: ^8.13.0 - yootils: ^0.3.1 +lockfileVersion: '6.0' dependencies: - '@codemirror/autocomplete': 6.4.2_lc2v3dpzp2l5pdzwtgfaudkm3e - '@codemirror/commands': 6.2.2 - '@codemirror/lang-css': 6.1.1_i3aqn63zftbgivbr4riltn5mqe - '@codemirror/lang-html': 6.4.2 - '@codemirror/lang-javascript': 6.1.4 - '@codemirror/language': 6.6.0 - '@codemirror/lint': 6.2.0 - '@codemirror/search': 6.3.0 - '@codemirror/state': 6.2.0 - '@codemirror/view': 6.9.2 - '@fontsource/roboto-mono': 4.5.10 - '@lezer/common': 1.0.2 - '@lezer/highlight': 1.1.3 - '@lezer/javascript': 1.4.1 - '@lezer/lr': 1.3.3 - '@replit/codemirror-lang-svelte': 6.0.0_ybny7xhlf2ysg4majw54z4nkly - '@replit/codemirror-vim': 6.0.11_43oovqgcdaxzhub7wnzsdexoq4 - '@rich_harris/svelte-split-pane': 1.1.0_svelte@3.57.0 - '@webcontainer/api': 1.1.0 - adm-zip: 0.5.10 - ansi-to-html: 0.7.2 - base64-js: 1.5.1 - codemirror: 6.0.1_@lezer+common@1.0.2 - marked: 4.2.12 - port-authority: 2.0.1 - prism-svelte: 0.5.0 - prismjs: 1.29.0 - ws: 8.13.0 - yootils: 0.3.1 + '@codemirror/autocomplete': + specifier: ^6.4.2 + version: 6.4.2(@codemirror/language@6.6.0)(@codemirror/state@6.2.0)(@codemirror/view@6.9.2)(@lezer/common@1.0.2) + '@codemirror/commands': + specifier: ^6.2.2 + version: 6.2.2 + '@codemirror/lang-css': + specifier: ^6.1.1 + version: 6.1.1(@codemirror/view@6.9.2)(@lezer/common@1.0.2) + '@codemirror/lang-html': + specifier: ^6.4.2 + version: 6.4.2 + '@codemirror/lang-javascript': + specifier: ^6.1.4 + version: 6.1.4 + '@codemirror/language': + specifier: ^6.6.0 + version: 6.6.0 + '@codemirror/lint': + specifier: ^6.2.0 + version: 6.2.0 + '@codemirror/search': + specifier: ^6.3.0 + version: 6.3.0 + '@codemirror/state': + specifier: ^6.2.0 + version: 6.2.0 + '@codemirror/view': + specifier: ^6.9.2 + version: 6.9.2 + '@fontsource/roboto-mono': + specifier: ^4.5.10 + version: 4.5.10 + '@lezer/common': + specifier: ^1.0.2 + version: 1.0.2 + '@lezer/highlight': + specifier: ^1.1.3 + version: 1.1.3 + '@lezer/javascript': + specifier: ^1.4.1 + version: 1.4.1 + '@lezer/lr': + specifier: ^1.3.3 + version: 1.3.3 + '@replit/codemirror-lang-svelte': + specifier: ^6.0.0 + version: 6.0.0(@codemirror/autocomplete@6.4.2)(@codemirror/lang-css@6.1.1)(@codemirror/lang-html@6.4.2)(@codemirror/lang-javascript@6.1.4)(@codemirror/language@6.6.0)(@codemirror/state@6.2.0)(@codemirror/view@6.9.2)(@lezer/common@1.0.2)(@lezer/highlight@1.1.3)(@lezer/javascript@1.4.1)(@lezer/lr@1.3.3) + '@replit/codemirror-vim': + specifier: ^6.0.9 + version: 6.0.11(@codemirror/commands@6.2.2)(@codemirror/language@6.6.0)(@codemirror/search@6.3.0)(@codemirror/state@6.2.0)(@codemirror/view@6.9.2) + '@rich_harris/svelte-split-pane': + specifier: ^1.1.0 + version: 1.1.0(svelte@3.57.0) + '@webcontainer/api': + specifier: ^1.1.0 + version: 1.1.0 + adm-zip: + specifier: ^0.5.10 + version: 0.5.10 + ansi-to-html: + specifier: ^0.7.2 + version: 0.7.2 + base64-js: + specifier: ^1.5.1 + version: 1.5.1 + codemirror: + specifier: ^6.0.1 + version: 6.0.1(@lezer/common@1.0.2) + marked: + specifier: ^4.2.12 + version: 4.2.12 + port-authority: + specifier: ^2.0.1 + version: 2.0.1 + prism-svelte: + specifier: ^0.5.0 + version: 0.5.0 + prismjs: + specifier: ^1.29.0 + version: 1.29.0 + ws: + specifier: ^8.13.0 + version: 8.13.0 + yootils: + specifier: ^0.3.1 + version: 0.3.1 devDependencies: - '@playwright/test': 1.31.2 - '@sveltejs/adapter-vercel': 2.3.1_@sveltejs+kit@1.15.4 - '@sveltejs/kit': 1.15.4_svelte@3.57.0+vite@4.2.1 - '@sveltejs/site-kit': 4.0.1_xkykli67bxy2y63jc6hpwzmwjy - '@types/diff': 5.0.2 - '@types/marked': 4.0.8 - '@types/prismjs': 1.26.0 - '@types/ws': 8.5.4 - diff: 5.1.0 - esbuild: 0.17.12 - prettier: 2.8.5 - prettier-plugin-svelte: 2.9.0_olnlr4336c4vkm7c26l3r45yii - svelte: 3.57.0 - svelte-check: 3.1.4_svelte@3.57.0 - tiny-glob: 0.2.9 - typescript: 4.9.5 - vite: 4.2.1 + '@playwright/test': + specifier: ^1.31.2 + version: 1.31.2 + '@sveltejs/adapter-vercel': + specifier: 2.3.1 + version: 2.3.1(@sveltejs/kit@1.15.4) + '@sveltejs/kit': + specifier: ^1.15.4 + version: 1.15.4(svelte@3.57.0)(vite@4.2.1) + '@sveltejs/site-kit': + specifier: ^5.0.4 + version: 5.0.4(@sveltejs/kit@1.15.4)(svelte@3.57.0) + '@types/diff': + specifier: ^5.0.2 + version: 5.0.2 + '@types/marked': + specifier: ^4.0.8 + version: 4.0.8 + '@types/prismjs': + specifier: ^1.26.0 + version: 1.26.0 + '@types/ws': + specifier: ^8.5.4 + version: 8.5.4 + diff: + specifier: ^5.1.0 + version: 5.1.0 + esbuild: + specifier: ^0.17.12 + version: 0.17.12 + prettier: + specifier: ^2.8.5 + version: 2.8.5 + prettier-plugin-svelte: + specifier: ^2.9.0 + version: 2.9.0(prettier@2.8.5)(svelte@3.57.0) + svelte: + specifier: ^3.57.0 + version: 3.57.0 + svelte-check: + specifier: ^3.1.4 + version: 3.1.4(svelte@3.57.0) + tiny-glob: + specifier: ^0.2.9 + version: 0.2.9 + typescript: + specifier: ~4.9.5 + version: 4.9.5 + vite: + specifier: ^4.2.1 + version: 4.2.1 packages: - /@codemirror/autocomplete/6.4.2_lc2v3dpzp2l5pdzwtgfaudkm3e: + /@codemirror/autocomplete@6.4.2(@codemirror/language@6.6.0)(@codemirror/state@6.2.0)(@codemirror/view@6.9.2)(@lezer/common@1.0.2): resolution: {integrity: sha512-8WE2xp+D0MpWEv5lZ6zPW1/tf4AGb358T5GWYiKEuCP8MvFfT3tH2mIF9Y2yr2e3KbHuSvsVhosiEyqCpiJhZQ==} peerDependencies: '@codemirror/language': ^6.0.0 @@ -114,7 +158,7 @@ packages: '@lezer/common': 1.0.2 dev: false - /@codemirror/commands/6.2.2: + /@codemirror/commands@6.2.2: resolution: {integrity: sha512-s9lPVW7TxXrI/7voZ+HmD/yiAlwAYn9PH5SUVSUhsxXHhv4yl5eZ3KLntSoTynfdgVYM0oIpccQEWRBQgmNZyw==} dependencies: '@codemirror/language': 6.6.0 @@ -123,10 +167,10 @@ packages: '@lezer/common': 1.0.2 dev: false - /@codemirror/lang-css/6.1.1_i3aqn63zftbgivbr4riltn5mqe: + /@codemirror/lang-css@6.1.1(@codemirror/view@6.9.2)(@lezer/common@1.0.2): resolution: {integrity: sha512-P6jdNEHyRcqqDgbvHYyC9Wxkek0rnG3a9aVSRi4a7WrjPbQtBTaOmvYpXmm13zZMAatO4Oqpac+0QZs7sy+LnQ==} dependencies: - '@codemirror/autocomplete': 6.4.2_lc2v3dpzp2l5pdzwtgfaudkm3e + '@codemirror/autocomplete': 6.4.2(@codemirror/language@6.6.0)(@codemirror/state@6.2.0)(@codemirror/view@6.9.2)(@lezer/common@1.0.2) '@codemirror/language': 6.6.0 '@codemirror/state': 6.2.0 '@lezer/css': 1.1.1 @@ -135,11 +179,11 @@ packages: - '@lezer/common' dev: false - /@codemirror/lang-html/6.4.2: + /@codemirror/lang-html@6.4.2: resolution: {integrity: sha512-bqCBASkteKySwtIbiV/WCtGnn/khLRbbiV5TE+d9S9eQJD7BA4c5dTRm2b3bVmSpilff5EYxvB4PQaZzM/7cNw==} dependencies: - '@codemirror/autocomplete': 6.4.2_lc2v3dpzp2l5pdzwtgfaudkm3e - '@codemirror/lang-css': 6.1.1_i3aqn63zftbgivbr4riltn5mqe + '@codemirror/autocomplete': 6.4.2(@codemirror/language@6.6.0)(@codemirror/state@6.2.0)(@codemirror/view@6.9.2)(@lezer/common@1.0.2) + '@codemirror/lang-css': 6.1.1(@codemirror/view@6.9.2)(@lezer/common@1.0.2) '@codemirror/lang-javascript': 6.1.4 '@codemirror/language': 6.6.0 '@codemirror/state': 6.2.0 @@ -149,10 +193,10 @@ packages: '@lezer/html': 1.3.3 dev: false - /@codemirror/lang-javascript/6.1.4: + /@codemirror/lang-javascript@6.1.4: resolution: {integrity: sha512-OxLf7OfOZBTMRMi6BO/F72MNGmgOd9B0vetOLvHsDACFXayBzW8fm8aWnDM0yuy68wTK03MBf4HbjSBNRG5q7A==} dependencies: - '@codemirror/autocomplete': 6.4.2_lc2v3dpzp2l5pdzwtgfaudkm3e + '@codemirror/autocomplete': 6.4.2(@codemirror/language@6.6.0)(@codemirror/state@6.2.0)(@codemirror/view@6.9.2)(@lezer/common@1.0.2) '@codemirror/language': 6.6.0 '@codemirror/lint': 6.2.0 '@codemirror/state': 6.2.0 @@ -161,7 +205,7 @@ packages: '@lezer/javascript': 1.4.1 dev: false - /@codemirror/language/6.6.0: + /@codemirror/language@6.6.0: resolution: {integrity: sha512-cwUd6lzt3MfNYOobdjf14ZkLbJcnv4WtndYaoBkbor/vF+rCNguMPK0IRtvZJG4dsWiaWPcK8x1VijhvSxnstg==} dependencies: '@codemirror/state': 6.2.0 @@ -172,7 +216,7 @@ packages: style-mod: 4.0.2 dev: false - /@codemirror/lint/6.2.0: + /@codemirror/lint@6.2.0: resolution: {integrity: sha512-KVCECmR2fFeYBr1ZXDVue7x3q5PMI0PzcIbA+zKufnkniMBo1325t0h1jM85AKp8l3tj67LRxVpZfgDxEXlQkg==} dependencies: '@codemirror/state': 6.2.0 @@ -180,7 +224,7 @@ packages: crelt: 1.0.5 dev: false - /@codemirror/search/6.3.0: + /@codemirror/search@6.3.0: resolution: {integrity: sha512-rBhZxzT34CarfhgCZGhaLBScABDN3iqJxixzNuINp9lrb3lzm0nTpR77G1VrxGO3HOGK7j62jcJftQM7eCOIuw==} dependencies: '@codemirror/state': 6.2.0 @@ -188,11 +232,11 @@ packages: crelt: 1.0.5 dev: false - /@codemirror/state/6.2.0: + /@codemirror/state@6.2.0: resolution: {integrity: sha512-69QXtcrsc3RYtOtd+GsvczJ319udtBf1PTrr2KbLWM/e2CXUPnh0Nz9AUo8WfhSQ7GeL8dPVNUmhQVgpmuaNGA==} dev: false - /@codemirror/view/6.9.2: + /@codemirror/view@6.9.2: resolution: {integrity: sha512-ci0r/v6aKOSlzOs7/STMTYP3jX/+YMq2dAfAJcLIB6uom4ThtrUlzeuS7GTRGNqJJ+qAJR1vGWfXgu4CO/0myQ==} dependencies: '@codemirror/state': 6.2.0 @@ -200,43 +244,43 @@ packages: w3c-keyname: 2.2.6 dev: false - /@esbuild/android-arm/0.16.17: - resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==} + /@esbuild/android-arm64@0.16.17: + resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@esbuild/android-arm/0.17.12: - resolution: {integrity: sha512-E/sgkvwoIfj4aMAPL2e35VnUJspzVYl7+M1B2cqeubdBhADV4uPon0KCc8p2G+LqSJ6i8ocYPCqY3A4GGq0zkQ==} + /@esbuild/android-arm64@0.17.12: + resolution: {integrity: sha512-WQ9p5oiXXYJ33F2EkE3r0FRDFVpEdcDiwNX3u7Xaibxfx6vQE0Sb8ytrfQsA5WO6kDn6mDfKLh6KrPBjvkk7xA==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@esbuild/android-arm64/0.16.17: - resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} + /@esbuild/android-arm@0.16.17: + resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@esbuild/android-arm64/0.17.12: - resolution: {integrity: sha512-WQ9p5oiXXYJ33F2EkE3r0FRDFVpEdcDiwNX3u7Xaibxfx6vQE0Sb8ytrfQsA5WO6kDn6mDfKLh6KrPBjvkk7xA==} + /@esbuild/android-arm@0.17.12: + resolution: {integrity: sha512-E/sgkvwoIfj4aMAPL2e35VnUJspzVYl7+M1B2cqeubdBhADV4uPon0KCc8p2G+LqSJ6i8ocYPCqY3A4GGq0zkQ==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@esbuild/android-x64/0.16.17: + /@esbuild/android-x64@0.16.17: resolution: {integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==} engines: {node: '>=12'} cpu: [x64] @@ -245,7 +289,7 @@ packages: dev: true optional: true - /@esbuild/android-x64/0.17.12: + /@esbuild/android-x64@0.17.12: resolution: {integrity: sha512-m4OsaCr5gT+se25rFPHKQXARMyAehHTQAz4XX1Vk3d27VtqiX0ALMBPoXZsGaB6JYryCLfgGwUslMqTfqeLU0w==} engines: {node: '>=12'} cpu: [x64] @@ -254,7 +298,7 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64/0.16.17: + /@esbuild/darwin-arm64@0.16.17: resolution: {integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==} engines: {node: '>=12'} cpu: [arm64] @@ -263,7 +307,7 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64/0.17.12: + /@esbuild/darwin-arm64@0.17.12: resolution: {integrity: sha512-O3GCZghRIx+RAN0NDPhyyhRgwa19MoKlzGonIb5hgTj78krqp9XZbYCvFr9N1eUxg0ZQEpiiZ4QvsOQwBpP+lg==} engines: {node: '>=12'} cpu: [arm64] @@ -272,7 +316,7 @@ packages: dev: true optional: true - /@esbuild/darwin-x64/0.16.17: + /@esbuild/darwin-x64@0.16.17: resolution: {integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==} engines: {node: '>=12'} cpu: [x64] @@ -281,7 +325,7 @@ packages: dev: true optional: true - /@esbuild/darwin-x64/0.17.12: + /@esbuild/darwin-x64@0.17.12: resolution: {integrity: sha512-5D48jM3tW27h1qjaD9UNRuN+4v0zvksqZSPZqeSWggfMlsVdAhH3pwSfQIFJwcs9QJ9BRibPS4ViZgs3d2wsCA==} engines: {node: '>=12'} cpu: [x64] @@ -290,7 +334,7 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64/0.16.17: + /@esbuild/freebsd-arm64@0.16.17: resolution: {integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==} engines: {node: '>=12'} cpu: [arm64] @@ -299,7 +343,7 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64/0.17.12: + /@esbuild/freebsd-arm64@0.17.12: resolution: {integrity: sha512-OWvHzmLNTdF1erSvrfoEBGlN94IE6vCEaGEkEH29uo/VoONqPnoDFfShi41Ew+yKimx4vrmmAJEGNoyyP+OgOQ==} engines: {node: '>=12'} cpu: [arm64] @@ -308,7 +352,7 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64/0.16.17: + /@esbuild/freebsd-x64@0.16.17: resolution: {integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==} engines: {node: '>=12'} cpu: [x64] @@ -317,7 +361,7 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64/0.17.12: + /@esbuild/freebsd-x64@0.17.12: resolution: {integrity: sha512-A0Xg5CZv8MU9xh4a+7NUpi5VHBKh1RaGJKqjxe4KG87X+mTjDE6ZvlJqpWoeJxgfXHT7IMP9tDFu7IZ03OtJAw==} engines: {node: '>=12'} cpu: [x64] @@ -326,43 +370,43 @@ packages: dev: true optional: true - /@esbuild/linux-arm/0.16.17: - resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==} + /@esbuild/linux-arm64@0.16.17: + resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-arm/0.17.12: - resolution: {integrity: sha512-WsHyJ7b7vzHdJ1fv67Yf++2dz3D726oO3QCu8iNYik4fb5YuuReOI9OtA+n7Mk0xyQivNTPbl181s+5oZ38gyA==} + /@esbuild/linux-arm64@0.17.12: + resolution: {integrity: sha512-cK3AjkEc+8v8YG02hYLQIQlOznW+v9N+OI9BAFuyqkfQFR+DnDLhEM5N8QRxAUz99cJTo1rLNXqRrvY15gbQUg==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-arm64/0.16.17: - resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==} + /@esbuild/linux-arm@0.16.17: + resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-arm64/0.17.12: - resolution: {integrity: sha512-cK3AjkEc+8v8YG02hYLQIQlOznW+v9N+OI9BAFuyqkfQFR+DnDLhEM5N8QRxAUz99cJTo1rLNXqRrvY15gbQUg==} + /@esbuild/linux-arm@0.17.12: + resolution: {integrity: sha512-WsHyJ7b7vzHdJ1fv67Yf++2dz3D726oO3QCu8iNYik4fb5YuuReOI9OtA+n7Mk0xyQivNTPbl181s+5oZ38gyA==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-ia32/0.16.17: + /@esbuild/linux-ia32@0.16.17: resolution: {integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==} engines: {node: '>=12'} cpu: [ia32] @@ -371,7 +415,7 @@ packages: dev: true optional: true - /@esbuild/linux-ia32/0.17.12: + /@esbuild/linux-ia32@0.17.12: resolution: {integrity: sha512-jdOBXJqcgHlah/nYHnj3Hrnl9l63RjtQ4vn9+bohjQPI2QafASB5MtHAoEv0JQHVb/xYQTFOeuHnNYE1zF7tYw==} engines: {node: '>=12'} cpu: [ia32] @@ -380,7 +424,7 @@ packages: dev: true optional: true - /@esbuild/linux-loong64/0.16.17: + /@esbuild/linux-loong64@0.16.17: resolution: {integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==} engines: {node: '>=12'} cpu: [loong64] @@ -389,7 +433,7 @@ packages: dev: true optional: true - /@esbuild/linux-loong64/0.17.12: + /@esbuild/linux-loong64@0.17.12: resolution: {integrity: sha512-GTOEtj8h9qPKXCyiBBnHconSCV9LwFyx/gv3Phw0pa25qPYjVuuGZ4Dk14bGCfGX3qKF0+ceeQvwmtI+aYBbVA==} engines: {node: '>=12'} cpu: [loong64] @@ -398,7 +442,7 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el/0.16.17: + /@esbuild/linux-mips64el@0.16.17: resolution: {integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==} engines: {node: '>=12'} cpu: [mips64el] @@ -407,7 +451,7 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el/0.17.12: + /@esbuild/linux-mips64el@0.17.12: resolution: {integrity: sha512-o8CIhfBwKcxmEENOH9RwmUejs5jFiNoDw7YgS0EJTF6kgPgcqLFjgoc5kDey5cMHRVCIWc6kK2ShUePOcc7RbA==} engines: {node: '>=12'} cpu: [mips64el] @@ -416,7 +460,7 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64/0.16.17: + /@esbuild/linux-ppc64@0.16.17: resolution: {integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==} engines: {node: '>=12'} cpu: [ppc64] @@ -425,7 +469,7 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64/0.17.12: + /@esbuild/linux-ppc64@0.17.12: resolution: {integrity: sha512-biMLH6NR/GR4z+ap0oJYb877LdBpGac8KfZoEnDiBKd7MD/xt8eaw1SFfYRUeMVx519kVkAOL2GExdFmYnZx3A==} engines: {node: '>=12'} cpu: [ppc64] @@ -434,7 +478,7 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64/0.16.17: + /@esbuild/linux-riscv64@0.16.17: resolution: {integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==} engines: {node: '>=12'} cpu: [riscv64] @@ -443,7 +487,7 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64/0.17.12: + /@esbuild/linux-riscv64@0.17.12: resolution: {integrity: sha512-jkphYUiO38wZGeWlfIBMB72auOllNA2sLfiZPGDtOBb1ELN8lmqBrlMiucgL8awBw1zBXN69PmZM6g4yTX84TA==} engines: {node: '>=12'} cpu: [riscv64] @@ -452,7 +496,7 @@ packages: dev: true optional: true - /@esbuild/linux-s390x/0.16.17: + /@esbuild/linux-s390x@0.16.17: resolution: {integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==} engines: {node: '>=12'} cpu: [s390x] @@ -461,7 +505,7 @@ packages: dev: true optional: true - /@esbuild/linux-s390x/0.17.12: + /@esbuild/linux-s390x@0.17.12: resolution: {integrity: sha512-j3ucLdeY9HBcvODhCY4b+Ds3hWGO8t+SAidtmWu/ukfLLG/oYDMaA+dnugTVAg5fnUOGNbIYL9TOjhWgQB8W5g==} engines: {node: '>=12'} cpu: [s390x] @@ -470,7 +514,7 @@ packages: dev: true optional: true - /@esbuild/linux-x64/0.16.17: + /@esbuild/linux-x64@0.16.17: resolution: {integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==} engines: {node: '>=12'} cpu: [x64] @@ -479,7 +523,7 @@ packages: dev: true optional: true - /@esbuild/linux-x64/0.17.12: + /@esbuild/linux-x64@0.17.12: resolution: {integrity: sha512-uo5JL3cgaEGotaqSaJdRfFNSCUJOIliKLnDGWaVCgIKkHxwhYMm95pfMbWZ9l7GeW9kDg0tSxcy9NYdEtjwwmA==} engines: {node: '>=12'} cpu: [x64] @@ -488,7 +532,7 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64/0.16.17: + /@esbuild/netbsd-x64@0.16.17: resolution: {integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==} engines: {node: '>=12'} cpu: [x64] @@ -497,7 +541,7 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64/0.17.12: + /@esbuild/netbsd-x64@0.17.12: resolution: {integrity: sha512-DNdoRg8JX+gGsbqt2gPgkgb00mqOgOO27KnrWZtdABl6yWTST30aibGJ6geBq3WM2TIeW6COs5AScnC7GwtGPg==} engines: {node: '>=12'} cpu: [x64] @@ -506,7 +550,7 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64/0.16.17: + /@esbuild/openbsd-x64@0.16.17: resolution: {integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==} engines: {node: '>=12'} cpu: [x64] @@ -515,7 +559,7 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64/0.17.12: + /@esbuild/openbsd-x64@0.17.12: resolution: {integrity: sha512-aVsENlr7B64w8I1lhHShND5o8cW6sB9n9MUtLumFlPhG3elhNWtE7M1TFpj3m7lT3sKQUMkGFjTQBrvDDO1YWA==} engines: {node: '>=12'} cpu: [x64] @@ -524,7 +568,7 @@ packages: dev: true optional: true - /@esbuild/sunos-x64/0.16.17: + /@esbuild/sunos-x64@0.16.17: resolution: {integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==} engines: {node: '>=12'} cpu: [x64] @@ -533,7 +577,7 @@ packages: dev: true optional: true - /@esbuild/sunos-x64/0.17.12: + /@esbuild/sunos-x64@0.17.12: resolution: {integrity: sha512-qbHGVQdKSwi0JQJuZznS4SyY27tYXYF0mrgthbxXrZI3AHKuRvU+Eqbg/F0rmLDpW/jkIZBlCO1XfHUBMNJ1pg==} engines: {node: '>=12'} cpu: [x64] @@ -542,7 +586,7 @@ packages: dev: true optional: true - /@esbuild/win32-arm64/0.16.17: + /@esbuild/win32-arm64@0.16.17: resolution: {integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==} engines: {node: '>=12'} cpu: [arm64] @@ -551,7 +595,7 @@ packages: dev: true optional: true - /@esbuild/win32-arm64/0.17.12: + /@esbuild/win32-arm64@0.17.12: resolution: {integrity: sha512-zsCp8Ql+96xXTVTmm6ffvoTSZSV2B/LzzkUXAY33F/76EajNw1m+jZ9zPfNJlJ3Rh4EzOszNDHsmG/fZOhtqDg==} engines: {node: '>=12'} cpu: [arm64] @@ -560,7 +604,7 @@ packages: dev: true optional: true - /@esbuild/win32-ia32/0.16.17: + /@esbuild/win32-ia32@0.16.17: resolution: {integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==} engines: {node: '>=12'} cpu: [ia32] @@ -569,7 +613,7 @@ packages: dev: true optional: true - /@esbuild/win32-ia32/0.17.12: + /@esbuild/win32-ia32@0.17.12: resolution: {integrity: sha512-FfrFjR4id7wcFYOdqbDfDET3tjxCozUgbqdkOABsSFzoZGFC92UK7mg4JKRc/B3NNEf1s2WHxJ7VfTdVDPN3ng==} engines: {node: '>=12'} cpu: [ia32] @@ -578,7 +622,7 @@ packages: dev: true optional: true - /@esbuild/win32-x64/0.16.17: + /@esbuild/win32-x64@0.16.17: resolution: {integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==} engines: {node: '>=12'} cpu: [x64] @@ -587,7 +631,7 @@ packages: dev: true optional: true - /@esbuild/win32-x64/0.17.12: + /@esbuild/win32-x64@0.17.12: resolution: {integrity: sha512-JOOxw49BVZx2/5tW3FqkdjSD/5gXYeVGPDcB0lvap0gLQshkh1Nyel1QazC+wNxus3xPlsYAgqU1BUmrmCvWtw==} engines: {node: '>=12'} cpu: [x64] @@ -596,44 +640,44 @@ packages: dev: true optional: true - /@fontsource/roboto-mono/4.5.10: + /@fontsource/roboto-mono@4.5.10: resolution: {integrity: sha512-KrJdmkqz6DszT2wV/bbhXef4r0hV3B0vw2mAqei8A2kRnvq+gcJLmmIeQ94vu9VEXrUQzos5M9lH1TAAXpRphw==} dev: false - /@jridgewell/resolve-uri/3.1.0: + /@jridgewell/resolve-uri@3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/sourcemap-codec/1.4.14: + /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} dev: true - /@jridgewell/trace-mapping/0.3.17: + /@jridgewell/trace-mapping@0.3.17: resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@lezer/common/1.0.2: + /@lezer/common@1.0.2: resolution: {integrity: sha512-SVgiGtMnMnW3ActR8SXgsDhw7a0w0ChHSYAyAUxxrOiJ1OqYWEKk/xJd84tTSPo1mo6DXLObAJALNnd0Hrv7Ng==} dev: false - /@lezer/css/1.1.1: + /@lezer/css@1.1.1: resolution: {integrity: sha512-mSjx+unLLapEqdOYDejnGBokB5+AiJKZVclmud0MKQOKx3DLJ5b5VTCstgDDknR6iIV4gVrN6euzsCnj0A2gQA==} dependencies: '@lezer/highlight': 1.1.3 '@lezer/lr': 1.3.3 dev: false - /@lezer/highlight/1.1.3: + /@lezer/highlight@1.1.3: resolution: {integrity: sha512-3vLKLPThO4td43lYRBygmMY18JN3CPh9w+XS2j8WC30vR4yZeFG4z1iFe4jXE43NtGqe//zHW5q8ENLlHvz9gw==} dependencies: '@lezer/common': 1.0.2 dev: false - /@lezer/html/1.3.3: + /@lezer/html@1.3.3: resolution: {integrity: sha512-04Fyvu66DjV2EjhDIG1kfDdktn5Pfw56SXPrzKNQH5B2m7BDfc6bDsz+ZJG8dLS3kIPEKbyyq1Sm2/kjeG0+AA==} dependencies: '@lezer/common': 1.0.2 @@ -641,20 +685,20 @@ packages: '@lezer/lr': 1.3.3 dev: false - /@lezer/javascript/1.4.1: + /@lezer/javascript@1.4.1: resolution: {integrity: sha512-Hqx36DJeYhKtdpc7wBYPR0XF56ZzIp0IkMO/zNNj80xcaFOV4Oj/P7TQc/8k2TxNhzl7tV5tXS8ZOCPbT4L3nA==} dependencies: '@lezer/highlight': 1.1.3 '@lezer/lr': 1.3.3 dev: false - /@lezer/lr/1.3.3: + /@lezer/lr@1.3.3: resolution: {integrity: sha512-JPQe3mwJlzEVqy67iQiiGozhcngbO8QBgpqZM6oL1Wj/dXckrEexpBLeFkq0edtW5IqnPRFxA24BHJni8Js69w==} dependencies: '@lezer/common': 1.0.2 dev: false - /@mapbox/node-pre-gyp/1.0.10: + /@mapbox/node-pre-gyp@1.0.10: resolution: {integrity: sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==} hasBin: true dependencies: @@ -672,7 +716,7 @@ packages: - supports-color dev: true - /@nodelib/fs.scandir/2.1.5: + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} dependencies: @@ -680,12 +724,12 @@ packages: run-parallel: 1.2.0 dev: true - /@nodelib/fs.stat/2.0.5: + /@nodelib/fs.stat@2.0.5: resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} dev: true - /@nodelib/fs.walk/1.2.8: + /@nodelib/fs.walk@1.2.8: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} dependencies: @@ -693,7 +737,7 @@ packages: fastq: 1.15.0 dev: true - /@playwright/test/1.31.2: + /@playwright/test@1.31.2: resolution: {integrity: sha512-BYVutxDI4JeZKV1+ups6dt5WiqKhjBtIYowyZIJ3kBDmJgsuPKsqqKNIMFbUePLSCmp2cZu+BDL427RcNKTRYw==} engines: {node: '>=14'} hasBin: true @@ -704,11 +748,11 @@ packages: fsevents: 2.3.2 dev: true - /@polka/url/1.0.0-next.21: + /@polka/url@1.0.0-next.21: resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} dev: true - /@replit/codemirror-lang-svelte/6.0.0_ybny7xhlf2ysg4majw54z4nkly: + /@replit/codemirror-lang-svelte@6.0.0(@codemirror/autocomplete@6.4.2)(@codemirror/lang-css@6.1.1)(@codemirror/lang-html@6.4.2)(@codemirror/lang-javascript@6.1.4)(@codemirror/language@6.6.0)(@codemirror/state@6.2.0)(@codemirror/view@6.9.2)(@lezer/common@1.0.2)(@lezer/highlight@1.1.3)(@lezer/javascript@1.4.1)(@lezer/lr@1.3.3): resolution: {integrity: sha512-U2OqqgMM6jKelL0GNWbAmqlu1S078zZNoBqlJBW+retTc5M4Mha6/Y2cf4SVg6ddgloJvmcSpt4hHrVoM4ePRA==} peerDependencies: '@codemirror/autocomplete': ^6.0.0 @@ -723,8 +767,8 @@ packages: '@lezer/javascript': ^1.2.0 '@lezer/lr': ^1.0.0 dependencies: - '@codemirror/autocomplete': 6.4.2_lc2v3dpzp2l5pdzwtgfaudkm3e - '@codemirror/lang-css': 6.1.1_i3aqn63zftbgivbr4riltn5mqe + '@codemirror/autocomplete': 6.4.2(@codemirror/language@6.6.0)(@codemirror/state@6.2.0)(@codemirror/view@6.9.2)(@lezer/common@1.0.2) + '@codemirror/lang-css': 6.1.1(@codemirror/view@6.9.2)(@lezer/common@1.0.2) '@codemirror/lang-html': 6.4.2 '@codemirror/lang-javascript': 6.1.4 '@codemirror/language': 6.6.0 @@ -736,7 +780,7 @@ packages: '@lezer/lr': 1.3.3 dev: false - /@replit/codemirror-vim/6.0.11_43oovqgcdaxzhub7wnzsdexoq4: + /@replit/codemirror-vim@6.0.11(@codemirror/commands@6.2.2)(@codemirror/language@6.6.0)(@codemirror/search@6.3.0)(@codemirror/state@6.2.0)(@codemirror/view@6.9.2): resolution: {integrity: sha512-b3umG+3DR9LfNjrPBk1849Cp8WHgFbYFhlFvGg62br03NdVquVKxaQonK7xA8WGurzQeQOpBW+hhr7mzZxWksA==} peerDependencies: '@codemirror/commands': ^6.0.0 @@ -752,7 +796,7 @@ packages: '@codemirror/view': 6.9.2 dev: false - /@rich_harris/svelte-split-pane/1.1.0_svelte@3.57.0: + /@rich_harris/svelte-split-pane@1.1.0(svelte@3.57.0): resolution: {integrity: sha512-gxDfPqRSRx11/t+cs5ao0pXzKSO6CiBDmbcVwD8o/zToNZZTZjompoRmvRRICT9OhPxwwl/87nXJEToorPyICg==} peerDependencies: svelte: ^3.54.0 @@ -760,7 +804,7 @@ packages: svelte: 3.57.0 dev: false - /@rollup/pluginutils/4.2.1: + /@rollup/pluginutils@4.2.1: resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} engines: {node: '>= 8.0.0'} dependencies: @@ -768,12 +812,12 @@ packages: picomatch: 2.3.1 dev: true - /@sveltejs/adapter-vercel/2.3.1_@sveltejs+kit@1.15.4: + /@sveltejs/adapter-vercel@2.3.1(@sveltejs/kit@1.15.4): resolution: {integrity: sha512-EanZoRgqaZw4EaT3yGbkUtswYW3cQFVL/7aRunbiZ86mmDEyn6liuYNpmMCiqhgnz6hwhfJErpR7p8l71zcKRA==} peerDependencies: '@sveltejs/kit': ^1.5.0 dependencies: - '@sveltejs/kit': 1.15.4_svelte@3.57.0+vite@4.2.1 + '@sveltejs/kit': 1.15.4(svelte@3.57.0)(vite@4.2.1) '@vercel/nft': 0.22.6 esbuild: 0.16.17 transitivePeerDependencies: @@ -781,7 +825,7 @@ packages: - supports-color dev: true - /@sveltejs/kit/1.15.4_svelte@3.57.0+vite@4.2.1: + /@sveltejs/kit@1.15.4(svelte@3.57.0)(vite@4.2.1): resolution: {integrity: sha512-m+Tid9nbtFawmiu85lDlal0AQ7UeuV48UsuKMe06QLr3ntMQSUzIPqyswNRZqFrar6NhVTUXQ0aO61M3U4MWpQ==} engines: {node: ^16.14 || >=18} hasBin: true @@ -790,7 +834,7 @@ packages: svelte: ^3.54.0 vite: ^4.0.0 dependencies: - '@sveltejs/vite-plugin-svelte': 2.0.3_svelte@3.57.0+vite@4.2.1 + '@sveltejs/vite-plugin-svelte': 2.0.3(svelte@3.57.0)(vite@4.2.1) '@types/cookie': 0.5.1 cookie: 0.5.0 devalue: 4.3.0 @@ -809,18 +853,19 @@ packages: - supports-color dev: true - /@sveltejs/site-kit/4.0.1_xkykli67bxy2y63jc6hpwzmwjy: - resolution: {integrity: sha512-4uMN2quyP+us87690TFMmmt5QtbapZrpbeqVoc9uvgBQqIs+2L0W5y033YnoKKxk/G40AnODYJ0Rqbwuome7jA==} + /@sveltejs/site-kit@5.0.4(@sveltejs/kit@1.15.4)(svelte@3.57.0): + resolution: {integrity: sha512-bn0Lk3hmIz/pDTMvVjiVX/US4OPoc1CzfceI0Y0ljxHs2fdxRTZz881xvItZRF7istLIueoFR1x3HAZPdI2F6g==} peerDependencies: '@sveltejs/kit': ^1.0.0 svelte: ^3.54.0 dependencies: - '@sveltejs/kit': 1.15.4_svelte@3.57.0+vite@4.2.1 + '@sveltejs/kit': 1.15.4(svelte@3.57.0)(vite@4.2.1) + esm-env: 1.0.0 svelte: 3.57.0 - svelte-local-storage-store: 0.4.0_svelte@3.57.0 + svelte-local-storage-store: 0.4.0(svelte@3.57.0) dev: true - /@sveltejs/vite-plugin-svelte/2.0.3_svelte@3.57.0+vite@4.2.1: + /@sveltejs/vite-plugin-svelte@2.0.3(svelte@3.57.0)(vite@4.2.1): resolution: {integrity: sha512-o+cguBFdwIGtRbNkYOyqTM7KvRUffxh5bfK4oJsWKG2obu+v/cbpT03tJrGl58C7tRXo/aEC0/axN5FVHBj0nA==} engines: {node: ^14.18.0 || >= 16} peerDependencies: @@ -832,44 +877,44 @@ packages: kleur: 4.1.5 magic-string: 0.29.0 svelte: 3.57.0 - svelte-hmr: 0.15.1_svelte@3.57.0 + svelte-hmr: 0.15.1(svelte@3.57.0) vite: 4.2.1 - vitefu: 0.2.4_vite@4.2.1 + vitefu: 0.2.4(vite@4.2.1) transitivePeerDependencies: - supports-color dev: true - /@types/cookie/0.5.1: + /@types/cookie@0.5.1: resolution: {integrity: sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==} dev: true - /@types/diff/5.0.2: + /@types/diff@5.0.2: resolution: {integrity: sha512-uw8eYMIReOwstQ0QKF0sICefSy8cNO/v7gOTiIy9SbwuHyEecJUm7qlgueOO5S1udZ5I/irVydHVwMchgzbKTg==} dev: true - /@types/marked/4.0.8: + /@types/marked@4.0.8: resolution: {integrity: sha512-HVNzMT5QlWCOdeuBsgXP8EZzKUf0+AXzN+sLmjvaB3ZlLqO+e4u0uXrdw9ub69wBKFs+c6/pA4r9sy6cCDvImw==} dev: true - /@types/node/18.15.3: + /@types/node@18.15.3: resolution: {integrity: sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==} dev: true - /@types/prismjs/1.26.0: + /@types/prismjs@1.26.0: resolution: {integrity: sha512-ZTaqn/qSqUuAq1YwvOFQfVW1AR/oQJlLSZVustdjwI+GZ8kr0MSHBj0tsXPW1EqHubx50gtBEjbPGsdZwQwCjQ==} dev: true - /@types/pug/2.0.6: + /@types/pug@2.0.6: resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==} dev: true - /@types/ws/8.5.4: + /@types/ws@8.5.4: resolution: {integrity: sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==} dependencies: '@types/node': 18.15.3 dev: true - /@vercel/nft/0.22.6: + /@vercel/nft@0.22.6: resolution: {integrity: sha512-gTsFnnT4mGxodr4AUlW3/urY+8JKKB452LwF3m477RFUJTAaDmcz2JqFuInzvdybYIeyIv1sSONEJxsxnbQ5JQ==} engines: {node: '>=14'} hasBin: true @@ -890,26 +935,26 @@ packages: - supports-color dev: true - /@webcontainer/api/1.1.0: + /@webcontainer/api@1.1.0: resolution: {integrity: sha512-qYUuy6BJl0eUlorA9dQ2DLxQ2I9vduhnhilV+DL7E5SxqLH+IZ2miS666/Uro93S3R6hLUVqg9Y17YiFUd/Hmg==} dev: false - /abbrev/1.1.1: + /abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: true - /acorn/8.8.2: + /acorn@8.8.2: resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} engines: {node: '>=0.4.0'} hasBin: true dev: true - /adm-zip/0.5.10: + /adm-zip@0.5.10: resolution: {integrity: sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==} engines: {node: '>=6.0'} dev: false - /agent-base/6.0.2: + /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: @@ -918,12 +963,12 @@ packages: - supports-color dev: true - /ansi-regex/5.0.1: + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} dev: true - /ansi-to-html/0.7.2: + /ansi-to-html@0.7.2: resolution: {integrity: sha512-v6MqmEpNlxF+POuyhKkidusCHWWkaLcGRURzivcU3I9tv7k4JVhFcnukrM5Rlk2rUywdZuzYAZ+kbZqWCnfN3g==} engines: {node: '>=8.0.0'} hasBin: true @@ -931,7 +976,7 @@ packages: entities: 2.2.0 dev: false - /anymatch/3.1.3: + /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} dependencies: @@ -939,11 +984,11 @@ packages: picomatch: 2.3.1 dev: true - /aproba/2.0.0: + /aproba@2.0.0: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} dev: true - /are-we-there-yet/2.0.0: + /are-we-there-yet@2.0.0: resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} engines: {node: '>=10'} dependencies: @@ -951,60 +996,60 @@ packages: readable-stream: 3.6.2 dev: true - /async-sema/3.1.1: + /async-sema@3.1.1: resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} dev: true - /balanced-match/1.0.2: + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true - /base64-js/1.5.1: + /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} dev: false - /binary-extensions/2.2.0: + /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} dev: true - /bindings/1.5.0: + /bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} dependencies: file-uri-to-path: 1.0.0 dev: true - /brace-expansion/1.1.11: + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 dev: true - /braces/3.0.2: + /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} dependencies: fill-range: 7.0.1 dev: true - /buffer-crc32/0.2.13: + /buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} dev: true - /busboy/1.6.0: + /busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} dependencies: streamsearch: 1.1.0 dev: true - /callsites/3.1.0: + /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} dev: true - /chokidar/3.5.3: + /chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} dependencies: @@ -1019,15 +1064,15 @@ packages: fsevents: 2.3.2 dev: true - /chownr/2.0.0: + /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} dev: true - /codemirror/6.0.1_@lezer+common@1.0.2: + /codemirror@6.0.1(@lezer/common@1.0.2): resolution: {integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==} dependencies: - '@codemirror/autocomplete': 6.4.2_lc2v3dpzp2l5pdzwtgfaudkm3e + '@codemirror/autocomplete': 6.4.2(@codemirror/language@6.6.0)(@codemirror/state@6.2.0)(@codemirror/view@6.9.2)(@lezer/common@1.0.2) '@codemirror/commands': 6.2.2 '@codemirror/language': 6.6.0 '@codemirror/lint': 6.2.0 @@ -1038,29 +1083,29 @@ packages: - '@lezer/common' dev: false - /color-support/1.1.3: + /color-support@1.1.3: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true dev: true - /concat-map/0.0.1: + /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true - /console-control-strings/1.1.0: + /console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} dev: true - /cookie/0.5.0: + /cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} dev: true - /crelt/1.0.5: + /crelt@1.0.5: resolution: {integrity: sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA==} dev: false - /debug/4.3.4: + /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} peerDependencies: @@ -1072,47 +1117,47 @@ packages: ms: 2.1.2 dev: true - /deepmerge/4.3.1: + /deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} dev: true - /delegates/1.0.0: + /delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} dev: true - /detect-indent/6.1.0: + /detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} dev: true - /detect-libc/2.0.1: + /detect-libc@2.0.1: resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} engines: {node: '>=8'} dev: true - /devalue/4.3.0: + /devalue@4.3.0: resolution: {integrity: sha512-n94yQo4LI3w7erwf84mhRUkUJfhLoCZiLyoOZ/QFsDbcWNZePrLwbQpvZBUG2TNxwV3VjCKPxkiiQA6pe3TrTA==} dev: true - /diff/5.1.0: + /diff@5.1.0: resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} engines: {node: '>=0.3.1'} dev: true - /emoji-regex/8.0.0: + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: true - /entities/2.2.0: + /entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} dev: false - /es6-promise/3.3.1: + /es6-promise@3.3.1: resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} dev: true - /esbuild/0.16.17: + /esbuild@0.16.17: resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==} engines: {node: '>=12'} hasBin: true @@ -1142,7 +1187,7 @@ packages: '@esbuild/win32-x64': 0.16.17 dev: true - /esbuild/0.17.12: + /esbuild@0.17.12: resolution: {integrity: sha512-bX/zHl7Gn2CpQwcMtRogTTBf9l1nl+H6R8nUbjk+RuKqAE3+8FDulLA+pHvX7aA7Xe07Iwa+CWvy9I8Y2qqPKQ==} engines: {node: '>=12'} hasBin: true @@ -1172,15 +1217,15 @@ packages: '@esbuild/win32-x64': 0.17.12 dev: true - /esm-env/1.0.0: + /esm-env@1.0.0: resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} dev: true - /estree-walker/2.0.2: + /estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} dev: true - /fast-glob/3.2.12: + /fast-glob@3.2.12: resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} engines: {node: '>=8.6.0'} dependencies: @@ -1191,35 +1236,35 @@ packages: micromatch: 4.0.5 dev: true - /fastq/1.15.0: + /fastq@1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: reusify: 1.0.4 dev: true - /file-uri-to-path/1.0.0: + /file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} dev: true - /fill-range/7.0.1: + /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 dev: true - /fs-minipass/2.1.0: + /fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} dependencies: minipass: 3.3.6 dev: true - /fs.realpath/1.0.0: + /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true - /fsevents/2.3.2: + /fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] @@ -1227,11 +1272,11 @@ packages: dev: true optional: true - /function-bind/1.1.1: + /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} dev: true - /gauge/3.0.2: + /gauge@3.0.2: resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} engines: {node: '>=10'} dependencies: @@ -1246,14 +1291,14 @@ packages: wide-align: 1.1.5 dev: true - /glob-parent/5.1.2: + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 dev: true - /glob/7.2.3: + /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: fs.realpath: 1.0.0 @@ -1264,30 +1309,30 @@ packages: path-is-absolute: 1.0.1 dev: true - /globalyzer/0.1.0: + /globalyzer@0.1.0: resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} dev: true - /globrex/0.1.2: + /globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} dev: true - /graceful-fs/4.2.11: + /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} dev: true - /has-unicode/2.0.1: + /has-unicode@2.0.1: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} dev: true - /has/1.0.3: + /has@1.0.3: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 dev: true - /https-proxy-agent/5.0.1: + /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} dependencies: @@ -1297,7 +1342,7 @@ packages: - supports-color dev: true - /import-fresh/3.3.0: + /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} dependencies: @@ -1305,104 +1350,104 @@ packages: resolve-from: 4.0.0 dev: true - /inflight/1.0.6: + /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: once: 1.4.0 wrappy: 1.0.2 dev: true - /inherits/2.0.4: + /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: true - /is-binary-path/2.1.0: + /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} dependencies: binary-extensions: 2.2.0 dev: true - /is-core-module/2.11.0: + /is-core-module@2.11.0: resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} dependencies: has: 1.0.3 dev: true - /is-extglob/2.1.1: + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} dev: true - /is-fullwidth-code-point/3.0.0: + /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} dev: true - /is-glob/4.0.3: + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 dev: true - /is-number/7.0.0: + /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} dev: true - /kleur/4.1.5: + /kleur@4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} dev: true - /lru-cache/6.0.0: + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} dependencies: yallist: 4.0.0 dev: true - /magic-string/0.27.0: + /magic-string@0.27.0: resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /magic-string/0.29.0: + /magic-string@0.29.0: resolution: {integrity: sha512-WcfidHrDjMY+eLjlU+8OvwREqHwpgCeKVBUpQ3OhYYuvfaYCUgcbuBzappNzZvg/v8onU3oQj+BYpkOJe9Iw4Q==} engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /magic-string/0.30.0: + /magic-string@0.30.0: resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /make-dir/3.1.0: + /make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} dependencies: semver: 6.3.0 dev: true - /marked/4.2.12: + /marked@4.2.12: resolution: {integrity: sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw==} engines: {node: '>= 12'} hasBin: true dev: false - /merge2/1.4.1: + /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} dev: true - /micromatch/4.0.5: + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} dependencies: @@ -1410,40 +1455,40 @@ packages: picomatch: 2.3.1 dev: true - /mime/3.0.0: + /mime@3.0.0: resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} engines: {node: '>=10.0.0'} hasBin: true dev: true - /min-indent/1.0.1: + /min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} dev: true - /minimatch/3.1.2: + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 dev: true - /minimist/1.2.8: + /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true - /minipass/3.3.6: + /minipass@3.3.6: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} dependencies: yallist: 4.0.0 dev: true - /minipass/4.2.5: + /minipass@4.2.5: resolution: {integrity: sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==} engines: {node: '>=8'} dev: true - /minizlib/2.1.2: + /minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} dependencies: @@ -1451,40 +1496,40 @@ packages: yallist: 4.0.0 dev: true - /mkdirp/0.5.6: + /mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true dependencies: minimist: 1.2.8 dev: true - /mkdirp/1.0.4: + /mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true dev: true - /mri/1.2.0: + /mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} dev: true - /mrmime/1.0.1: + /mrmime@1.0.1: resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} engines: {node: '>=10'} dev: true - /ms/2.1.2: + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true - /nanoid/3.3.4: + /nanoid@3.3.4: resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true dev: true - /node-fetch/2.6.9: + /node-fetch@2.6.9: resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} engines: {node: 4.x || >=6.0.0} peerDependencies: @@ -1496,12 +1541,12 @@ packages: whatwg-url: 5.0.0 dev: true - /node-gyp-build/4.6.0: + /node-gyp-build@4.6.0: resolution: {integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==} hasBin: true dev: true - /nopt/5.0.0: + /nopt@5.0.0: resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} engines: {node: '>=6'} hasBin: true @@ -1509,12 +1554,12 @@ packages: abbrev: 1.1.1 dev: true - /normalize-path/3.0.0: + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} dev: true - /npmlog/5.0.1: + /npmlog@5.0.1: resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} dependencies: are-we-there-yet: 2.0.0 @@ -1523,53 +1568,53 @@ packages: set-blocking: 2.0.0 dev: true - /object-assign/4.1.1: + /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} dev: true - /once/1.4.0: + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 dev: true - /parent-module/1.0.1: + /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} dependencies: callsites: 3.1.0 dev: true - /path-is-absolute/1.0.1: + /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} dev: true - /path-parse/1.0.7: + /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true - /picocolors/1.0.0: + /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true - /picomatch/2.3.1: + /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} dev: true - /playwright-core/1.31.2: + /playwright-core@1.31.2: resolution: {integrity: sha512-a1dFgCNQw4vCsG7bnojZjDnPewZcw7tZUNFN0ZkcLYKj+mPmXvg4MpaaKZ5SgqPsOmqIf2YsVRkgqiRDxD+fDQ==} engines: {node: '>=14'} hasBin: true dev: true - /port-authority/2.0.1: + /port-authority@2.0.1: resolution: {integrity: sha512-Hz/WvSNt5+7x+Rq1Cn6DetJOZxKtLDehJ1mLCYge6ju4QvSF/PHvRgy94e1SKJVI96AJTcqEdNwkkaAFad+TXQ==} dev: false - /postcss/8.4.21: + /postcss@8.4.21: resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} engines: {node: ^10 || ^12 || >=14} dependencies: @@ -1578,7 +1623,7 @@ packages: source-map-js: 1.0.2 dev: true - /prettier-plugin-svelte/2.9.0_olnlr4336c4vkm7c26l3r45yii: + /prettier-plugin-svelte@2.9.0(prettier@2.8.5)(svelte@3.57.0): resolution: {integrity: sha512-3doBi5NO4IVgaNPtwewvrgPpqAcvNv0NwJNflr76PIGgi9nf1oguQV1Hpdm9TI2ALIQVn/9iIwLpBO5UcD2Jiw==} peerDependencies: prettier: ^1.16.4 || ^2.0.0 @@ -1588,26 +1633,26 @@ packages: svelte: 3.57.0 dev: true - /prettier/2.8.5: + /prettier@2.8.5: resolution: {integrity: sha512-3gzuxrHbKUePRBB4ZeU08VNkUcqEHaUaouNt0m7LGP4Hti/NuB07C7PPTM/LkWqXoJYJn2McEo5+kxPNrtQkLQ==} engines: {node: '>=10.13.0'} hasBin: true dev: true - /prism-svelte/0.5.0: + /prism-svelte@0.5.0: resolution: {integrity: sha512-db91Bf3pRGKDPz1lAqLFSJXeW13mulUJxhycysFpfXV5MIK7RgWWK2E5aPAa71s8TCzQUXxF5JOV42/iOs6QkA==} dev: false - /prismjs/1.29.0: + /prismjs@1.29.0: resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} engines: {node: '>=6'} dev: false - /queue-microtask/1.2.3: + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true - /readable-stream/3.6.2: + /readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} dependencies: @@ -1616,24 +1661,24 @@ packages: util-deprecate: 1.0.2 dev: true - /readdirp/3.6.0: + /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 dev: true - /resolve-from/4.0.0: + /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} dev: true - /resolve-from/5.0.0: + /resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} dev: true - /resolve/1.22.1: + /resolve@1.22.1: resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} hasBin: true dependencies: @@ -1642,26 +1687,26 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true - /reusify/1.0.4: + /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: true - /rimraf/2.7.1: + /rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} hasBin: true dependencies: glob: 7.2.3 dev: true - /rimraf/3.0.2: + /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true dependencies: glob: 7.2.3 dev: true - /rollup/3.20.0: + /rollup@3.20.0: resolution: {integrity: sha512-YsIfrk80NqUDrxrjWPXUa7PWvAfegZEXHuPsEZg58fGCdjL1I9C1i/NaG+L+27kxxwkrG/QEDEQc8s/ynXWWGQ==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true @@ -1669,24 +1714,24 @@ packages: fsevents: 2.3.2 dev: true - /run-parallel/1.2.0: + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 dev: true - /sade/1.8.1: + /sade@1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} dependencies: mri: 1.2.0 dev: true - /safe-buffer/5.2.1: + /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: true - /sander/0.5.1: + /sander@0.5.1: resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} dependencies: es6-promise: 3.3.1 @@ -1695,12 +1740,12 @@ packages: rimraf: 2.7.1 dev: true - /semver/6.3.0: + /semver@6.3.0: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true dev: true - /semver/7.3.8: + /semver@7.3.8: resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} engines: {node: '>=10'} hasBin: true @@ -1708,19 +1753,19 @@ packages: lru-cache: 6.0.0 dev: true - /set-blocking/2.0.0: + /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: true - /set-cookie-parser/2.6.0: + /set-cookie-parser@2.6.0: resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} dev: true - /signal-exit/3.0.7: + /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: true - /sirv/2.0.2: + /sirv@2.0.2: resolution: {integrity: sha512-4Qog6aE29nIjAOKe/wowFTxOdmbEZKb+3tsLljaBRzJwtqto0BChD2zzH0LhgCSXiI+V7X+Y45v14wBZQ1TK3w==} engines: {node: '>= 10'} dependencies: @@ -1729,7 +1774,7 @@ packages: totalist: 3.0.0 dev: true - /sorcery/0.11.0: + /sorcery@0.11.0: resolution: {integrity: sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==} hasBin: true dependencies: @@ -1739,17 +1784,17 @@ packages: sander: 0.5.1 dev: true - /source-map-js/1.0.2: + /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} dev: true - /streamsearch/1.1.0: + /streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} dev: true - /string-width/4.2.3: + /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} dependencies: @@ -1758,36 +1803,36 @@ packages: strip-ansi: 6.0.1 dev: true - /string_decoder/1.3.0: + /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 dev: true - /strip-ansi/6.0.1: + /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 dev: true - /strip-indent/3.0.0: + /strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} dependencies: min-indent: 1.0.1 dev: true - /style-mod/4.0.2: + /style-mod@4.0.2: resolution: {integrity: sha512-C4myMmRTO8iaC5Gg+N1ftK2WT4eXUTMAa+HEFPPrfVeO/NtqLTtAmV1HbqnuGtLwCek44Ra76fdGUkSqjiMPcQ==} dev: false - /supports-preserve-symlinks-flag/1.0.0: + /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} dev: true - /svelte-check/3.1.4_svelte@3.57.0: + /svelte-check@3.1.4(svelte@3.57.0): resolution: {integrity: sha512-25Lb46ZS4IK/XpBMe4IBMrtYf23V8alqBX+szXoccb7uM0D2Wqq5rMRzYBONZnFVuU1bQG3R50lyIT5eRewv2g==} hasBin: true peerDependencies: @@ -1800,7 +1845,7 @@ packages: picocolors: 1.0.0 sade: 1.8.1 svelte: 3.57.0 - svelte-preprocess: 5.0.3_wkdgp32a7s6524odeddpfzb52q + svelte-preprocess: 5.0.3(svelte@3.57.0)(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - '@babel/core' @@ -1814,7 +1859,7 @@ packages: - sugarss dev: true - /svelte-hmr/0.15.1_svelte@3.57.0: + /svelte-hmr@0.15.1(svelte@3.57.0): resolution: {integrity: sha512-BiKB4RZ8YSwRKCNVdNxK/GfY+r4Kjgp9jCLEy0DuqAKfmQtpL38cQK3afdpjw4sqSs4PLi3jIPJIFp259NkZtA==} engines: {node: ^12.20 || ^14.13.1 || >= 16} peerDependencies: @@ -1823,7 +1868,7 @@ packages: svelte: 3.57.0 dev: true - /svelte-local-storage-store/0.4.0_svelte@3.57.0: + /svelte-local-storage-store@0.4.0(svelte@3.57.0): resolution: {integrity: sha512-ctPykTt4S3BE5bF0mfV0jKiUR1qlmqLvnAkQvYHLeb9wRyO1MdIFDVI23X+TZEFleATHkTaOpYZswIvf3b2tWA==} engines: {node: '>=0.14'} peerDependencies: @@ -1832,7 +1877,7 @@ packages: svelte: 3.57.0 dev: true - /svelte-preprocess/5.0.3_wkdgp32a7s6524odeddpfzb52q: + /svelte-preprocess@5.0.3(svelte@3.57.0)(typescript@4.9.5): resolution: {integrity: sha512-GrHF1rusdJVbOZOwgPWtpqmaexkydznKzy5qIC2FabgpFyKN57bjMUUUqPRfbBXK5igiEWn1uO/DXsa2vJ5VHA==} engines: {node: '>= 14.10.0'} requiresBuild: true @@ -1879,11 +1924,11 @@ packages: typescript: 4.9.5 dev: true - /svelte/3.57.0: + /svelte@3.57.0: resolution: {integrity: sha512-WMXEvF+RtAaclw0t3bPDTUe19pplMlfyKDsixbHQYgCWi9+O9VN0kXU1OppzrB9gPAvz4NALuoca2LfW2bOjTQ==} engines: {node: '>= 8'} - /tar/6.1.13: + /tar@6.1.13: resolution: {integrity: sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==} engines: {node: '>=10'} dependencies: @@ -1895,47 +1940,47 @@ packages: yallist: 4.0.0 dev: true - /tiny-glob/0.2.9: + /tiny-glob@0.2.9: resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} dependencies: globalyzer: 0.1.0 globrex: 0.1.2 dev: true - /to-regex-range/5.0.1: + /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 dev: true - /totalist/3.0.0: + /totalist@3.0.0: resolution: {integrity: sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==} engines: {node: '>=6'} dev: true - /tr46/0.0.3: + /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: true - /typescript/4.9.5: + /typescript@4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} engines: {node: '>=4.2.0'} hasBin: true dev: true - /undici/5.20.0: + /undici@5.20.0: resolution: {integrity: sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g==} engines: {node: '>=12.18'} dependencies: busboy: 1.6.0 dev: true - /util-deprecate/1.0.2: + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true - /vite/4.2.1: + /vite@4.2.1: resolution: {integrity: sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -1968,7 +2013,7 @@ packages: fsevents: 2.3.2 dev: true - /vitefu/0.2.4_vite@4.2.1: + /vitefu@0.2.4(vite@4.2.1): resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==} peerDependencies: vite: ^3.0.0 || ^4.0.0 @@ -1979,32 +2024,32 @@ packages: vite: 4.2.1 dev: true - /w3c-keyname/2.2.6: + /w3c-keyname@2.2.6: resolution: {integrity: sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==} dev: false - /webidl-conversions/3.0.1: + /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} dev: true - /whatwg-url/5.0.0: + /whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 dev: true - /wide-align/1.1.5: + /wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} dependencies: string-width: 4.2.3 dev: true - /wrappy/1.0.2: + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true - /ws/8.13.0: + /ws@8.13.0: resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} engines: {node: '>=10.0.0'} peerDependencies: @@ -2017,10 +2062,10 @@ packages: optional: true dev: false - /yallist/4.0.0: + /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true - /yootils/0.3.1: + /yootils@0.3.1: resolution: {integrity: sha512-A7AMeJfGefk317I/3tBoUYRcDcNavKEkpiPN/nQsBz/viI2GvT7BtrqdPD6rGqBFN8Ax7v4obf+Cl32JF9DDVw==} dev: false diff --git a/src/app.html b/src/app.html index 8450f2886..87478843f 100644 --- a/src/app.html +++ b/src/app.html @@ -7,11 +7,24 @@ - + %sveltekit.head% + +
%sveltekit.body%
diff --git a/src/routes/tutorial/[slug]/Output.svelte b/src/routes/tutorial/[slug]/Output.svelte index a633b8d84..0f2526e36 100644 --- a/src/routes/tutorial/[slug]/Output.svelte +++ b/src/routes/tutorial/[slug]/Output.svelte @@ -1,7 +1,8 @@ -
+
{#if error} - {#if !isWebContainerSupported()} -

This app requires modern web platform features. Please use a browser other than Safari.

- {:else} +
+
+

Yikes!

+ {#if error.message === 'Your browser does not support all necessary features'} +

+ This app requires modern web platform features. Please use a browser other than Safari. +

+ {:else if /firefox/i.test(navigator.userAgent)} +

+ We couldn't start the app. Please ensure + + third party cookies + are enabled for this site, and disable Enhanced Tracking Protection. +

+

+ If you have 'Delete cookies and site data when Firefox is closed' enabled in + about:preferences#privacy, make sure learn.svelte.dev is included + as an exception. +

+ {:else if /chrome/i.test(navigator.userAgent) && !/edg/i.test(navigator.userAgent)} +

+ We couldn't start the app. Please ensure third party cookies are enabled for this site — + click the + + eye + + + icon in the URL bar or go to + chrome://settings/cookies and add learn.svelte.dev to 'Sites that + can always use cookies'. +

+ {:else} +

+ We couldn't start the app. Please ensure third party cookies are enabled for this site. +

+ {/if} +
+ {error.message} -

Yikes!

- {#if /firefox/i.test(navigator.userAgent)} -

- We couldn't start the app. Please ensure - - third party cookies - are enabled for this site, and disable Enhanced Tracking Protection. -

-

- If you have 'Delete cookies and site data when Firefox is closed' enabled in - about:preferences#privacy, make sure learn.svelte.dev is included - as an exception. -

- {:else if /chrome/i.test(navigator.userAgent) && !/edg/i.test(navigator.userAgent)} -

- We couldn't start the app. Please ensure third party cookies are enabled for this site — - click the - - eye - - - icon in the URL bar or go to - chrome://settings/cookies and add learn.svelte.dev to 'Sites that - can always use cookies'. -

- {:else} -

- We couldn't start the app. Please ensure third party cookies are enabled for this site. -

- {/if} - {/if} +
{:else} Date: Wed, 31 May 2023 06:48:33 +0900 Subject: [PATCH 016/106] Typo of a file path (#396) --- .../05-advanced-loading/03-await-parent/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/tutorial/04-advanced-sveltekit/05-advanced-loading/03-await-parent/README.md b/content/tutorial/04-advanced-sveltekit/05-advanced-loading/03-await-parent/README.md index f622d5a1e..d1b7e39f0 100644 --- a/content/tutorial/04-advanced-sveltekit/05-advanced-loading/03-await-parent/README.md +++ b/content/tutorial/04-advanced-sveltekit/05-advanced-loading/03-await-parent/README.md @@ -30,7 +30,7 @@ export async function load(+++{ parent }+++) { Finally, in `src/routes/sum/+page.js`, get parent data from both `load` functions: ```js -/// file: src/sum/+page.js +/// file: src/routes/sum/+page.js export async function load(+++{ parent }+++) { +++const { a, b } = await parent();+++ return { +++c: a + b+++ }; From 127ffcebe39f333a3c1e11bf569650d50540ddc0 Mon Sep 17 00:00:00 2001 From: tomoam <29677552+tomoam@users.noreply.github.com> Date: Wed, 31 May 2023 06:57:29 +0900 Subject: [PATCH 017/106] fix: handling of a link to redirect URL (#393) --- content/tutorial/common/src/__client.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/content/tutorial/common/src/__client.js b/content/tutorial/common/src/__client.js index 06d49d7b4..2aba31a3c 100644 --- a/content/tutorial/common/src/__client.js +++ b/content/tutorial/common/src/__client.js @@ -49,6 +49,8 @@ window.addEventListener('focusin', (e) => { post({ type: 'iframe_took_focus' }); }); +let previous_href = location.href; + window.addEventListener('click', (e) => { let node = e.target; while (node) { @@ -60,7 +62,10 @@ window.addEventListener('click', (e) => { e.preventDefault(); window.open(url, '_blank'); } else { - update_path(url.pathname + url.search + url.hash); + if (location.href !== url.href) { + previous_href = url.href; + update_path(url.pathname + url.search + url.hash); + } } } node = node.parent; @@ -75,8 +80,6 @@ window.addEventListener('visibilitychange', () => { } }); -let previous_href = location.href; - const url_observer = new MutationObserver(() => { if (location.href !== previous_href) { previous_href = location.href; From 9882419a614ecf0c9a3b40c8b49d1162ebf2c4a1 Mon Sep 17 00:00:00 2001 From: Matthew Farley Date: Tue, 30 May 2023 18:08:46 -0400 Subject: [PATCH 018/106] Fix typo in SvelteKit $lib lesson (#373) --- .../tutorial/03-sveltekit/05-shared-modules/01-lib/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/tutorial/03-sveltekit/05-shared-modules/01-lib/README.md b/content/tutorial/03-sveltekit/05-shared-modules/01-lib/README.md index 9b9b20520..d5c082d5f 100644 --- a/content/tutorial/03-sveltekit/05-shared-modules/01-lib/README.md +++ b/content/tutorial/03-sveltekit/05-shared-modules/01-lib/README.md @@ -4,7 +4,7 @@ title: The $lib alias Because SvelteKit uses directory-based routing, it's easy to place modules and components alongside the routes that use them. A good rule of thumb is 'put code close to where it's used'. -Sometimes, code is used in multiple places. When this happens, it's useful to have a place to put them that can be access by all routes without needing to prefix imports with `../../../../`. In SvelteKit, that place is the `src/lib` directory. Anything inside this directory can be accessed by any module in `src` via the `$lib` alias. +Sometimes, code is used in multiple places. When this happens, it's useful to have a place to put them that can be accessed by all routes without needing to prefix imports with `../../../../`. In SvelteKit, that place is the `src/lib` directory. Anything inside this directory can be accessed by any module in `src` via the `$lib` alias. Both `+page.svelte` files in this exercise import `src/lib/message.js`. But if you navigate to `/a/deeply/nested/route`, the app breaks, because we got the prefix wrong. Update it to use `$lib/message.js` instead: @@ -28,4 +28,4 @@ Do the same for `src/routes/+page.svelte`:

home

{message}

-``` \ No newline at end of file +``` From 865c28fd1a16489ab808628b620d56dc46578b85 Mon Sep 17 00:00:00 2001 From: Hyeyeon Seo <42148741+skojphy@users.noreply.github.com> Date: Wed, 31 May 2023 07:09:56 +0900 Subject: [PATCH 019/106] Update tutorial (#371) Updated the example in the tutorial to match the answer in the exercise. --- .../tutorial/01-svelte/04-logic/04-each-blocks/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/tutorial/01-svelte/04-logic/04-each-blocks/README.md b/content/tutorial/01-svelte/04-logic/04-each-blocks/README.md index 9c9e7ffc3..3011cbb8f 100644 --- a/content/tutorial/01-svelte/04-logic/04-each-blocks/README.md +++ b/content/tutorial/01-svelte/04-logic/04-each-blocks/README.md @@ -11,7 +11,7 @@ Instead of laboriously copying, pasting and editing, we can get rid of all but t
+++{#each colors as color}+++ + - - ``` From 3fe7f041ab9cf2a3ff7ba7ee9fb4771a5621d264 Mon Sep 17 00:00:00 2001 From: Johannes Bader Date: Fri, 11 Aug 2023 11:24:10 +0200 Subject: [PATCH 045/106] docs: replace `background` with `background-color` for consistency (#467) Fixes potential confusion by the tutorial using `background-color` to overwrite `background` and referencing `background-color` instead of the shorthand `background` used by the app. --- .../06-classes-and-styles/04-component-styles/README.md | 4 ++-- .../04-component-styles/app-a/src/lib/Box.svelte | 4 ++-- .../04-component-styles/app-b/src/lib/Box.svelte | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/content/tutorial/02-advanced-svelte/06-classes-and-styles/04-component-styles/README.md b/content/tutorial/02-advanced-svelte/06-classes-and-styles/04-component-styles/README.md index 7e4f7c4f0..c272846c3 100644 --- a/content/tutorial/02-advanced-svelte/06-classes-and-styles/04-component-styles/README.md +++ b/content/tutorial/02-advanced-svelte/06-classes-and-styles/04-component-styles/README.md @@ -37,7 +37,7 @@ Inside `Box.svelte`, change `background-color` so that it is determined by a [CS height: 5em; border-radius: 0.5em; margin: 0 0 1em 0; - background: +++var(--color, #ddd)+++; + background-color: +++var(--color, #ddd)+++; } ``` @@ -55,4 +55,4 @@ Any parent element (such as `
`) can set the value of `--color The values can be dynamic, like any other attribute. -This feature works by wrapping each component in a `
`, where needed, and applying the custom properties to it. \ No newline at end of file +This feature works by wrapping each component in a `
`, where needed, and applying the custom properties to it. diff --git a/content/tutorial/02-advanced-svelte/06-classes-and-styles/04-component-styles/app-a/src/lib/Box.svelte b/content/tutorial/02-advanced-svelte/06-classes-and-styles/04-component-styles/app-a/src/lib/Box.svelte index 5b700e91d..523b40a79 100644 --- a/content/tutorial/02-advanced-svelte/06-classes-and-styles/04-component-styles/app-a/src/lib/Box.svelte +++ b/content/tutorial/02-advanced-svelte/06-classes-and-styles/04-component-styles/app-a/src/lib/Box.svelte @@ -6,6 +6,6 @@ height: 5em; border-radius: 0.5em; margin: 0 0 1em 0; - background: #ddd; + background-color: #ddd; } - \ No newline at end of file + diff --git a/content/tutorial/02-advanced-svelte/06-classes-and-styles/04-component-styles/app-b/src/lib/Box.svelte b/content/tutorial/02-advanced-svelte/06-classes-and-styles/04-component-styles/app-b/src/lib/Box.svelte index ab5da5e35..40c4aa7dc 100644 --- a/content/tutorial/02-advanced-svelte/06-classes-and-styles/04-component-styles/app-b/src/lib/Box.svelte +++ b/content/tutorial/02-advanced-svelte/06-classes-and-styles/04-component-styles/app-b/src/lib/Box.svelte @@ -6,6 +6,6 @@ height: 5em; border-radius: 0.5em; margin: 0 0 1em 0; - background: var(--color, #ddd); + background-color: var(--color, #ddd); } - \ No newline at end of file + From 10bdf8d1db67fda81d78f331f2d243d35c494a64 Mon Sep 17 00:00:00 2001 From: Kyutae Lee Date: Fri, 11 Aug 2023 18:25:41 +0900 Subject: [PATCH 046/106] docs: fix sample code in tutorial text to match the exercise solution (#463) This commit fix sample code in the-form-element tutorial text, which is `01-the-form-element /README.md`, to match the exercise solution, which is `01-the-form-element/app-b/src/routes/+page.svelte`. --- .../03-sveltekit/06-forms/01-the-form-element/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/tutorial/03-sveltekit/06-forms/01-the-form-element/README.md b/content/tutorial/03-sveltekit/06-forms/01-the-form-element/README.md index e0eb996df..1a4a59557 100644 --- a/content/tutorial/03-sveltekit/06-forms/01-the-form-element/README.md +++ b/content/tutorial/03-sveltekit/06-forms/01-the-form-element/README.md @@ -8,7 +8,7 @@ Let's build a todo app. We've already got an in-memory database set up in `src/l ```svelte /// file: src/routes/+page.svelte -

Todos

+

todos

+++
+++ -{#each data.todos as todo} +
    ``` If we type something into the `` and hit Enter, the browser makes a POST request (because of the `method="POST"` attribute) to the current page. But that results in an error, because we haven't created a server-side _action_ to handle the POST request. Let's do that now: From 7b01aef47bf35d431624fcefb99ab42dbd28ebbe Mon Sep 17 00:00:00 2001 From: Shinya Fujino Date: Tue, 22 Aug 2023 01:36:41 +0900 Subject: [PATCH 047/106] chore: remove `experimental` from inspector option (#481) Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> --- svelte.config.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/svelte.config.js b/svelte.config.js index 83e7b17cb..819cf63b7 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -9,14 +9,6 @@ const config = { version: { name: child_process.execSync('git rev-parse HEAD').toString().trim() } - }, - - vitePlugin: { - experimental: { - inspector: { - holdMode: true - } - } } }; From 996dcd283457d280aa1938484c66172db5f1a16a Mon Sep 17 00:00:00 2001 From: Yoon Han Date: Thu, 24 Aug 2023 03:33:47 +0900 Subject: [PATCH 048/106] docs: clarify the meaning of content (#485) * fix mismatched content * admit suggestion Co-authored-by: Geoff Rich <4992896+geoffrich@users.noreply.github.com> --------- Co-authored-by: Geoff Rich <4992896+geoffrich@users.noreply.github.com> --- .../02-advanced-svelte/07-composition/02-named-slots/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/tutorial/02-advanced-svelte/07-composition/02-named-slots/README.md b/content/tutorial/02-advanced-svelte/07-composition/02-named-slots/README.md index 7918e0423..609166d9b 100644 --- a/content/tutorial/02-advanced-svelte/07-composition/02-named-slots/README.md +++ b/content/tutorial/02-advanced-svelte/07-composition/02-named-slots/README.md @@ -4,7 +4,7 @@ title: Named slots The previous example contained a _default slot_, which renders the direct children of a component. Sometimes you will need more control over placement. In those cases, we can use _named slots_. -Inside the `` component, we've got `` and others for `company` and `address`. Let's add the corresponding named slots in `Card.svelte`: +Inside `App.svelte`, we're rendering a `` component that contains `` and others for `company` and `address`. Let's add the corresponding named slots in `Card.svelte`: ```svelte /// file: Card.svelte From 6584bed964d7a6c52ba52e13df23f1ebcd55c25e Mon Sep 17 00:00:00 2001 From: Ben Tomlin <57016008+bent101@users.noreply.github.com> Date: Thu, 24 Aug 2023 08:11:17 -0700 Subject: [PATCH 049/106] docs: fix link to cookies API (#489) --- .../03-sveltekit/06-forms/01-the-form-element/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/tutorial/03-sveltekit/06-forms/01-the-form-element/README.md b/content/tutorial/03-sveltekit/06-forms/01-the-form-element/README.md index 1a4a59557..2bccee00f 100644 --- a/content/tutorial/03-sveltekit/06-forms/01-the-form-element/README.md +++ b/content/tutorial/03-sveltekit/06-forms/01-the-form-element/README.md @@ -4,7 +4,7 @@ title: The
    element In the [chapter on loading](page-data), we saw how to get data from the server to the browser. Sometimes you need to send data in the opposite direction, and that's where `` — the web platform's way of submitting data — comes in. -Let's build a todo app. We've already got an in-memory database set up in `src/lib/server/database.js`, and our `load` function in `src/routes/+page.server.js` uses the [`cookies`](https://kit.svelte.dev/docs/load#cookies-and-headers) API so that we can have a per-user todo list, but we need to add a `` to create new todos: +Let's build a todo app. We've already got an in-memory database set up in `src/lib/server/database.js`, and our `load` function in `src/routes/+page.server.js` uses the [`cookies`](https://kit.svelte.dev/docs/load#cookies) API so that we can have a per-user todo list, but we need to add a `` to create new todos: ```svelte /// file: src/routes/+page.svelte From 6373fc608f5dd91616db30c64fc1018d286b7c98 Mon Sep 17 00:00:00 2001 From: Gordon Liang Date: Thu, 24 Aug 2023 19:39:18 -0400 Subject: [PATCH 050/106] docs: edit instruction for Store Bindings (#488) Edited instruction to 'add button' to 'add event handler', to reflect the true diff in the code. (The button already exists; the highlighted part is the event handler) --- .../tutorial/01-svelte/08-stores/06-store-bindings/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/tutorial/01-svelte/08-stores/06-store-bindings/README.md b/content/tutorial/01-svelte/08-stores/06-store-bindings/README.md index 20bba5bc8..f0fdcde9b 100644 --- a/content/tutorial/01-svelte/08-stores/06-store-bindings/README.md +++ b/content/tutorial/01-svelte/08-stores/06-store-bindings/README.md @@ -13,7 +13,7 @@ In this example we're exporting a writable store `name` and a derived store `gre Changing the input value will now update `name` and all its dependents. -We can also assign directly to store values inside a component. Add a ` -

    -{/if}+++ ++++{#if $updated}+++ +
    +

    + A new version of the app is available + + +

    +
    ++++{/if}+++ +``` diff --git a/content/tutorial/03-sveltekit/08-stores/03-updated-store/app-a/src/routes/+layout.svelte b/content/tutorial/03-sveltekit/08-stores/03-updated-store/app-a/src/routes/+layout.svelte index a00cb3018..6932ab024 100644 --- a/content/tutorial/03-sveltekit/08-stores/03-updated-store/app-a/src/routes/+layout.svelte +++ b/content/tutorial/03-sveltekit/08-stores/03-updated-store/app-a/src/routes/+layout.svelte @@ -1,5 +1,5 @@ -``` \ No newline at end of file +``` From 01f871846d70a74500f51e4e38720369e6554489 Mon Sep 17 00:00:00 2001 From: Emmy Lim Date: Sun, 3 Mar 2024 00:09:27 +0800 Subject: [PATCH 089/106] fix: add missing semicolon (#594) --- content/tutorial/01-svelte/07-lifecycle/01-onmount/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/tutorial/01-svelte/07-lifecycle/01-onmount/README.md b/content/tutorial/01-svelte/07-lifecycle/01-onmount/README.md index 23013d3a8..4195b5c69 100644 --- a/content/tutorial/01-svelte/07-lifecycle/01-onmount/README.md +++ b/content/tutorial/01-svelte/07-lifecycle/01-onmount/README.md @@ -41,7 +41,7 @@ So far so good — you should see gently undulating colours in the shape of the ```js /// file: App.svelte onMount(() => { - const canvas = document.querySelector('canvas') + const canvas = document.querySelector('canvas'); const context = canvas.getContext('2d'); +++let frame =+++ requestAnimationFrame(function loop(t) { From 9b19caf5eb29fc6342fdd0ac48612b8f9ec5f895 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Sun, 3 Mar 2024 01:53:09 +0800 Subject: [PATCH 090/106] fix: prevent ios from loading webcontainers (#584) --- src/routes/tutorial/[slug]/Loading.svelte | 32 +++++++++++++++++++++-- src/routes/tutorial/[slug]/adapter.js | 13 +++++++++ 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/routes/tutorial/[slug]/Loading.svelte b/src/routes/tutorial/[slug]/Loading.svelte index fb813058d..576835016 100644 --- a/src/routes/tutorial/[slug]/Loading.svelte +++ b/src/routes/tutorial/[slug]/Loading.svelte @@ -1,7 +1,8 @@ - + {/each} diff --git a/content/tutorial/02-advanced-svelte/02-transitions/09-deferred-transitions/app-b/src/lib/TodoList.svelte b/content/tutorial/02-advanced-svelte/02-transitions/09-deferred-transitions/app-b/src/lib/TodoList.svelte index 6d826d435..680de1fd9 100644 --- a/content/tutorial/02-advanced-svelte/02-transitions/09-deferred-transitions/app-b/src/lib/TodoList.svelte +++ b/content/tutorial/02-advanced-svelte/02-transitions/09-deferred-transitions/app-b/src/lib/TodoList.svelte @@ -21,7 +21,7 @@ {todo.description} - {/each} diff --git a/content/tutorial/02-advanced-svelte/03-animations/01-animate/app-b/src/lib/TodoList.svelte b/content/tutorial/02-advanced-svelte/03-animations/01-animate/app-b/src/lib/TodoList.svelte index 8ccddb80b..7d62582a2 100644 --- a/content/tutorial/02-advanced-svelte/03-animations/01-animate/app-b/src/lib/TodoList.svelte +++ b/content/tutorial/02-advanced-svelte/03-animations/01-animate/app-b/src/lib/TodoList.svelte @@ -23,7 +23,7 @@ {todo.description} - {/each} diff --git a/content/tutorial/02-advanced-svelte/04-actions/01-actions/app-a/src/lib/App.svelte b/content/tutorial/02-advanced-svelte/04-actions/01-actions/app-a/src/lib/App.svelte index f13598a4f..ceacc6d80 100644 --- a/content/tutorial/02-advanced-svelte/04-actions/01-actions/app-a/src/lib/App.svelte +++ b/content/tutorial/02-advanced-svelte/04-actions/01-actions/app-a/src/lib/App.svelte @@ -30,7 +30,7 @@ on:click={() => { selected = color; }} - /> + > {/each}
diff --git a/content/tutorial/02-advanced-svelte/04-actions/01-actions/app-a/src/lib/Canvas.svelte b/content/tutorial/02-advanced-svelte/04-actions/01-actions/app-a/src/lib/Canvas.svelte index 9bdad0400..e723693d9 100644 --- a/content/tutorial/02-advanced-svelte/04-actions/01-actions/app-a/src/lib/Canvas.svelte +++ b/content/tutorial/02-advanced-svelte/04-actions/01-actions/app-a/src/lib/Canvas.svelte @@ -66,13 +66,13 @@ previous = coords; }} -/> +> {#if previous}
+ >
{/if} - \ No newline at end of file + diff --git a/content/tutorial/02-advanced-svelte/05-bindings/03-media-elements/app-b/src/lib/AudioPlayer.svelte b/content/tutorial/02-advanced-svelte/05-bindings/03-media-elements/app-b/src/lib/AudioPlayer.svelte index 2a2a9d89e..fcfbc28ce 100644 --- a/content/tutorial/02-advanced-svelte/05-bindings/03-media-elements/app-b/src/lib/AudioPlayer.svelte +++ b/content/tutorial/02-advanced-svelte/05-bindings/03-media-elements/app-b/src/lib/AudioPlayer.svelte @@ -27,13 +27,13 @@ on:ended={() => { time = 0; }} - /> + >
@@ -69,7 +69,7 @@ }); }} > -
+
{duration ? format(duration) : '--:--'}
diff --git a/content/tutorial/02-advanced-svelte/05-bindings/05-bind-this/app-a/src/lib/App.svelte b/content/tutorial/02-advanced-svelte/05-bindings/05-bind-this/app-a/src/lib/App.svelte index de10e6465..582abc630 100644 --- a/content/tutorial/02-advanced-svelte/05-bindings/05-bind-this/app-a/src/lib/App.svelte +++ b/content/tutorial/02-advanced-svelte/05-bindings/05-bind-this/app-a/src/lib/App.svelte @@ -20,7 +20,7 @@ +> -``` \ No newline at end of file +``` diff --git a/content/tutorial/02-advanced-svelte/07-composition/04-slot-props/README.md b/content/tutorial/02-advanced-svelte/07-composition/04-slot-props/README.md index 896528c17..c8dbd89a4 100644 --- a/content/tutorial/02-advanced-svelte/07-composition/04-slot-props/README.md +++ b/content/tutorial/02-advanced-svelte/07-composition/04-slot-props/README.md @@ -12,7 +12,7 @@ Open `FilterableList.svelte`. The `` is being rendered for each filtered i /// file: FilterableList.svelte
{#each data.filter(matches) as item} - + {/each}
``` diff --git a/content/tutorial/02-advanced-svelte/07-composition/04-slot-props/app-a/src/lib/App.svelte b/content/tutorial/02-advanced-svelte/07-composition/04-slot-props/app-a/src/lib/App.svelte index 9757ff15d..1a7c9c9d5 100644 --- a/content/tutorial/02-advanced-svelte/07-composition/04-slot-props/app-a/src/lib/App.svelte +++ b/content/tutorial/02-advanced-svelte/07-composition/04-slot-props/app-a/src/lib/App.svelte @@ -10,7 +10,7 @@ field="name" >
- + name hex rgb @@ -18,7 +18,7 @@
- + {row.name} {row.hex} {row.rgb} diff --git a/content/tutorial/02-advanced-svelte/07-composition/04-slot-props/app-b/src/lib/App.svelte b/content/tutorial/02-advanced-svelte/07-composition/04-slot-props/app-b/src/lib/App.svelte index a21b37016..34c173fff 100644 --- a/content/tutorial/02-advanced-svelte/07-composition/04-slot-props/app-b/src/lib/App.svelte +++ b/content/tutorial/02-advanced-svelte/07-composition/04-slot-props/app-b/src/lib/App.svelte @@ -9,7 +9,7 @@ let:item={row} >
- + name hex rgb @@ -17,7 +17,7 @@
- + {row.name} {row.hex} {row.rgb} diff --git a/content/tutorial/02-advanced-svelte/07-composition/05-optional-slots/README.md b/content/tutorial/02-advanced-svelte/07-composition/05-optional-slots/README.md index 7f1d3d859..c9c219f69 100644 --- a/content/tutorial/02-advanced-svelte/07-composition/05-optional-slots/README.md +++ b/content/tutorial/02-advanced-svelte/07-composition/05-optional-slots/README.md @@ -7,7 +7,7 @@ In some cases, you may want to control parts of your component based on whether ```svelte /// file: App.svelte ---
- + name hex rgb @@ -31,7 +31,7 @@ We can fix that by using the special `$$slots` variable in `FilterableList.svelt /// file: FilterableList.svelte +++{#if $$slots.header}+++
- +
+++{/if}+++ ``` diff --git a/content/tutorial/02-advanced-svelte/07-composition/05-optional-slots/app-b/src/lib/App.svelte b/content/tutorial/02-advanced-svelte/07-composition/05-optional-slots/app-b/src/lib/App.svelte index de5be5138..0dde93327 100644 --- a/content/tutorial/02-advanced-svelte/07-composition/05-optional-slots/app-b/src/lib/App.svelte +++ b/content/tutorial/02-advanced-svelte/07-composition/05-optional-slots/app-b/src/lib/App.svelte @@ -9,7 +9,7 @@ let:item={row} >
- + {row.name} {row.hex} {row.rgb} diff --git a/content/tutorial/02-advanced-svelte/09-special-elements/01-svelte-self/README.md b/content/tutorial/02-advanced-svelte/09-special-elements/01-svelte-self/README.md index c117ad4ce..ea4e6a572 100644 --- a/content/tutorial/02-advanced-svelte/09-special-elements/01-svelte-self/README.md +++ b/content/tutorial/02-advanced-svelte/09-special-elements/01-svelte-self/README.md @@ -20,8 +20,8 @@ It's useful for things like this folder tree view, where folders can contain _ot ```svelte /// file: Folder.svelte {#if file.files} - ++++++ + ++++++ {:else} - + {/if} ``` diff --git a/content/tutorial/02-advanced-svelte/10-module-context/01-sharing-code/app-a/src/lib/AudioPlayer.svelte b/content/tutorial/02-advanced-svelte/10-module-context/01-sharing-code/app-a/src/lib/AudioPlayer.svelte index 1cc7d1737..85be476d6 100644 --- a/content/tutorial/02-advanced-svelte/10-module-context/01-sharing-code/app-a/src/lib/AudioPlayer.svelte +++ b/content/tutorial/02-advanced-svelte/10-module-context/01-sharing-code/app-a/src/lib/AudioPlayer.svelte @@ -26,13 +26,13 @@ on:ended={() => { time = 0; }} - /> + >
@@ -68,7 +68,7 @@ }); }} > -
+
{duration ? format(duration) : '--:--'}
diff --git a/content/tutorial/02-advanced-svelte/10-module-context/01-sharing-code/app-b/src/lib/AudioPlayer.svelte b/content/tutorial/02-advanced-svelte/10-module-context/01-sharing-code/app-b/src/lib/AudioPlayer.svelte index acafe1bbc..ffdb485d8 100644 --- a/content/tutorial/02-advanced-svelte/10-module-context/01-sharing-code/app-b/src/lib/AudioPlayer.svelte +++ b/content/tutorial/02-advanced-svelte/10-module-context/01-sharing-code/app-b/src/lib/AudioPlayer.svelte @@ -38,13 +38,13 @@ on:ended={() => { time = 0; }} - /> + >
@@ -80,7 +80,7 @@ }); }} > -
+
{duration ? format(duration) : '--:--'}
diff --git a/content/tutorial/02-advanced-svelte/10-module-context/02-module-exports/app-b/src/lib/AudioPlayer.svelte b/content/tutorial/02-advanced-svelte/10-module-context/02-module-exports/app-b/src/lib/AudioPlayer.svelte index 0eaa4a16e..323286b79 100644 --- a/content/tutorial/02-advanced-svelte/10-module-context/02-module-exports/app-b/src/lib/AudioPlayer.svelte +++ b/content/tutorial/02-advanced-svelte/10-module-context/02-module-exports/app-b/src/lib/AudioPlayer.svelte @@ -42,13 +42,13 @@ on:ended={() => { time = 0; }} - /> + >
@@ -84,7 +84,7 @@ }); }} > -
+
{duration ? format(duration) : '--:--'}
diff --git a/content/tutorial/03-sveltekit/02-routing/02-layouts/README.md b/content/tutorial/03-sveltekit/02-routing/02-layouts/README.md index e7812fead..79898d168 100644 --- a/content/tutorial/03-sveltekit/02-routing/02-layouts/README.md +++ b/content/tutorial/03-sveltekit/02-routing/02-layouts/README.md @@ -14,7 +14,7 @@ src/routes/ └ +page.svelte ``` -...and move the duplicated content from the `+page.svelte` files into the new `+layout.svelte` file. The `` element is where the page content will be rendered: +...and move the duplicated content from the `+page.svelte` files into the new `+layout.svelte` file. The `` element is where the page content will be rendered: ```svelte /// file: src/routes/+layout.svelte @@ -23,7 +23,7 @@ src/routes/ about - + ``` A `+layout.svelte` file applies to every child route, including the sibling `+page.svelte` (if it exists). You can nest layouts to arbitrary depth. diff --git a/content/tutorial/03-sveltekit/03-loading-data/02-layout-data/README.md b/content/tutorial/03-sveltekit/03-loading-data/02-layout-data/README.md index 0ea2b69c5..a96aab1ad 100644 --- a/content/tutorial/03-sveltekit/03-loading-data/02-layout-data/README.md +++ b/content/tutorial/03-sveltekit/03-loading-data/02-layout-data/README.md @@ -19,7 +19,7 @@ Now, add a sidebar in the layout for the post page:
- +
+++