Merge branch 'main' into partial-components

partial-components
ComputerGuy 5 days ago
commit 77d2143ecd

@ -4,7 +4,7 @@ title: $bindable
Ordinarily, props go one way, from parent to child. This makes it easy to understand how data flows around your app. Ordinarily, props go one way, from parent to child. This makes it easy to understand how data flows around your app.
In Svelte, component props can be _bound_, which means that data can also flow _up_ from child to parent. This isn't something you should do often, but it can simplify your code if used sparingly and carefully. In Svelte, component props can be _bound_, which means that data can also flow _up_ from child to parent. This isn't something you should do often — overuse can make your data flow unpredictable and your components harder to maintain — but it can simplify your code if used sparingly and carefully.
It also means that a state proxy can be _mutated_ in the child. It also means that a state proxy can be _mutated_ in the child.

@ -14,6 +14,8 @@ title: {#each ...}
Iterating over values can be done with an each block. The values in question can be arrays, array-like objects (i.e. anything with a `length` property), or iterables like `Map` and `Set`— in other words, anything that can be used with `Array.from`. Iterating over values can be done with an each block. The values in question can be arrays, array-like objects (i.e. anything with a `length` property), or iterables like `Map` and `Set`— in other words, anything that can be used with `Array.from`.
If the value is `null` or `undefined`, it is treated the same as an empty array (which will cause [else blocks](#Else-blocks) to be rendered, where applicable).
```svelte ```svelte
<h1>Shopping list</h1> <h1>Shopping list</h1>
<ul> <ul>

@ -18,7 +18,7 @@ There are online forums and chats which are a great place for discussion about b
## Are there any third-party resources? ## Are there any third-party resources?
Svelte Society maintains a [list of books and videos](https://sveltesociety.dev/resources). Svelte Society maintains a [list of books and videos](https://sveltesociety.dev/collection/a-list-of-books-and-courses-ac01dd10363184fa).
## How can I get VS Code to syntax-highlight my .svelte files? ## How can I get VS Code to syntax-highlight my .svelte files?

@ -41,7 +41,7 @@
"prettier-plugin-svelte": "^3.4.0", "prettier-plugin-svelte": "^3.4.0",
"svelte": "workspace:^", "svelte": "workspace:^",
"typescript": "^5.5.4", "typescript": "^5.5.4",
"typescript-eslint": "^8.48.0", "typescript-eslint": "^8.48.1",
"v8-natives": "^1.2.5", "v8-natives": "^1.2.5",
"vitest": "^2.1.9" "vitest": "^2.1.9"
} }

@ -1,5 +1,37 @@
# svelte # svelte
## 5.45.10
### Patch Changes
- fix: race condition when importing `AsyncLocalStorage` ([#17350](https://github.com/sveltejs/svelte/pull/17350))
## 5.45.9
### Patch Changes
- fix: correctly reschedule deferred effects when reviving a batch after async work ([#17332](https://github.com/sveltejs/svelte/pull/17332))
- fix: correctly print `!doctype` during `print` ([#17341](https://github.com/sveltejs/svelte/pull/17341))
## 5.45.8
### Patch Changes
- fix: set AST `root.start` to `0` and `root.end` to `template.length` ([#17125](https://github.com/sveltejs/svelte/pull/17125))
- fix: prevent erroneous `state_referenced_locally` warnings on prop fallbacks ([#17329](https://github.com/sveltejs/svelte/pull/17329))
## 5.45.7
### Patch Changes
- fix: Add `<textarea wrap="off">` as a valid attribute value ([#17326](https://github.com/sveltejs/svelte/pull/17326))
- fix: add more css selectors to `print()` ([#17330](https://github.com/sveltejs/svelte/pull/17330))
- fix: don't crash on `hydratable` serialization failure ([#17315](https://github.com/sveltejs/svelte/pull/17315))
## 5.45.6 ## 5.45.6
### Patch Changes ### Patch Changes

@ -1422,7 +1422,7 @@ export interface HTMLTextareaAttributes extends HTMLAttributes<HTMLTextAreaEleme
// needs both casing variants because language tools does lowercase names of non-shorthand attributes // needs both casing variants because language tools does lowercase names of non-shorthand attributes
defaultValue?: string | string[] | number | undefined | null; defaultValue?: string | string[] | number | undefined | null;
defaultvalue?: string | string[] | number | undefined | null; defaultvalue?: string | string[] | number | undefined | null;
wrap?: 'hard' | 'soft' | undefined | null; wrap?: 'hard' | 'soft' | 'off' | undefined | null;
'on:change'?: ChangeEventHandler<HTMLTextAreaElement> | undefined | null; 'on:change'?: ChangeEventHandler<HTMLTextAreaElement> | undefined | null;
onchange?: ChangeEventHandler<HTMLTextAreaElement> | undefined | null; onchange?: ChangeEventHandler<HTMLTextAreaElement> | undefined | null;

@ -2,7 +2,7 @@
"name": "svelte", "name": "svelte",
"description": "Cybernetically enhanced web apps", "description": "Cybernetically enhanced web apps",
"license": "MIT", "license": "MIT",
"version": "5.45.6", "version": "5.45.10",
"type": "module", "type": "module",
"types": "./types/index.d.ts", "types": "./types/index.d.ts",
"engines": { "engines": {

@ -117,21 +117,8 @@ export class Parser {
e.unexpected_eof(this.index); e.unexpected_eof(this.index);
} }
if (this.root.fragment.nodes.length) { this.root.start = 0;
let start = /** @type {number} */ (this.root.fragment.nodes[0].start); this.root.end = template.length;
while (regex_whitespace.test(template[start])) start += 1;
let end = /** @type {number} */ (
this.root.fragment.nodes[this.root.fragment.nodes.length - 1].end
);
while (regex_whitespace.test(template[end - 1])) end -= 1;
this.root.start = start;
this.root.end = end;
} else {
// @ts-ignore
this.root.start = this.root.end = null;
}
const options_index = this.root.fragment.nodes.findIndex( const options_index = this.root.fragment.nodes.findIndex(
/** @param {any} thing */ /** @param {any} thing */

@ -146,5 +146,15 @@ export function VariableDeclarator(node, context) {
} }
} }
if (node.init && get_rune(node.init, context.state.scope) === '$props') {
// prevent erroneous `state_referenced_locally` warnings on prop fallbacks
context.visit(node.id, {
...context.state,
function_depth: context.state.function_depth + 1
});
context.visit(node.init);
} else {
context.next(); context.next();
} }
}

@ -112,12 +112,13 @@ function base_element(node, context) {
} }
const multiline_attributes = attributes(node.attributes, child_context); const multiline_attributes = attributes(node.attributes, child_context);
const is_doctype_node = node.name.toLowerCase() === '!doctype';
const is_self_closing = const is_self_closing =
is_void(node.name) || (node.type === 'Component' && node.fragment.nodes.length === 0); is_void(node.name) || (node.type === 'Component' && node.fragment.nodes.length === 0);
let multiline_content = false; let multiline_content = false;
if (is_self_closing) { if (is_doctype_node) child_context.write(`>`);
else if (is_self_closing) {
child_context.write(`${multiline_attributes ? '' : ' '}/>`); child_context.write(`${multiline_attributes ? '' : ' '}/>`);
} else { } else {
child_context.write('>'); child_context.write('>');
@ -181,6 +182,18 @@ const css_visitors = {
} }
}, },
AttributeSelector(node, context) {
context.write(`[${node.name}`);
if (node.matcher) {
context.write(node.matcher);
context.write(`"${node.value}"`);
if (node.flags) {
context.write(` ${node.flags}`);
}
}
context.write(']');
},
Block(node, context) { Block(node, context) {
context.write('{'); context.write('{');
@ -221,10 +234,22 @@ const css_visitors = {
context.write(`${node.property}: ${node.value};`); context.write(`${node.property}: ${node.value};`);
}, },
IdSelector(node, context) {
context.write(`#${node.name}`);
},
NestingSelector(node, context) {
context.write('&');
},
Nth(node, context) { Nth(node, context) {
context.write(node.value); context.write(node.value);
}, },
Percentage(node, context) {
context.write(`${node.value}%`);
},
PseudoClassSelector(node, context) { PseudoClassSelector(node, context) {
context.write(`:${node.name}`); context.write(`:${node.name}`);

@ -44,7 +44,6 @@ import { eager_effect, unlink_effect } from './effects.js';
* effect: Effect | null; * effect: Effect | null;
* effects: Effect[]; * effects: Effect[];
* render_effects: Effect[]; * render_effects: Effect[];
* block_effects: Effect[];
* }} EffectTarget * }} EffectTarget
*/ */
@ -128,15 +127,15 @@ export class Batch {
/** /**
* Deferred effects (which run after async work has completed) that are DIRTY * Deferred effects (which run after async work has completed) that are DIRTY
* @type {Effect[]} * @type {Set<Effect>}
*/ */
#dirty_effects = []; #dirty_effects = new Set();
/** /**
* Deferred effects that are MAYBE_DIRTY * Deferred effects that are MAYBE_DIRTY
* @type {Effect[]} * @type {Set<Effect>}
*/ */
#maybe_dirty_effects = []; #maybe_dirty_effects = new Set();
/** /**
* A set of branches that still exist, but will be destroyed when this batch * A set of branches that still exist, but will be destroyed when this batch
@ -167,8 +166,7 @@ export class Batch {
parent: null, parent: null,
effect: null, effect: null,
effects: [], effects: [],
render_effects: [], render_effects: []
block_effects: []
}; };
for (const root of root_effects) { for (const root of root_effects) {
@ -187,7 +185,6 @@ export class Batch {
if (this.is_deferred()) { if (this.is_deferred()) {
this.#defer_effects(target.effects); this.#defer_effects(target.effects);
this.#defer_effects(target.render_effects); this.#defer_effects(target.render_effects);
this.#defer_effects(target.block_effects);
} else { } else {
// If sources are written to, then work needs to happen in a separate batch, else prior sources would be mixed with // If sources are written to, then work needs to happen in a separate batch, else prior sources would be mixed with
// newly updated sources, which could lead to infinite loops when effects run over and over again. // newly updated sources, which could lead to infinite loops when effects run over and over again.
@ -228,8 +225,7 @@ export class Batch {
parent: target, parent: target,
effect, effect,
effects: [], effects: [],
render_effects: [], render_effects: []
block_effects: []
}; };
} }
@ -241,7 +237,7 @@ export class Batch {
} else if (async_mode_flag && (flags & (RENDER_EFFECT | MANAGED_EFFECT)) !== 0) { } else if (async_mode_flag && (flags & (RENDER_EFFECT | MANAGED_EFFECT)) !== 0) {
target.render_effects.push(effect); target.render_effects.push(effect);
} else if (is_dirty(effect)) { } else if (is_dirty(effect)) {
if ((effect.f & BLOCK_EFFECT) !== 0) target.block_effects.push(effect); if ((effect.f & BLOCK_EFFECT) !== 0) this.#dirty_effects.add(effect);
update_effect(effect); update_effect(effect);
} }
@ -263,7 +259,6 @@ export class Batch {
// once the boundary is ready? // once the boundary is ready?
this.#defer_effects(target.effects); this.#defer_effects(target.effects);
this.#defer_effects(target.render_effects); this.#defer_effects(target.render_effects);
this.#defer_effects(target.block_effects);
target = /** @type {EffectTarget} */ (target.parent); target = /** @type {EffectTarget} */ (target.parent);
} }
@ -279,8 +274,11 @@ export class Batch {
*/ */
#defer_effects(effects) { #defer_effects(effects) {
for (const e of effects) { for (const e of effects) {
const target = (e.f & DIRTY) !== 0 ? this.#dirty_effects : this.#maybe_dirty_effects; if ((e.f & DIRTY) !== 0) {
target.push(e); this.#dirty_effects.add(e);
} else if ((e.f & MAYBE_DIRTY) !== 0) {
this.#maybe_dirty_effects.add(e);
}
// Since we're not executing these effects now, we need to clear any WAS_MARKED flags // Since we're not executing these effects now, we need to clear any WAS_MARKED flags
// so that other batches can correctly reach these effects during their own traversal // so that other batches can correctly reach these effects during their own traversal
@ -390,8 +388,7 @@ export class Batch {
parent: null, parent: null,
effect: null, effect: null,
effects: [], effects: [],
render_effects: [], render_effects: []
block_effects: []
}; };
for (const batch of batches) { for (const batch of batches) {
@ -484,6 +481,7 @@ export class Batch {
revive() { revive() {
for (const e of this.#dirty_effects) { for (const e of this.#dirty_effects) {
this.#maybe_dirty_effects.delete(e);
set_signal_status(e, DIRTY); set_signal_status(e, DIRTY);
schedule_effect(e); schedule_effect(e);
} }
@ -493,9 +491,6 @@ export class Batch {
schedule_effect(e); schedule_effect(e);
} }
this.#dirty_effects = [];
this.#maybe_dirty_effects = [];
this.flush(); this.flush();
} }

@ -57,8 +57,16 @@ function encode(key, value, unresolved) {
entry.serialized = devalue.uneval(entry.value, (value, uneval) => { entry.serialized = devalue.uneval(entry.value, (value, uneval) => {
if (is_promise(value)) { if (is_promise(value)) {
// we serialize promises as `"${i}"`, because it's impossible for that string
// to occur 'naturally' (since the quote marks would have to be escaped)
// this placeholder is returned synchronously from `uneval`, which includes it in the
// serialized string. Later (at least one microtask from now), when `p.then` runs, it'll
// be replaced.
const placeholder = `"${uid++}"`;
const p = value const p = value
.then((v) => `r(${uneval(v)})`) .then((v) => {
entry.serialized = entry.serialized.replace(placeholder, `r(${uneval(v)})`);
})
.catch((devalue_error) => .catch((devalue_error) =>
e.hydratable_serialization_failed( e.hydratable_serialization_failed(
key, key,
@ -66,23 +74,11 @@ function encode(key, value, unresolved) {
) )
); );
// prevent unhandled rejections from crashing the server
p.catch(() => {});
// track which promises are still resolving when render is complete
unresolved?.set(p, key); unresolved?.set(p, key);
p.finally(() => unresolved?.delete(p)); // prevent unhandled rejections from crashing the server, track which promises are still resolving when render is complete
p.catch(() => {}).finally(() => unresolved?.delete(p));
// we serialize promises as `"${i}"`, because it's impossible for that string
// to occur 'naturally' (since the quote marks would have to be escaped)
const placeholder = `"${uid++}"`;
(entry.promises ??= []).push(
p.then((s) => {
entry.serialized = entry.serialized.replace(placeholder, s);
})
);
(entry.promises ??= []).push(p);
return placeholder; return placeholder;
} }
}); });

@ -2,7 +2,7 @@
/** @import { AsyncLocalStorage } from 'node:async_hooks' */ /** @import { AsyncLocalStorage } from 'node:async_hooks' */
/** @import { RenderContext } from '#server' */ /** @import { RenderContext } from '#server' */
import { deferred } from '../shared/utils.js'; import { deferred, noop } from '../shared/utils.js';
import * as e from './errors.js'; import * as e from './errors.js';
/** @type {Promise<void> | null} */ /** @type {Promise<void> | null} */
@ -56,14 +56,26 @@ export async function with_render_context(fn) {
/** @type {AsyncLocalStorage<RenderContext | null> | null} */ /** @type {AsyncLocalStorage<RenderContext | null> | null} */
let als = null; let als = null;
/** @type {Promise<void> | null} */
let als_import = null;
export async function init_render_context() { /**
if (als !== null) return; *
try { * @returns {Promise<void>}
*/
export function init_render_context() {
// It's important the right side of this assignment can run a maximum of one time
// otherwise it's possible for a very, very well-timed race condition to assign to `als`
// at the beginning of a render, and then another render to assign to it again, which causes
// the first render's second half to use a new instance of `als` which doesn't have its
// context anymore.
// @ts-ignore -- we don't include node types in the production build // @ts-ignore -- we don't include node types in the production build
const { AsyncLocalStorage } = await import('node:async_hooks'); als_import ??= import('node:async_hooks')
als = new AsyncLocalStorage(); .then((hooks) => {
} catch {} als = new hooks.AsyncLocalStorage();
})
.then(noop, noop);
return als_import;
} }
// this has to be a function because rollup won't treeshake it if it's a constant // this has to be a function because rollup won't treeshake it if it's a constant

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

@ -1,6 +1,6 @@
# Test repo # Test repo
This repo tries to migrate as many tests from the currente Svelte project over to test against the new compiler/runtime. This repo tries to migrate as many tests from the current Svelte project over to test against the new compiler/runtime.
## Differences to the old test suite ## Differences to the old test suite

@ -1,7 +1,7 @@
{ {
"css": null, "css": null,
"js": [], "js": [],
"start": 37, "start": 0,
"end": 117, "end": 117,
"type": "Root", "type": "Root",
"fragment": { "fragment": {

@ -2,7 +2,7 @@
"css": null, "css": null,
"js": [], "js": [],
"start": 0, "start": 0,
"end": 27, "end": 76,
"type": "Root", "type": "Root",
"fragment": { "fragment": {
"type": "Fragment", "type": "Fragment",

@ -1079,7 +1079,7 @@
} }
}, },
"js": [], "js": [],
"start": 808, "start": 0,
"end": 820, "end": 820,
"type": "Root", "type": "Root",
"fragment": { "fragment": {

@ -398,8 +398,8 @@
} }
}, },
"js": [], "js": [],
"start": null, "start": 0,
"end": null, "end": 386,
"type": "Root", "type": "Root",
"fragment": { "fragment": {
"type": "Fragment", "type": "Fragment",

@ -1,7 +1,7 @@
{ {
"css": null, "css": null,
"js": [], "js": [],
"start": 30, "start": 0,
"end": 192, "end": 192,
"type": "Root", "type": "Root",
"fragment": { "fragment": {

@ -1,7 +1,7 @@
{ {
"css": null, "css": null,
"js": [], "js": [],
"start": 45, "start": 0,
"end": 119, "end": 119,
"type": "Root", "type": "Root",
"fragment": { "fragment": {

@ -2,7 +2,7 @@
"css": null, "css": null,
"js": [], "js": [],
"start": 0, "start": 0,
"end": 102, "end": 169,
"type": "Root", "type": "Root",
"fragment": { "fragment": {
"type": "Fragment", "type": "Fragment",

@ -0,0 +1,6 @@
<script>
// script and style but no markup
</script>
<style>
div { color: red; }
</style>

@ -0,0 +1,112 @@
{
"css": {
"type": "StyleSheet",
"start": 54,
"end": 91,
"attributes": [],
"children": [
{
"type": "Rule",
"prelude": {
"type": "SelectorList",
"start": 63,
"end": 66,
"children": [
{
"type": "ComplexSelector",
"start": 63,
"end": 66,
"children": [
{
"type": "RelativeSelector",
"combinator": null,
"selectors": [
{
"type": "TypeSelector",
"name": "div",
"start": 63,
"end": 66
}
],
"start": 63,
"end": 66
}
]
}
]
},
"block": {
"type": "Block",
"start": 67,
"end": 82,
"children": [
{
"type": "Declaration",
"start": 69,
"end": 79,
"property": "color",
"value": "red"
}
]
},
"start": 63,
"end": 82
}
],
"content": {
"start": 61,
"end": 83,
"styles": "\n\tdiv { color: red; }\n",
"comment": null
}
},
"js": [],
"start": 0,
"end": 91,
"type": "Root",
"fragment": {
"type": "Fragment",
"nodes": [
{
"type": "Text",
"start": 53,
"end": 54,
"raw": "\n",
"data": "\n"
}
]
},
"options": null,
"instance": {
"type": "Script",
"start": 0,
"end": 53,
"context": "default",
"content": {
"type": "Program",
"start": 8,
"end": 44,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 3,
"column": 0
}
},
"body": [],
"sourceType": "module",
"trailingComments": [
{
"type": "Line",
"value": " script and style but no markup",
"start": 10,
"end": 43
}
]
},
"attributes": []
}
}

@ -77,7 +77,7 @@
}, },
"js": [], "js": [],
"start": 0, "start": 0,
"end": 35, "end": 205,
"type": "Root", "type": "Root",
"fragment": { "fragment": {
"type": "Fragment", "type": "Fragment",

@ -1,7 +1,7 @@
{ {
"css": null, "css": null,
"js": [], "js": [],
"start": 29, "start": 0,
"end": 101, "end": 101,
"type": "Root", "type": "Root",
"fragment": { "fragment": {

@ -1,7 +1,7 @@
{ {
"css": null, "css": null,
"js": [], "js": [],
"start": 54, "start": 0,
"end": 173, "end": 173,
"type": "Root", "type": "Root",
"fragment": { "fragment": {

@ -0,0 +1,11 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Svelte App</title>
</head>
<body>
<div>Hello World</div>
</body>
</html>

@ -0,0 +1,12 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0"
/>
<title>Svelte App</title>
</head>
<body><div>Hello World</div></body>
</html>

@ -16,6 +16,7 @@
@keyframes fade { @keyframes fade {
from { opacity: 0; } from { opacity: 0; }
50% { opacity: 0.5; }
to { opacity: 1; } to { opacity: 1; }
} }
@ -40,4 +41,14 @@
.container .item, nav > ul.menu { .container .item, nav > ul.menu {
color: red; color: red;
} }
#id-selector { color: red; }
[data-attribute] { color: red; }
[data-attribute="value"] { color: red; }
.card {
background: white;
&:hover {
background: gray;
}
}
</style> </style>

@ -19,6 +19,9 @@
from { from {
opacity: 0; opacity: 0;
} }
50%% {
opacity: 0.5;
}
to { to {
opacity: 1; opacity: 1;
} }
@ -66,4 +69,23 @@
nav > ul.menu { nav > ul.menu {
color: red; color: red;
} }
#id-selector {
color: red;
}
[data-attribute] {
color: red;
}
[data-attribute="value"] {
color: red;
}
.card {
background: white;
&:hover {
background: gray;
}
}
</style> </style>

@ -164,6 +164,7 @@ async function run_test(
} }
], ],
bundle: true, bundle: true,
platform: 'node',
format: 'iife', format: 'iife',
globalName: 'test_ssr' globalName: 'test_ssr'
}); });

@ -0,0 +1,26 @@
import { tick } from 'svelte';
import { test } from '../../test';
export default test({
async test({ assert, target }) {
const [a, b, resolve] = target.querySelectorAll('button');
a.click();
await tick();
b.click();
await tick();
resolve.click();
await tick();
assert.htmlEqual(
target.innerHTML,
`
<button>a (true)</button>
<button>b (true)</button>
<button>resolve</button>
42
`
);
}
});

@ -0,0 +1,23 @@
<script>
import Child from './Child.svelte';
let a = $state(false);
let b = $state(false);
let deferred = [];
function push(value) {
const d = Promise.withResolvers();
deferred.push(() => d.resolve(value))
return d.promise;
}
</script>
<button onclick={() => a = !a}>a ({a})</button>
<button onclick={() => b = !b}>b ({b})</button>
<button onclick={() => deferred.shift()()}>resolve</button>
{#if a}
{await push(42)}
<Child />
{/if}

@ -0,0 +1,6 @@
import { test } from '../../test';
export default test({
mode: ['async'],
error: 'hydratable_serialization_failed'
});

@ -0,0 +1,5 @@
<script lang="ts">
import { hydratable } from 'svelte';
hydratable('key', () => new Promise(() => { throw new Error('nope') }));
</script>

@ -9,7 +9,8 @@
console.log(doubled); console.log(doubled);
let { let {
prop prop,
other_prop = prop
} = $props(); } = $props();
let prop_state = $state(prop); let prop_state = $state(prop);
let prop_derived = $derived(prop); let prop_derived = $derived(prop);

@ -39,36 +39,36 @@
"code": "state_referenced_locally", "code": "state_referenced_locally",
"end": { "end": {
"column": 29, "column": 29,
"line": 14 "line": 15
}, },
"message": "This reference only captures the initial value of `prop`. Did you mean to reference it inside a closure instead?", "message": "This reference only captures the initial value of `prop`. Did you mean to reference it inside a closure instead?",
"start": { "start": {
"column": 25, "column": 25,
"line": 14 "line": 15
} }
}, },
{ {
"code": "state_referenced_locally", "code": "state_referenced_locally",
"end": { "end": {
"column": 17, "column": 17,
"line": 16 "line": 17
}, },
"message": "This reference only captures the initial value of `prop`. Did you mean to reference it inside a closure instead?", "message": "This reference only captures the initial value of `prop`. Did you mean to reference it inside a closure instead?",
"start": { "start": {
"column": 13, "column": 13,
"line": 16 "line": 17
} }
}, },
{ {
"code": "state_referenced_locally", "code": "state_referenced_locally",
"end": { "end": {
"column": 25, "column": 25,
"line": 17 "line": 18
}, },
"message": "This reference only captures the initial value of `prop_derived`. Did you mean to reference it inside a closure instead?", "message": "This reference only captures the initial value of `prop_derived`. Did you mean to reference it inside a closure instead?",
"start": { "start": {
"column": 13, "column": 13,
"line": 17 "line": 18
} }
} }
] ]

@ -13,7 +13,7 @@ importers:
version: 2.29.8(@types/node@20.19.17) version: 2.29.8(@types/node@20.19.17)
'@sveltejs/eslint-config': '@sveltejs/eslint-config':
specifier: ^8.3.3 specifier: ^8.3.3
version: 8.3.3(@stylistic/eslint-plugin-js@1.8.0(eslint@9.9.1))(eslint-config-prettier@9.1.0(eslint@9.9.1))(eslint-plugin-n@17.16.1(eslint@9.9.1)(typescript@5.5.4))(eslint-plugin-svelte@3.11.0(eslint@9.9.1)(svelte@packages+svelte))(eslint@9.9.1)(typescript-eslint@8.48.0(eslint@9.9.1)(typescript@5.5.4))(typescript@5.5.4) version: 8.3.3(@stylistic/eslint-plugin-js@1.8.0(eslint@9.9.1))(eslint-config-prettier@9.1.0(eslint@9.9.1))(eslint-plugin-n@17.16.1(eslint@9.9.1)(typescript@5.5.4))(eslint-plugin-svelte@3.11.0(eslint@9.9.1)(svelte@packages+svelte))(eslint@9.9.1)(typescript-eslint@8.48.1(eslint@9.9.1)(typescript@5.5.4))(typescript@5.5.4)
'@svitejs/changesets-changelog-github-compact': '@svitejs/changesets-changelog-github-compact':
specifier: ^1.1.0 specifier: ^1.1.0
version: 1.1.0 version: 1.1.0
@ -54,8 +54,8 @@ importers:
specifier: ^5.5.4 specifier: ^5.5.4
version: 5.5.4 version: 5.5.4
typescript-eslint: typescript-eslint:
specifier: ^8.48.0 specifier: ^8.48.1
version: 8.48.0(eslint@9.9.1)(typescript@5.5.4) version: 8.48.1(eslint@9.9.1)(typescript@5.5.4)
v8-natives: v8-natives:
specifier: ^1.2.5 specifier: ^1.2.5
version: 1.2.5 version: 1.2.5
@ -898,63 +898,63 @@ packages:
'@types/resolve@1.20.2': '@types/resolve@1.20.2':
resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==}
'@typescript-eslint/eslint-plugin@8.48.0': '@typescript-eslint/eslint-plugin@8.48.1':
resolution: {integrity: sha512-XxXP5tL1txl13YFtrECECQYeZjBZad4fyd3cFV4a19LkAY/bIp9fev3US4S5fDVV2JaYFiKAZ/GRTOLer+mbyQ==} resolution: {integrity: sha512-X63hI1bxl5ohelzr0LY5coufyl0LJNthld+abwxpCoo6Gq+hSqhKwci7MUWkXo67mzgUK6YFByhmaHmUcuBJmA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
'@typescript-eslint/parser': ^8.48.0 '@typescript-eslint/parser': ^8.48.1
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/parser@8.48.0': '@typescript-eslint/parser@8.48.1':
resolution: {integrity: sha512-jCzKdm/QK0Kg4V4IK/oMlRZlY+QOcdjv89U2NgKHZk1CYTj82/RVSx1mV/0gqCVMJ/DA+Zf/S4NBWNF8GQ+eqQ==} resolution: {integrity: sha512-PC0PDZfJg8sP7cmKe6L3QIL8GZwU5aRvUFedqSIpw3B+QjRSUZeeITC2M5XKeMXEzL6wccN196iy3JLwKNvDVA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/project-service@8.48.0': '@typescript-eslint/project-service@8.48.1':
resolution: {integrity: sha512-Ne4CTZyRh1BecBf84siv42wv5vQvVmgtk8AuiEffKTUo3DrBaGYZueJSxxBZ8fjk/N3DrgChH4TOdIOwOwiqqw==} resolution: {integrity: sha512-HQWSicah4s9z2/HifRPQ6b6R7G+SBx64JlFQpgSSHWPKdvCZX57XCbszg/bapbRsOEv42q5tayTYcEFpACcX1w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/scope-manager@8.48.0': '@typescript-eslint/scope-manager@8.48.1':
resolution: {integrity: sha512-uGSSsbrtJrLduti0Q1Q9+BF1/iFKaxGoQwjWOIVNJv0o6omrdyR8ct37m4xIl5Zzpkp69Kkmvom7QFTtue89YQ==} resolution: {integrity: sha512-rj4vWQsytQbLxC5Bf4XwZ0/CKd362DkWMUkviT7DCS057SK64D5lH74sSGzhI6PDD2HCEq02xAP9cX68dYyg1w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/tsconfig-utils@8.48.0': '@typescript-eslint/tsconfig-utils@8.48.1':
resolution: {integrity: sha512-WNebjBdFdyu10sR1M4OXTt2OkMd5KWIL+LLfeH9KhgP+jzfDV/LI3eXzwJ1s9+Yc0Kzo2fQCdY/OpdusCMmh6w==} resolution: {integrity: sha512-k0Jhs4CpEffIBm6wPaCXBAD7jxBtrHjrSgtfCjUvPp9AZ78lXKdTR8fxyZO5y4vWNlOvYXRtngSZNSn+H53Jkw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/type-utils@8.48.0': '@typescript-eslint/type-utils@8.48.1':
resolution: {integrity: sha512-zbeVaVqeXhhab6QNEKfK96Xyc7UQuoFWERhEnj3mLVnUWrQnv15cJNseUni7f3g557gm0e46LZ6IJ4NJVOgOpw==} resolution: {integrity: sha512-1jEop81a3LrJQLTf/1VfPQdhIY4PlGDBc/i67EVWObrtvcziysbLN3oReexHOM6N3jyXgCrkBsZpqwH0hiDOQg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/types@8.48.0': '@typescript-eslint/types@8.48.1':
resolution: {integrity: sha512-cQMcGQQH7kwKoVswD1xdOytxQR60MWKM1di26xSUtxehaDs/32Zpqsu5WJlXTtTTqyAVK8R7hvsUnIXRS+bjvA==} resolution: {integrity: sha512-+fZ3LZNeiELGmimrujsDCT4CRIbq5oXdHe7chLiW8qzqyPMnn1puNstCrMNVAqwcl2FdIxkuJ4tOs/RFDBVc/Q==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/typescript-estree@8.48.0': '@typescript-eslint/typescript-estree@8.48.1':
resolution: {integrity: sha512-ljHab1CSO4rGrQIAyizUS6UGHHCiAYhbfcIZ1zVJr5nMryxlXMVWS3duFPSKvSUbFPwkXMFk1k0EMIjub4sRRQ==} resolution: {integrity: sha512-/9wQ4PqaefTK6POVTjJaYS0bynCgzh6ClJHGSBj06XEHjkfylzB+A3qvyaXnErEZSaxhIo4YdyBgq6j4RysxDg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/utils@8.48.0': '@typescript-eslint/utils@8.48.1':
resolution: {integrity: sha512-yTJO1XuGxCsSfIVt1+1UrLHtue8xz16V8apzPYI06W0HbEbEWHxHXgZaAgavIkoh+GeV6hKKd5jm0sS6OYxWXQ==} resolution: {integrity: sha512-fAnhLrDjiVfey5wwFRwrweyRlCmdz5ZxXz2G/4cLn0YDLjTapmN4gcCsTBR1N2rWnZSDeWpYtgLDsJt+FpmcwA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/visitor-keys@8.48.0': '@typescript-eslint/visitor-keys@8.48.1':
resolution: {integrity: sha512-T0XJMaRPOH3+LBbAfzR2jalckP1MSG/L9eUtY0DEzUyVaXJ/t6zN0nR7co5kz0Jko/nkSYCBRkz1djvjajVTTg==} resolution: {integrity: sha512-BmxxndzEWhE4TIEEMBs8lP3MBWN3jFPs/p6gPm/wkv02o41hI6cq9AuSmGAaTTHPtA1FTi2jBre4A9rm5ZmX+Q==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@vitest/coverage-v8@2.1.9': '@vitest/coverage-v8@2.1.9':
@ -1472,8 +1472,8 @@ packages:
resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
engines: {node: '>=10.13.0'} engines: {node: '>=10.13.0'}
glob@10.4.5: glob@10.5.0:
resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==}
hasBin: true hasBin: true
globals@14.0.0: globals@14.0.0:
@ -2283,8 +2283,8 @@ packages:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
engines: {node: '>= 0.8.0'} engines: {node: '>= 0.8.0'}
typescript-eslint@8.48.0: typescript-eslint@8.48.1:
resolution: {integrity: sha512-fcKOvQD9GUn3Xw63EgiDqhvWJ5jsyZUaekl3KVpGsDJnN46WJTe3jWxtQP9lMZm1LJNkFLlTaWAxK2vUQR+cqw==} resolution: {integrity: sha512-FbOKN1fqNoXp1hIl5KYpObVrp0mCn+CLgn479nmu2IsRMrx2vyv74MmsBLVlhg8qVwNFGbXSp8fh1zp8pEoC2A==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
@ -3100,7 +3100,7 @@ snapshots:
dependencies: dependencies:
acorn: 8.15.0 acorn: 8.15.0
'@sveltejs/eslint-config@8.3.3(@stylistic/eslint-plugin-js@1.8.0(eslint@9.9.1))(eslint-config-prettier@9.1.0(eslint@9.9.1))(eslint-plugin-n@17.16.1(eslint@9.9.1)(typescript@5.5.4))(eslint-plugin-svelte@3.11.0(eslint@9.9.1)(svelte@packages+svelte))(eslint@9.9.1)(typescript-eslint@8.48.0(eslint@9.9.1)(typescript@5.5.4))(typescript@5.5.4)': '@sveltejs/eslint-config@8.3.3(@stylistic/eslint-plugin-js@1.8.0(eslint@9.9.1))(eslint-config-prettier@9.1.0(eslint@9.9.1))(eslint-plugin-n@17.16.1(eslint@9.9.1)(typescript@5.5.4))(eslint-plugin-svelte@3.11.0(eslint@9.9.1)(svelte@packages+svelte))(eslint@9.9.1)(typescript-eslint@8.48.1(eslint@9.9.1)(typescript@5.5.4))(typescript@5.5.4)':
dependencies: dependencies:
'@stylistic/eslint-plugin-js': 1.8.0(eslint@9.9.1) '@stylistic/eslint-plugin-js': 1.8.0(eslint@9.9.1)
eslint: 9.9.1 eslint: 9.9.1
@ -3109,7 +3109,7 @@ snapshots:
eslint-plugin-svelte: 3.11.0(eslint@9.9.1)(svelte@packages+svelte) eslint-plugin-svelte: 3.11.0(eslint@9.9.1)(svelte@packages+svelte)
globals: 15.15.0 globals: 15.15.0
typescript: 5.5.4 typescript: 5.5.4
typescript-eslint: 8.48.0(eslint@9.9.1)(typescript@5.5.4) typescript-eslint: 8.48.1(eslint@9.9.1)(typescript@5.5.4)
'@sveltejs/vite-plugin-svelte-inspector@5.0.1(@sveltejs/vite-plugin-svelte@6.2.0(svelte@packages+svelte)(vite@7.1.11(@types/node@24.5.2)(lightningcss@1.23.0)(sass@1.70.0)(terser@5.27.0)))(svelte@packages+svelte)(vite@7.1.11(@types/node@24.5.2)(lightningcss@1.23.0)(sass@1.70.0)(terser@5.27.0))': '@sveltejs/vite-plugin-svelte-inspector@5.0.1(@sveltejs/vite-plugin-svelte@6.2.0(svelte@packages+svelte)(vite@7.1.11(@types/node@24.5.2)(lightningcss@1.23.0)(sass@1.70.0)(terser@5.27.0)))(svelte@packages+svelte)(vite@7.1.11(@types/node@24.5.2)(lightningcss@1.23.0)(sass@1.70.0)(terser@5.27.0))':
dependencies: dependencies:
@ -3164,14 +3164,14 @@ snapshots:
'@types/resolve@1.20.2': {} '@types/resolve@1.20.2': {}
'@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.9.1)(typescript@5.5.4))(eslint@9.9.1)(typescript@5.5.4)': '@typescript-eslint/eslint-plugin@8.48.1(@typescript-eslint/parser@8.48.1(eslint@9.9.1)(typescript@5.5.4))(eslint@9.9.1)(typescript@5.5.4)':
dependencies: dependencies:
'@eslint-community/regexpp': 4.12.2 '@eslint-community/regexpp': 4.12.2
'@typescript-eslint/parser': 8.48.0(eslint@9.9.1)(typescript@5.5.4) '@typescript-eslint/parser': 8.48.1(eslint@9.9.1)(typescript@5.5.4)
'@typescript-eslint/scope-manager': 8.48.0 '@typescript-eslint/scope-manager': 8.48.1
'@typescript-eslint/type-utils': 8.48.0(eslint@9.9.1)(typescript@5.5.4) '@typescript-eslint/type-utils': 8.48.1(eslint@9.9.1)(typescript@5.5.4)
'@typescript-eslint/utils': 8.48.0(eslint@9.9.1)(typescript@5.5.4) '@typescript-eslint/utils': 8.48.1(eslint@9.9.1)(typescript@5.5.4)
'@typescript-eslint/visitor-keys': 8.48.0 '@typescript-eslint/visitor-keys': 8.48.1
eslint: 9.9.1 eslint: 9.9.1
graphemer: 1.4.0 graphemer: 1.4.0
ignore: 7.0.5 ignore: 7.0.5
@ -3181,41 +3181,41 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/parser@8.48.0(eslint@9.9.1)(typescript@5.5.4)': '@typescript-eslint/parser@8.48.1(eslint@9.9.1)(typescript@5.5.4)':
dependencies: dependencies:
'@typescript-eslint/scope-manager': 8.48.0 '@typescript-eslint/scope-manager': 8.48.1
'@typescript-eslint/types': 8.48.0 '@typescript-eslint/types': 8.48.1
'@typescript-eslint/typescript-estree': 8.48.0(typescript@5.5.4) '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.5.4)
'@typescript-eslint/visitor-keys': 8.48.0 '@typescript-eslint/visitor-keys': 8.48.1
debug: 4.4.3 debug: 4.4.3
eslint: 9.9.1 eslint: 9.9.1
typescript: 5.5.4 typescript: 5.5.4
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/project-service@8.48.0(typescript@5.5.4)': '@typescript-eslint/project-service@8.48.1(typescript@5.5.4)':
dependencies: dependencies:
'@typescript-eslint/tsconfig-utils': 8.48.0(typescript@5.5.4) '@typescript-eslint/tsconfig-utils': 8.48.1(typescript@5.5.4)
'@typescript-eslint/types': 8.48.0 '@typescript-eslint/types': 8.48.1
debug: 4.4.3 debug: 4.4.3
typescript: 5.5.4 typescript: 5.5.4
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/scope-manager@8.48.0': '@typescript-eslint/scope-manager@8.48.1':
dependencies: dependencies:
'@typescript-eslint/types': 8.48.0 '@typescript-eslint/types': 8.48.1
'@typescript-eslint/visitor-keys': 8.48.0 '@typescript-eslint/visitor-keys': 8.48.1
'@typescript-eslint/tsconfig-utils@8.48.0(typescript@5.5.4)': '@typescript-eslint/tsconfig-utils@8.48.1(typescript@5.5.4)':
dependencies: dependencies:
typescript: 5.5.4 typescript: 5.5.4
'@typescript-eslint/type-utils@8.48.0(eslint@9.9.1)(typescript@5.5.4)': '@typescript-eslint/type-utils@8.48.1(eslint@9.9.1)(typescript@5.5.4)':
dependencies: dependencies:
'@typescript-eslint/types': 8.48.0 '@typescript-eslint/types': 8.48.1
'@typescript-eslint/typescript-estree': 8.48.0(typescript@5.5.4) '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.5.4)
'@typescript-eslint/utils': 8.48.0(eslint@9.9.1)(typescript@5.5.4) '@typescript-eslint/utils': 8.48.1(eslint@9.9.1)(typescript@5.5.4)
debug: 4.4.3 debug: 4.4.3
eslint: 9.9.1 eslint: 9.9.1
ts-api-utils: 2.1.0(typescript@5.5.4) ts-api-utils: 2.1.0(typescript@5.5.4)
@ -3223,14 +3223,14 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/types@8.48.0': {} '@typescript-eslint/types@8.48.1': {}
'@typescript-eslint/typescript-estree@8.48.0(typescript@5.5.4)': '@typescript-eslint/typescript-estree@8.48.1(typescript@5.5.4)':
dependencies: dependencies:
'@typescript-eslint/project-service': 8.48.0(typescript@5.5.4) '@typescript-eslint/project-service': 8.48.1(typescript@5.5.4)
'@typescript-eslint/tsconfig-utils': 8.48.0(typescript@5.5.4) '@typescript-eslint/tsconfig-utils': 8.48.1(typescript@5.5.4)
'@typescript-eslint/types': 8.48.0 '@typescript-eslint/types': 8.48.1
'@typescript-eslint/visitor-keys': 8.48.0 '@typescript-eslint/visitor-keys': 8.48.1
debug: 4.4.3 debug: 4.4.3
minimatch: 9.0.5 minimatch: 9.0.5
semver: 7.7.3 semver: 7.7.3
@ -3240,20 +3240,20 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/utils@8.48.0(eslint@9.9.1)(typescript@5.5.4)': '@typescript-eslint/utils@8.48.1(eslint@9.9.1)(typescript@5.5.4)':
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.9.0(eslint@9.9.1) '@eslint-community/eslint-utils': 4.9.0(eslint@9.9.1)
'@typescript-eslint/scope-manager': 8.48.0 '@typescript-eslint/scope-manager': 8.48.1
'@typescript-eslint/types': 8.48.0 '@typescript-eslint/types': 8.48.1
'@typescript-eslint/typescript-estree': 8.48.0(typescript@5.5.4) '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.5.4)
eslint: 9.9.1 eslint: 9.9.1
typescript: 5.5.4 typescript: 5.5.4
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/visitor-keys@8.48.0': '@typescript-eslint/visitor-keys@8.48.1':
dependencies: dependencies:
'@typescript-eslint/types': 8.48.0 '@typescript-eslint/types': 8.48.1
eslint-visitor-keys: 4.2.1 eslint-visitor-keys: 4.2.1
'@vitest/coverage-v8@2.1.9(vitest@2.1.9(@types/node@20.19.17)(jsdom@25.0.1)(lightningcss@1.23.0)(sass@1.70.0)(terser@5.27.0))': '@vitest/coverage-v8@2.1.9(vitest@2.1.9(@types/node@20.19.17)(jsdom@25.0.1)(lightningcss@1.23.0)(sass@1.70.0)(terser@5.27.0))':
@ -3620,7 +3620,7 @@ snapshots:
eslint-plugin-n@17.16.1(eslint@9.9.1)(typescript@5.5.4): eslint-plugin-n@17.16.1(eslint@9.9.1)(typescript@5.5.4):
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.9.0(eslint@9.9.1) '@eslint-community/eslint-utils': 4.9.0(eslint@9.9.1)
'@typescript-eslint/utils': 8.48.0(eslint@9.9.1)(typescript@5.5.4) '@typescript-eslint/utils': 8.48.1(eslint@9.9.1)(typescript@5.5.4)
enhanced-resolve: 5.18.3 enhanced-resolve: 5.18.3
eslint: 9.9.1 eslint: 9.9.1
eslint-plugin-es-x: 7.8.0(eslint@9.9.1) eslint-plugin-es-x: 7.8.0(eslint@9.9.1)
@ -3832,7 +3832,7 @@ snapshots:
dependencies: dependencies:
is-glob: 4.0.3 is-glob: 4.0.3
glob@10.4.5: glob@10.5.0:
dependencies: dependencies:
foreground-child: 3.3.0 foreground-child: 3.3.0
jackspeak: 3.4.3 jackspeak: 3.4.3
@ -4501,7 +4501,7 @@ snapshots:
test-exclude@7.0.1: test-exclude@7.0.1:
dependencies: dependencies:
'@istanbuljs/schema': 0.1.3 '@istanbuljs/schema': 0.1.3
glob: 10.4.5 glob: 10.5.0
minimatch: 9.0.5 minimatch: 9.0.5
text-table@0.2.0: {} text-table@0.2.0: {}
@ -4566,12 +4566,12 @@ snapshots:
dependencies: dependencies:
prelude-ls: 1.2.1 prelude-ls: 1.2.1
typescript-eslint@8.48.0(eslint@9.9.1)(typescript@5.5.4): typescript-eslint@8.48.1(eslint@9.9.1)(typescript@5.5.4):
dependencies: dependencies:
'@typescript-eslint/eslint-plugin': 8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.9.1)(typescript@5.5.4))(eslint@9.9.1)(typescript@5.5.4) '@typescript-eslint/eslint-plugin': 8.48.1(@typescript-eslint/parser@8.48.1(eslint@9.9.1)(typescript@5.5.4))(eslint@9.9.1)(typescript@5.5.4)
'@typescript-eslint/parser': 8.48.0(eslint@9.9.1)(typescript@5.5.4) '@typescript-eslint/parser': 8.48.1(eslint@9.9.1)(typescript@5.5.4)
'@typescript-eslint/typescript-estree': 8.48.0(typescript@5.5.4) '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.5.4)
'@typescript-eslint/utils': 8.48.0(eslint@9.9.1)(typescript@5.5.4) '@typescript-eslint/utils': 8.48.1(eslint@9.9.1)(typescript@5.5.4)
eslint: 9.9.1 eslint: 9.9.1
typescript: 5.5.4 typescript: 5.5.4
transitivePeerDependencies: transitivePeerDependencies:

Loading…
Cancel
Save