diff --git a/.changeset/four-loops-agree.md b/.changeset/four-loops-agree.md
new file mode 100644
index 0000000000..46d30e8464
--- /dev/null
+++ b/.changeset/four-loops-agree.md
@@ -0,0 +1,5 @@
+---
+'svelte': minor
+---
+
+feat: allow declarations in the template
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 4f72b6c23e..7eff1b9fe7 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -80,7 +80,7 @@ jobs:
Lint:
permissions: {}
runs-on: ubuntu-latest
- timeout-minutes: 5
+ timeout-minutes: 10
steps:
- uses: actions/checkout@v6
- uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v4
@@ -99,7 +99,7 @@ jobs:
if: (${{ success() }} || ${{ failure() }}) # ensures this step runs even if previous steps fail
run: pnpm build && { [ "`git status --porcelain=v1`" == "" ] || (echo "Generated types have changed — please regenerate types locally with `cd packages/svelte && pnpm generate:types` and commit the changes after you have reviewed them"; git diff; exit 1); }
- name: check browser-support docs page is up to date
- run: '{ [ "`git status --porcelain=v1 documentation/docs/07-misc/05-browser-support.md`" == "" ] || (echo "The browser-support docs page is out of date — please regenerate it locally with \`cd packages/svelte && pnpm generate:browser-support\` and commit the changes"; git diff documentation/docs/07-misc/05-browser-support.md; exit 1); }'
+ run: '{ [ "`git status --porcelain=v1 documentation/docs/07-misc/.generated/`" == "" ] || (echo "The browser-support docs page is out of date — please regenerate it locally with \`cd packages/svelte && pnpm generate:browser-support\` and commit the changes"; git diff documentation/docs/07-misc/.generated/; exit 1); }'
Benchmarks:
permissions: {}
runs-on: ubuntu-latest
diff --git a/AGENTS.md b/AGENTS.md
index c6cd3ea310..7f143248aa 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -4,6 +4,8 @@ This guide is for AI coding agents working in the Svelte monorepo.
**Important:** Read and follow [`CONTRIBUTING.md`](./CONTRIBUTING.md) as well - it contains essential information about testing, code structure, and contribution guidelines that applies here.
+When submitting a PR, you **MUST** read [`PULL_REQUEST_TEMPLATE.md`](./.github/PULL_REQUEST_TEMPLATE.md) and fill it out correctly. **DO NOT** submit a PR without running the full test suite.
+
## Quick Reference
If asked to do a performance investigation, use the `performance-investigation` skill.
diff --git a/documentation/docs/03-template-syntax/10-@const.md b/documentation/docs/03-template-syntax/10-@const.md
index 2a587b7a3d..6f2edc1a37 100644
--- a/documentation/docs/03-template-syntax/10-@const.md
+++ b/documentation/docs/03-template-syntax/10-@const.md
@@ -2,6 +2,8 @@
title: {@const ...}
---
+> [!NOTE] `{@const x = y}` is legacy syntax — use [`{const x = $derived(y)}`](declaration-tags) instead
+
The `{@const ...}` tag defines a local constant.
```svelte
diff --git a/documentation/docs/03-template-syntax/11-declaration-tags.md b/documentation/docs/03-template-syntax/11-declaration-tags.md
new file mode 100644
index 0000000000..34b7164775
--- /dev/null
+++ b/documentation/docs/03-template-syntax/11-declaration-tags.md
@@ -0,0 +1,70 @@
+---
+title: {let/const ...}
+---
+
+Declaration tags define local variables inside markup with `const` or `let`:
+
+
+```svelte
+
+
+
+{#each boxes as box}
+ {const area = box.width * box.height}
+ {const label = `${box.width} ⨉ ${box.height} = ${area}`}
+
+
{label}
+{/each}
+```
+
+
+> [!NOTE] The [`{@const ...}`](@const) syntax is considered legacy — use declaration tags instead.
+
+When values should be reactive, you can use `$state` and `$derived`:
+
+
+```svelte
+
+
+
+Hello {user.name}
+ editing = true}>edit name
+
+{#if editing}
+ {let name = $state(user.name)}
+ {const greeting = $derived(`Hello ${name}`)}
+
+
+
+ {greeting}
+
+ {
+ user.name = name;
+ editing = false;
+ }}>save
+{/if}
+```
+
+
+Declaration tags can be used anywhere inside the component. They can reference values declared outside themselves (for example in the `
+
+
+ {const sync = 'sync'}
+ {const number = await Promise.resolve(5)}
+ {const after_async =number + 1}
+ {const { length, 0: first } = await '01234'}
+
+ {#snippet greet()}
+ {const greeting = $derived(await `Hello, ${name}!`)}
+ {greeting}
+ {number}
+ {#if number > 4 && after_async && greeting}
+ {const length = $derived(await number)}
+ {#each { length }, index}
+ {const i = $derived(await index)}
+ {i}
+ {/each}
+ {/if}
+ {/snippet}
+
+ {@render greet()}
+ {number} {sync} {after_async} {length} {first}
+
+ {#if sync}
+ {const double = $derived(number * 2)}
+ {double}
+ {/if}
+
diff --git a/packages/svelte/tests/runtime-runes/samples/async-declaration-tag/_config.js b/packages/svelte/tests/runtime-runes/samples/async-declaration-tag/_config.js
new file mode 100644
index 0000000000..8fd2fc0976
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/async-declaration-tag/_config.js
@@ -0,0 +1,43 @@
+import { tick } from 'svelte';
+import { test } from '../../test';
+
+export default test({
+ async test({ assert, target }) {
+ await tick();
+ const [top, change] = target.querySelectorAll('button');
+
+ assert.htmlEqual(
+ target.innerHTML,
+ `
+ name
+ change name
+ Hello name
+ nested Hi name
+ `
+ );
+
+ top.click();
+ await tick();
+ assert.htmlEqual(
+ target.innerHTML,
+ `
+ other
+ change name
+ Hello name
+ nested Hi name
+ `
+ );
+
+ change.click();
+ await tick();
+ assert.htmlEqual(
+ target.innerHTML,
+ `
+ other
+ change name
+ Hello other
+ nested Hi other
+ `
+ );
+ }
+});
diff --git a/packages/svelte/tests/runtime-runes/samples/async-declaration-tag/main.svelte b/packages/svelte/tests/runtime-runes/samples/async-declaration-tag/main.svelte
new file mode 100644
index 0000000000..4521ea2e41
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/async-declaration-tag/main.svelte
@@ -0,0 +1,20 @@
+
+
+{let name = $state(top_id)}
+ name = 'other'}>{name}
+
+{#if id}
+ {let name = $state(await id)}
+ {let greeting = $derived(await `Hello ${name}`)}
+
+ name = 'other'}>change name
+ {greeting}
+
+ {const nested = 'nested'}
+ {const greeting2 = $derived(await `Hi ${name}`)}
+ {nested} {greeting2}
+
+{/if}
diff --git a/packages/svelte/tests/runtime-runes/samples/declaration-tags-no-script/_config.js b/packages/svelte/tests/runtime-runes/samples/declaration-tags-no-script/_config.js
new file mode 100644
index 0000000000..901df42df7
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/declaration-tags-no-script/_config.js
@@ -0,0 +1,13 @@
+import { tick } from 'svelte';
+import { test } from '../../test';
+
+export default test({
+ html: '0 | 0 ',
+ async test({ assert, target }) {
+ const [increment] = target.querySelectorAll('button');
+
+ increment.click();
+ await tick();
+ assert.htmlEqual(target.innerHTML, '1 | 2 ');
+ }
+});
diff --git a/packages/svelte/tests/runtime-runes/samples/declaration-tags-no-script/main.svelte b/packages/svelte/tests/runtime-runes/samples/declaration-tags-no-script/main.svelte
new file mode 100644
index 0000000000..da72bc69c6
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/declaration-tags-no-script/main.svelte
@@ -0,0 +1,3 @@
+{let count = $state(0)}
+{let doubled = $derived(count * 2)}
+ (count += 1)}>{count} | {doubled}
diff --git a/packages/svelte/tests/runtime-runes/samples/declaration-tags/_config.js b/packages/svelte/tests/runtime-runes/samples/declaration-tags/_config.js
new file mode 100644
index 0000000000..54e390ec83
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/declaration-tags/_config.js
@@ -0,0 +1,37 @@
+import { tick } from 'svelte';
+import { test } from '../../test';
+
+export default test({
+ html: `top 2 toggle 2 4 total
nested
nested
`,
+ async test({ assert, target }) {
+ const [top, toggle, increment] = target.querySelectorAll('button');
+
+ top.click();
+ await tick();
+ assert.htmlEqual(
+ target.innerHTML,
+ `top 4 toggle 2 4 total
nested
nested
`
+ );
+
+ increment.click();
+ await tick();
+ assert.htmlEqual(
+ target.innerHTML,
+ `top 4 toggle 3 6 total
nested
nested
`
+ );
+
+ toggle.click();
+ await tick();
+ assert.htmlEqual(
+ target.innerHTML,
+ `top 4 toggle nested
`
+ );
+
+ toggle.click();
+ await tick();
+ assert.htmlEqual(
+ target.innerHTML,
+ `top 4 toggle 2 4 total
nested
nested
`
+ );
+ }
+});
diff --git a/packages/svelte/tests/runtime-runes/samples/declaration-tags/main.svelte b/packages/svelte/tests/runtime-runes/samples/declaration-tags/main.svelte
new file mode 100644
index 0000000000..5953104092
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/declaration-tags/main.svelte
@@ -0,0 +1,29 @@
+
+
+{let top = $state(1)}
+{let top_doubled = $derived(top * 2)}
+
+ (top += 1)}>top {top_doubled}
+ (visible = !visible)}>toggle
+
+{#if visible}
+ {let counter = $state({ value: initial })}
+ {let doubled = $derived(counter.value * 2)}
+ {const suffix = ' total'}
+ {const format = (value) => `${value}${suffix}`}
+
+ (counter.value += 1)}>{counter.value}
+ {format(doubled)}
+
+ {const doubled = 'nested'}
+ {doubled}
+
+{/if}
+
+
+ {const nested = 'nested'}
+ {nested}
+
diff --git a/packages/svelte/tests/validator/samples/declaration-tag-invalid-function/errors.json b/packages/svelte/tests/validator/samples/declaration-tag-invalid-function/errors.json
new file mode 100644
index 0000000000..bf0266225f
--- /dev/null
+++ b/packages/svelte/tests/validator/samples/declaration-tag-invalid-function/errors.json
@@ -0,0 +1,14 @@
+[
+ {
+ "code": "declaration_tag_invalid_type",
+ "message": "Declaration tags must be `let` or `const` declarations",
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 2,
+ "column": 10
+ }
+ }
+]
diff --git a/packages/svelte/tests/validator/samples/declaration-tag-invalid-function/input.svelte b/packages/svelte/tests/validator/samples/declaration-tag-invalid-function/input.svelte
new file mode 100644
index 0000000000..8cfdf59c0f
--- /dev/null
+++ b/packages/svelte/tests/validator/samples/declaration-tag-invalid-function/input.svelte
@@ -0,0 +1,3 @@
+{#if true}
+ {function foo() {}}
+{/if}
diff --git a/packages/svelte/tests/validator/samples/declaration-tag-invalid-type/errors.json b/packages/svelte/tests/validator/samples/declaration-tag-invalid-type/errors.json
new file mode 100644
index 0000000000..2a9b3c0140
--- /dev/null
+++ b/packages/svelte/tests/validator/samples/declaration-tag-invalid-type/errors.json
@@ -0,0 +1,14 @@
+[
+ {
+ "code": "declaration_tag_invalid_type",
+ "message": "Declaration tags must be `let` or `const` declarations",
+ "start": {
+ "line": 2,
+ "column": 2
+ },
+ "end": {
+ "line": 2,
+ "column": 5
+ }
+ }
+]
diff --git a/packages/svelte/tests/validator/samples/declaration-tag-invalid-type/input.svelte b/packages/svelte/tests/validator/samples/declaration-tag-invalid-type/input.svelte
new file mode 100644
index 0000000000..eb9fcd5e75
--- /dev/null
+++ b/packages/svelte/tests/validator/samples/declaration-tag-invalid-type/input.svelte
@@ -0,0 +1,3 @@
+{#if true}
+ {var foo = 1}
+{/if}
diff --git a/packages/svelte/tests/validator/samples/declaration-tag-legacy-mode/errors.json b/packages/svelte/tests/validator/samples/declaration-tag-legacy-mode/errors.json
new file mode 100644
index 0000000000..6b89f2eab8
--- /dev/null
+++ b/packages/svelte/tests/validator/samples/declaration-tag-legacy-mode/errors.json
@@ -0,0 +1,14 @@
+[
+ {
+ "code": "declaration_tag_no_legacy_mode",
+ "message": "Declaration tags cannot be used in legacy mode",
+ "start": {
+ "line": 5,
+ "column": 0
+ },
+ "end": {
+ "line": 5,
+ "column": 19
+ }
+ }
+]
diff --git a/packages/svelte/tests/validator/samples/declaration-tag-legacy-mode/input.svelte b/packages/svelte/tests/validator/samples/declaration-tag-legacy-mode/input.svelte
new file mode 100644
index 0000000000..026d4eff1e
--- /dev/null
+++ b/packages/svelte/tests/validator/samples/declaration-tag-legacy-mode/input.svelte
@@ -0,0 +1,5 @@
+
+
+{const foo = 'foo'}
diff --git a/packages/svelte/tests/validator/samples/declaration-tag-maybe-runes/errors.json b/packages/svelte/tests/validator/samples/declaration-tag-maybe-runes/errors.json
new file mode 100644
index 0000000000..fe51488c70
--- /dev/null
+++ b/packages/svelte/tests/validator/samples/declaration-tag-maybe-runes/errors.json
@@ -0,0 +1 @@
+[]
diff --git a/packages/svelte/tests/validator/samples/declaration-tag-maybe-runes/input.svelte b/packages/svelte/tests/validator/samples/declaration-tag-maybe-runes/input.svelte
new file mode 100644
index 0000000000..081f242a81
--- /dev/null
+++ b/packages/svelte/tests/validator/samples/declaration-tag-maybe-runes/input.svelte
@@ -0,0 +1,6 @@
+
+
+Usage when no explicit runes/legacy mode should be ok
+{const foo = world}
diff --git a/packages/svelte/types/index.d.ts b/packages/svelte/types/index.d.ts
index e2bffab6a7..e707ea9ca3 100644
--- a/packages/svelte/types/index.d.ts
+++ b/packages/svelte/types/index.d.ts
@@ -1345,6 +1345,12 @@ declare module 'svelte/compiler' {
};
}
+ /** A `{let ...}` or `{const ...}` tag */
+ export interface DeclarationTag extends BaseNode {
+ type: 'DeclarationTag';
+ declaration: VariableDeclaration;
+ }
+
/** A `{@debug ...}` tag */
export interface DebugTag extends BaseNode {
type: 'DebugTag';
@@ -1655,6 +1661,7 @@ declare module 'svelte/compiler' {
export type Tag =
| AST.AttachTag
| AST.ConstTag
+ | AST.DeclarationTag
| AST.DebugTag
| AST.ExpressionTag
| AST.HtmlTag
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 4c077f0f6b..767af0515a 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -42,8 +42,8 @@ importers:
specifier: 25.0.1
version: 25.0.1
playwright:
- specifier: ^1.58.0
- version: 1.58.0
+ specifier: ^1.60.0
+ version: 1.60.0
prettier:
specifier: ^3.2.4
version: 3.2.4
@@ -121,8 +121,8 @@ importers:
specifier: ^0.3.25
version: 0.3.31
'@playwright/test':
- specifier: ^1.58.0
- version: 1.58.0
+ specifier: ^1.60.0
+ version: 1.60.0
'@rollup/plugin-commonjs':
specifier: ^28.0.1
version: 28.0.1(rollup@4.60.1)
@@ -864,8 +864,8 @@ packages:
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'}
- '@playwright/test@1.58.0':
- resolution: {integrity: sha512-fWza+Lpbj6SkQKCrU6si4iu+fD2dD3gxNHFhUPxsfXBPhnv3rRSQVd0NtBUT9Z/RhF/boCBcuUaMUSTRTopjZg==}
+ '@playwright/test@1.60.0':
+ resolution: {integrity: sha512-O71yZIbAh/PxDMNGns37GHBIfrVkEVyn+AXyIa5dOTfb4/xNvRWV+Vv/NMbNCtODB/pO7vLlF2OTmMVLhmr7Ag==}
engines: {node: '>=18'}
hasBin: true
@@ -1096,6 +1096,9 @@ packages:
'@types/estree@1.0.8':
resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
+ '@types/estree@1.0.9':
+ resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==}
+
'@types/json-schema@7.0.15':
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
@@ -1459,8 +1462,8 @@ packages:
emoji-regex@9.2.2:
resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
- enhanced-resolve@5.20.1:
- resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==}
+ enhanced-resolve@5.22.1:
+ resolution: {integrity: sha512-6QEuw3zoX1SJQc7b87aBXke/no+mG2bTBgw29gWMQonLmpEkWoCAVkl+M49e48AZlWzxiDzDZzYdp6kobcyLww==}
engines: {node: '>=10.13.0'}
enquirer@2.4.1:
@@ -1699,8 +1702,8 @@ packages:
function-bind@1.1.2:
resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
- get-tsconfig@4.13.7:
- resolution: {integrity: sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==}
+ get-tsconfig@4.14.0:
+ resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==}
glob-parent@5.1.2:
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
@@ -2162,13 +2165,13 @@ packages:
resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
engines: {node: '>=6'}
- playwright-core@1.58.0:
- resolution: {integrity: sha512-aaoB1RWrdNi3//rOeKuMiS65UCcgOVljU46At6eFcOFPFHWtd2weHRRow6z/n+Lec0Lvu0k9ZPKJSjPugikirw==}
+ playwright-core@1.60.0:
+ resolution: {integrity: sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA==}
engines: {node: '>=18'}
hasBin: true
- playwright@1.58.0:
- resolution: {integrity: sha512-2SVA0sbPktiIY/MCOPX8e86ehA/e+tDNq+e5Y8qjKYti2Z/JG7xnronT/TXTIkKbYGWlCbuucZ6dziEgkoEjQQ==}
+ playwright@1.60.0:
+ resolution: {integrity: sha512-hheHdokM8cdqCb0lcE3s+zT4t4W+vvjpGxsZlDnikarzx8tSzMebh3UiFtgqwFwnTnjYQcsyMF8ei2mCO/tpeA==}
engines: {node: '>=18'}
hasBin: true
@@ -2307,6 +2310,11 @@ packages:
engines: {node: '>=10'}
hasBin: true
+ semver@7.8.1:
+ resolution: {integrity: sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==}
+ engines: {node: '>=10'}
+ hasBin: true
+
serialize-javascript@6.0.2:
resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==}
@@ -2403,8 +2411,8 @@ packages:
symbol-tree@3.2.4:
resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
- tapable@2.3.2:
- resolution: {integrity: sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==}
+ tapable@2.3.3:
+ resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==}
engines: {node: '>=6'}
term-size@2.2.1:
@@ -3283,9 +3291,9 @@ snapshots:
'@pkgjs/parseargs@0.11.0':
optional: true
- '@playwright/test@1.58.0':
+ '@playwright/test@1.60.0':
dependencies:
- playwright: 1.58.0
+ playwright: 1.60.0
'@polka/url@1.0.0-next.25': {}
@@ -3463,13 +3471,15 @@ snapshots:
'@types/eslint@8.56.12':
dependencies:
- '@types/estree': 1.0.8
+ '@types/estree': 1.0.9
'@types/json-schema': 7.0.15
'@types/esrecurse@4.3.1': {}
'@types/estree@1.0.8': {}
+ '@types/estree@1.0.9': {}
+
'@types/json-schema@7.0.15': {}
'@types/node@12.20.55': {}
@@ -3840,10 +3850,10 @@ snapshots:
emoji-regex@9.2.2: {}
- enhanced-resolve@5.20.1:
+ enhanced-resolve@5.22.1:
dependencies:
graceful-fs: 4.2.11
- tapable: 2.3.2
+ tapable: 2.3.3
enquirer@2.4.1:
dependencies:
@@ -3945,7 +3955,7 @@ snapshots:
eslint-compat-utils@0.5.1(eslint@10.0.0):
dependencies:
eslint: 10.0.0
- semver: 7.7.4
+ semver: 7.8.1
eslint-config-prettier@9.1.0(eslint@10.0.0):
dependencies:
@@ -3965,14 +3975,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.20.1
+ enhanced-resolve: 5.22.1
eslint: 10.0.0
eslint-plugin-es-x: 7.8.0(eslint@10.0.0)
- get-tsconfig: 4.13.7
+ get-tsconfig: 4.14.0
globals: 15.15.0
globrex: 0.1.2
ignore: 5.3.2
- semver: 7.7.4
+ semver: 7.8.1
ts-declaration-location: 1.0.7(typescript@5.5.4)
transitivePeerDependencies:
- typescript
@@ -4176,7 +4186,7 @@ snapshots:
function-bind@1.1.2: {}
- get-tsconfig@4.13.7:
+ get-tsconfig@4.14.0:
dependencies:
resolve-pkg-maps: 1.0.0
@@ -4596,11 +4606,11 @@ snapshots:
pify@4.0.1: {}
- playwright-core@1.58.0: {}
+ playwright-core@1.60.0: {}
- playwright@1.58.0:
+ playwright@1.60.0:
dependencies:
- playwright-core: 1.58.0
+ playwright-core: 1.60.0
optionalDependencies:
fsevents: 2.3.2
@@ -4742,6 +4752,8 @@ snapshots:
semver@7.7.4: {}
+ semver@7.8.1: {}
+
serialize-javascript@6.0.2:
dependencies:
randombytes: 2.1.0
@@ -4829,7 +4841,7 @@ snapshots:
symbol-tree@3.2.4: {}
- tapable@2.3.2: {}
+ tapable@2.3.3: {}
term-size@2.2.1: {}