diff --git a/eslint.config.js b/eslint.config.js
index 0e0e0bc729..04d9294394 100644
--- a/eslint.config.js
+++ b/eslint.config.js
@@ -102,6 +102,7 @@ export default [
'playgrounds/sandbox/**',
// exclude top level config files
'*.config.js',
+ 'vitest-xhtml-environment.ts',
// documentation can contain invalid examples
'documentation',
'tmp/**'
diff --git a/packages/svelte/tests/html_equal.js b/packages/svelte/tests/html_equal.js
index 76a4a957a5..cdb8f52e37 100644
--- a/packages/svelte/tests/html_equal.js
+++ b/packages/svelte/tests/html_equal.js
@@ -9,7 +9,9 @@ function clean_children(node, opts) {
let previous = null;
let has_element_children = false;
let template =
- node.nodeName === 'TEMPLATE' ? /** @type {HTMLTemplateElement} */ (node) : undefined;
+ node.nodeName.toUpperCase() === 'TEMPLATE'
+ ? /** @type {HTMLTemplateElement} */ (node)
+ : undefined;
if (template) {
const div = document.createElement('div');
@@ -23,22 +25,20 @@ function clean_children(node, opts) {
});
attributes.forEach((attr) => {
- node.removeAttribute(attr.name);
+ if (attr.name !== 'xmlns') node.removeAttribute(attr.name);
});
- attributes.forEach((attr) => {
+ attributes.forEach(({ name, value }) => {
// Strip out the special onload/onerror hydration events from the test output
- if ((attr.name === 'onload' || attr.name === 'onerror') && attr.value === 'this.__e=event') {
+ if (['onload', 'onerror', 'xmlns'].includes(name) && value === 'this.__e=event') {
return;
}
- let value = attr.value;
-
- if (attr.name === 'class') {
+ if (name === 'class') {
value = value.replace(/svelte-\w+/, 'svelte-xyz123');
}
- node.setAttribute(attr.name, value);
+ node.setAttribute(name, value);
});
for (let child of [...node.childNodes]) {
diff --git a/packages/svelte/tests/runtime-xhtml/samples/attribute-quotes/_config.js b/packages/svelte/tests/runtime-xhtml/samples/attribute-quotes/_config.js
new file mode 100644
index 0000000000..f47bee71df
--- /dev/null
+++ b/packages/svelte/tests/runtime-xhtml/samples/attribute-quotes/_config.js
@@ -0,0 +1,3 @@
+import { test } from '../../test';
+
+export default test({});
diff --git a/packages/svelte/tests/runtime-xhtml/samples/attribute-quotes/main.svelte b/packages/svelte/tests/runtime-xhtml/samples/attribute-quotes/main.svelte
new file mode 100644
index 0000000000..82db611c12
--- /dev/null
+++ b/packages/svelte/tests/runtime-xhtml/samples/attribute-quotes/main.svelte
@@ -0,0 +1,2 @@
+
+
diff --git a/packages/svelte/tests/runtime-xhtml/samples/autoclosed-tags/_config.js b/packages/svelte/tests/runtime-xhtml/samples/autoclosed-tags/_config.js
new file mode 100644
index 0000000000..f47bee71df
--- /dev/null
+++ b/packages/svelte/tests/runtime-xhtml/samples/autoclosed-tags/_config.js
@@ -0,0 +1,3 @@
+import { test } from '../../test';
+
+export default test({});
diff --git a/packages/svelte/tests/runtime-xhtml/samples/autoclosed-tags/main.svelte b/packages/svelte/tests/runtime-xhtml/samples/autoclosed-tags/main.svelte
new file mode 100644
index 0000000000..18a4463ce1
--- /dev/null
+++ b/packages/svelte/tests/runtime-xhtml/samples/autoclosed-tags/main.svelte
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/packages/svelte/tests/runtime-xhtml/samples/boolean-attributes/_config.js b/packages/svelte/tests/runtime-xhtml/samples/boolean-attributes/_config.js
new file mode 100644
index 0000000000..f965e04b02
--- /dev/null
+++ b/packages/svelte/tests/runtime-xhtml/samples/boolean-attributes/_config.js
@@ -0,0 +1,5 @@
+import { test } from '../../test';
+
+export default test({
+ skip: true
+});
diff --git a/packages/svelte/tests/runtime-xhtml/samples/boolean-attributes/main.svelte b/packages/svelte/tests/runtime-xhtml/samples/boolean-attributes/main.svelte
new file mode 100644
index 0000000000..3d2fc88d10
--- /dev/null
+++ b/packages/svelte/tests/runtime-xhtml/samples/boolean-attributes/main.svelte
@@ -0,0 +1 @@
+
diff --git a/packages/svelte/tests/runtime-xhtml/samples/comment-marker/_config.js b/packages/svelte/tests/runtime-xhtml/samples/comment-marker/_config.js
new file mode 100644
index 0000000000..f47bee71df
--- /dev/null
+++ b/packages/svelte/tests/runtime-xhtml/samples/comment-marker/_config.js
@@ -0,0 +1,3 @@
+import { test } from '../../test';
+
+export default test({});
diff --git a/packages/svelte/tests/runtime-xhtml/samples/comment-marker/main.svelte b/packages/svelte/tests/runtime-xhtml/samples/comment-marker/main.svelte
new file mode 100644
index 0000000000..8dd87ce81e
--- /dev/null
+++ b/packages/svelte/tests/runtime-xhtml/samples/comment-marker/main.svelte
@@ -0,0 +1 @@
+{#each [1,2] as i}{i}{/each}
diff --git a/packages/svelte/tests/runtime-xhtml/samples/is-xhtml/_config.js b/packages/svelte/tests/runtime-xhtml/samples/is-xhtml/_config.js
new file mode 100644
index 0000000000..52dddb4ad7
--- /dev/null
+++ b/packages/svelte/tests/runtime-xhtml/samples/is-xhtml/_config.js
@@ -0,0 +1,8 @@
+import { test } from '../../test';
+
+export default test({
+ mode: ['client'],
+ test({ assert, target }) {
+ assert.htmlEqual(target.innerHTML, `div
`);
+ }
+});
diff --git a/packages/svelte/tests/runtime-xhtml/samples/is-xhtml/main.svelte b/packages/svelte/tests/runtime-xhtml/samples/is-xhtml/main.svelte
new file mode 100644
index 0000000000..27a4378d0f
--- /dev/null
+++ b/packages/svelte/tests/runtime-xhtml/samples/is-xhtml/main.svelte
@@ -0,0 +1,5 @@
+
+{nodeName}
diff --git a/packages/svelte/tests/runtime-xhtml/samples/void-tags/_config.js b/packages/svelte/tests/runtime-xhtml/samples/void-tags/_config.js
new file mode 100644
index 0000000000..f47bee71df
--- /dev/null
+++ b/packages/svelte/tests/runtime-xhtml/samples/void-tags/_config.js
@@ -0,0 +1,3 @@
+import { test } from '../../test';
+
+export default test({});
diff --git a/packages/svelte/tests/runtime-xhtml/samples/void-tags/main.svelte b/packages/svelte/tests/runtime-xhtml/samples/void-tags/main.svelte
new file mode 100644
index 0000000000..08ea2838b3
--- /dev/null
+++ b/packages/svelte/tests/runtime-xhtml/samples/void-tags/main.svelte
@@ -0,0 +1,15 @@
+
+
+
+
+