Skip to content

Commit

Permalink
perf: optimize template literal printing in html mode
Browse files Browse the repository at this point in the history
  • Loading branch information
DylanPiercey committed Aug 29, 2024
1 parent e7eb9c3 commit 3623b48
Show file tree
Hide file tree
Showing 13 changed files with 59 additions and 15 deletions.
7 changes: 7 additions & 0 deletions .changeset/long-adults-knock.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@marko/translator-default": patch
"@marko/compiler": patch
"marko": patch
---

Optimize template literal printing in html output.
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export default {
} else {
value.parentPath.remove();
}
} else {
} else if (!value.isTemplateLiteral()) {
value.replaceWith(
withPreviousLocation(
t.callExpression(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export default {
} else {
value.parentPath.remove();
}
} else {
} else if (!value.isTemplateLiteral()) {
value.replaceWith(
withPreviousLocation(
t.callExpression(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
import { importDefault, normalizeTemplateString } from "@marko/babel-utils";
import {
importDefault,
importNamed,
normalizeTemplateString,
} from "@marko/babel-utils";
import { types as t } from "@marko/compiler";
import attrHelper from "marko/src/runtime/html/helpers/attr";
import { d as escapeDoubleQuotes } from "marko/src/runtime/html/helpers/escape-quotes";

import { evaluateAttr } from "../util";

Expand Down Expand Up @@ -94,6 +99,32 @@ export default function (path, attrs) {
}

curString += attrHelper(name, computed);
} else if (value.type === "TemplateLiteral") {
curString += " " + name + '="';

for (let i = 0; i < value.expressions.length; i++) {
const quasi = value.quasis[i];
const expression = value.expressions[i];
curString += escapeDoubleQuotes(quasi.value.cooked);
quasis.push(curString);
curString = "";
expressions.push(
t.callExpression(
importNamed(
file,
"marko/src/runtime/html/helpers/escape-quotes.js",
"d",
"marko_escape_double_quotes",
),
[expression],
),
);
}

curString +=
escapeDoubleQuotes(
value.quasis[value.expressions.length].value.cooked,
) + '"';
} else {
quasis.push(curString);
curString = "";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,15 @@ exports.default = void 0;
var _index = require("marko/src/runtime/html/index.js");
var _classValue = _interopRequireDefault(require("marko/src/runtime/helpers/class-value.js"));
var _attr = _interopRequireDefault(require("marko/src/runtime/html/helpers/attr.js"));
var _escapeQuotes = require("marko/src/runtime/html/helpers/escape-quotes.js");
var _renderer = _interopRequireDefault(require("marko/src/runtime/components/renderer.js"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const _marko_componentType = "packages/translator-default/test/fixtures/attr-escape/template.marko",
_marko_template = (0, _index.t)(_marko_componentType);
var _default = exports.default = _marko_template;
const _marko_component = {};
_marko_template._ = (0, _renderer.default)(function (input, out, _componentDef, _component, state, $global) {
out.w(`<div${(0, _attr.default)("class", (0, _classValue.default)(input.className))}${(0, _attr.default)("foo", 'a' + input.foo + 'b')}${(0, _attr.default)("bar", `a ${input.foo} b`)}></div>`);
out.w(`<div${(0, _attr.default)("class", (0, _classValue.default)(input.className))}${(0, _attr.default)("foo", 'a' + input.foo + 'b')} bar="a ${(0, _escapeQuotes.d)(input.foo)} b"></div>`);
}, {
t: _marko_componentType,
i: true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@ const _marko_componentType = "packages/translator-default/test/fixtures/attr-esc
export default _marko_template;
import _marko_class_merge from "marko/src/runtime/helpers/class-value.js";
import _marko_attr from "marko/src/runtime/html/helpers/attr.js";
import { d as _marko_escape_double_quotes } from "marko/src/runtime/html/helpers/escape-quotes.js";
import _marko_renderer from "marko/src/runtime/components/renderer.js";
const _marko_component = {};
_marko_template._ = _marko_renderer(function (input, out, _componentDef, _component, state, $global) {
out.w(`<div${_marko_attr("class", _marko_class_merge(input.className))}${_marko_attr("foo", 'a' + input.foo + 'b')}${_marko_attr("bar", `a ${input.foo} b`)}></div>`);
out.w(`<div${_marko_attr("class", _marko_class_merge(input.className))}${_marko_attr("foo", 'a' + input.foo + 'b')} bar="a ${_marko_escape_double_quotes(input.foo)} b"></div>`);
}, {
t: _marko_componentType,
i: true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@ const _marko_componentType = "WJodxLLd",
export default _marko_template;
import _marko_class_merge from "marko/dist/runtime/helpers/class-value.js";
import _marko_attr from "marko/dist/runtime/html/helpers/attr.js";
import { d as _marko_escape_double_quotes } from "marko/dist/runtime/html/helpers/escape-quotes.js";
import _marko_renderer from "marko/dist/runtime/components/renderer.js";
const _marko_component = {};
_marko_template._ = _marko_renderer(function (input, out, _componentDef, _component, state, $global) {
out.w(`<div${_marko_attr("class", _marko_class_merge(input.className))}${_marko_attr("foo", 'a' + input.foo + 'b')}${_marko_attr("bar", `a ${input.foo} b`)}></div>`);
out.w(`<div${_marko_attr("class", _marko_class_merge(input.className))}${_marko_attr("foo", 'a' + input.foo + 'b')} bar="a ${_marko_escape_double_quotes(input.foo)} b"></div>`);
}, {
t: _marko_componentType,
i: true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@
exports.__esModule = true;
exports.default = void 0;
var _index = require("marko/src/runtime/html/index.js");
var _attr = _interopRequireDefault(require("marko/src/runtime/html/helpers/attr.js"));
var _escapeQuotes = require("marko/src/runtime/html/helpers/escape-quotes.js");
var _renderer = _interopRequireDefault(require("marko/src/runtime/components/renderer.js"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const _marko_componentType = "packages/translator-default/test/fixtures/attr-template-literal-escape/template.marko",
_marko_template = (0, _index.t)(_marko_componentType);
var _default = exports.default = _marko_template;
const _marko_component = {};
_marko_template._ = (0, _renderer.default)(function (input, out, _componentDef, _component, state, $global) {
out.w(`<div${(0, _attr.default)("foo", `Hello ${input.name}`)}></div>`);
out.w(`<div foo="Hello ${(0, _escapeQuotes.d)(input.name)}"></div>`);
}, {
t: _marko_componentType,
i: true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ import { t as _t } from "marko/src/runtime/html/index.js";
const _marko_componentType = "packages/translator-default/test/fixtures/attr-template-literal-escape/template.marko",
_marko_template = _t(_marko_componentType);
export default _marko_template;
import _marko_attr from "marko/src/runtime/html/helpers/attr.js";
import { d as _marko_escape_double_quotes } from "marko/src/runtime/html/helpers/escape-quotes.js";
import _marko_renderer from "marko/src/runtime/components/renderer.js";
const _marko_component = {};
_marko_template._ = _marko_renderer(function (input, out, _componentDef, _component, state, $global) {
out.w(`<div${_marko_attr("foo", `Hello ${input.name}`)}></div>`);
out.w(`<div foo="Hello ${_marko_escape_double_quotes(input.name)}"></div>`);
}, {
t: _marko_componentType,
i: true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ import { t as _t } from "marko/dist/runtime/html/index.js";
const _marko_componentType = "jF_vuKKj",
_marko_template = _t(_marko_componentType);
export default _marko_template;
import _marko_attr from "marko/dist/runtime/html/helpers/attr.js";
import { d as _marko_escape_double_quotes } from "marko/dist/runtime/html/helpers/escape-quotes.js";
import _marko_renderer from "marko/dist/runtime/components/renderer.js";
const _marko_component = {};
_marko_template._ = _marko_renderer(function (input, out, _componentDef, _component, state, $global) {
out.w(`<div${_marko_attr("foo", `Hello ${input.name}`)}></div>`);
out.w(`<div foo="Hello ${_marko_escape_double_quotes(input.name)}"></div>`);
}, {
t: _marko_componentType,
i: true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ exports.__esModule = true;
exports.default = void 0;
var _index = require("marko/src/runtime/html/index.js");
var _attr = _interopRequireDefault(require("marko/src/runtime/html/helpers/attr.js"));
var _escapeQuotes = require("marko/src/runtime/html/helpers/escape-quotes.js");
var _renderer = _interopRequireDefault(require("marko/src/runtime/components/renderer.js"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const _marko_componentType = "packages/translator-default/test/fixtures/shorthand-id/template.marko",
Expand All @@ -13,7 +14,7 @@ const _marko_component = {};
_marko_template._ = (0, _renderer.default)(function (input, out, _componentDef, _component, state, $global) {
out.w("<div id=shorthand></div>");
out.w(`<div${(0, _attr.default)("id", dynamic)}></div>`);
out.w(`<div${(0, _attr.default)("id", `partial-${dynamic}`)}></div>`);
out.w(`<div id="partial-${(0, _escapeQuotes.d)(dynamic)}"></div>`);
}, {
t: _marko_componentType,
i: true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,13 @@ const _marko_componentType = "packages/translator-default/test/fixtures/shorthan
_marko_template = _t(_marko_componentType);
export default _marko_template;
import _marko_attr from "marko/src/runtime/html/helpers/attr.js";
import { d as _marko_escape_double_quotes } from "marko/src/runtime/html/helpers/escape-quotes.js";
import _marko_renderer from "marko/src/runtime/components/renderer.js";
const _marko_component = {};
_marko_template._ = _marko_renderer(function (input, out, _componentDef, _component, state, $global) {
out.w("<div id=shorthand></div>");
out.w(`<div${_marko_attr("id", dynamic)}></div>`);
out.w(`<div${_marko_attr("id", `partial-${dynamic}`)}></div>`);
out.w(`<div id="partial-${_marko_escape_double_quotes(dynamic)}"></div>`);
}, {
t: _marko_componentType,
i: true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@ const _marko_componentType = "dFcmvNXj",
_marko_template = _t(_marko_componentType);
export default _marko_template;
import _marko_attr from "marko/dist/runtime/html/helpers/attr.js";
import { d as _marko_escape_double_quotes } from "marko/dist/runtime/html/helpers/escape-quotes.js";
import _marko_renderer from "marko/dist/runtime/components/renderer.js";
const _marko_component = {};
_marko_template._ = _marko_renderer(function (input, out, _componentDef, _component, state, $global) {
out.w(`<div id=shorthand></div><div${_marko_attr("id", dynamic)}></div><div${_marko_attr("id", `partial-${dynamic}`)}></div>`);
out.w(`<div id=shorthand></div><div${_marko_attr("id", dynamic)}></div><div id="partial-${_marko_escape_double_quotes(dynamic)}"></div>`);
}, {
t: _marko_componentType,
i: true
Expand Down

0 comments on commit 3623b48

Please sign in to comment.