mirror of https://github.com/sveltejs/svelte
commit
d7e01b7634
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: handle parens in template expressions more robustly
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: correct types for `ontoggle` on `<details>` elements
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: unskip branches of earlier batches after commit
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: skip rebase logic in non-async mode
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: don't reset status of uninitialized deriveds
|
||||
@ -0,0 +1 @@
|
||||
{(/**/ 42)}
|
||||
@ -0,0 +1,61 @@
|
||||
{
|
||||
"css": null,
|
||||
"js": [],
|
||||
"start": 0,
|
||||
"end": 11,
|
||||
"type": "Root",
|
||||
"fragment": {
|
||||
"type": "Fragment",
|
||||
"nodes": [
|
||||
{
|
||||
"type": "ExpressionTag",
|
||||
"start": 0,
|
||||
"end": 11,
|
||||
"expression": {
|
||||
"type": "Literal",
|
||||
"start": 7,
|
||||
"end": 9,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 7
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 9
|
||||
}
|
||||
},
|
||||
"value": 42,
|
||||
"raw": "42",
|
||||
"leadingComments": [
|
||||
{
|
||||
"type": "Block",
|
||||
"value": "",
|
||||
"start": 2,
|
||||
"end": 6
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"options": null,
|
||||
"comments": [
|
||||
{
|
||||
"type": "Block",
|
||||
"value": "",
|
||||
"start": 2,
|
||||
"end": 6,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 2
|
||||
},
|
||||
"end": {
|
||||
"line": 1,
|
||||
"column": 6
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -0,0 +1,8 @@
|
||||
<svelte:options customElement={{
|
||||
tag: "my-inner",
|
||||
props: { value: { reflect: true }}
|
||||
}} />
|
||||
<script>
|
||||
export let value;
|
||||
</script>
|
||||
{value}
|
||||
@ -0,0 +1,20 @@
|
||||
import { tick } from 'svelte';
|
||||
import { test } from '../../test';
|
||||
|
||||
export default test({
|
||||
async test({ assert, target }) {
|
||||
await tick();
|
||||
const [btn] = target.querySelectorAll('button');
|
||||
|
||||
btn.click();
|
||||
await tick();
|
||||
assert.htmlEqual(
|
||||
target.innerHTML,
|
||||
`
|
||||
<button>inc</button>
|
||||
<my-inner value="2"></my-inner>
|
||||
2
|
||||
`
|
||||
);
|
||||
}
|
||||
});
|
||||
@ -0,0 +1,12 @@
|
||||
<script>
|
||||
import "./Inner.svelte"
|
||||
let count = 1;
|
||||
</script>
|
||||
|
||||
<button on:click={() => count++}>inc</button>
|
||||
<!-- updating value prop will cause a flushSync -->
|
||||
<my-inner value={count}></my-inner>
|
||||
<!-- updating count will cause an internal_set -->
|
||||
{#each [count] as row}
|
||||
{row}
|
||||
{/each}
|
||||
@ -0,0 +1,20 @@
|
||||
import { tick } from 'svelte';
|
||||
import { test } from '../../test';
|
||||
|
||||
export default test({
|
||||
async test({ assert, target }) {
|
||||
const [, toggle] = target.querySelectorAll('button');
|
||||
|
||||
toggle?.click();
|
||||
await tick();
|
||||
assert.htmlEqual(target.innerHTML, `<button>0</button> <button>toggle</button> 0`);
|
||||
|
||||
toggle?.click();
|
||||
await tick();
|
||||
assert.htmlEqual(target.innerHTML, `<button>0</button> <button>toggle</button>`);
|
||||
|
||||
toggle?.click();
|
||||
await tick();
|
||||
assert.htmlEqual(target.innerHTML, `<button>0</button> <button>toggle</button> 0`);
|
||||
}
|
||||
});
|
||||
@ -0,0 +1,13 @@
|
||||
<script>
|
||||
import { fork } from 'svelte';
|
||||
let show = $state(false);
|
||||
let count = $state(0);
|
||||
let d_count = $derived(count);
|
||||
</script>
|
||||
|
||||
<button onclick={() => count += 1}>{count}</button> <!-- just here so count is compiled as a source -->
|
||||
<button onclick={() => fork(() => show = !show).commit()}>toggle</button>
|
||||
|
||||
{#if show}
|
||||
{d_count}
|
||||
{/if}
|
||||
@ -0,0 +1,30 @@
|
||||
import { tick } from 'svelte';
|
||||
import { test } from '../../test';
|
||||
|
||||
export default test({
|
||||
async test({ assert, target }) {
|
||||
await tick();
|
||||
const [load, resolve] = target.querySelectorAll('button');
|
||||
|
||||
load.click();
|
||||
await tick();
|
||||
assert.htmlEqual(
|
||||
target.innerHTML,
|
||||
`
|
||||
<button>load</button>
|
||||
<button>resolve</button>
|
||||
`
|
||||
);
|
||||
|
||||
resolve.click();
|
||||
await tick();
|
||||
assert.htmlEqual(
|
||||
target.innerHTML,
|
||||
`
|
||||
search search search search
|
||||
<button>load</button>
|
||||
<button>resolve</button>
|
||||
`
|
||||
);
|
||||
}
|
||||
});
|
||||
@ -0,0 +1,40 @@
|
||||
<script>
|
||||
let query = $state('');
|
||||
// changing the query results in a new promise with loading initialized to true
|
||||
const promise = $derived(push(query));
|
||||
|
||||
const resolvers = [];
|
||||
function push(value) {
|
||||
if (!value) return Promise.resolve(value);
|
||||
|
||||
const { promise, resolve } = Promise.withResolvers();
|
||||
|
||||
resolvers.push(() => {
|
||||
// before resolving, set loading to false - this makes it run in a different batch
|
||||
loading = false;
|
||||
resolve(value);
|
||||
});
|
||||
|
||||
let loading = $state(true);
|
||||
Object.defineProperty(promise, 'loading', {
|
||||
get() {
|
||||
return loading;
|
||||
}
|
||||
});
|
||||
|
||||
return promise
|
||||
}
|
||||
</script>
|
||||
|
||||
{query} {await promise}
|
||||
|
||||
{#if !promise.loading}
|
||||
{query}
|
||||
{/if}
|
||||
|
||||
{#if !promise.loading}
|
||||
{await query}
|
||||
{/if}
|
||||
|
||||
<button onclick={() => query = 'search'}>load</button>
|
||||
<button onclick={() => resolvers.shift()?.()}>resolve</button>
|
||||
Loading…
Reference in new issue