Merge remote-tracking branch 'upstream/main' into fix-global-transition-resume

pull/18431/head
Nic 3 days ago
commit 79dfd51c14

@ -0,0 +1,5 @@
---
'svelte': patch
---
chore: drop dead code that make TSGO fail

@ -0,0 +1,5 @@
---
'svelte': patch
---
fix: don't (re)connect deriveds when read inside branch/root effects

@ -0,0 +1,5 @@
---
'svelte': patch
---
fix: skip unnecessary derived effect in earlier batch

@ -0,0 +1,5 @@
---
'svelte': patch
---
fix: avoid declaration tag warning in event handlers

@ -0,0 +1,5 @@
---
'svelte': patch
---
fix: correctly transform declaration tags during SSR

@ -0,0 +1,5 @@
---
'svelte': patch
---
fix: transform computed keys in keyed `{#each}` destructuring patterns

@ -0,0 +1,5 @@
---
'svelte': patch
---
fix: chain preprocessor sourcemaps with an empty `sources[0]` instead of dropping them

@ -0,0 +1,5 @@
---
'svelte': patch
---
fix: don't treat declaration tags as parts inside each blocks

@ -0,0 +1,47 @@
import assert from 'node:assert';
import * as $ from 'svelte/internal/client';
import { block } from '../../../../packages/svelte/src/internal/client/reactivity/effects.js';
// Like `kairo_broad`, but each derived is also read by a block effect, as
// happens with e.g. `{#if derived}` in a component. Measures our #traverse perf better.
export default () => {
let head = $.state(0);
let last = head;
let counter = 0;
const destroy = $.effect_root(() => {
for (let i = 0; i < 50; i++) {
let current = $.derived(() => {
return $.get(head) + i;
});
let current2 = $.derived(() => {
return $.get(current) + 1;
});
block(() => {
$.get(current2);
});
$.render_effect(() => {
$.get(current2);
counter++;
});
last = current2;
}
});
return {
destroy,
run() {
$.flush(() => {
$.set(head, 1);
});
counter = 0;
for (let i = 0; i < 50; i++) {
$.flush(() => {
$.set(head, i);
});
assert.equal($.get(last), i + 50);
}
assert.equal(counter, 50 * 50);
}
};
};

@ -0,0 +1,48 @@
import assert from 'node:assert';
import * as $ from 'svelte/internal/client';
import { block } from '../../../../packages/svelte/src/internal/client/reactivity/effects.js';
let len = 50;
const iter = 50;
// Like `kairo_deep`, but the derived chain is also read by a block effect, as
// happens with e.g. `{#if derived}` in a component. Measures our #traverse perf better.
export default () => {
let head = $.state(0);
let current = head;
for (let i = 0; i < len; i++) {
let c = current;
current = $.derived(() => {
return $.get(c) + 1;
});
}
let counter = 0;
const destroy = $.effect_root(() => {
block(() => {
$.get(current);
});
$.render_effect(() => {
$.get(current);
counter++;
});
});
return {
destroy,
run() {
$.flush(() => {
$.set(head, 1);
});
counter = 0;
for (let i = 0; i < iter; i++) {
$.flush(() => {
$.set(head, i);
});
assert.equal($.get(current), len + i);
}
assert.equal(counter, iter);
}
};
};

@ -1,5 +1,17 @@
# svelte
## 5.56.4
### Patch Changes
- fix: include wrapping parentheses in `{@const}` declarator `end` position ([#18436](https://github.com/sveltejs/svelte/pull/18436))
- fix: always unset reactivity context after restoring it ([#18453](https://github.com/sveltejs/svelte/pull/18453))
- fix: don't notify `searchParams` subscribers when the URL changes without affecting the search string ([#18425](https://github.com/sveltejs/svelte/pull/18425))
- fix: strip `?` from optional parameters in `<script lang="ts">` so generated JavaScript is valid ([#18448](https://github.com/sveltejs/svelte/pull/18448))
## 5.56.3
### Patch Changes

@ -2,7 +2,7 @@
"name": "svelte",
"description": "Cybernetically enhanced web apps",
"license": "MIT",
"version": "5.56.3",
"version": "5.56.4",
"type": "module",
"types": "./types/index.d.ts",
"engines": {
@ -161,7 +161,7 @@
"@types/node": "^20.11.5",
"baseline-browser-mapping": "^2.10.32",
"dts-buddy": "^0.5.5",
"esbuild": "^0.25.10",
"esbuild": "^0.28.1",
"rollup": "^4.59.0",
"source-map": "^0.7.4",
"tinyglobby": "^0.2.12",
@ -181,7 +181,7 @@
"clsx": "^2.1.1",
"devalue": "^5.8.1",
"esm-env": "^1.2.1",
"esrap": "^2.2.11",
"esrap": "^2.2.12",
"is-reference": "^3.0.3",
"locate-character": "^3.0.0",
"magic-string": "^0.30.11",

@ -30,6 +30,12 @@ const visitors = {
delete n.readonly;
delete n.definite;
delete n.override;
// `optional` is reused by JS optional chaining (`a?.b`, `a?.()`), so only
// strip the TypeScript optional marker (`x?: T`, `m?(): T`, `x?: T` fields)
if (n.type !== 'MemberExpression' && n.type !== 'CallExpression') {
delete n.optional;
}
},
Decorator(node) {
e.typescript_invalid_feature(node, 'decorators (related TSC proposal is not stage 4 yet)');

@ -783,6 +783,8 @@ function special(parser) {
const expression_start = parser.index;
const init = read_expression(parser);
// parser is past wrapping parens, but `init.end` is not — use the parser position
const declarator_end = parser.index;
if (
init.type === 'SequenceExpression' &&
!parser.template.substring(expression_start, init.start).includes('(')
@ -801,7 +803,9 @@ function special(parser) {
declaration: {
type: 'VariableDeclaration',
kind: 'const',
declarations: [{ type: 'VariableDeclarator', id, init, start: id.start, end: init.end }],
declarations: [
{ type: 'VariableDeclarator', id, init, start: id.start, end: declarator_end }
],
start: start + 2, // start at const, not at @const
end: parser.index - 1
},

@ -18,7 +18,9 @@ export function visit_function(node, context) {
context.next({
...context.state,
function_depth: context.state.function_depth + 1,
// we generally want to use scope.function_depth unless we specifically increased
// that in state.function_depth (e.g. a derived)
function_depth: Math.max(context.state.scope.function_depth, context.state.function_depth) + 1,
expression: null
});
}

@ -294,7 +294,10 @@ export function EachBlock(node, context) {
let key_function = b.id('$.index');
if (node.metadata.keyed) {
const pattern = /** @type {Pattern} */ (node.context); // can only be keyed when a context is provided
// can only be keyed when a context is provided
const pattern = /** @type {Pattern} */ (
context.visit(/** @type {Pattern} */ (node.context), key_state)
);
const expression = /** @type {Expression} */ (
context.visit(/** @type {Expression} */ (node.key), key_state)
);

@ -8,7 +8,7 @@ import { sanitize_template_string } from '../../../../../utils/sanitize_template
import { regex_is_valid_identifier } from '../../../../patterns.js';
import is_reference from 'is-reference';
import { dev, is_ignored, locator, component_name } from '../../../../../state.js';
import { build_getter } from '../../utils.js';
import { build_getter, is_state_source } from '../../utils.js';
import { ExpressionMetadata } from '../../../../nodes.js';
/**
@ -272,6 +272,10 @@ export function build_bind_this(expression, value, { state, visit }) {
const binding = state.scope.get(node.name);
if (!binding) return;
// if it is a state or a derived it means is a declaration tag...in that case we don't want to pass the
// value but the signal itself or assignment will break
if (is_state_source(binding, state.analysis) || binding.kind === 'derived') return;
for (const [owner, scope] of state.scopes) {
if (owner.type === 'EachBlock' && scope === binding.scope) {
ids.push(node);

@ -60,7 +60,9 @@ export function process_children(nodes, { visit, state }) {
if (evaluated.is_known) {
quasi.value.cooked += escape_html((evaluated.value ?? '') + '');
} else {
expressions.push(b.call('$.escape', /** @type {Expression} */ (visit(node.expression))));
expressions.push(
b.call('$.escape', /** @type {Expression} */ (visit(node.expression, state)))
);
quasi = b.quasi('', i + 1 === sequence.length);
quasis.push(quasi);
@ -80,7 +82,7 @@ export function process_children(nodes, { visit, state }) {
if (node.type === 'ExpressionTag' && node.metadata.expression.is_async()) {
flush();
const expression = /** @type {Expression} */ (visit(node.expression));
const expression = /** @type {Expression} */ (visit(node.expression, state));
let call = b.call(
'$$renderer.push',

@ -311,6 +311,13 @@ function apply_preprocessor_sourcemap(filename, svelte_map, preprocessor_map_inp
typeof preprocessor_map_input === 'string'
? JSON.parse(preprocessor_map_input)
: preprocessor_map_input;
// A preprocessor map with a missing/empty `sources[0]` (e.g. from a MagicString transform
// created without a `source` option) can't be matched against `filename` during combination,
// which silently drops the chain instead of erroring. Normalize it to `filename` first, the
// same way Vite treats an empty `sources[0]` as referring to the file being transformed.
if (preprocessor_map.sources?.length === 1 && !preprocessor_map.sources[0]) {
preprocessor_map.sources = [filename];
}
const result_map = combine_sourcemaps(filename, [svelte_map, preprocessor_map]);
// Svelte expects a SourceMap which includes toUrl and toString. Instead of wrapping our output in a class,
// we just tack on the extra properties.

@ -25,6 +25,7 @@ import {
set_reactivity_loss_tracker
} from './deriveds.js';
import { aborted } from './effects.js';
import { queue_micro_task } from '../dom/task.js';
/**
* @param {Blocker[]} blockers
@ -169,6 +170,7 @@ export async function save(promise) {
return () => {
restore();
queue_micro_task(unset_context);
return value;
};
}

@ -530,6 +530,12 @@ export class Batch {
const mark = (value) => {
var reactions = value.reactions;
if (reactions === null) return;
// skip if value is derived and is neither dirty nor maybe dirty. transitive
// deriveds (a derived depending on another derived) are only MAYBE_DIRTY, so
// we must continue traversing them to reach the effects that depend on them
if ((value.f & DERIVED) !== 0 && (value.f & (DIRTY | MAYBE_DIRTY)) === 0) {
return;
}
for (const reaction of reactions) {
var flags = reaction.f;

@ -91,10 +91,7 @@ const rest_props_handler = {
*/
/*#__NO_SIDE_EFFECTS__*/
export function rest_props(props, exclude, name) {
return new Proxy(
DEV ? { props, exclude, name, other: {}, to_proxy: [] } : { props, exclude },
rest_props_handler
);
return new Proxy(DEV ? { props, exclude, name } : { props, exclude }, rest_props_handler);
}
/**

@ -61,6 +61,9 @@ import { without_reactive_context } from './dom/elements/bindings/shared.js';
import { set_signal_status, update_derived_status } from './reactivity/status.js';
import * as w from './warnings.js';
/**
* True if updating in an effect context that is reactive (i.e. not branch/root effects)
*/
let is_updating_effect = false;
export let is_destroying_effect = false;
@ -444,7 +447,7 @@ export function update_effect(effect) {
var was_updating_effect = is_updating_effect;
active_effect = effect;
is_updating_effect = true;
is_updating_effect = (flags & (BRANCH_EFFECT | ROOT_EFFECT)) === 0; // Branch/root effects are not reactive contexts
if (DEV) {
var previous_component_fn = dev_current_component_function;

@ -54,6 +54,11 @@ export class SvelteURLSearchParams extends URLSearchParams {
*/
[REPLACE](params) {
if (this.#updating) return;
// the URL may have changed in a way that leaves the search string untouched —
// don't rebuild the params or notify readers if nothing changed
if (params.toString() === super.toString()) return;
this.#updating = true;
for (const key of [...super.keys()]) {
@ -126,6 +131,16 @@ export class SvelteURLSearchParams extends URLSearchParams {
return super.keys();
}
/**
* @param {(value: string, key: string, parent: URLSearchParams) => void} callback
* @param {any} [this_arg]
* @returns {void}
*/
forEach(callback, this_arg) {
get(this.#version);
super.forEach(callback, this_arg);
}
/**
* @param {string} name
* @param {string} value

@ -244,3 +244,24 @@ test('URLSearchParams.toString', () => {
test('SvelteURLSearchParams instanceof URLSearchParams', () => {
assert.ok(new SvelteURLSearchParams() instanceof URLSearchParams);
});
test('params.forEach is reactive', () => {
const params = new SvelteURLSearchParams('foo=1');
const log: any = [];
const cleanup = effect_root(() => {
render_effect(() => {
const entries: string[] = [];
params.forEach((value, key) => entries.push(`${key}=${value}`));
log.push(entries.join('&'));
});
});
flushSync(() => {
params.set('foo', '2');
});
assert.deepEqual(log, ['foo=1', 'foo=2']);
cleanup();
});

@ -166,3 +166,77 @@ test('url.search normalizes value', () => {
test('SvelteURL instanceof URL', () => {
assert.ok(new SvelteURL('https://svelte.dev') instanceof URL);
});
test('url.searchParams subscribers are not notified by changes that leave the search string untouched', () => {
const url = new SvelteURL('https://svelte.dev/a?foo=bar');
const log: any = [];
const cleanup = effect_root(() => {
render_effect(() => {
log.push(url.searchParams.toString());
});
});
flushSync(() => {
// does not affect the search string
url.pathname = '/b';
});
flushSync(() => {
// neither does this
url.href = 'https://svelte.dev/c?foo=bar#hash';
});
flushSync(() => {
// but this does
url.search = '?foo=baz';
});
assert.deepEqual(log, ['foo=bar', 'foo=baz']);
cleanup();
});
test('url.searchParams.size is not notified by unrelated href changes', () => {
const url = new SvelteURL('https://svelte.dev/?foo=bar');
const log: any = [];
const cleanup = effect_root(() => {
render_effect(() => {
log.push(url.searchParams.size);
});
});
flushSync(() => {
url.href = 'https://svelte.dev/other?foo=bar';
});
flushSync(() => {
url.searchParams.append('baz', 'qux');
});
assert.deepEqual(log, [1, 2]);
cleanup();
});
test('url.searchParams.forEach re-runs when the search string changes via the URL', () => {
const url = new SvelteURL('https://svelte.dev/?foo=1');
const log: any = [];
const cleanup = effect_root(() => {
render_effect(() => {
const entries: string[] = [];
url.searchParams.forEach((value, key) => entries.push(`${key}=${value}`));
log.push(entries.join('&'));
});
});
flushSync(() => {
url.href = 'https://svelte.dev/?bar=2';
});
assert.deepEqual(log, ['foo=1', 'bar=2']);
cleanup();
});

@ -4,5 +4,5 @@
* The current version, as set in package.json.
* @type {string}
*/
export const VERSION = '5.56.3';
export const VERSION = '5.56.4';
export const PUBLIC_VERSION = '5';

@ -0,0 +1,6 @@
{#each items as item}
{@const x = (item.value)}
{@const y = (a = item.n)}
{@const z = ({ a: item.a })}
{x}{y}{z.a}
{/each}

@ -0,0 +1,527 @@
{
"css": null,
"js": [],
"start": 0,
"end": 126,
"type": "Root",
"fragment": {
"type": "Fragment",
"nodes": [
{
"type": "EachBlock",
"start": 0,
"end": 126,
"expression": {
"type": "Identifier",
"start": 7,
"end": 12,
"loc": {
"start": {
"line": 1,
"column": 7
},
"end": {
"line": 1,
"column": 12
}
},
"name": "items"
},
"body": {
"type": "Fragment",
"nodes": [
{
"type": "Text",
"start": 21,
"end": 23,
"raw": "\n\t",
"data": "\n\t"
},
{
"type": "ConstTag",
"start": 23,
"end": 48,
"declaration": {
"type": "VariableDeclaration",
"kind": "const",
"declarations": [
{
"type": "VariableDeclarator",
"id": {
"type": "Identifier",
"name": "x",
"start": 31,
"end": 32,
"loc": {
"start": {
"line": 2,
"column": 9,
"character": 31
},
"end": {
"line": 2,
"column": 10,
"character": 32
}
}
},
"init": {
"type": "MemberExpression",
"start": 36,
"end": 46,
"loc": {
"start": {
"line": 2,
"column": 14
},
"end": {
"line": 2,
"column": 24
}
},
"object": {
"type": "Identifier",
"start": 36,
"end": 40,
"loc": {
"start": {
"line": 2,
"column": 14
},
"end": {
"line": 2,
"column": 18
}
},
"name": "item"
},
"property": {
"type": "Identifier",
"start": 41,
"end": 46,
"loc": {
"start": {
"line": 2,
"column": 19
},
"end": {
"line": 2,
"column": 24
}
},
"name": "value"
},
"computed": false,
"optional": false
},
"start": 31,
"end": 47
}
],
"start": 25,
"end": 47
}
},
{
"type": "Text",
"start": 48,
"end": 50,
"raw": "\n\t",
"data": "\n\t"
},
{
"type": "ConstTag",
"start": 50,
"end": 75,
"declaration": {
"type": "VariableDeclaration",
"kind": "const",
"declarations": [
{
"type": "VariableDeclarator",
"id": {
"type": "Identifier",
"name": "y",
"start": 58,
"end": 59,
"loc": {
"start": {
"line": 3,
"column": 9,
"character": 58
},
"end": {
"line": 3,
"column": 10,
"character": 59
}
}
},
"init": {
"type": "AssignmentExpression",
"start": 63,
"end": 73,
"loc": {
"start": {
"line": 3,
"column": 14
},
"end": {
"line": 3,
"column": 24
}
},
"operator": "=",
"left": {
"type": "Identifier",
"start": 63,
"end": 64,
"loc": {
"start": {
"line": 3,
"column": 14
},
"end": {
"line": 3,
"column": 15
}
},
"name": "a"
},
"right": {
"type": "MemberExpression",
"start": 67,
"end": 73,
"loc": {
"start": {
"line": 3,
"column": 18
},
"end": {
"line": 3,
"column": 24
}
},
"object": {
"type": "Identifier",
"start": 67,
"end": 71,
"loc": {
"start": {
"line": 3,
"column": 18
},
"end": {
"line": 3,
"column": 22
}
},
"name": "item"
},
"property": {
"type": "Identifier",
"start": 72,
"end": 73,
"loc": {
"start": {
"line": 3,
"column": 23
},
"end": {
"line": 3,
"column": 24
}
},
"name": "n"
},
"computed": false,
"optional": false
}
},
"start": 58,
"end": 74
}
],
"start": 52,
"end": 74
}
},
{
"type": "Text",
"start": 75,
"end": 77,
"raw": "\n\t",
"data": "\n\t"
},
{
"type": "ConstTag",
"start": 77,
"end": 105,
"declaration": {
"type": "VariableDeclaration",
"kind": "const",
"declarations": [
{
"type": "VariableDeclarator",
"id": {
"type": "Identifier",
"name": "z",
"start": 85,
"end": 86,
"loc": {
"start": {
"line": 4,
"column": 9,
"character": 85
},
"end": {
"line": 4,
"column": 10,
"character": 86
}
}
},
"init": {
"type": "ObjectExpression",
"start": 90,
"end": 103,
"loc": {
"start": {
"line": 4,
"column": 14
},
"end": {
"line": 4,
"column": 27
}
},
"properties": [
{
"type": "Property",
"start": 92,
"end": 101,
"loc": {
"start": {
"line": 4,
"column": 16
},
"end": {
"line": 4,
"column": 25
}
},
"method": false,
"shorthand": false,
"computed": false,
"key": {
"type": "Identifier",
"start": 92,
"end": 93,
"loc": {
"start": {
"line": 4,
"column": 16
},
"end": {
"line": 4,
"column": 17
}
},
"name": "a"
},
"value": {
"type": "MemberExpression",
"start": 95,
"end": 101,
"loc": {
"start": {
"line": 4,
"column": 19
},
"end": {
"line": 4,
"column": 25
}
},
"object": {
"type": "Identifier",
"start": 95,
"end": 99,
"loc": {
"start": {
"line": 4,
"column": 19
},
"end": {
"line": 4,
"column": 23
}
},
"name": "item"
},
"property": {
"type": "Identifier",
"start": 100,
"end": 101,
"loc": {
"start": {
"line": 4,
"column": 24
},
"end": {
"line": 4,
"column": 25
}
},
"name": "a"
},
"computed": false,
"optional": false
},
"kind": "init"
}
]
},
"start": 85,
"end": 104
}
],
"start": 79,
"end": 104
}
},
{
"type": "Text",
"start": 105,
"end": 107,
"raw": "\n\t",
"data": "\n\t"
},
{
"type": "ExpressionTag",
"start": 107,
"end": 110,
"expression": {
"type": "Identifier",
"start": 108,
"end": 109,
"loc": {
"start": {
"line": 5,
"column": 2
},
"end": {
"line": 5,
"column": 3
}
},
"name": "x"
}
},
{
"type": "ExpressionTag",
"start": 110,
"end": 113,
"expression": {
"type": "Identifier",
"start": 111,
"end": 112,
"loc": {
"start": {
"line": 5,
"column": 5
},
"end": {
"line": 5,
"column": 6
}
},
"name": "y"
}
},
{
"type": "ExpressionTag",
"start": 113,
"end": 118,
"expression": {
"type": "MemberExpression",
"start": 114,
"end": 117,
"loc": {
"start": {
"line": 5,
"column": 8
},
"end": {
"line": 5,
"column": 11
}
},
"object": {
"type": "Identifier",
"start": 114,
"end": 115,
"loc": {
"start": {
"line": 5,
"column": 8
},
"end": {
"line": 5,
"column": 9
}
},
"name": "z"
},
"property": {
"type": "Identifier",
"start": 116,
"end": 117,
"loc": {
"start": {
"line": 5,
"column": 10
},
"end": {
"line": 5,
"column": 11
}
},
"name": "a"
},
"computed": false,
"optional": false
}
},
{
"type": "Text",
"start": 118,
"end": 119,
"raw": "\n",
"data": "\n"
}
]
},
"context": {
"type": "Identifier",
"name": "item",
"start": 16,
"end": 20,
"loc": {
"start": {
"line": 1,
"column": 16,
"character": 16
},
"end": {
"line": 1,
"column": 20,
"character": 20
}
}
}
}
]
},
"options": null
}

@ -0,0 +1,28 @@
import { tick } from 'svelte';
import { test } from '../../test';
export default test({
async test({ assert, target }) {
const [increment, pop] = target.querySelectorAll('button');
increment.click();
await tick();
assert.htmlEqual(
target.innerHTML,
`<button>increment</button> <button>pop</button> <p>Loading...</p>`
);
increment.click();
await tick();
assert.htmlEqual(
target.innerHTML,
`<button>increment</button> <button>pop</button> <p>Loading...</p>`
);
pop.click();
await tick();
assert.htmlEqual(target.innerHTML, `<button>increment</button> <button>pop</button> 2 2 1`);
pop.click();
await tick();
assert.htmlEqual(target.innerHTML, `<button>increment</button> <button>pop</button> 2 2 1`);
}
});

@ -0,0 +1,29 @@
<script>
let count = $state(0);
let other = $state(0);
const queue = [];
let pending = $derived(defaultPending);
function push(v) {
return new Promise((resolve) => queue.push(() => resolve(v)));
}
</script>
<button onclick={() => {
if (count === 0) {
other++;
count++;
} else {
count++
}
}}>increment</button>
<button onclick={() => queue.pop()?.()}>pop</button>
{#snippet defaultPending()}
<p>Loading...</p>
{/snippet}
{#if count > 0}
<svelte:boundary {pending}>
{await push(count)} {count} {other}
</svelte:boundary>
{/if}

@ -0,0 +1,44 @@
import { tick } from 'svelte';
import { test } from '../../test';
export default test({
mode: ['client'],
compileOptions: {
dev: true
},
async test({ assert, target, errors }) {
await tick();
const [increment, update, resolve] = target.querySelectorAll('button');
increment.click();
await tick();
resolve.click();
await tick();
update.click();
await tick();
resolve.click();
await tick();
assert.deepEqual(
errors.filter((error) => error.includes('state_unsafe_mutation')),
[]
);
assert.htmlEqual(
target.innerHTML,
`
<button>increment</button>
<button>update</button>
<button>resolve</button>
<p>count: 1</p>
<p>submits: 1</p>
<p>pending: 0</p>
<p>2</p>
`
);
}
});

@ -0,0 +1,28 @@
<script>
const queued = [];
function push(value) {
if(!value) return value;
return new Promise((resolve) => queued.push(() => resolve(value)));
}
let count = $state(0);
let submits = $state(0);
const a = $derived(push(count));
const b = $derived(push(count));
async function updateAfterPromise() {
await Promise.resolve();
submits += 1;
}
</script>
<button onclick={() => (count += 1)}>increment</button>
<button onclick={updateAfterPromise}>update</button>
<button onclick={() => queued.shift()?.()}>resolve</button>
<p>count: {count}</p>
<p>submits: {submits}</p>
<p>pending: {$effect.pending()}</p>
<p>{await a + await b}</p>

@ -0,0 +1,10 @@
import { flushSync } from 'svelte';
import { test } from '../../test';
export default test({
async test({ target, assert }) {
const [btn1, btn2] = target.querySelectorAll('button');
flushSync(() => btn2.click());
assert.equal(btn1.textContent, '1');
}
});

@ -0,0 +1,6 @@
{#each Array(1)}
{let ref = $state()}
{let count = $state(0)}
<button onclick={()=>count++} bind:this={ref}>{count}</button>
<button onclick={()=>ref.click()}></button>
{/each}

@ -0,0 +1,7 @@
<script>
let { labelKey, valueKey, options } = $props();
</script>
{#each options as { [labelKey]: label, [valueKey]: value } (value)}
<p>{label}: {value}</p>
{/each}

@ -0,0 +1,29 @@
import { flushSync } from 'svelte';
import { ok, test } from '../../test';
// https://github.com/sveltejs/svelte/issues/18519
export default test({
html: `
<button>reverse</button>
<p>1: a1</p>
<p>2: a2</p>
<p>3: a3</p>
`,
test({ assert, target }) {
const btn = target.querySelector('button');
ok(btn);
flushSync(() => btn.click());
assert.htmlEqual(
target.innerHTML,
`
<button>reverse</button>
<p>3: a3</p>
<p>2: a2</p>
<p>1: a1</p>
`
);
}
});

@ -0,0 +1,12 @@
<script>
import Child from './Child.svelte';
let options = $state([
{ a: 1, v: 'a1' },
{ a: 2, v: 'a2' },
{ a: 3, v: 'a3' }
]);
</script>
<button onclick={() => options.reverse()}>reverse</button>
<Child {options} labelKey="a" valueKey="v" />

@ -0,0 +1,4 @@
<div>
{let dt = $derived(Date.parse("2026-10-01T00:00:00Z"))}
{typeof dt}
</div>

@ -1503,4 +1503,22 @@ describe('signals', () => {
assert.deepEqual(log, ['inner destroyed', 'inner destroyed']);
};
});
test('derived read in an untracked context should not leak in deps reactions', () => {
return () => {
let s = state('hello');
let a = derived(() => $.get(s));
let b = derived(() => $.get(a));
let destroy = effect_root(() => {
$.get(b);
});
destroy();
// a was spuriously added to s.reactions via is_updating_effect
// even though the entire derived chain was read in an untracked context
assert.equal(s.reactions, null);
};
});
});

@ -0,0 +1,22 @@
import 'svelte/internal/disclose-version';
import 'svelte/internal/flags/legacy';
import * as $ from 'svelte/internal/client';
export default function Typescript_optional_parameter($$anchor) {
// the `?` on the optional parameter must be stripped, but optional chaining
// (`x?.length`, `o?.b`) must be preserved
function a(x) {
return x?.length;
}
const o = {};
const v = o?.b?.c;
a();
$.next();
var text = $.text();
$.template_effect(() => $.set_text(text, v));
$.append($$anchor, text);
}

@ -0,0 +1,15 @@
import * as $ from 'svelte/internal/server';
export default function Typescript_optional_parameter($$renderer) {
// the `?` on the optional parameter must be stripped, but optional chaining
// (`x?.length`, `o?.b`) must be preserved
function a(x) {
return x?.length;
}
const o = {};
const v = o?.b?.c;
a();
$$renderer.push(`<!---->${$.escape(v)}`);
}

@ -0,0 +1,14 @@
<script lang="ts">
// the `?` on the optional parameter must be stripped, but optional chaining
// (`x?.length`, `o?.b`) must be preserved
function a(x?: string) {
return x?.length;
}
const o: { b?: { c: number } } = {};
const v = o?.b?.c;
a();
</script>
{v}

@ -0,0 +1,29 @@
import * as fs from 'node:fs';
import MagicString from 'magic-string';
import { test } from '../../test';
// Simulates a bundler plugin (e.g. a Vite plugin using `magic-string`) that transforms
// the Svelte source *before* it reaches `compile()`, and hands its own sourcemap to
// `compileOptions.sourcemap` — the documented way to let svelte chain an upstream map
// into its own output map. Crucially, the upstream map is generated *without* a `source`
// option, exactly like `new MagicString(code).generateMap()` — this yields a sourcemap
// whose `sources` is `['']`, which previously broke the chain entirely (see #18491)
// instead of being treated as "this file", causing every mapping through it to resolve
// to `{ source: null, line: null, column: null }`.
const input = fs.readFileSync(new URL('./input.svelte', import.meta.url), 'utf-8');
const src = new MagicString(input);
src.overwrite(
src.original.indexOf('count * 2'),
src.original.indexOf('count * 2') + 'count * 2'.length,
'count * 2',
{
storeName: false
}
);
export default test({
compileOptions: {
sourcemap: src.generateMap({ hires: true })
},
client: [{ str: 'let doubled' }]
});

@ -0,0 +1,6 @@
<script>
let count = 0;
let doubled = count * 2;
</script>
<button>clicks: {count}</button>

@ -7,3 +7,7 @@
{let e = $state(0), f = e}
{a}{b}{c}{d}{e}{f}
<button onclick={() => {
console.log(a);
}}>a</button>

@ -102,8 +102,8 @@ importers:
specifier: ^1.2.1
version: 1.2.1
esrap:
specifier: ^2.2.11
version: 2.2.11(@typescript-eslint/types@8.59.4)
specifier: ^2.2.12
version: 2.2.12(@typescript-eslint/types@8.59.4)
is-reference:
specifier: ^3.0.3
version: 3.0.3
@ -148,8 +148,8 @@ importers:
specifier: ^0.5.5
version: 0.5.5(typescript@5.5.4)
esbuild:
specifier: ^0.25.10
version: 0.25.11
specifier: ^0.28.1
version: 0.28.1
rollup:
specifier: ^4.59.0
version: 4.60.1
@ -285,23 +285,17 @@ packages:
'@changesets/write@0.4.0':
resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==}
'@esbuild/aix-ppc64@0.25.11':
resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [aix]
'@esbuild/aix-ppc64@0.27.7':
resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [aix]
'@esbuild/android-arm64@0.25.11':
resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==}
'@esbuild/aix-ppc64@0.28.1':
resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [android]
cpu: [ppc64]
os: [aix]
'@esbuild/android-arm64@0.27.7':
resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==}
@ -309,10 +303,10 @@ packages:
cpu: [arm64]
os: [android]
'@esbuild/android-arm@0.25.11':
resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==}
'@esbuild/android-arm64@0.28.1':
resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==}
engines: {node: '>=18'}
cpu: [arm]
cpu: [arm64]
os: [android]
'@esbuild/android-arm@0.27.7':
@ -321,10 +315,10 @@ packages:
cpu: [arm]
os: [android]
'@esbuild/android-x64@0.25.11':
resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==}
'@esbuild/android-arm@0.28.1':
resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==}
engines: {node: '>=18'}
cpu: [x64]
cpu: [arm]
os: [android]
'@esbuild/android-x64@0.27.7':
@ -333,11 +327,11 @@ packages:
cpu: [x64]
os: [android]
'@esbuild/darwin-arm64@0.25.11':
resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==}
'@esbuild/android-x64@0.28.1':
resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==}
engines: {node: '>=18'}
cpu: [arm64]
os: [darwin]
cpu: [x64]
os: [android]
'@esbuild/darwin-arm64@0.27.7':
resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==}
@ -345,10 +339,10 @@ packages:
cpu: [arm64]
os: [darwin]
'@esbuild/darwin-x64@0.25.11':
resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==}
'@esbuild/darwin-arm64@0.28.1':
resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==}
engines: {node: '>=18'}
cpu: [x64]
cpu: [arm64]
os: [darwin]
'@esbuild/darwin-x64@0.27.7':
@ -357,11 +351,11 @@ packages:
cpu: [x64]
os: [darwin]
'@esbuild/freebsd-arm64@0.25.11':
resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==}
'@esbuild/darwin-x64@0.28.1':
resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [freebsd]
cpu: [x64]
os: [darwin]
'@esbuild/freebsd-arm64@0.27.7':
resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==}
@ -369,10 +363,10 @@ packages:
cpu: [arm64]
os: [freebsd]
'@esbuild/freebsd-x64@0.25.11':
resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==}
'@esbuild/freebsd-arm64@0.28.1':
resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==}
engines: {node: '>=18'}
cpu: [x64]
cpu: [arm64]
os: [freebsd]
'@esbuild/freebsd-x64@0.27.7':
@ -381,11 +375,11 @@ packages:
cpu: [x64]
os: [freebsd]
'@esbuild/linux-arm64@0.25.11':
resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==}
'@esbuild/freebsd-x64@0.28.1':
resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [linux]
cpu: [x64]
os: [freebsd]
'@esbuild/linux-arm64@0.27.7':
resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==}
@ -393,10 +387,10 @@ packages:
cpu: [arm64]
os: [linux]
'@esbuild/linux-arm@0.25.11':
resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==}
'@esbuild/linux-arm64@0.28.1':
resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==}
engines: {node: '>=18'}
cpu: [arm]
cpu: [arm64]
os: [linux]
'@esbuild/linux-arm@0.27.7':
@ -405,10 +399,10 @@ packages:
cpu: [arm]
os: [linux]
'@esbuild/linux-ia32@0.25.11':
resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==}
'@esbuild/linux-arm@0.28.1':
resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==}
engines: {node: '>=18'}
cpu: [ia32]
cpu: [arm]
os: [linux]
'@esbuild/linux-ia32@0.27.7':
@ -417,10 +411,10 @@ packages:
cpu: [ia32]
os: [linux]
'@esbuild/linux-loong64@0.25.11':
resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==}
'@esbuild/linux-ia32@0.28.1':
resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==}
engines: {node: '>=18'}
cpu: [loong64]
cpu: [ia32]
os: [linux]
'@esbuild/linux-loong64@0.27.7':
@ -429,10 +423,10 @@ packages:
cpu: [loong64]
os: [linux]
'@esbuild/linux-mips64el@0.25.11':
resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==}
'@esbuild/linux-loong64@0.28.1':
resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==}
engines: {node: '>=18'}
cpu: [mips64el]
cpu: [loong64]
os: [linux]
'@esbuild/linux-mips64el@0.27.7':
@ -441,10 +435,10 @@ packages:
cpu: [mips64el]
os: [linux]
'@esbuild/linux-ppc64@0.25.11':
resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==}
'@esbuild/linux-mips64el@0.28.1':
resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==}
engines: {node: '>=18'}
cpu: [ppc64]
cpu: [mips64el]
os: [linux]
'@esbuild/linux-ppc64@0.27.7':
@ -453,10 +447,10 @@ packages:
cpu: [ppc64]
os: [linux]
'@esbuild/linux-riscv64@0.25.11':
resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==}
'@esbuild/linux-ppc64@0.28.1':
resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==}
engines: {node: '>=18'}
cpu: [riscv64]
cpu: [ppc64]
os: [linux]
'@esbuild/linux-riscv64@0.27.7':
@ -465,10 +459,10 @@ packages:
cpu: [riscv64]
os: [linux]
'@esbuild/linux-s390x@0.25.11':
resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==}
'@esbuild/linux-riscv64@0.28.1':
resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==}
engines: {node: '>=18'}
cpu: [s390x]
cpu: [riscv64]
os: [linux]
'@esbuild/linux-s390x@0.27.7':
@ -477,10 +471,10 @@ packages:
cpu: [s390x]
os: [linux]
'@esbuild/linux-x64@0.25.11':
resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==}
'@esbuild/linux-s390x@0.28.1':
resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==}
engines: {node: '>=18'}
cpu: [x64]
cpu: [s390x]
os: [linux]
'@esbuild/linux-x64@0.27.7':
@ -489,11 +483,11 @@ packages:
cpu: [x64]
os: [linux]
'@esbuild/netbsd-arm64@0.25.11':
resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==}
'@esbuild/linux-x64@0.28.1':
resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==}
engines: {node: '>=18'}
cpu: [arm64]
os: [netbsd]
cpu: [x64]
os: [linux]
'@esbuild/netbsd-arm64@0.27.7':
resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==}
@ -501,10 +495,10 @@ packages:
cpu: [arm64]
os: [netbsd]
'@esbuild/netbsd-x64@0.25.11':
resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==}
'@esbuild/netbsd-arm64@0.28.1':
resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==}
engines: {node: '>=18'}
cpu: [x64]
cpu: [arm64]
os: [netbsd]
'@esbuild/netbsd-x64@0.27.7':
@ -513,11 +507,11 @@ packages:
cpu: [x64]
os: [netbsd]
'@esbuild/openbsd-arm64@0.25.11':
resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==}
'@esbuild/netbsd-x64@0.28.1':
resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openbsd]
cpu: [x64]
os: [netbsd]
'@esbuild/openbsd-arm64@0.27.7':
resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==}
@ -525,10 +519,10 @@ packages:
cpu: [arm64]
os: [openbsd]
'@esbuild/openbsd-x64@0.25.11':
resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==}
'@esbuild/openbsd-arm64@0.28.1':
resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==}
engines: {node: '>=18'}
cpu: [x64]
cpu: [arm64]
os: [openbsd]
'@esbuild/openbsd-x64@0.27.7':
@ -537,11 +531,11 @@ packages:
cpu: [x64]
os: [openbsd]
'@esbuild/openharmony-arm64@0.25.11':
resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==}
'@esbuild/openbsd-x64@0.28.1':
resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openharmony]
cpu: [x64]
os: [openbsd]
'@esbuild/openharmony-arm64@0.27.7':
resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==}
@ -549,11 +543,11 @@ packages:
cpu: [arm64]
os: [openharmony]
'@esbuild/sunos-x64@0.25.11':
resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==}
'@esbuild/openharmony-arm64@0.28.1':
resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==}
engines: {node: '>=18'}
cpu: [x64]
os: [sunos]
cpu: [arm64]
os: [openharmony]
'@esbuild/sunos-x64@0.27.7':
resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==}
@ -561,11 +555,11 @@ packages:
cpu: [x64]
os: [sunos]
'@esbuild/win32-arm64@0.25.11':
resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==}
'@esbuild/sunos-x64@0.28.1':
resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [win32]
cpu: [x64]
os: [sunos]
'@esbuild/win32-arm64@0.27.7':
resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==}
@ -573,10 +567,10 @@ packages:
cpu: [arm64]
os: [win32]
'@esbuild/win32-ia32@0.25.11':
resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==}
'@esbuild/win32-arm64@0.28.1':
resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==}
engines: {node: '>=18'}
cpu: [ia32]
cpu: [arm64]
os: [win32]
'@esbuild/win32-ia32@0.27.7':
@ -585,10 +579,10 @@ packages:
cpu: [ia32]
os: [win32]
'@esbuild/win32-x64@0.25.11':
resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==}
'@esbuild/win32-ia32@0.28.1':
resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==}
engines: {node: '>=18'}
cpu: [x64]
cpu: [ia32]
os: [win32]
'@esbuild/win32-x64@0.27.7':
@ -597,6 +591,12 @@ packages:
cpu: [x64]
os: [win32]
'@esbuild/win32-x64@0.28.1':
resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==}
engines: {node: '>=18'}
cpu: [x64]
os: [win32]
'@eslint-community/eslint-utils@4.9.1':
resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@ -936,6 +936,7 @@ packages:
'@svitejs/changesets-changelog-github-compact@1.1.0':
resolution: {integrity: sha512-qhUGGDHcpbY2zpjW3SwqchuW8J/5EzlPFud7xNntHKA7f3a/mx5+g+ruJKFHSAiVZYo30PALt+AyhmPUNKH/Og==}
engines: {node: ^14.13.1 || ^16.0.0 || >=18}
deprecated: unmaintained
'@types/aria-query@5.0.4':
resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==}
@ -1090,6 +1091,11 @@ packages:
engines: {node: '>=0.4.0'}
hasBin: true
acorn@8.17.0:
resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==}
engines: {node: '>=0.4.0'}
hasBin: true
agent-base@7.1.1:
resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==}
engines: {node: '>= 14'}
@ -1287,8 +1293,8 @@ packages:
peerDependencies:
typescript: '>=5.0.4 <5.8'
enhanced-resolve@5.22.1:
resolution: {integrity: sha512-6QEuw3zoX1SJQc7b87aBXke/no+mG2bTBgw29gWMQonLmpEkWoCAVkl+M49e48AZlWzxiDzDZzYdp6kobcyLww==}
enhanced-resolve@5.24.0:
resolution: {integrity: sha512-SkE2t82KlkkxQRVMVLAGKxLfORGQfrkx5dkj+vlgXRVNEdPc4eZcR+J/Fvj8C+yKSFH5L0q3NFlyufOVQnCcYQ==}
engines: {node: '>=10.13.0'}
enquirer@2.4.1:
@ -1305,13 +1311,13 @@ packages:
es-module-lexer@2.1.0:
resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==}
esbuild@0.25.11:
resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==}
esbuild@0.27.7:
resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==}
engines: {node: '>=18'}
hasBin: true
esbuild@0.27.7:
resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==}
esbuild@0.28.1:
resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==}
engines: {node: '>=18'}
hasBin: true
@ -1412,8 +1418,8 @@ packages:
resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==}
engines: {node: '>=0.10'}
esrap@2.2.11:
resolution: {integrity: sha512-gPdx+I+BjYEinNMQaBXFjbaJVyoPMU4ZODg5mE+M4DqVG9VusAVHHjcBX+zqyITlI0DIARwDMMzZwAWj36dRoQ==}
esrap@2.2.12:
resolution: {integrity: sha512-On0QbLyaiAkVC4eXtgnXK9Kh2opit+3rcUSOc45DqJ2s/X2eXAHsGOKRSJ6IDagQEW5vPyivANfXUiqgXC67Rw==}
peerDependencies:
'@typescript-eslint/types': ^8.2.0
peerDependenciesMeta:
@ -2095,8 +2101,8 @@ packages:
engines: {node: '>=10'}
hasBin: true
semver@7.8.1:
resolution: {integrity: sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==}
semver@7.8.4:
resolution: {integrity: sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==}
engines: {node: '>=10'}
hasBin: true
@ -2663,162 +2669,162 @@ snapshots:
human-id: 4.1.1
prettier: 2.8.8
'@esbuild/aix-ppc64@0.25.11':
optional: true
'@esbuild/aix-ppc64@0.27.7':
optional: true
'@esbuild/android-arm64@0.25.11':
'@esbuild/aix-ppc64@0.28.1':
optional: true
'@esbuild/android-arm64@0.27.7':
optional: true
'@esbuild/android-arm@0.25.11':
'@esbuild/android-arm64@0.28.1':
optional: true
'@esbuild/android-arm@0.27.7':
optional: true
'@esbuild/android-x64@0.25.11':
'@esbuild/android-arm@0.28.1':
optional: true
'@esbuild/android-x64@0.27.7':
optional: true
'@esbuild/darwin-arm64@0.25.11':
'@esbuild/android-x64@0.28.1':
optional: true
'@esbuild/darwin-arm64@0.27.7':
optional: true
'@esbuild/darwin-x64@0.25.11':
'@esbuild/darwin-arm64@0.28.1':
optional: true
'@esbuild/darwin-x64@0.27.7':
optional: true
'@esbuild/freebsd-arm64@0.25.11':
'@esbuild/darwin-x64@0.28.1':
optional: true
'@esbuild/freebsd-arm64@0.27.7':
optional: true
'@esbuild/freebsd-x64@0.25.11':
'@esbuild/freebsd-arm64@0.28.1':
optional: true
'@esbuild/freebsd-x64@0.27.7':
optional: true
'@esbuild/linux-arm64@0.25.11':
'@esbuild/freebsd-x64@0.28.1':
optional: true
'@esbuild/linux-arm64@0.27.7':
optional: true
'@esbuild/linux-arm@0.25.11':
'@esbuild/linux-arm64@0.28.1':
optional: true
'@esbuild/linux-arm@0.27.7':
optional: true
'@esbuild/linux-ia32@0.25.11':
'@esbuild/linux-arm@0.28.1':
optional: true
'@esbuild/linux-ia32@0.27.7':
optional: true
'@esbuild/linux-loong64@0.25.11':
'@esbuild/linux-ia32@0.28.1':
optional: true
'@esbuild/linux-loong64@0.27.7':
optional: true
'@esbuild/linux-mips64el@0.25.11':
'@esbuild/linux-loong64@0.28.1':
optional: true
'@esbuild/linux-mips64el@0.27.7':
optional: true
'@esbuild/linux-ppc64@0.25.11':
'@esbuild/linux-mips64el@0.28.1':
optional: true
'@esbuild/linux-ppc64@0.27.7':
optional: true
'@esbuild/linux-riscv64@0.25.11':
'@esbuild/linux-ppc64@0.28.1':
optional: true
'@esbuild/linux-riscv64@0.27.7':
optional: true
'@esbuild/linux-s390x@0.25.11':
'@esbuild/linux-riscv64@0.28.1':
optional: true
'@esbuild/linux-s390x@0.27.7':
optional: true
'@esbuild/linux-x64@0.25.11':
'@esbuild/linux-s390x@0.28.1':
optional: true
'@esbuild/linux-x64@0.27.7':
optional: true
'@esbuild/netbsd-arm64@0.25.11':
'@esbuild/linux-x64@0.28.1':
optional: true
'@esbuild/netbsd-arm64@0.27.7':
optional: true
'@esbuild/netbsd-x64@0.25.11':
'@esbuild/netbsd-arm64@0.28.1':
optional: true
'@esbuild/netbsd-x64@0.27.7':
optional: true
'@esbuild/openbsd-arm64@0.25.11':
'@esbuild/netbsd-x64@0.28.1':
optional: true
'@esbuild/openbsd-arm64@0.27.7':
optional: true
'@esbuild/openbsd-x64@0.25.11':
'@esbuild/openbsd-arm64@0.28.1':
optional: true
'@esbuild/openbsd-x64@0.27.7':
optional: true
'@esbuild/openharmony-arm64@0.25.11':
'@esbuild/openbsd-x64@0.28.1':
optional: true
'@esbuild/openharmony-arm64@0.27.7':
optional: true
'@esbuild/sunos-x64@0.25.11':
'@esbuild/openharmony-arm64@0.28.1':
optional: true
'@esbuild/sunos-x64@0.27.7':
optional: true
'@esbuild/win32-arm64@0.25.11':
'@esbuild/sunos-x64@0.28.1':
optional: true
'@esbuild/win32-arm64@0.27.7':
optional: true
'@esbuild/win32-ia32@0.25.11':
'@esbuild/win32-arm64@0.28.1':
optional: true
'@esbuild/win32-ia32@0.27.7':
optional: true
'@esbuild/win32-x64@0.25.11':
'@esbuild/win32-ia32@0.28.1':
optional: true
'@esbuild/win32-x64@0.27.7':
optional: true
'@esbuild/win32-x64@0.28.1':
optional: true
'@eslint-community/eslint-utils@4.9.1(eslint@10.0.0)':
dependencies:
eslint: 10.0.0
@ -2880,7 +2886,7 @@ snapshots:
'@jridgewell/gen-mapping@0.3.5':
dependencies:
'@jridgewell/set-array': 1.2.1
'@jridgewell/sourcemap-codec': 1.5.0
'@jridgewell/sourcemap-codec': 1.5.5
'@jridgewell/trace-mapping': 0.3.31
'@jridgewell/remapping@2.3.4':
@ -3062,7 +3068,7 @@ snapshots:
'@stylistic/eslint-plugin-js@1.8.0(eslint@10.0.0)':
dependencies:
'@types/eslint': 8.56.12
acorn: 8.16.0
acorn: 8.17.0
escape-string-regexp: 4.0.0
eslint: 10.0.0
eslint-visitor-keys: 3.4.3
@ -3303,8 +3309,14 @@ snapshots:
dependencies:
acorn: 8.16.0
acorn-jsx@5.3.2(acorn@8.17.0):
dependencies:
acorn: 8.17.0
acorn@8.16.0: {}
acorn@8.17.0: {}
agent-base@7.1.1:
dependencies:
debug: 4.4.3
@ -3475,7 +3487,7 @@ snapshots:
ts-api-utils: 1.3.0(typescript@5.5.4)
typescript: 5.5.4
enhanced-resolve@5.22.1:
enhanced-resolve@5.24.0:
dependencies:
graceful-fs: 4.2.11
tapable: 2.3.3
@ -3491,35 +3503,6 @@ snapshots:
es-module-lexer@2.1.0: {}
esbuild@0.25.11:
optionalDependencies:
'@esbuild/aix-ppc64': 0.25.11
'@esbuild/android-arm': 0.25.11
'@esbuild/android-arm64': 0.25.11
'@esbuild/android-x64': 0.25.11
'@esbuild/darwin-arm64': 0.25.11
'@esbuild/darwin-x64': 0.25.11
'@esbuild/freebsd-arm64': 0.25.11
'@esbuild/freebsd-x64': 0.25.11
'@esbuild/linux-arm': 0.25.11
'@esbuild/linux-arm64': 0.25.11
'@esbuild/linux-ia32': 0.25.11
'@esbuild/linux-loong64': 0.25.11
'@esbuild/linux-mips64el': 0.25.11
'@esbuild/linux-ppc64': 0.25.11
'@esbuild/linux-riscv64': 0.25.11
'@esbuild/linux-s390x': 0.25.11
'@esbuild/linux-x64': 0.25.11
'@esbuild/netbsd-arm64': 0.25.11
'@esbuild/netbsd-x64': 0.25.11
'@esbuild/openbsd-arm64': 0.25.11
'@esbuild/openbsd-x64': 0.25.11
'@esbuild/openharmony-arm64': 0.25.11
'@esbuild/sunos-x64': 0.25.11
'@esbuild/win32-arm64': 0.25.11
'@esbuild/win32-ia32': 0.25.11
'@esbuild/win32-x64': 0.25.11
esbuild@0.27.7:
optionalDependencies:
'@esbuild/aix-ppc64': 0.27.7
@ -3549,12 +3532,41 @@ snapshots:
'@esbuild/win32-ia32': 0.27.7
'@esbuild/win32-x64': 0.27.7
esbuild@0.28.1:
optionalDependencies:
'@esbuild/aix-ppc64': 0.28.1
'@esbuild/android-arm': 0.28.1
'@esbuild/android-arm64': 0.28.1
'@esbuild/android-x64': 0.28.1
'@esbuild/darwin-arm64': 0.28.1
'@esbuild/darwin-x64': 0.28.1
'@esbuild/freebsd-arm64': 0.28.1
'@esbuild/freebsd-x64': 0.28.1
'@esbuild/linux-arm': 0.28.1
'@esbuild/linux-arm64': 0.28.1
'@esbuild/linux-ia32': 0.28.1
'@esbuild/linux-loong64': 0.28.1
'@esbuild/linux-mips64el': 0.28.1
'@esbuild/linux-ppc64': 0.28.1
'@esbuild/linux-riscv64': 0.28.1
'@esbuild/linux-s390x': 0.28.1
'@esbuild/linux-x64': 0.28.1
'@esbuild/netbsd-arm64': 0.28.1
'@esbuild/netbsd-x64': 0.28.1
'@esbuild/openbsd-arm64': 0.28.1
'@esbuild/openbsd-x64': 0.28.1
'@esbuild/openharmony-arm64': 0.28.1
'@esbuild/sunos-x64': 0.28.1
'@esbuild/win32-arm64': 0.28.1
'@esbuild/win32-ia32': 0.28.1
'@esbuild/win32-x64': 0.28.1
escape-string-regexp@4.0.0: {}
eslint-compat-utils@0.5.1(eslint@10.0.0):
dependencies:
eslint: 10.0.0
semver: 7.8.1
semver: 7.8.4
eslint-config-prettier@9.1.0(eslint@10.0.0):
dependencies:
@ -3574,14 +3586,14 @@ snapshots:
eslint-plugin-n@17.24.0(eslint@10.0.0)(typescript@5.5.4):
dependencies:
'@eslint-community/eslint-utils': 4.9.1(eslint@10.0.0)
enhanced-resolve: 5.22.1
enhanced-resolve: 5.24.0
eslint: 10.0.0
eslint-plugin-es-x: 7.8.0(eslint@10.0.0)
get-tsconfig: 4.14.0
globals: 15.15.0
globrex: 0.1.2
ignore: 5.3.2
semver: 7.8.1
semver: 7.8.4
ts-declaration-location: 1.0.7(typescript@5.5.4)
transitivePeerDependencies:
- typescript
@ -3673,8 +3685,8 @@ snapshots:
espree@9.6.1:
dependencies:
acorn: 8.16.0
acorn-jsx: 5.3.2(acorn@8.16.0)
acorn: 8.17.0
acorn-jsx: 5.3.2(acorn@8.17.0)
eslint-visitor-keys: 3.4.3
esprima@4.0.1: {}
@ -3683,7 +3695,7 @@ snapshots:
dependencies:
estraverse: 5.3.0
esrap@2.2.11(@typescript-eslint/types@8.59.4):
esrap@2.2.12(@typescript-eslint/types@8.59.4):
dependencies:
'@jridgewell/sourcemap-codec': 1.5.5
optionalDependencies:
@ -4312,7 +4324,7 @@ snapshots:
semver@7.7.4: {}
semver@7.8.1: {}
semver@7.8.4: {}
serialize-javascript@6.0.2:
dependencies:

Loading…
Cancel
Save