diff --git a/src/runtime/internal/ssr.ts b/src/runtime/internal/ssr.ts index 2c7d24a2cd..dc4c16dffb 100644 --- a/src/runtime/internal/ssr.ts +++ b/src/runtime/internal/ssr.ts @@ -85,18 +85,20 @@ export function escape(value: unknown, is_attr = false) { let escaped = ''; let last = 0; - while (pattern.test(str)) { - const i = pattern.lastIndex - 1; - const ch = str[i]; - escaped += str.substring(last, i) + (ch === '&' ? '&' : (ch === '"' ? '"' : '<')); - last = i + 1; - } + while (pattern.test(str)) { + const i = pattern.lastIndex - 1; + const ch = str[i]; + escaped += str.substring(last, i) + (ch === '&' ? '&' : (ch === '"' ? '"' : '<')); + last = i + 1; + } return escaped + str.substring(last); } export function escape_attribute_value(value) { - return typeof value === 'string' ? escape(value, true) : value; + // keep booleans, null, and undefined for the sake of `spread` + const should_escape = typeof value === 'string' || (value && typeof value === 'object'); + return should_escape ? escape(value, true) : value; } export function escape_object(obj) { @@ -192,7 +194,7 @@ export function create_ssr_component(fn) { export function add_attribute(name, value, boolean) { if (value == null || (boolean && !value)) return ''; - const assignment = (boolean && value === true) ? '' : `="${escape_attribute_value(value.toString())}"`; + const assignment = (boolean && value === true) ? '' : `="${escape(value, true)}"`; return ` ${name}${assignment}`; } diff --git a/test/server-side-rendering/samples/attribute-escaped-quotes-spread/_expected.html b/test/server-side-rendering/samples/attribute-escaped-quotes-spread/_expected.html index b3970f88ba..5db9a90fff 100644 --- a/test/server-side-rendering/samples/attribute-escaped-quotes-spread/_expected.html +++ b/test/server-side-rendering/samples/attribute-escaped-quotes-spread/_expected.html @@ -2,4 +2,10 @@ bar="'>" foo="">" qux="&&&" -> \ No newline at end of file + quux="">" +> + +
diff --git a/test/server-side-rendering/samples/attribute-escaped-quotes-spread/main.svelte b/test/server-side-rendering/samples/attribute-escaped-quotes-spread/main.svelte index 66047eb09a..9d721cd88f 100644 --- a/test/server-side-rendering/samples/attribute-escaped-quotes-spread/main.svelte +++ b/test/server-side-rendering/samples/attribute-escaped-quotes-spread/main.svelte @@ -1,10 +1,15 @@ -
\ No newline at end of file +
+