diff --git a/package-lock.json b/package-lock.json
index 64d4eccc68..a87f367521 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -7027,6 +7027,31 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/svelte": {
+ "version": "5.20.2",
+ "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.20.2.tgz",
+ "integrity": "sha512-aYXJreNUiyTob0QOzRZeBXZMGeFZDch6SrSRV8QTncZb6zj0O3BEdUzPpojuHQ1pTvk+KX7I6rZCXPUf8pTPxA==",
+ "license": "MIT",
+ "dependencies": {
+ "@ampproject/remapping": "^2.3.0",
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@types/estree": "^1.0.5",
+ "acorn": "^8.12.1",
+ "acorn-typescript": "^1.4.13",
+ "aria-query": "^5.3.1",
+ "axobject-query": "^4.1.0",
+ "clsx": "^2.1.1",
+ "esm-env": "^1.2.1",
+ "esrap": "^1.4.3",
+ "is-reference": "^3.0.3",
+ "locate-character": "^3.0.0",
+ "magic-string": "^0.30.11",
+ "zimmerframe": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/to-regex-range": {
"version": "5.0.1",
"dev": true,
@@ -7833,7 +7858,7 @@
"dependencies": {
"playwright": "1.51.0-next",
"playwright-core": "1.51.0-next",
- "vite": "^5.4.14 || ^6.0.0"
+ "vite": "^6.1.0"
},
"engines": {
"node": ">=18"
@@ -7881,7 +7906,7 @@
"playwright": "cli.js"
},
"devDependencies": {
- "svelte": "^5.19.9"
+ "svelte": "^5.20.2"
},
"engines": {
"node": ">=18"
@@ -7921,29 +7946,6 @@
"vite": "^6.0.0"
}
},
- "packages/playwright-ct-svelte/node_modules/svelte": {
- "version": "5.19.9",
- "license": "MIT",
- "dependencies": {
- "@ampproject/remapping": "^2.3.0",
- "@jridgewell/sourcemap-codec": "^1.5.0",
- "@types/estree": "^1.0.5",
- "acorn": "^8.12.1",
- "acorn-typescript": "^1.4.13",
- "aria-query": "^5.3.1",
- "axobject-query": "^4.1.0",
- "clsx": "^2.1.1",
- "esm-env": "^1.2.1",
- "esrap": "^1.4.3",
- "is-reference": "^3.0.3",
- "locate-character": "^3.0.0",
- "magic-string": "^0.30.11",
- "zimmerframe": "^1.1.2"
- },
- "engines": {
- "node": ">=18"
- }
- },
"packages/playwright-ct-svelte/node_modules/vitefu": {
"version": "1.0.5",
"license": "MIT",
diff --git a/packages/playwright-ct-core/package.json b/packages/playwright-ct-core/package.json
index a2702f0658..51474714d5 100644
--- a/packages/playwright-ct-core/package.json
+++ b/packages/playwright-ct-core/package.json
@@ -27,7 +27,7 @@
},
"dependencies": {
"playwright-core": "1.51.0-next",
- "vite": "^5.4.14 || ^6.0.0",
+ "vite": "^6.1.0",
"playwright": "1.51.0-next"
}
}
diff --git a/packages/playwright-ct-svelte/package.json b/packages/playwright-ct-svelte/package.json
index fe19be57ee..1c64ffefed 100644
--- a/packages/playwright-ct-svelte/package.json
+++ b/packages/playwright-ct-svelte/package.json
@@ -34,7 +34,7 @@
"@sveltejs/vite-plugin-svelte": "^5.0.3"
},
"devDependencies": {
- "svelte": "^5.19.9"
+ "svelte": "^5.20.2"
},
"bin": {
"playwright": "cli.js"
diff --git a/tests/components/ct-svelte-vite/package.json b/tests/components/ct-svelte-vite/package.json
index c12bcede60..6093bc6085 100644
--- a/tests/components/ct-svelte-vite/package.json
+++ b/tests/components/ct-svelte-vite/package.json
@@ -14,7 +14,7 @@
"@tsconfig/svelte": "^5.0.2",
"svelte-check": "^3.6.2",
"typescript": "^5.3.3",
- "vite": "^5.2.8"
+ "vite": "^6.1.0"
},
"dependencies": {
"svelte": "^5.19.9"
diff --git a/tests/components/ct-svelte4/.gitignore b/tests/components/ct-svelte4/.gitignore
new file mode 100644
index 0000000000..2347f3ca3b
--- /dev/null
+++ b/tests/components/ct-svelte4/.gitignore
@@ -0,0 +1,5 @@
+/node_modules/
+/public/build/
+/public/tests/
+
+.DS_Store
diff --git a/tests/components/ct-svelte4/README.md b/tests/components/ct-svelte4/README.md
new file mode 100644
index 0000000000..8ca4fcaff9
--- /dev/null
+++ b/tests/components/ct-svelte4/README.md
@@ -0,0 +1,109 @@
+*Psst — looking for a more complete solution? Check out [SvelteKit](https://kit.svelte.dev), the official framework for building web applications of all sizes, with a beautiful development experience and flexible filesystem-based routing.*
+
+*Looking for a shareable component template instead? You can [use SvelteKit for that as well](https://kit.svelte.dev/docs#packaging) or the older [sveltejs/component-template](https://github.com/sveltejs/component-template)*
+
+---
+
+# svelte app
+
+This is a project template for [Svelte](https://svelte.dev) apps. It lives at https://github.com/sveltejs/template.
+
+To create a new project based on this template using [degit](https://github.com/Rich-Harris/degit):
+
+```bash
+npx degit sveltejs/template svelte-app
+cd svelte-app
+```
+
+*Note that you will need to have [Node.js](https://nodejs.org) installed.*
+
+
+## Get started
+
+Install the dependencies...
+
+```bash
+cd svelte-app
+npm install
+```
+
+...then start [Rollup](https://rollupjs.org):
+
+```bash
+npm run dev
+```
+
+Navigate to [localhost:8080](http://localhost:8080). You should see your app running. Edit a component file in `src`, save it, and reload the page to see your changes.
+
+By default, the server will only respond to requests from localhost. To allow connections from other computers, edit the `sirv` commands in package.json to include the option `--host 0.0.0.0`.
+
+If you're using [Visual Studio Code](https://code.visualstudio.com/) we recommend installing the official extension [Svelte for VS Code](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode). If you are using other editors you may need to install a plugin in order to get syntax highlighting and intellisense.
+
+## Building and running in production mode
+
+To create an optimised version of the app:
+
+```bash
+npm run build
+```
+
+You can run the newly built app with `npm run start`. This uses [sirv](https://github.com/lukeed/sirv), which is included in your package.json's `dependencies` so that the app will work when you deploy to platforms like [Heroku](https://heroku.com).
+
+
+## Single-page app mode
+
+By default, sirv will only respond to requests that match files in `public`. This is to maximise compatibility with static fileservers, allowing you to deploy your app anywhere.
+
+If you're building a single-page app (SPA) with multiple routes, sirv needs to be able to respond to requests for *any* path. You can make it so by editing the `"start"` command in package.json:
+
+```js
+"start": "sirv public --single"
+```
+
+## Using TypeScript
+
+This template comes with a script to set up a TypeScript development environment, you can run it immediately after cloning the template with:
+
+```bash
+node scripts/setupTypeScript.js
+```
+
+Or remove the script via:
+
+```bash
+rm scripts/setupTypeScript.js
+```
+
+If you want to use `baseUrl` or `path` aliases within your `tsconfig`, you need to set up `@rollup/plugin-alias` to tell Rollup to resolve the aliases. For more info, see [this StackOverflow question](https://stackoverflow.com/questions/63427935/setup-tsconfig-path-in-svelte).
+
+## Deploying to the web
+
+### With [Vercel](https://vercel.com)
+
+Install `vercel` if you haven't already:
+
+```bash
+npm install -g vercel
+```
+
+Then, from within your project folder:
+
+```bash
+cd public
+vercel deploy --name my-project
+```
+
+### With [surge](https://surge.sh/)
+
+Install `surge` if you haven't already:
+
+```bash
+npm install -g surge
+```
+
+Then, from within your project folder:
+
+```bash
+npm run build
+surge public my-project.surge.sh
+```
diff --git a/tests/components/ct-svelte4/package.json b/tests/components/ct-svelte4/package.json
new file mode 100644
index 0000000000..90ac777a15
--- /dev/null
+++ b/tests/components/ct-svelte4/package.json
@@ -0,0 +1,24 @@
+{
+ "name": "ct-svelte",
+ "version": "1.0.0",
+ "private": true,
+ "scripts": {
+ "build": "rollup -c",
+ "dev": "rollup -c -w",
+ "start": "sirv public --no-clear",
+ "typecheck": "tsc --noEmit"
+ },
+ "devDependencies": {
+ "@rollup/plugin-commonjs": "^17.0.0",
+ "@rollup/plugin-node-resolve": "^11.0.0",
+ "rollup": "^2.3.4",
+ "rollup-plugin-css-only": "^3.1.0",
+ "rollup-plugin-livereload": "^2.0.0",
+ "rollup-plugin-svelte": "^7.0.0",
+ "rollup-plugin-terser": "^7.0.0",
+ "sirv-cli": "^2.0.0"
+ },
+ "dependencies": {
+ "svelte": "^5.19.9"
+ }
+}
diff --git a/tests/components/ct-svelte4/playwright.config.ts b/tests/components/ct-svelte4/playwright.config.ts
new file mode 100644
index 0000000000..e26caad736
--- /dev/null
+++ b/tests/components/ct-svelte4/playwright.config.ts
@@ -0,0 +1,49 @@
+/**
+ * Copyright (c) Microsoft Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { defineConfig, devices } from '@playwright/experimental-ct-svelte';
+import { resolve } from 'path';
+
+export default defineConfig({
+ testDir: 'tests',
+ forbidOnly: !!process.env.CI,
+ retries: process.env.CI ? 2 : 0,
+ reporter: process.env.CI ? 'html' : 'line',
+ use: {
+ trace: 'on-first-retry',
+ ctViteConfig: {
+ resolve: {
+ alias: {
+ '@': resolve(__dirname, './src'),
+ }
+ }
+ }
+ },
+ projects: [
+ {
+ name: 'chromium',
+ use: { ...devices['Desktop Chrome'] },
+ },
+ {
+ name: 'firefox',
+ use: { ...devices['Desktop Firefox'] },
+ },
+ {
+ name: 'webkit',
+ use: { ...devices['Desktop Safari'] },
+ },
+ ],
+});
diff --git a/tests/components/ct-svelte4/playwright/index.html b/tests/components/ct-svelte4/playwright/index.html
new file mode 100644
index 0000000000..43136a165e
--- /dev/null
+++ b/tests/components/ct-svelte4/playwright/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Svelte Test
+
+
+
+
+
+
diff --git a/tests/components/ct-svelte4/playwright/index.ts b/tests/components/ct-svelte4/playwright/index.ts
new file mode 100644
index 0000000000..fe89c98e10
--- /dev/null
+++ b/tests/components/ct-svelte4/playwright/index.ts
@@ -0,0 +1,15 @@
+// @ts-check
+import '../src/assets/index.css';
+import { beforeMount, afterMount } from '@playwright/experimental-ct-svelte/hooks';
+
+export type HooksConfig = {
+ route: string;
+}
+
+beforeMount(async ({ hooksConfig }) => {
+ console.log(`Before mount: ${JSON.stringify(hooksConfig)}`);
+});
+
+afterMount(async () => {
+ console.log(`After mount`);
+});
diff --git a/tests/components/ct-svelte4/public/favicon.png b/tests/components/ct-svelte4/public/favicon.png
new file mode 100644
index 0000000000..7e6f5eb5a2
Binary files /dev/null and b/tests/components/ct-svelte4/public/favicon.png differ
diff --git a/tests/components/ct-svelte4/public/index.html b/tests/components/ct-svelte4/public/index.html
new file mode 100644
index 0000000000..74558940d0
--- /dev/null
+++ b/tests/components/ct-svelte4/public/index.html
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+ Svelte app
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/components/ct-svelte4/rollup.config.js b/tests/components/ct-svelte4/rollup.config.js
new file mode 100644
index 0000000000..10b425f1fb
--- /dev/null
+++ b/tests/components/ct-svelte4/rollup.config.js
@@ -0,0 +1,121 @@
+import svelte from 'rollup-plugin-svelte';
+import commonjs from '@rollup/plugin-commonjs';
+import resolve from '@rollup/plugin-node-resolve';
+import livereload from 'rollup-plugin-livereload';
+import { terser } from 'rollup-plugin-terser';
+import css from 'rollup-plugin-css-only';
+
+const production = !process.env.ROLLUP_WATCH;
+
+function serve() {
+ let server;
+
+ function toExit() {
+ if (server) server.kill(0);
+ }
+
+ return {
+ writeBundle() {
+ if (server) return;
+ server = require('child_process').spawn('npm', ['run', 'start', '--', '--dev'], {
+ stdio: ['ignore', 'inherit', 'inherit'],
+ shell: true
+ });
+
+ process.on('SIGTERM', toExit);
+ process.on('exit', toExit);
+ }
+ };
+}
+
+const prod = {
+ input: 'src/main.js',
+ output: {
+ sourcemap: true,
+ format: 'iife',
+ name: 'app',
+ file: 'public/build/bundle.js'
+ },
+ plugins: [
+ svelte({
+ compilerOptions: {
+ // enable run-time checks when not in production
+ dev: !production
+ }
+ }),
+ // we'll extract any component CSS out into
+ // a separate file - better for performance
+ css({ output: 'bundle.css' }),
+
+ // If you have external dependencies installed from
+ // npm, you'll most likely need these plugins. In
+ // some cases you'll need additional configuration -
+ // consult the documentation for details:
+ // https://github.com/rollup/plugins/tree/master/packages/commonjs
+ resolve({
+ browser: true,
+ dedupe: ['svelte']
+ }),
+ commonjs(),
+
+ // In dev mode, call `npm run start` once
+ // the bundle has been generated
+ !production && serve(),
+
+ // Watch the `public` directory and refresh the
+ // browser on changes when not in production
+ !production && livereload('public'),
+
+ // If we're building for production (npm run build
+ // instead of npm run dev), minify
+ production && terser()
+ ],
+ watch: {
+ clearScreen: false
+ }
+};
+
+const test = {
+ input: 'src/tests.js',
+ output: {
+ sourcemap: true,
+ format: 'iife',
+ name: 'app',
+ file: 'public/tests/bundle.js'
+ },
+ plugins: [
+ svelte({
+ compilerOptions: {
+ // enable run-time checks when not in production
+ dev: !production
+ }
+ }),
+ // we'll extract any component CSS out into
+ // a separate file - better for performance
+ css({ output: 'bundle.css' }),
+
+ // If you have external dependencies installed from
+ // npm, you'll most likely need these plugins. In
+ // some cases you'll need additional configuration -
+ // consult the documentation for details:
+ // https://github.com/rollup/plugins/tree/master/packages/commonjs
+ resolve({
+ browser: true,
+ dedupe: ['svelte']
+ }),
+ commonjs(),
+
+ // Watch the `public` directory and refresh the
+ // browser on changes when not in production
+ !production && livereload('public'),
+
+ // If we're building for production (npm run build
+ // instead of npm run dev), minify
+ production && terser()
+ ],
+ watch: {
+ clearScreen: false
+ },
+};
+
+export default [ prod, test ];
diff --git a/tests/components/ct-svelte4/scripts/setupTypeScript.js b/tests/components/ct-svelte4/scripts/setupTypeScript.js
new file mode 100644
index 0000000000..e6184aa223
--- /dev/null
+++ b/tests/components/ct-svelte4/scripts/setupTypeScript.js
@@ -0,0 +1,121 @@
+// @ts-check
+
+/** This script modifies the project to support TS code in .svelte files like:
+
+
+
+ As well as validating the code for CI.
+ */
+
+/** To work on this script:
+ rm -rf test-template template && git clone sveltejs/template test-template && node scripts/setupTypeScript.js test-template
+*/
+
+const fs = require("fs")
+const path = require("path")
+const { argv } = require("process")
+
+const projectRoot = argv[2] || path.join(__dirname, "..")
+
+// Add deps to pkg.json
+const packageJSON = JSON.parse(fs.readFileSync(path.join(projectRoot, "package.json"), "utf8"))
+packageJSON.devDependencies = Object.assign(packageJSON.devDependencies, {
+ "svelte-check": "^2.0.0",
+ "svelte-preprocess": "^4.0.0",
+ "@rollup/plugin-typescript": "^8.0.0",
+ "typescript": "^4.0.0",
+ "tslib": "^2.0.0",
+ "@tsconfig/svelte": "^2.0.0"
+})
+
+// Add script for checking
+packageJSON.scripts = Object.assign(packageJSON.scripts, {
+ "check": "svelte-check --tsconfig ./tsconfig.json"
+})
+
+// Write the package JSON
+fs.writeFileSync(path.join(projectRoot, "package.json"), JSON.stringify(packageJSON, null, " "))
+
+// mv src/main.js to main.ts - note, we need to edit rollup.config.js for this too
+const beforeMainJSPath = path.join(projectRoot, "src", "main.js")
+const afterMainTSPath = path.join(projectRoot, "src", "main.ts")
+fs.renameSync(beforeMainJSPath, afterMainTSPath)
+
+// Switch the app.svelte file to use TS
+const appSveltePath = path.join(projectRoot, "src", "App.svelte")
+let appFile = fs.readFileSync(appSveltePath, "utf8")
+appFile = appFile.replace("
+
+
+ { e.preventDefault(); navigate('/'); }} href='/login'>Login
+ { e.preventDefault(); navigate('/dashboard'); }} href='/dashboard'>Dashboard
+
+{#if path === '/'}
+
+{:else if path === '/dashboard'}
+
+{/if}
diff --git a/tests/components/ct-svelte4/src/assets/index.css b/tests/components/ct-svelte4/src/assets/index.css
new file mode 100644
index 0000000000..97495c44b8
--- /dev/null
+++ b/tests/components/ct-svelte4/src/assets/index.css
@@ -0,0 +1,20 @@
+body {
+ margin: 0;
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
+ 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
+ sans-serif;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+code {
+ font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
+ monospace;
+}
+
+@media (prefers-color-scheme: light) {
+ :root {
+ color: #e3e3e3;
+ background-color: #1b1b1d;
+ }
+}
diff --git a/tests/components/ct-svelte4/src/components/Button.svelte b/tests/components/ct-svelte4/src/components/Button.svelte
new file mode 100644
index 0000000000..8c46efd1f2
--- /dev/null
+++ b/tests/components/ct-svelte4/src/components/Button.svelte
@@ -0,0 +1,7 @@
+
+
+
diff --git a/tests/components/ct-svelte4/src/components/Component.svelte b/tests/components/ct-svelte4/src/components/Component.svelte
new file mode 100644
index 0000000000..179f993315
--- /dev/null
+++ b/tests/components/ct-svelte4/src/components/Component.svelte
@@ -0,0 +1 @@
+
test
diff --git a/tests/components/ct-svelte4/src/components/Counter.svelte b/tests/components/ct-svelte4/src/components/Counter.svelte
new file mode 100644
index 0000000000..38674bb6c3
--- /dev/null
+++ b/tests/components/ct-svelte4/src/components/Counter.svelte
@@ -0,0 +1,14 @@
+
+
+
diff --git a/tests/components/ct-svelte4/src/components/DefaultSlot.svelte b/tests/components/ct-svelte4/src/components/DefaultSlot.svelte
new file mode 100644
index 0000000000..201dda6ce3
--- /dev/null
+++ b/tests/components/ct-svelte4/src/components/DefaultSlot.svelte
@@ -0,0 +1,9 @@
+
+
Welcome!
+
+
+
+
+
diff --git a/tests/components/ct-svelte4/src/components/Empty.svelte b/tests/components/ct-svelte4/src/components/Empty.svelte
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/tests/components/ct-svelte4/src/components/MultiRoot.svelte b/tests/components/ct-svelte4/src/components/MultiRoot.svelte
new file mode 100644
index 0000000000..87996d0ce0
--- /dev/null
+++ b/tests/components/ct-svelte4/src/components/MultiRoot.svelte
@@ -0,0 +1,2 @@
+
root 1
+
root 2
diff --git a/tests/components/ct-svelte4/src/components/NamedSlots.svelte b/tests/components/ct-svelte4/src/components/NamedSlots.svelte
new file mode 100644
index 0000000000..5f0d988af5
--- /dev/null
+++ b/tests/components/ct-svelte4/src/components/NamedSlots.svelte
@@ -0,0 +1,11 @@
+