diff --git a/src/compiler/compile/render_ssr/Renderer.ts b/src/compiler/compile/render_ssr/Renderer.ts index 64e9ee1f4e81..99a2ee3d685f 100644 --- a/src/compiler/compile/render_ssr/Renderer.ts +++ b/src/compiler/compile/render_ssr/Renderer.ts @@ -16,6 +16,7 @@ import Title from './handlers/Title'; import { AppendTarget, CompileOptions } from '../../interfaces'; import { INode } from '../nodes/interfaces'; import { Expression, TemplateLiteral, Identifier } from 'estree'; +import { collapse_template_literal } from '../utils/collapse_template_literal'; import { escape_template } from '../utils/stringify'; type Handler = (node: any, renderer: Renderer, options: CompileOptions) => void; @@ -106,6 +107,9 @@ export default class Renderer { this.current = last.current; } + // Optimize the TemplateLiteral to remove unnecessary nodes + collapse_template_literal(popped.literal); + return popped.literal; } diff --git a/src/compiler/compile/utils/collapse_template_literal.ts b/src/compiler/compile/utils/collapse_template_literal.ts new file mode 100644 index 000000000000..5c5f78b8a30b --- /dev/null +++ b/src/compiler/compile/utils/collapse_template_literal.ts @@ -0,0 +1,34 @@ +import { TemplateLiteral } from 'estree'; +import { escape_template } from './stringify'; + +/** + * Collapse string literals together + */ +export function collapse_template_literal(literal: TemplateLiteral) { + if (!literal.quasis.length) return; + + const collapsed_quasis = []; + const collapsed_expressions = []; + + let cur_quasi = literal.quasis[0]; + + // An expression always follows a quasi and vice versa, ending with a quasi + for (let i = 0; i < literal.quasis.length; i++) { + const expr = literal.expressions[i]; + const next_quasi = literal.quasis[i + 1]; + // If an expression is a simple string literal, combine it with its preceding + // and following quasi + if (next_quasi && expr && expr.type === 'Literal' && typeof expr.value === 'string') { + cur_quasi.value.raw += escape_template(expr.value) + next_quasi.value.raw; + } else { + if (expr) { + collapsed_expressions.push(expr); + } + collapsed_quasis.push(cur_quasi); + cur_quasi = next_quasi; + } + } + + literal.quasis = collapsed_quasis; + literal.expressions = collapsed_expressions; +} diff --git a/test/js/samples/collapse-literal-ssr/_config.js b/test/js/samples/collapse-literal-ssr/_config.js new file mode 100644 index 000000000000..c4070b9a3b0f --- /dev/null +++ b/test/js/samples/collapse-literal-ssr/_config.js @@ -0,0 +1,6 @@ +export default { + options: { + generate: 'ssr', + dev: true + } +}; diff --git a/test/js/samples/collapse-literal-ssr/expected.js b/test/js/samples/collapse-literal-ssr/expected.js new file mode 100644 index 000000000000..8440a10082bb --- /dev/null +++ b/test/js/samples/collapse-literal-ssr/expected.js @@ -0,0 +1,25 @@ +/* generated by Svelte vX.Y.Z */ +import { add_attribute, create_ssr_component, escape } from "svelte/internal"; + +const const1 = 1; +const const2 = 'const2'; + +function foo() { + return ''; +} + +const Component = create_ssr_component(($$result, $$props, $$bindings, slots) => { + return ` +
-
+ + +- +- + + +
-
+
-
+
-
`; +}); + +export default Component; \ No newline at end of file diff --git a/test/js/samples/collapse-literal-ssr/input.svelte b/test/js/samples/collapse-literal-ssr/input.svelte new file mode 100644 index 000000000000..83a7be9bda6c --- /dev/null +++ b/test/js/samples/collapse-literal-ssr/input.svelte @@ -0,0 +1,20 @@ + + + +
-
+ + +
-
+
-
+ + +
-
+
-
+
-
diff --git a/test/validator/samples/assignment-to-const-5/errors.json b/test/validator/samples/assignment-to-const-5/errors.json index 21de70863c1e..bca92bf26617 100644 --- a/test/validator/samples/assignment-to-const-5/errors.json +++ b/test/validator/samples/assignment-to-const-5/errors.json @@ -4,14 +4,11 @@ "message": "You are assigning to a const", "start": { "line": 3, - "column": 1, - "character": 31 + "column": 1 }, "end": { "line": 3, - "column": 33, - "character": 63 - }, - "pos": 31 + "column": 33 + } } ] \ No newline at end of file diff --git a/test/validator/samples/assignment-to-const-7/errors.json b/test/validator/samples/assignment-to-const-7/errors.json index 34c88bebf64b..5304a61c4bb5 100644 --- a/test/validator/samples/assignment-to-const-7/errors.json +++ b/test/validator/samples/assignment-to-const-7/errors.json @@ -4,14 +4,11 @@ "message": "You are assigning to a const", "start": { "line": 3, - "column": 1, - "character": 43 + "column": 1 }, "end": { "line": 3, - "column": 42, - "character": 84 - }, - "pos": 43 + "column": 42 + } } ] \ No newline at end of file