diff --git a/.changeset/mighty-mice-call.md b/.changeset/mighty-mice-call.md
new file mode 100644
index 0000000000..340b33bd4b
--- /dev/null
+++ b/.changeset/mighty-mice-call.md
@@ -0,0 +1,5 @@
+---
+'svelte': patch
+---
+
+fix: keep batches alive until all async work is complete
diff --git a/.changeset/short-banks-yell.md b/.changeset/short-banks-yell.md
new file mode 100644
index 0000000000..34d5ba66d3
--- /dev/null
+++ b/.changeset/short-banks-yell.md
@@ -0,0 +1,5 @@
+---
+'svelte': patch
+---
+
+fix: don't preserve reactivity context across function boundaries
diff --git a/.changeset/silly-penguins-sleep.md b/.changeset/silly-penguins-sleep.md
new file mode 100644
index 0000000000..f397f1e8ba
--- /dev/null
+++ b/.changeset/silly-penguins-sleep.md
@@ -0,0 +1,5 @@
+---
+'svelte': patch
+---
+
+fix: make `$inspect` logs come from the callsite
diff --git a/.changeset/witty-seas-learn.md b/.changeset/witty-seas-learn.md
new file mode 100644
index 0000000000..aa94c7c35f
--- /dev/null
+++ b/.changeset/witty-seas-learn.md
@@ -0,0 +1,5 @@
+---
+'svelte': patch
+---
+
+fix: ensure guards (eg. if, each, key) run before their contents
diff --git a/.github/workflows/ecosystem-ci-trigger.yml b/.github/workflows/ecosystem-ci-trigger.yml
index 7753b606e1..8a6d1bf345 100644
--- a/.github/workflows/ecosystem-ci-trigger.yml
+++ b/.github/workflows/ecosystem-ci-trigger.yml
@@ -4,19 +4,20 @@ on:
issue_comment:
types: [created]
+permissions: {}
+
jobs:
trigger:
runs-on: ubuntu-latest
if: github.repository == 'sveltejs/svelte' && github.event.issue.pull_request && startsWith(github.event.comment.body, '/ecosystem-ci run')
permissions:
- issues: write # to add / delete reactions
+ issues: write # to add / delete reactions, post comments
pull-requests: write # to read PR data, and to add labels
actions: read # to check workflow status
contents: read # to clone the repo
steps:
- - name: monitor action permissions
- - name: check user authorization # user needs triage permission
- uses: actions/github-script@v7
+ - name: Check User Permissions
+ uses: actions/github-script@v8
id: check-permissions
with:
script: |
@@ -55,7 +56,7 @@ jobs:
}
- name: Get PR Data
- uses: actions/github-script@v7
+ uses: actions/github-script@v8
id: get-pr-data
with:
script: |
@@ -65,6 +66,37 @@ jobs:
repo: context.repo.repo,
pull_number: context.issue.number
})
+
+ const commentCreatedAt = new Date(context.payload.comment.created_at)
+ const commitPushedAt = new Date(pr.head.repo.pushed_at)
+
+ console.log(`Comment created at: ${commentCreatedAt.toISOString()}`)
+ console.log(`PR last pushed at: ${commitPushedAt.toISOString()}`)
+
+ // Check if any commits were pushed after the comment was created
+ if (commitPushedAt > commentCreatedAt) {
+ const errorMsg = [
+ '⚠️ Security warning: PR was updated after the trigger command was posted.',
+ '',
+ `Comment posted at: ${commentCreatedAt.toISOString()}`,
+ `PR last pushed at: ${commitPushedAt.toISOString()}`,
+ '',
+ 'This could indicate an attempt to inject code after approval.',
+ 'Please review the latest changes and re-run /ecosystem-ci run if they are acceptable.'
+ ].join('\n')
+
+ core.setFailed(errorMsg)
+
+ await github.rest.issues.createComment({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: context.issue.number,
+ body: errorMsg
+ })
+
+ throw new Error('PR was pushed to after comment was created')
+ }
+
return {
num: context.issue.number,
branchName: pr.head.ref,
@@ -83,15 +115,16 @@ jobs:
svelte-ecosystem-ci
- name: Trigger Downstream Workflow
- uses: actions/github-script@v7
+ uses: actions/github-script@v8
id: trigger
env:
COMMENT: ${{ github.event.comment.body }}
+ PR_DATA: ${{ steps.get-pr-data.outputs.result }}
with:
github-token: ${{ steps.generate-token.outputs.token }}
script: |
const comment = process.env.COMMENT.trim()
- const prData = ${{ steps.get-pr-data.outputs.result }}
+ const prData = JSON.parse(process.env.PR_DATA)
const suite = comment.split('\n')[0].replace(/^\/ecosystem-ci run/, '').trim()
diff --git a/.github/workflows/pkg.pr.new.yml b/.github/workflows/pkg.pr.new.yml
index b1ba217e5a..49303f1684 100644
--- a/.github/workflows/pkg.pr.new.yml
+++ b/.github/workflows/pkg.pr.new.yml
@@ -1,6 +1,8 @@
name: Publish Any Commit
on: [push, pull_request]
+permissions: {}
+
jobs:
build:
permissions: {}
diff --git a/documentation/docs/01-introduction/02-getting-started.md b/documentation/docs/01-introduction/02-getting-started.md
index e97a46ad34..2ad22c8469 100644
--- a/documentation/docs/01-introduction/02-getting-started.md
+++ b/documentation/docs/01-introduction/02-getting-started.md
@@ -15,11 +15,11 @@ Don't worry if you don't know Svelte yet! You can ignore all the nice features S
## Alternatives to SvelteKit
-You can also use Svelte directly with Vite by running `npm create vite@latest` and selecting the `svelte` option. With this, `npm run build` will generate HTML, JS, and CSS files inside the `dist` directory using [vite-plugin-svelte](https://github.com/sveltejs/vite-plugin-svelte). In most cases, you will probably need to [choose a routing library](faq#Is-there-a-router) as well.
+You can also use Svelte directly with Vite by running `npm create vite@latest` and selecting the `svelte` option. With this, `npm run build` will generate HTML, JS, and CSS files inside the `dist` directory using [vite-plugin-svelte](https://github.com/sveltejs/vite-plugin-svelte). In most cases, you will probably need to [choose a routing library](/packages#routing) as well.
>[!NOTE] Vite is often used in standalone mode to build [single page apps (SPAs)](../kit/glossary#SPA), which you can also [build with SvelteKit](../kit/single-page-apps).
-There are also plugins for [Rollup](https://github.com/sveltejs/rollup-plugin-svelte), [Webpack](https://github.com/sveltejs/svelte-loader) [and a few others](https://sveltesociety.dev/packages?category=build-plugins), but we recommend Vite.
+There are also [plugins for other bundlers](/packages#bundler-plugins), but we recommend Vite.
## Editor tooling
diff --git a/documentation/docs/02-runes/02-$state.md b/documentation/docs/02-runes/02-$state.md
index 741e24fde0..6fbf3b8895 100644
--- a/documentation/docs/02-runes/02-$state.md
+++ b/documentation/docs/02-runes/02-$state.md
@@ -166,6 +166,21 @@ To take a static snapshot of a deeply reactive `$state` proxy, use `$state.snaps
This is handy when you want to pass some state to an external library or API that doesn't expect a proxy, such as `structuredClone`.
+## `$state.eager`
+
+When state changes, it may not be reflected in the UI immediately if it is used by an `await` expression, because [updates are synchronized](await-expressions#Synchronized-updates).
+
+In some cases, you may want to update the UI as soon as the state changes. For example, you might want to update a navigation bar when the user clicks on a link, so that they get visual feedback while waiting for the new page to load. To do this, use `$state.eager(value)`:
+
+```svelte
+
+```
+
+Use this feature sparingly, and only to provide feedback in response to user action — in general, allowing Svelte to coordinate updates will provide a better user experience.
+
## Passing state into functions
JavaScript is a _pass-by-value_ language — when you call a function, the arguments are the _values_ rather than the _variables_. In other words:
diff --git a/documentation/docs/02-runes/03-$derived.md b/documentation/docs/02-runes/03-$derived.md
index 0123868c4e..d3e46eb22d 100644
--- a/documentation/docs/02-runes/03-$derived.md
+++ b/documentation/docs/02-runes/03-$derived.md
@@ -85,8 +85,9 @@ Derived expressions are recalculated when their dependencies change, but you can
Unlike `$state`, which converts objects and arrays to [deeply reactive proxies]($state#Deep-state), `$derived` values are left as-is. For example, [in a case like this](/playground/untitled#H4sIAAAAAAAAE4VU22rjMBD9lUHd3aaQi9PdstS1A3t5XvpQ2Ic4D7I1iUUV2UjjNMX431eS7TRdSosxgjMzZ45mjt0yzffIYibvy0ojFJWqDKCQVBk2ZVup0LJ43TJ6rn2aBxw-FP2o67k9oCKP5dziW3hRaUJNjoYltjCyplWmM1JIIAn3FlL4ZIkTTtYez6jtj4w8WwyXv9GiIXiQxLVs9pfTMR7EuoSLIuLFbX7Z4930bZo_nBrD1bs834tlfvsBz9_SyX6PZXu9XaL4gOWn4sXjeyzftv4ZWfyxubpzxzg6LfD4MrooxELEosKCUPigQCMPKCZh0OtQE1iSxcsmdHuBvCiHZXALLXiN08EL3RRkaJ_kDVGle0HcSD5TPEeVtj67O4Nrg9aiSNtBY5oODJkrL5QsHtN2cgXp6nSJMWzpWWGasdlsGEMbzi5jPr5KFr0Ep7pdeM2-TCelCddIhDxAobi1jqF3cMaC1RKp64bAW9iFAmXGIHfd4wNXDabtOLN53w8W53VvJoZLh7xk4Rr3CoL-UNoLhWHrT1JQGcM17u96oES5K-kc2XOzkzqGCKL5De79OUTyyrg1zgwXsrEx3ESfx4Bz0M5UjVMHB24mw9SuXtXFoN13fYKOM1tyUT3FbvbWmSWCZX2Er-41u5xPoml45svRahl9Wb9aasbINJixDZwcPTbyTLZSUsAvrg_cPuCR7s782_WU8343Y72Qtlb8OYatwuOQvuN13M_hJKNfxann1v1U_B1KZ_D_mzhzhz24fw85CSz2irtN9w9HshBK7AQAAA==)...
-```svelte
-let items = $state([...]);
+```js
+// @errors: 7005
+let items = $state([ /*...*/ ]);
let index = $state(0);
let selected = $derived(items[index]);
diff --git a/documentation/docs/02-runes/07-$inspect.md b/documentation/docs/02-runes/07-$inspect.md
index 13ac8b79a3..6d47e30e27 100644
--- a/documentation/docs/02-runes/07-$inspect.md
+++ b/documentation/docs/02-runes/07-$inspect.md
@@ -18,6 +18,8 @@ The `$inspect` rune is roughly equivalent to `console.log`, with the exception t
```
+On updates, a stack trace will be printed, making it easy to find the origin of a state change (unless you're in the playground, due to technical limitations).
+
## $inspect(...).with
`$inspect` returns a property `with`, which you can invoke with a callback, which will then be invoked instead of `console.log`. The first argument to the callback is either `"init"` or `"update"`; subsequent arguments are the values passed to `$inspect` ([demo](/playground/untitled#H4sIAAAAAAAACkVQ24qDMBD9lSEUqlTqPlsj7ON-w7pQG8c2VCchmVSK-O-bKMs-DefKYRYx6BG9qL4XQd2EohKf1opC8Nsm4F84MkbsTXAqMbVXTltuWmp5RAZlAjFIOHjuGLOP_BKVqB00eYuKs82Qn2fNjyxLtcWeyUE2sCRry3qATQIpJRyD7WPVMf9TW-7xFu53dBcoSzAOrsqQNyOe2XUKr0Xi5kcMvdDB2wSYO-I9vKazplV1-T-d6ltgNgSG1KjVUy7ZtmdbdjqtzRcphxMS1-XubOITJtPrQWMvKnYB15_1F7KKadA_AQAA)):
@@ -36,13 +38,6 @@ The `$inspect` rune is roughly equivalent to `console.log`, with the exception t
```
-A convenient way to find the origin of some change is to pass `console.trace` to `with`:
-
-```js
-// @errors: 2304
-$inspect(stuff).with(console.trace);
-```
-
## $inspect.trace(...)
This rune, added in 5.14, causes the surrounding function to be _traced_ in development. Any time the function re-runs as part of an [effect]($effect) or a [derived]($derived), information will be printed to the console about which pieces of reactive state caused the effect to fire.
diff --git a/documentation/docs/03-template-syntax/12-bind.md b/documentation/docs/03-template-syntax/12-bind.md
index de57815687..be84969b87 100644
--- a/documentation/docs/03-template-syntax/12-bind.md
+++ b/documentation/docs/03-template-syntax/12-bind.md
@@ -95,7 +95,7 @@ Since 5.6.0, if an `` has a `defaultValue` and is part of a form, it will
## ``
-Checkbox and radio inputs can be bound with `bind:checked`:
+Checkbox inputs can be bound with `bind:checked`:
```svelte
diff --git a/packages/svelte/tests/server-side-rendering/samples/async-children/_expected.html b/packages/svelte/tests/server-side-rendering/samples/async-children/_expected.html
new file mode 100644
index 0000000000..04d9709792
--- /dev/null
+++ b/packages/svelte/tests/server-side-rendering/samples/async-children/_expected.html
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git a/packages/svelte/tests/server-side-rendering/samples/async-children/component.svelte b/packages/svelte/tests/server-side-rendering/samples/async-children/component.svelte
new file mode 100644
index 0000000000..73b5a2f823
--- /dev/null
+++ b/packages/svelte/tests/server-side-rendering/samples/async-children/component.svelte
@@ -0,0 +1,4 @@
+
+{@render children()}
\ No newline at end of file
diff --git a/packages/svelte/tests/server-side-rendering/samples/async-children/main.svelte b/packages/svelte/tests/server-side-rendering/samples/async-children/main.svelte
new file mode 100644
index 0000000000..ae0fc571b3
--- /dev/null
+++ b/packages/svelte/tests/server-side-rendering/samples/async-children/main.svelte
@@ -0,0 +1,7 @@
+
+
+ {@const one = await 1}
+ {one}
+
\ No newline at end of file
diff --git a/packages/svelte/tests/server-side-rendering/samples/async-directive-with-spreading/_expected.html b/packages/svelte/tests/server-side-rendering/samples/async-directive-with-spreading/_expected.html
new file mode 100644
index 0000000000..d46a957bdf
--- /dev/null
+++ b/packages/svelte/tests/server-side-rendering/samples/async-directive-with-spreading/_expected.html
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/svelte/tests/server-side-rendering/samples/async-directive-with-spreading/main.svelte b/packages/svelte/tests/server-side-rendering/samples/async-directive-with-spreading/main.svelte
new file mode 100644
index 0000000000..ed4270b754
--- /dev/null
+++ b/packages/svelte/tests/server-side-rendering/samples/async-directive-with-spreading/main.svelte
@@ -0,0 +1,2 @@
+
+
diff --git a/packages/svelte/tests/server-side-rendering/samples/async-html-tag/_expected.html b/packages/svelte/tests/server-side-rendering/samples/async-html-tag/_expected.html
new file mode 100644
index 0000000000..5be0be37f2
--- /dev/null
+++ b/packages/svelte/tests/server-side-rendering/samples/async-html-tag/_expected.html
@@ -0,0 +1 @@
+
this should work
\ No newline at end of file
diff --git a/packages/svelte/tests/server-side-rendering/samples/async-html-tag/main.svelte b/packages/svelte/tests/server-side-rendering/samples/async-html-tag/main.svelte
new file mode 100644
index 0000000000..2d556e4d5b
--- /dev/null
+++ b/packages/svelte/tests/server-side-rendering/samples/async-html-tag/main.svelte
@@ -0,0 +1 @@
+
{@html await 'this should work'}
\ No newline at end of file
diff --git a/packages/svelte/tests/server-side-rendering/samples/async-if-const/_expected.html b/packages/svelte/tests/server-side-rendering/samples/async-if-const/_expected.html
new file mode 100644
index 0000000000..e440e5c842
--- /dev/null
+++ b/packages/svelte/tests/server-side-rendering/samples/async-if-const/_expected.html
@@ -0,0 +1 @@
+3
\ No newline at end of file
diff --git a/packages/svelte/tests/server-side-rendering/samples/async-if-const/main.svelte b/packages/svelte/tests/server-side-rendering/samples/async-if-const/main.svelte
new file mode 100644
index 0000000000..1437ac8f14
--- /dev/null
+++ b/packages/svelte/tests/server-side-rendering/samples/async-if-const/main.svelte
@@ -0,0 +1,10 @@
+{#if false}
+ {@const one = await 1}
+ {one}
+{:else if false}
+ {@const two = await 2}
+ {two}
+{:else}
+ {@const three = await 3}
+ {three}
+{/if}
diff --git a/packages/svelte/tests/server-side-rendering/samples/async-nullish-pending-snippet/_expected.html b/packages/svelte/tests/server-side-rendering/samples/async-nullish-pending-snippet/_expected.html
new file mode 100644
index 0000000000..1cc0b4b00f
--- /dev/null
+++ b/packages/svelte/tests/server-side-rendering/samples/async-nullish-pending-snippet/_expected.html
@@ -0,0 +1 @@
+awaited
\ No newline at end of file
diff --git a/packages/svelte/tests/server-side-rendering/samples/async-nullish-pending-snippet/main.svelte b/packages/svelte/tests/server-side-rendering/samples/async-nullish-pending-snippet/main.svelte
new file mode 100644
index 0000000000..b4e8dbcb75
--- /dev/null
+++ b/packages/svelte/tests/server-side-rendering/samples/async-nullish-pending-snippet/main.svelte
@@ -0,0 +1,6 @@
+
+
+ {await 'awaited'}
+
\ No newline at end of file
diff --git a/packages/svelte/tests/server-side-rendering/samples/async-snippet/_expected.html b/packages/svelte/tests/server-side-rendering/samples/async-snippet/_expected.html
new file mode 100644
index 0000000000..5be0be37f2
--- /dev/null
+++ b/packages/svelte/tests/server-side-rendering/samples/async-snippet/_expected.html
@@ -0,0 +1 @@
+
this should work
\ No newline at end of file
diff --git a/packages/svelte/tests/server-side-rendering/samples/async-snippet/main.svelte b/packages/svelte/tests/server-side-rendering/samples/async-snippet/main.svelte
new file mode 100644
index 0000000000..a6f2ac7b09
--- /dev/null
+++ b/packages/svelte/tests/server-side-rendering/samples/async-snippet/main.svelte
@@ -0,0 +1,6 @@
+{#snippet foo()}
+ {@const x = await 'this should work'}
+
\ No newline at end of file
diff --git a/packages/svelte/tests/server-side-rendering/samples/async-svelte-boundary/main.svelte b/packages/svelte/tests/server-side-rendering/samples/async-svelte-boundary/main.svelte
new file mode 100644
index 0000000000..c4cde60119
--- /dev/null
+++ b/packages/svelte/tests/server-side-rendering/samples/async-svelte-boundary/main.svelte
@@ -0,0 +1,4 @@
+
+ {@const x = await 'this should work'}
+
{x}
+
\ No newline at end of file
diff --git a/packages/svelte/tests/server-side-rendering/samples/boundary-pending-prop-async/_config.js b/packages/svelte/tests/server-side-rendering/samples/boundary-pending-prop-async/_config.js
new file mode 100644
index 0000000000..f47bee71df
--- /dev/null
+++ b/packages/svelte/tests/server-side-rendering/samples/boundary-pending-prop-async/_config.js
@@ -0,0 +1,3 @@
+import { test } from '../../test';
+
+export default test({});
diff --git a/packages/svelte/tests/server-side-rendering/samples/boundary-pending-prop-async/_expected.html b/packages/svelte/tests/server-side-rendering/samples/boundary-pending-prop-async/_expected.html
new file mode 100644
index 0000000000..ac7cd985f1
--- /dev/null
+++ b/packages/svelte/tests/server-side-rendering/samples/boundary-pending-prop-async/_expected.html
@@ -0,0 +1 @@
+Loading...
\ No newline at end of file
diff --git a/packages/svelte/tests/server-side-rendering/samples/boundary-pending-prop-async/main.svelte b/packages/svelte/tests/server-side-rendering/samples/boundary-pending-prop-async/main.svelte
new file mode 100644
index 0000000000..7e0d4c62ea
--- /dev/null
+++ b/packages/svelte/tests/server-side-rendering/samples/boundary-pending-prop-async/main.svelte
@@ -0,0 +1,8 @@
+{#snippet pending()}
+ Loading...
+{/snippet}
+
+
+ {@const data = await Promise.resolve('hello')}
+
{data}
+
\ No newline at end of file
diff --git a/packages/svelte/tests/server-side-rendering/samples/each-body-async/_config.js b/packages/svelte/tests/server-side-rendering/samples/each-body-async/_config.js
new file mode 100644
index 0000000000..05de37a8bd
--- /dev/null
+++ b/packages/svelte/tests/server-side-rendering/samples/each-body-async/_config.js
@@ -0,0 +1,5 @@
+import { test } from '../../test';
+
+export default test({
+ mode: ['async']
+});
diff --git a/packages/svelte/tests/server-side-rendering/samples/each-body-async/_expected.html b/packages/svelte/tests/server-side-rendering/samples/each-body-async/_expected.html
new file mode 100644
index 0000000000..605299c2ae
--- /dev/null
+++ b/packages/svelte/tests/server-side-rendering/samples/each-body-async/_expected.html
@@ -0,0 +1 @@
+each else
\ No newline at end of file
diff --git a/packages/svelte/tests/server-side-rendering/samples/each-body-async/main.svelte b/packages/svelte/tests/server-side-rendering/samples/each-body-async/main.svelte
new file mode 100644
index 0000000000..86e15c4e7e
--- /dev/null
+++ b/packages/svelte/tests/server-side-rendering/samples/each-body-async/main.svelte
@@ -0,0 +1,11 @@
+{#each { length: 1 }}
+ {@const data = await Promise.resolve("each")}
+ {data}
+{/each}
+
+{#each { length: 0 }}
+ should not see this
+{:else}
+ {@const data = await Promise.resolve("else")}
+ {data}
+{/each}
\ No newline at end of file
diff --git a/packages/svelte/tests/server-side-rendering/samples/option-scoped-class/_expected.html b/packages/svelte/tests/server-side-rendering/samples/option-scoped-class/_expected.html
new file mode 100644
index 0000000000..b30e5ff4a1
--- /dev/null
+++ b/packages/svelte/tests/server-side-rendering/samples/option-scoped-class/_expected.html
@@ -0,0 +1,2 @@
+
+
diff --git a/packages/svelte/tests/server-side-rendering/samples/option-scoped-class/main.svelte b/packages/svelte/tests/server-side-rendering/samples/option-scoped-class/main.svelte
new file mode 100644
index 0000000000..657f1e949d
--- /dev/null
+++ b/packages/svelte/tests/server-side-rendering/samples/option-scoped-class/main.svelte
@@ -0,0 +1,10 @@
+
+
+
+
diff --git a/packages/svelte/tests/server-side-rendering/samples/select-value-scoped-class/_expected.html b/packages/svelte/tests/server-side-rendering/samples/select-value-scoped-class/_expected.html
new file mode 100644
index 0000000000..d74fc96d9c
--- /dev/null
+++ b/packages/svelte/tests/server-side-rendering/samples/select-value-scoped-class/_expected.html
@@ -0,0 +1 @@
+
diff --git a/packages/svelte/tests/server-side-rendering/samples/select-value-scoped-class/main.svelte b/packages/svelte/tests/server-side-rendering/samples/select-value-scoped-class/main.svelte
new file mode 100644
index 0000000000..9ad3a6b4d2
--- /dev/null
+++ b/packages/svelte/tests/server-side-rendering/samples/select-value-scoped-class/main.svelte
@@ -0,0 +1,9 @@
+
+
+
diff --git a/packages/svelte/tests/snapshot/samples/async-in-derived/_config.js b/packages/svelte/tests/snapshot/samples/async-in-derived/_config.js
new file mode 100644
index 0000000000..2e30bbeb16
--- /dev/null
+++ b/packages/svelte/tests/snapshot/samples/async-in-derived/_config.js
@@ -0,0 +1,3 @@
+import { test } from '../../test';
+
+export default test({ compileOptions: { experimental: { async: true } } });
diff --git a/packages/svelte/tests/snapshot/samples/async-in-derived/_expected/client/index.svelte.js b/packages/svelte/tests/snapshot/samples/async-in-derived/_expected/client/index.svelte.js
new file mode 100644
index 0000000000..7a97850175
--- /dev/null
+++ b/packages/svelte/tests/snapshot/samples/async-in-derived/_expected/client/index.svelte.js
@@ -0,0 +1,52 @@
+import 'svelte/internal/disclose-version';
+import 'svelte/internal/flags/async';
+import * as $ from 'svelte/internal/client';
+
+export default function Async_in_derived($$anchor, $$props) {
+ $.push($$props, true);
+
+ $.async_body($$anchor, async ($$anchor) => {
+ let yes1 = (await $.save($.async_derived(async () => (await $.save(1))())))();
+ let yes2 = (await $.save($.async_derived(async () => foo((await $.save(1))()))))();
+
+ let no1 = $.derived(async () => {
+ return await 1;
+ });
+
+ let no2 = $.derived(() => async () => {
+ return await 1;
+ });
+
+ if ($.aborted()) return;
+
+ var fragment = $.comment();
+ var node = $.first_child(fragment);
+
+ {
+ var consequent = ($$anchor) => {
+ $.async_body($$anchor, async ($$anchor) => {
+ const yes1 = (await $.save($.async_derived(async () => (await $.save(1))())))();
+ const yes2 = (await $.save($.async_derived(async () => foo((await $.save(1))()))))();
+
+ const no1 = $.derived(() => (async () => {
+ return await 1;
+ })());
+
+ const no2 = $.derived(() => (async () => {
+ return await 1;
+ })());
+
+ if ($.aborted()) return;
+ });
+ };
+
+ $.if(node, ($$render) => {
+ if (true) $$render(consequent);
+ });
+ }
+
+ $.append($$anchor, fragment);
+ });
+
+ $.pop();
+}
\ No newline at end of file
diff --git a/packages/svelte/tests/snapshot/samples/async-in-derived/_expected/server/index.svelte.js b/packages/svelte/tests/snapshot/samples/async-in-derived/_expected/server/index.svelte.js
new file mode 100644
index 0000000000..69eca5a383
--- /dev/null
+++ b/packages/svelte/tests/snapshot/samples/async-in-derived/_expected/server/index.svelte.js
@@ -0,0 +1,40 @@
+import 'svelte/internal/flags/async';
+import * as $ from 'svelte/internal/server';
+
+export default function Async_in_derived($$renderer, $$props) {
+ $$renderer.component(($$renderer) => {
+ $$renderer.async(async ($$renderer) => {
+ let yes1 = (await $.save(1))();
+ let yes2 = foo((await $.save(1))());
+
+ let no1 = (async () => {
+ return await 1;
+ })();
+
+ let no2 = async () => {
+ return await 1;
+ };
+
+ $$renderer.async(async ($$renderer) => {
+ if (true) {
+ $$renderer.push('');
+
+ const yes1 = (await $.save(1))();
+ const yes2 = foo((await $.save(1))());
+
+ const no1 = (async () => {
+ return await 1;
+ })();
+
+ const no2 = (async () => {
+ return await 1;
+ })();
+ } else {
+ $$renderer.push('');
+ }
+ });
+
+ $$renderer.push(``);
+ });
+ });
+}
\ No newline at end of file
diff --git a/packages/svelte/tests/snapshot/samples/async-in-derived/index.svelte b/packages/svelte/tests/snapshot/samples/async-in-derived/index.svelte
new file mode 100644
index 0000000000..bda88fd3ae
--- /dev/null
+++ b/packages/svelte/tests/snapshot/samples/async-in-derived/index.svelte
@@ -0,0 +1,21 @@
+
+
+{#if true}
+ {@const yes1 = await 1}
+ {@const yes2 = foo(await 1)}
+ {@const no1 = (async () => {
+ return await 1;
+ })()}
+ {@const no2 = (async () => {
+ return await 1;
+ })()}
+{/if}
diff --git a/packages/svelte/tests/validator/samples/a11y-anchor-has-content/warnings.json b/packages/svelte/tests/validator/samples/a11y-anchor-has-content/warnings.json
index cd3778a443..3d9adc1cde 100644
--- a/packages/svelte/tests/validator/samples/a11y-anchor-has-content/warnings.json
+++ b/packages/svelte/tests/validator/samples/a11y-anchor-has-content/warnings.json
@@ -1,7 +1,7 @@
[
{
"code": "a11y_consider_explicit_label",
- "message": "Buttons and links should either contain text or have an `aria-label` or `aria-labelledby` attribute",
+ "message": "Buttons and links should either contain text or have an `aria-label`, `aria-labelledby` or `title` attribute",
"start": {
"line": 1,
"column": 0
diff --git a/packages/svelte/tests/validator/samples/a11y-consider-explicit-label/input.svelte b/packages/svelte/tests/validator/samples/a11y-consider-explicit-label/input.svelte
index e97951065d..463889dc4f 100644
--- a/packages/svelte/tests/validator/samples/a11y-consider-explicit-label/input.svelte
+++ b/packages/svelte/tests/validator/samples/a11y-consider-explicit-label/input.svelte
@@ -4,6 +4,9 @@
+
+
+
diff --git a/packages/svelte/tests/validator/samples/a11y-consider-explicit-label/warnings.json b/packages/svelte/tests/validator/samples/a11y-consider-explicit-label/warnings.json
index 2dcecf08b3..bc29076184 100644
--- a/packages/svelte/tests/validator/samples/a11y-consider-explicit-label/warnings.json
+++ b/packages/svelte/tests/validator/samples/a11y-consider-explicit-label/warnings.json
@@ -1,7 +1,7 @@
[
{
"code": "a11y_consider_explicit_label",
- "message": "Buttons and links should either contain text or have an `aria-label` or `aria-labelledby` attribute",
+ "message": "Buttons and links should either contain text or have an `aria-label`, `aria-labelledby` or `title` attribute",
"start": {
"line": 1,
"column": 0
@@ -13,7 +13,7 @@
},
{
"code": "a11y_consider_explicit_label",
- "message": "Buttons and links should either contain text or have an `aria-label` or `aria-labelledby` attribute",
+ "message": "Buttons and links should either contain text or have an `aria-label`, `aria-labelledby` or `title` attribute",
"start": {
"line": 2,
"column": 0
diff --git a/packages/svelte/tests/validator/samples/binding-dimensions-svg/errors.json b/packages/svelte/tests/validator/samples/binding-dimensions-svg/errors.json
index 4d3819453c..61e6ca6355 100644
--- a/packages/svelte/tests/validator/samples/binding-dimensions-svg/errors.json
+++ b/packages/svelte/tests/validator/samples/binding-dimensions-svg/errors.json
@@ -1,7 +1,7 @@
[
{
"code": "bind_invalid_target",
- "message": "`bind:offsetWidth` can only be used with non-