From 9a18ced27b04b6fbd391d84c61d97269bcf7f851 Mon Sep 17 00:00:00 2001 From: dpiercey Date: Thu, 15 Feb 2024 15:58:20 -0700 Subject: [PATCH 01/20] fix: vdom hoisting id bug --- .changeset/gentle-dogs-hammer.md | 6 + .../src/runtime/vdom/helpers/const-element.js | 25 +++ .../marko/src/runtime/vdom/helpers/const.js | 8 - .../src/runtime/vdom/helpers/v-element.js | 15 -- .../marko/src/runtime/vdom/helpers/v-text.js | 7 - packages/translator-default/src/index.js | 4 +- .../src/tag/native-tag[vdom]/index.js | 190 +++++++++--------- .../src/util/optimize-vdom-create.js | 26 ++- .../snapshots/vdomProduction-expected.js | 6 +- .../snapshots/vdomProduction-expected.js | 10 +- .../snapshots/vdomProduction-expected.js | 6 +- .../snapshots/vdomProduction-expected.js | 10 +- .../snapshots/vdomProduction-expected.js | 4 +- .../snapshots/vdomProduction-expected.js | 4 +- .../snapshots/vdomProduction-expected.js | 4 +- .../snapshots/vdomProduction-expected.js | 4 +- .../snapshots/vdomProduction-expected.js | 4 +- .../snapshots/vdomProduction-expected.js | 4 +- .../snapshots/vdomProduction-expected.js | 6 +- .../snapshots/vdomProduction-expected.js | 4 +- .../snapshots/vdomProduction-expected.js | 4 +- .../snapshots/vdomProduction-expected.js | 10 +- .../snapshots/vdomProduction-expected.js | 6 +- .../snapshots/vdomProduction-expected.js | 4 +- .../snapshots/vdomProduction-expected.js | 4 +- .../snapshots/vdomProduction-expected.js | 4 +- .../snapshots/vdomProduction-expected.js | 18 +- .../snapshots/vdomProduction-expected.js | 6 +- .../snapshots/vdomProduction-expected.js | 4 +- .../snapshots/vdomProduction-expected.js | 30 +-- .../snapshots/vdomProduction-expected.js | 14 +- .../snapshots/vdomProduction-expected.js | 6 +- .../snapshots/vdomProduction-expected.js | 18 +- .../snapshots/vdomProduction-expected.js | 4 +- .../snapshots/vdomProduction-expected.js | 4 +- .../snapshots/vdomProduction-expected.js | 4 +- .../snapshots/vdomProduction-expected.js | 6 +- .../snapshots/vdomProduction-expected.js | 6 +- .../snapshots/vdomProduction-expected.js | 20 +- .../snapshots/vdomProduction-expected.js | 8 +- .../snapshots/vdomProduction-expected.js | 4 +- .../snapshots/vdomProduction-expected.js | 6 +- 42 files changed, 271 insertions(+), 266 deletions(-) create mode 100644 .changeset/gentle-dogs-hammer.md create mode 100644 packages/marko/src/runtime/vdom/helpers/const-element.js delete mode 100644 packages/marko/src/runtime/vdom/helpers/const.js delete mode 100644 packages/marko/src/runtime/vdom/helpers/v-element.js delete mode 100644 packages/marko/src/runtime/vdom/helpers/v-text.js diff --git a/.changeset/gentle-dogs-hammer.md b/.changeset/gentle-dogs-hammer.md new file mode 100644 index 000000000..7a9ad9c74 --- /dev/null +++ b/.changeset/gentle-dogs-hammer.md @@ -0,0 +1,6 @@ +--- +"@marko/translator-default": patch +"marko": patch +--- + +Fix and optimize the output for vdom hoisting. diff --git a/packages/marko/src/runtime/vdom/helpers/const-element.js b/packages/marko/src/runtime/vdom/helpers/const-element.js new file mode 100644 index 000000000..42c0ba1cc --- /dev/null +++ b/packages/marko/src/runtime/vdom/helpers/const-element.js @@ -0,0 +1,25 @@ +"use strict"; + +var VElement = require("../vdom").___VElement; +var i = 0; + +module.exports = function (tagName, attrs, childCount) { + return new ConstVElement(tagName, attrs, childCount); +}; + +function ConstVElement(tagName, attrs, childCount) { + VElement.call(this, tagName, attrs, null, null, childCount, null, { i: i++ }); +} + +ConstVElement.prototype = Object.create(VElement.prototype); +ConstVElement.prototype.e = function (tagName, attrs, childCount) { + var child = this.___appendChild( + new ConstVElement(tagName, attrs, childCount), + ); + + if (childCount === 0) { + return this.___finishChild(); + } else { + return child; + } +}; diff --git a/packages/marko/src/runtime/vdom/helpers/const.js b/packages/marko/src/runtime/vdom/helpers/const.js deleted file mode 100644 index d7c6a4075..000000000 --- a/packages/marko/src/runtime/vdom/helpers/const.js +++ /dev/null @@ -1,8 +0,0 @@ -"use strict"; - -module.exports = function (id) { - var i = 0; - return function () { - return id + i++; - }; -}; diff --git a/packages/marko/src/runtime/vdom/helpers/v-element.js b/packages/marko/src/runtime/vdom/helpers/v-element.js deleted file mode 100644 index 92b336bb4..000000000 --- a/packages/marko/src/runtime/vdom/helpers/v-element.js +++ /dev/null @@ -1,15 +0,0 @@ -"use strict"; - -var VElement = require("../vdom").___VElement; - -module.exports = function ( - tagName, - attrs, - key, - component, - childCount, - flags, - props, -) { - return new VElement(tagName, attrs, key, component, childCount, flags, props); -}; diff --git a/packages/marko/src/runtime/vdom/helpers/v-text.js b/packages/marko/src/runtime/vdom/helpers/v-text.js deleted file mode 100644 index e027ad71b..000000000 --- a/packages/marko/src/runtime/vdom/helpers/v-text.js +++ /dev/null @@ -1,7 +0,0 @@ -"use strict"; - -var VText = require("../vdom").___VText; - -module.exports = function (value) { - return new VText(value); -}; diff --git a/packages/translator-default/src/index.js b/packages/translator-default/src/index.js index 2ba396e0c..19d5ad321 100644 --- a/packages/translator-default/src/index.js +++ b/packages/translator-default/src/index.js @@ -505,9 +505,7 @@ export function getRuntimeEntryFiles(output, optimize) { `${base}runtime/vdom/index.js`, `${base}runtime/vdom/hot-reload.js`, `${base}runtime/vdom/helpers/attrs.js`, - `${base}runtime/vdom/helpers/const.js`, - `${base}runtime/vdom/helpers/v-element.js`, - `${base}runtime/vdom/helpers/v-text.js`, + `${base}runtime/vdom/helpers/const-element.js`, `${base}runtime/vdom/preserve-attrs.js`, ]), ]; diff --git a/packages/translator-default/src/tag/native-tag[vdom]/index.js b/packages/translator-default/src/tag/native-tag[vdom]/index.js index 60e36e975..21f6405af 100644 --- a/packages/translator-default/src/tag/native-tag[vdom]/index.js +++ b/packages/translator-default/src/tag/native-tag[vdom]/index.js @@ -7,102 +7,6 @@ import translateAttributes from "./attributes"; const SIMPLE_ATTRS = ["id", "class", "style"]; -export function tagArguments(path, isStatic) { - const { - hub: { file }, - node, - } = path; - const { - name, - key, - body: { body }, - handlers, - } = node; - const tagProperties = (path.node.extra && path.node.extra.properties) || []; - const attrsObj = translateAttributes(path, path.get("attributes")); - let runtimeFlags = 0; - - if (!t.isNullLiteral(attrsObj) && !t.isObjectExpression(attrsObj)) { - runtimeFlags |= FLAGS.SPREAD_ATTRS; - } - - const writeArgs = [ - name, - attrsObj, - !key && isStatic ? t.nullLiteral() : key, - isStatic ? t.nullLiteral() : file._componentInstanceIdentifier, - isStatic - ? t.numericLiteral(body.length) - : body.length - ? t.nullLiteral() - : t.numericLiteral(0), - ]; - - if (node.preserveAttrs) { - tagProperties.push( - t.objectProperty( - t.identifier("pa"), - t.arrayExpression( - node.preserveAttrs.map((name) => t.stringLiteral(name)), - ), - ), - ); - } - - if (handlers) { - Object.entries(handlers).forEach( - ([eventName, { arguments: args, once }]) => { - const delegateArgs = [t.stringLiteral(eventName), args[0]]; - - // TODO: look into only sending this if once is true. - delegateArgs.push(t.booleanLiteral(once)); - - if (args.length > 1) { - delegateArgs.push(t.arrayExpression(args.slice(1))); - } - - // TODO: why do we output eventName twice. - tagProperties.push( - t.objectProperty( - t.stringLiteral(`on${eventName}`), - t.callExpression( - t.memberExpression( - file._componentDefIdentifier, - t.identifier("d"), - ), - delegateArgs, - ), - ), - ); - }, - ); - } - - if ( - t.isObjectExpression(attrsObj) && - attrsObj.properties.every((n) => isPropertyName(n, SIMPLE_ATTRS)) && - !node.preserveAttrs - ) { - runtimeFlags |= FLAGS.HAS_SIMPLE_ATTRS; - } - - const tagDef = getTagDef(path); - - if (tagDef) { - const { htmlType } = tagDef; - if (htmlType === "custom-element") { - runtimeFlags |= FLAGS.IS_CUSTOM_ELEMENT; - } - } - - writeArgs.push(t.numericLiteral(runtimeFlags)); - - if (tagProperties.length) { - writeArgs.push(t.objectExpression(tagProperties)); - } - return writeArgs; -} - /** * Translates the html streaming version of a standard html element. */ @@ -180,3 +84,97 @@ function isPropertyName({ key }, names) { return names.includes(key.name); } } + +function tagArguments(path) { + const { + hub: { file }, + node, + } = path; + const { + name, + key, + body: { body }, + handlers, + } = node; + const tagProperties = (path.node.extra && path.node.extra.properties) || []; + const attrsObj = translateAttributes(path, path.get("attributes")); + let runtimeFlags = 0; + + if (!t.isNullLiteral(attrsObj) && !t.isObjectExpression(attrsObj)) { + runtimeFlags |= FLAGS.SPREAD_ATTRS; + } + + const writeArgs = [ + name, + attrsObj, + key, + file._componentInstanceIdentifier, + body.length + ? t.nullLiteral() + : t.numericLiteral(0), + ]; + + if (node.preserveAttrs) { + tagProperties.push( + t.objectProperty( + t.identifier("pa"), + t.arrayExpression( + node.preserveAttrs.map((name) => t.stringLiteral(name)), + ), + ), + ); + } + + if (handlers) { + Object.entries(handlers).forEach( + ([eventName, { arguments: args, once }]) => { + const delegateArgs = [t.stringLiteral(eventName), args[0]]; + + // TODO: look into only sending this if once is true. + delegateArgs.push(t.booleanLiteral(once)); + + if (args.length > 1) { + delegateArgs.push(t.arrayExpression(args.slice(1))); + } + + // TODO: why do we output eventName twice. + tagProperties.push( + t.objectProperty( + t.stringLiteral(`on${eventName}`), + t.callExpression( + t.memberExpression( + file._componentDefIdentifier, + t.identifier("d"), + ), + delegateArgs, + ), + ), + ); + }, + ); + } + + if ( + t.isObjectExpression(attrsObj) && + attrsObj.properties.every((n) => isPropertyName(n, SIMPLE_ATTRS)) && + !node.preserveAttrs + ) { + runtimeFlags |= FLAGS.HAS_SIMPLE_ATTRS; + } + + const tagDef = getTagDef(path); + + if (tagDef) { + const { htmlType } = tagDef; + if (htmlType === "custom-element") { + runtimeFlags |= FLAGS.IS_CUSTOM_ELEMENT; + } + } + + writeArgs.push(t.numericLiteral(runtimeFlags)); + + if (tagProperties.length) { + writeArgs.push(t.objectExpression(tagProperties)); + } + return writeArgs; +} diff --git a/packages/translator-default/src/util/optimize-vdom-create.js b/packages/translator-default/src/util/optimize-vdom-create.js index ef7fba115..fd5cdb1c0 100644 --- a/packages/translator-default/src/util/optimize-vdom-create.js +++ b/packages/translator-default/src/util/optimize-vdom-create.js @@ -7,8 +7,8 @@ import { } from "@marko/babel-utils"; import { types as t } from "@marko/compiler"; import { decode } from "he"; -import { tagArguments } from "../tag/native-tag[vdom]"; -import { getKeyManager } from "./key-manager"; +import translateAttributes from "../tag/native-tag[vdom]/attributes"; +import { getKeyManager, hasUserKey } from "./key-manager"; import write from "./vdom-out-write"; const skipDirectives = new Set([ @@ -40,10 +40,9 @@ const mergeStaticCreateVisitor = { }, MarkoTag(path, state) { getKeyManager(path).resolveKey(path); - const writeArgs = tagArguments(path, true); state.currentRoot = t.callExpression( t.memberExpression(state.currentRoot, t.identifier("e")), - writeArgs, + getConstElementArgs(path), ); }, }; @@ -70,7 +69,8 @@ const analyzeStaticVisitor = { let isStatic = isNativeTag(path) && !path.node.body.params.length && - !path.node.arguments; + !path.node.arguments && + !hasUserKey(path); const tagDef = getTagDef(path); isStatic = isStatic && !tagDef.translator; @@ -118,15 +118,14 @@ export function optimizeStaticVDOM(path) { } const identifier = path.scope.generateUidIdentifier("marko_node"); - const writeArgs = tagArguments(path, true); const state = { currentRoot: t.callExpression( importDefault( file, - "marko/src/runtime/vdom/helpers/v-element.js", - "marko_createElement", + "marko/src/runtime/vdom/helpers/const-element.js", + "marko_constElement", ), - writeArgs, + getConstElementArgs(path), ), }; @@ -149,3 +148,12 @@ export function analyzeStaticVDOM(path) { function shouldRun(markoOpts) { return markoOpts.optimize && markoOpts.output !== "html"; } + +function getConstElementArgs(path) { + const { node } = path; + return [ + node.name, + translateAttributes(path, path.get("attributes")), + t.numericLiteral(node.body.body.length), + ]; +} diff --git a/packages/translator-default/test/fixtures/attr-boolean/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/attr-boolean/snapshots/vdomProduction-expected.js index 1d907c454..c805c5ecf 100644 --- a/packages/translator-default/test/fixtures/attr-boolean/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/attr-boolean/snapshots/vdomProduction-expected.js @@ -2,10 +2,10 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "CtqnD7TI", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("input", { +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("input", { "checked": "" -}, "0", null, 0, 0); +}, 0); import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; _marko_registerComponent(_marko_componentType, () => _marko_template); diff --git a/packages/translator-default/test/fixtures/attr-class/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/attr-class/snapshots/vdomProduction-expected.js index 8916ac807..fb47c5496 100644 --- a/packages/translator-default/test/fixtures/attr-class/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/attr-class/snapshots/vdomProduction-expected.js @@ -3,13 +3,13 @@ const _marko_componentType = "TKoJdMQb", _marko_template = _t(_marko_componentType); export default _marko_template; import _marko_class_merge from "marko/dist/runtime/helpers/class-value.js"; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("div", { +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("div", { "class": "a b" -}, "1", null, 0, 1); -const _marko_node2 = _marko_createElement("div", { +}, 0); +const _marko_node2 = _marko_constElement("div", { "class": "a b c" -}, "2", null, 0, 1); +}, 0); import _customTag from "./components/custom-tag.marko"; import _marko_tag from "marko/dist/runtime/helpers/render-tag.js"; import _marko_self_iterator from "marko/dist/runtime/helpers/self-iterator.js"; diff --git a/packages/translator-default/test/fixtures/attr-falsey/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/attr-falsey/snapshots/vdomProduction-expected.js index 86fb2f63d..28068b4ab 100644 --- a/packages/translator-default/test/fixtures/attr-falsey/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/attr-falsey/snapshots/vdomProduction-expected.js @@ -2,11 +2,11 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "9WNpCPpT", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("div", { +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("div", { "d": "0", "y": "1" -}, "0", null, 0, 0); +}, 0); import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; _marko_registerComponent(_marko_componentType, () => _marko_template); diff --git a/packages/translator-default/test/fixtures/attr-style/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/attr-style/snapshots/vdomProduction-expected.js index a82e275f8..37fd30159 100644 --- a/packages/translator-default/test/fixtures/attr-style/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/attr-style/snapshots/vdomProduction-expected.js @@ -3,13 +3,13 @@ const _marko_componentType = "Up7A+MWi", _marko_template = _t(_marko_componentType); export default _marko_template; import _marko_style_merge from "marko/dist/runtime/helpers/style-value.js"; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("div", { +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("div", { "style": "width:100px" -}, "1", null, 0, 1); -const _marko_node2 = _marko_createElement("div", { +}, 0); +const _marko_node2 = _marko_constElement("div", { "style": "color: green" -}, "2", null, 0, 1); +}, 0); import _customTag from "./components/custom-tag.marko"; import _marko_tag from "marko/dist/runtime/helpers/render-tag.js"; import _marko_self_iterator from "marko/dist/runtime/helpers/self-iterator.js"; diff --git a/packages/translator-default/test/fixtures/class-external-component-index/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/class-external-component-index/snapshots/vdomProduction-expected.js index d25883724..28797b03d 100644 --- a/packages/translator-default/test/fixtures/class-external-component-index/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/class-external-component-index/snapshots/vdomProduction-expected.js @@ -2,8 +2,8 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "ErZDLFTk", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("div", null, "0", null, 0, 0); +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("div", null, 0); import _marko_component from "./component.js"; import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; diff --git a/packages/translator-default/test/fixtures/class-external-component/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/class-external-component/snapshots/vdomProduction-expected.js index 4ee4c9ccf..207239ac0 100644 --- a/packages/translator-default/test/fixtures/class-external-component/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/class-external-component/snapshots/vdomProduction-expected.js @@ -2,8 +2,8 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "cQ4BiZgz", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("div", null, "0", null, 0, 0); +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("div", null, 0); import _marko_component from "./template.component.js"; import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; diff --git a/packages/translator-default/test/fixtures/class-inline-class-props-without-on-create/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/class-inline-class-props-without-on-create/snapshots/vdomProduction-expected.js index 441cd6d97..ed244a12a 100644 --- a/packages/translator-default/test/fixtures/class-inline-class-props-without-on-create/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/class-inline-class-props-without-on-create/snapshots/vdomProduction-expected.js @@ -2,8 +2,8 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "rmgp0gbX", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("div", null, "0", null, 0, 0); +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("div", null, 0); import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; _marko_registerComponent(_marko_componentType, () => _marko_template); diff --git a/packages/translator-default/test/fixtures/class-inline/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/class-inline/snapshots/vdomProduction-expected.js index 395941583..1ccdefc11 100644 --- a/packages/translator-default/test/fixtures/class-inline/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/class-inline/snapshots/vdomProduction-expected.js @@ -2,8 +2,8 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "F7GLatBK", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("div", null, "0", null, 0, 0); +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("div", null, 0); import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; _marko_registerComponent(_marko_componentType, () => _marko_template); diff --git a/packages/translator-default/test/fixtures/custom-element-tag/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/custom-element-tag/snapshots/vdomProduction-expected.js index 6f53c16bd..193d2710f 100644 --- a/packages/translator-default/test/fixtures/custom-element-tag/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/custom-element-tag/snapshots/vdomProduction-expected.js @@ -2,8 +2,8 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "O83mlmop", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("hello", null, "0", null, 0, 2); +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("hello", null, 0); import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; _marko_registerComponent(_marko_componentType, () => _marko_template); diff --git a/packages/translator-default/test/fixtures/custom-tag-separate-assets/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/custom-tag-separate-assets/snapshots/vdomProduction-expected.js index 912d27836..6f22263d1 100644 --- a/packages/translator-default/test/fixtures/custom-tag-separate-assets/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/custom-tag-separate-assets/snapshots/vdomProduction-expected.js @@ -2,8 +2,8 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "WET+Vfy4", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("div", null, "0", null, 0, 0); +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("div", null, 0); import _marko_component from "./template.component.js"; import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; diff --git a/packages/translator-default/test/fixtures/custom-tag-transform/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/custom-tag-transform/snapshots/vdomProduction-expected.js index bfc16cbe1..995ff9694 100644 --- a/packages/translator-default/test/fixtures/custom-tag-transform/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/custom-tag-transform/snapshots/vdomProduction-expected.js @@ -2,10 +2,10 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "5fhDZgMT", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("span", { +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("span", { "style": "display:block" -}, "0", null, 0, 1); +}, 0); import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; _marko_registerComponent(_marko_componentType, () => _marko_template); diff --git a/packages/translator-default/test/fixtures/declaration/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/declaration/snapshots/vdomProduction-expected.js index 109cc9103..97706d9c6 100644 --- a/packages/translator-default/test/fixtures/declaration/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/declaration/snapshots/vdomProduction-expected.js @@ -2,8 +2,8 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "p0+/pj8a", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("contact-info", null, "0", null, 1, 0).e("name", null, "1", null, 1, 0).t("Hello World"); +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("contact-info", null, 1).e("name", null, 1).t("Hello World"); import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; _marko_registerComponent(_marko_componentType, () => _marko_template); diff --git a/packages/translator-default/test/fixtures/doctype/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/doctype/snapshots/vdomProduction-expected.js index 615dfc520..d2ae6d602 100644 --- a/packages/translator-default/test/fixtures/doctype/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/doctype/snapshots/vdomProduction-expected.js @@ -2,8 +2,8 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "VJrYycFN", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("head", null, "1", null, 1, 0).e("title", null, "2", null, 1, 0).t("Title of the document"); +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("head", null, 1).e("title", null, 1).t("Title of the document"); import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; _marko_registerComponent(_marko_componentType, () => _marko_template); diff --git a/packages/translator-default/test/fixtures/error-at-tags-top-level/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/error-at-tags-top-level/snapshots/vdomProduction-expected.js index b89860592..a11d0b7a0 100644 --- a/packages/translator-default/test/fixtures/error-at-tags-top-level/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/error-at-tags-top-level/snapshots/vdomProduction-expected.js @@ -2,13 +2,13 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "DvY2Lw0O", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("@header", { +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("@header", { "class": "my-header" -}, null, null, 1, 1).t("Header content"); -const _marko_node2 = _marko_createElement("@footer", { +}, 1).t("Header content"); +const _marko_node2 = _marko_constElement("@footer", { "class": "my-footer" -}, null, null, 1, 1).t("Footer content"); +}, 1).t("Footer content"); import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; _marko_registerComponent(_marko_componentType, () => _marko_template); diff --git a/packages/translator-default/test/fixtures/error-body-only-if-no-condition/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/error-body-only-if-no-condition/snapshots/vdomProduction-expected.js index 52caf17f3..643d5b14d 100644 --- a/packages/translator-default/test/fixtures/error-body-only-if-no-condition/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/error-body-only-if-no-condition/snapshots/vdomProduction-expected.js @@ -2,10 +2,10 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "QPcOe9nt", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("div", { +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("div", { "body-only-if": "" -}, "0", null, 0, 0); +}, 0); import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; _marko_registerComponent(_marko_componentType, () => _marko_template); diff --git a/packages/translator-default/test/fixtures/error-class-with-name/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/error-class-with-name/snapshots/vdomProduction-expected.js index 0c243e9a9..a89e35d08 100644 --- a/packages/translator-default/test/fixtures/error-class-with-name/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/error-class-with-name/snapshots/vdomProduction-expected.js @@ -2,8 +2,8 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "/7Yakras", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("div", null, "0", null, 0, 0); +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("div", null, 0); import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; _marko_registerComponent(_marko_componentType, () => _marko_template); diff --git a/packages/translator-default/test/fixtures/html-entity/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/html-entity/snapshots/vdomProduction-expected.js index 6b9488aaa..c7b5e3f4d 100644 --- a/packages/translator-default/test/fixtures/html-entity/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/html-entity/snapshots/vdomProduction-expected.js @@ -2,8 +2,8 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "PF20NQ88", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("div", null, "0", null, 1, 0).t("
"); +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("div", null, 1).t("
"); import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; _marko_registerComponent(_marko_componentType, () => _marko_template); diff --git a/packages/translator-default/test/fixtures/macro-non-root/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/macro-non-root/snapshots/vdomProduction-expected.js index f6ba629c8..de6b00cf5 100644 --- a/packages/translator-default/test/fixtures/macro-non-root/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/macro-non-root/snapshots/vdomProduction-expected.js @@ -2,8 +2,8 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "R6eF4gGA", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("div", null, "2", null, 0, 0); +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("div", null, 0); import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; _marko_registerComponent(_marko_componentType, () => _marko_template); diff --git a/packages/translator-default/test/fixtures/no-update-directives/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/no-update-directives/snapshots/vdomProduction-expected.js index 43f24f441..a7eb54339 100644 --- a/packages/translator-default/test/fixtures/no-update-directives/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/no-update-directives/snapshots/vdomProduction-expected.js @@ -4,16 +4,16 @@ const _marko_componentType = "qUg9ApxN", export default _marko_template; import _hello from "./components/hello/index.marko"; import _marko_tag from "marko/dist/runtime/helpers/render-tag.js"; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("div", null, "2", null, 0, 0); +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("div", null, 0); import _preserve from "marko/dist/core-tags/components/preserve-tag.js"; -const _marko_node2 = _marko_createElement("div", null, "5", null, 0, 0); -const _marko_node3 = _marko_createElement("div", null, "8", null, 0, 0); -const _marko_node4 = _marko_createElement("div", null, "11", null, 0, 0); -const _marko_node5 = _marko_createElement("div", null, "13", null, 0, 0); -const _marko_node6 = _marko_createElement("div", null, "14", null, 0, 0); -const _marko_node7 = _marko_createElement("div", null, "16", null, 0, 0); -const _marko_node8 = _marko_createElement("div", null, "17", null, 0, 0); +const _marko_node2 = _marko_constElement("div", null, 0); +const _marko_node3 = _marko_constElement("div", null, 0); +const _marko_node4 = _marko_constElement("div", null, 0); +const _marko_node5 = _marko_constElement("div", null, 0); +const _marko_node6 = _marko_constElement("div", null, 0); +const _marko_node7 = _marko_constElement("div", null, 0); +const _marko_node8 = _marko_constElement("div", null, 0); import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; _marko_registerComponent(_marko_componentType, () => _marko_template); diff --git a/packages/translator-default/test/fixtures/placeholders/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/placeholders/snapshots/vdomProduction-expected.js index 3b276561d..fdf22803e 100644 --- a/packages/translator-default/test/fixtures/placeholders/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/placeholders/snapshots/vdomProduction-expected.js @@ -2,9 +2,9 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "jxXJawbJ", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("script", null, "1", null, 3, 0).t("\n ").t("Hello ").t("\n "); -const _marko_node2 = _marko_createElement("style", null, "2", null, 3, 0).t("\n ").t("Hello ").t("\n "); +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("script", null, 3).t("\n ").t("Hello ").t("\n "); +const _marko_node2 = _marko_constElement("style", null, 3).t("\n ").t("Hello ").t("\n "); import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; _marko_registerComponent(_marko_componentType, () => _marko_template); diff --git a/packages/translator-default/test/fixtures/prevent-override-component-def/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/prevent-override-component-def/snapshots/vdomProduction-expected.js index 2a607623b..9a4692295 100644 --- a/packages/translator-default/test/fixtures/prevent-override-component-def/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/prevent-override-component-def/snapshots/vdomProduction-expected.js @@ -2,8 +2,8 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "AWlOZ9B/", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("div", null, "0", null, 0, 0); +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("div", null, 0); import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; _marko_registerComponent(_marko_componentType, () => _marko_template); diff --git a/packages/translator-default/test/fixtures/sanity-check/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/sanity-check/snapshots/vdomProduction-expected.js index 0503a8f12..213d04620 100644 --- a/packages/translator-default/test/fixtures/sanity-check/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/sanity-check/snapshots/vdomProduction-expected.js @@ -9,30 +9,30 @@ function more() { abc(); } import _marko_class_merge from "marko/dist/runtime/helpers/class-value.js"; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("input", { +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("input", { "type": "text" -}, "9", null, 0, 0); -const _marko_node2 = _marko_createElement("div", null, "10", null, 0, 0); +}, 0); +const _marko_node2 = _marko_constElement("div", null, 0); import _marko_dynamic_tag from "marko/dist/runtime/helpers/dynamic-tag.js"; -const _marko_node3 = _marko_createElement("div", null, "13", null, 0, 0); +const _marko_node3 = _marko_constElement("div", null, 0); import _other from "./components/other/index.marko"; import _marko_tag from "marko/dist/runtime/helpers/render-tag.js"; -const _marko_node4 = _marko_createElement("div", null, "15", null, 0, 0); -const _marko_node5 = _marko_createElement("div", null, "16", null, 0, 0); -const _marko_node6 = _marko_createElement("div", null, "17", null, 0, 0); +const _marko_node4 = _marko_constElement("div", null, 0); +const _marko_node5 = _marko_constElement("div", null, 0); +const _marko_node6 = _marko_constElement("div", null, 0); import _marko_self_iterator from "marko/dist/runtime/helpers/self-iterator.js"; -const _marko_node7 = _marko_createElement("div", { +const _marko_node7 = _marko_constElement("div", { "c": "1" -}, "19", null, 0, 0); -const _marko_node8 = _marko_createElement("div", { +}, 0); +const _marko_node8 = _marko_constElement("div", { "d": "1" -}, "20", null, 0, 0); +}, 0); import _marko_merge_attrs from "marko/dist/runtime/vdom/helpers/merge-attrs.js"; -const _marko_node9 = _marko_createElement("div", { +const _marko_node9 = _marko_constElement("div", { "b": "1" -}, "21", null, 0, 0); -const _marko_node10 = _marko_createElement("div", null, "22", null, 1, 0).t("123 abc 123"); +}, 0); +const _marko_node10 = _marko_constElement("div", null, 1).t("123 abc 123"); import _marko_attrs from "marko/dist/runtime/vdom/helpers/attrs.js"; import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; diff --git a/packages/translator-default/test/fixtures/shorthand-classname/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/shorthand-classname/snapshots/vdomProduction-expected.js index 8b98d9694..94bf0c4be 100644 --- a/packages/translator-default/test/fixtures/shorthand-classname/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/shorthand-classname/snapshots/vdomProduction-expected.js @@ -2,16 +2,16 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "WqUsRyBC", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("div", { +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("div", { "class": "shorthand" -}, "0", null, 0, 1); -const _marko_node2 = _marko_createElement("div", { +}, 0); +const _marko_node2 = _marko_constElement("div", { "class": "shorthand1 shorthand2" -}, "1", null, 0, 1); -const _marko_node3 = _marko_createElement("div", { +}, 0); +const _marko_node3 = _marko_constElement("div", { "class": "shorthand1 shorthand2 inline" -}, "2", null, 0, 1); +}, 0); import _marko_class_merge from "marko/dist/runtime/helpers/class-value.js"; import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; diff --git a/packages/translator-default/test/fixtures/shorthand-id/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/shorthand-id/snapshots/vdomProduction-expected.js index 4588634c9..5bd4ce6cd 100644 --- a/packages/translator-default/test/fixtures/shorthand-id/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/shorthand-id/snapshots/vdomProduction-expected.js @@ -2,10 +2,10 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "wUxkdMJU", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("div", { +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("div", { "id": "shorthand" -}, "0", null, 0, 1); +}, 0); import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; _marko_registerComponent(_marko_componentType, () => _marko_template); diff --git a/packages/translator-default/test/fixtures/simple-attrs-tag/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/simple-attrs-tag/snapshots/vdomProduction-expected.js index d6a207810..a34b0a701 100644 --- a/packages/translator-default/test/fixtures/simple-attrs-tag/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/simple-attrs-tag/snapshots/vdomProduction-expected.js @@ -2,24 +2,24 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "YUZPhHIa", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("div", { +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("div", { "style": "c:1px", "class": "b", "id": "a" -}, "0", null, 0, 1); -const _marko_node2 = _marko_createElement("div", { +}, 0); +const _marko_node2 = _marko_constElement("div", { "style": "c:1px", "id": "a" -}, "1", null, 0, 1); -const _marko_node3 = _marko_createElement("div", { +}, 0); +const _marko_node3 = _marko_constElement("div", { "style": "c:1px" -}, "2", null, 0, 1); +}, 0); import "marko/dist/runtime/vdom/preserve-attrs.js"; -const _marko_node4 = _marko_createElement("div", { +const _marko_node4 = _marko_constElement("div", { "a": "1", "style": "c:1px" -}, "4", null, 0, 0); +}, 0); import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; _marko_registerComponent(_marko_componentType, () => _marko_template); diff --git a/packages/translator-default/test/fixtures/simple/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/simple/snapshots/vdomProduction-expected.js index 13bb3703a..8c8f10f68 100644 --- a/packages/translator-default/test/fixtures/simple/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/simple/snapshots/vdomProduction-expected.js @@ -2,8 +2,8 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "NRekT+g6", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("div", null, "2", null, 1, 0).t("No colors!"); +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("div", null, 1).t("No colors!"); import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; _marko_registerComponent(_marko_componentType, () => _marko_template); diff --git a/packages/translator-default/test/fixtures/split-component-with-component/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/split-component-with-component/snapshots/vdomProduction-expected.js index 72094877a..cd5b400fe 100644 --- a/packages/translator-default/test/fixtures/split-component-with-component/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/split-component-with-component/snapshots/vdomProduction-expected.js @@ -2,8 +2,8 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "Wgq3cfjm", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("div", null, "0", null, 0, 0); +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("div", null, 0); import _marko_component from "./template.component.js"; import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; diff --git a/packages/translator-default/test/fixtures/split-component/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/split-component/snapshots/vdomProduction-expected.js index b760b4d79..99750ad8f 100644 --- a/packages/translator-default/test/fixtures/split-component/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/split-component/snapshots/vdomProduction-expected.js @@ -2,8 +2,8 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "tgVjO8nX", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("div", null, "0", null, 0, 0); +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("div", null, 0); import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; import _marko_split_component from "./template.component-browser.js"; diff --git a/packages/translator-default/test/fixtures/style-block-empty/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/style-block-empty/snapshots/vdomProduction-expected.js index 577df77d6..1564cc9db 100644 --- a/packages/translator-default/test/fixtures/style-block-empty/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/style-block-empty/snapshots/vdomProduction-expected.js @@ -2,10 +2,10 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "iTWeM9Hv", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("div", { +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("div", { "class": "test" -}, "0", null, 0, 1); +}, 0); import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; _marko_registerComponent(_marko_componentType, () => _marko_template); diff --git a/packages/translator-default/test/fixtures/style-block-with-styles/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/style-block-with-styles/snapshots/vdomProduction-expected.js index 942f26ac2..5c66b550a 100644 --- a/packages/translator-default/test/fixtures/style-block-with-styles/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/style-block-with-styles/snapshots/vdomProduction-expected.js @@ -2,10 +2,10 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "ZsW3uNOB", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("div", { +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("div", { "class": "test" -}, "0", null, 0, 1); +}, 0); import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; _marko_registerComponent(_marko_componentType, () => _marko_template); diff --git a/packages/translator-default/test/fixtures/svg-tag/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/svg-tag/snapshots/vdomProduction-expected.js index 61a1e9455..be3100984 100644 --- a/packages/translator-default/test/fixtures/svg-tag/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/svg-tag/snapshots/vdomProduction-expected.js @@ -2,24 +2,24 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "LOy6P2CY", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("circle", { +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("circle", { "cx": "50", "cy": "50", "r": "40", "stroke": "black", "stroke-width": "3", "fill": "red" -}, "1", null, 0, 0); -const _marko_node2 = _marko_createElement("a", null, "2", null, 0, 0); -const _marko_node3 = _marko_createElement("style", null, "3", null, 1, 0).t("div { color: green }"); -const _marko_node4 = _marko_createElement("script", null, "4", null, 1, 0).t("alert(\"Hello\");"); -const _marko_node5 = _marko_createElement("title", null, "5", null, 1, 0).t("Test"); -const _marko_node6 = _marko_createElement("text", { +}, 0); +const _marko_node2 = _marko_constElement("a", null, 0); +const _marko_node3 = _marko_constElement("style", null, 1).t("div { color: green }"); +const _marko_node4 = _marko_constElement("script", null, 1).t("alert(\"Hello\");"); +const _marko_node5 = _marko_constElement("title", null, 1).t("Test"); +const _marko_node6 = _marko_constElement("text", { "x": "10", "y": "25" -}, "7", null, 1, 0).t("MDN Web Docs"); -const _marko_node7 = _marko_createElement("a", null, "8", null, 0, 0); +}, 1).t("MDN Web Docs"); +const _marko_node7 = _marko_constElement("a", null, 0); import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; _marko_registerComponent(_marko_componentType, () => _marko_template); diff --git a/packages/translator-default/test/fixtures/tag-with-default-attr/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/tag-with-default-attr/snapshots/vdomProduction-expected.js index cdaf73807..0c91ed5a7 100644 --- a/packages/translator-default/test/fixtures/tag-with-default-attr/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/tag-with-default-attr/snapshots/vdomProduction-expected.js @@ -2,11 +2,11 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "d4MwwGDt", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("div", { +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("div", { "value": "" -}, "0", null, 0, 0); -const _marko_node2 = _marko_createElement("div", null, "1", null, 0, 0); +}, 0); +const _marko_node2 = _marko_constElement("div", null, 0); import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; _marko_registerComponent(_marko_componentType, () => _marko_template); diff --git a/packages/translator-default/test/fixtures/textarea-tag/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/textarea-tag/snapshots/vdomProduction-expected.js index 8518aa048..43c7193ec 100644 --- a/packages/translator-default/test/fixtures/textarea-tag/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/textarea-tag/snapshots/vdomProduction-expected.js @@ -2,8 +2,8 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "or1T1BHP", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("textarea", null, "0", null, 1, 0).t("\n hello world\n"); +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("textarea", null, 1).t("\n hello world\n"); import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; _marko_registerComponent(_marko_componentType, () => _marko_template); diff --git a/packages/translator-default/test/fixtures/white-space-test/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/white-space-test/snapshots/vdomProduction-expected.js index d5602b2b9..985ad8239 100644 --- a/packages/translator-default/test/fixtures/white-space-test/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/white-space-test/snapshots/vdomProduction-expected.js @@ -2,9 +2,9 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "TRrwGTtp", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_createElement from "marko/dist/runtime/vdom/helpers/v-element.js"; -const _marko_node = _marko_createElement("div", null, "0", null, 4, 0).e("div", null, "1", null, 3, 0).t("Hello ").e("div", null, "2", null, 1, 0).t(" ").t(" World").e("div", null, "3", null, 1, 0).t(" Hello").e("pre", null, "4", null, 1, 0).t("\n This should \n be preserved\n ").e("div", null, "5", null, 1, 0).e("div", null, "6", null, 1, 0).t("Hello "); -const _marko_node2 = _marko_createElement("div", null, "8", null, 0, 0); +import _marko_constElement from "marko/dist/runtime/vdom/helpers/const-element.js"; +const _marko_node = _marko_constElement("div", null, 4).e("div", null, 3).t("Hello ").e("div", null, 1).t(" ").t(" World").e("div", null, 1).t(" Hello").e("pre", null, 1).t("\n This should \n be preserved\n ").e("div", null, 1).e("div", null, 1).t("Hello "); +const _marko_node2 = _marko_constElement("div", null, 0); import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; _marko_registerComponent(_marko_componentType, () => _marko_template); From a87b69212f8b204dbe3d5a1396d95ddafd1adb85 Mon Sep 17 00:00:00 2001 From: dpiercey Date: Thu, 15 Feb 2024 15:59:15 -0700 Subject: [PATCH 02/20] fix: diffing edge cases --- .changeset/red-panthers-own.md | 6 ++ .../marko/src/runtime/vdom/morphdom/index.js | 55 ++++++++++++++----- .../components/app-hello/index.marko | 1 + .../index.marko | 19 +++++++ .../test.js | 17 ++++++ .../components/app-hello/index.marko | 1 + .../index.marko | 19 +++++++ .../test.js | 21 +++++++ 8 files changed, 125 insertions(+), 14 deletions(-) create mode 100644 .changeset/red-panthers-own.md create mode 100644 packages/marko/test/components-browser/fixtures/diffpatch-existing-key-component-to-element/components/app-hello/index.marko create mode 100644 packages/marko/test/components-browser/fixtures/diffpatch-existing-key-component-to-element/index.marko create mode 100644 packages/marko/test/components-browser/fixtures/diffpatch-existing-key-component-to-element/test.js create mode 100644 packages/marko/test/components-browser/fixtures/diffpatch-existing-key-component-to-fragment/components/app-hello/index.marko create mode 100644 packages/marko/test/components-browser/fixtures/diffpatch-existing-key-component-to-fragment/index.marko create mode 100644 packages/marko/test/components-browser/fixtures/diffpatch-existing-key-component-to-fragment/test.js diff --git a/.changeset/red-panthers-own.md b/.changeset/red-panthers-own.md new file mode 100644 index 000000000..57bc70799 --- /dev/null +++ b/.changeset/red-panthers-own.md @@ -0,0 +1,6 @@ +--- +"@marko/translator-default": patch +"marko": patch +--- + +Fix diffing issues when swapping keyed elements between native tags, custom tags and fragments. diff --git a/packages/marko/src/runtime/vdom/morphdom/index.js b/packages/marko/src/runtime/vdom/morphdom/index.js index 666597c19..4c7c89d3c 100644 --- a/packages/marko/src/runtime/vdom/morphdom/index.js +++ b/packages/marko/src/runtime/vdom/morphdom/index.js @@ -281,13 +281,26 @@ function morphdom(fromNode, toNode, host, componentsContext) { if (!curToNodeChild.___preserve) { // We just skip over the fromNode if it is preserved - if (compareNodeNames(curToNodeChild, curVFromNodeChild)) { - morphEl( - curFromNodeChild, - curVFromNodeChild, - curToNodeChild, - parentComponent, - ); + if ( + curVFromNodeChild && + curToNodeType === curVFromNodeChild.___nodeType && + (curToNodeType !== ELEMENT_NODE || + compareNodeNames(curToNodeChild, curVFromNodeChild)) + ) { + if (curToNodeType === ELEMENT_NODE) { + morphEl( + curFromNodeChild, + curVFromNodeChild, + curToNodeChild, + parentComponent, + ); + } else { + morphChildren( + curFromNodeChild, + curToNodeChild, + parentComponent, + ); + } } else { // Remove the old node detachNode(curFromNodeChild, fromNode, ownerComponent); @@ -404,7 +417,12 @@ function morphdom(fromNode, toNode, host, componentsContext) { if (!curToNodeChild.___preserve) { curVFromNodeChild = vElementByDOMNode.get(matchingFromEl); - if (compareNodeNames(curVFromNodeChild, curToNodeChild)) { + if ( + curVFromNodeChild && + curToNodeType === curVFromNodeChild.___nodeType && + (curToNodeType !== ELEMENT_NODE || + compareNodeNames(curVFromNodeChild, curToNodeChild)) + ) { if (fromNextSibling === matchingFromEl) { // Single element removal: // A <-> A @@ -455,12 +473,21 @@ function morphdom(fromNode, toNode, host, componentsContext) { } } - morphEl( - matchingFromEl, - curVFromNodeChild, - curToNodeChild, - parentComponent, - ); + if (curToNodeType === ELEMENT_NODE) { + morphEl( + matchingFromEl, + curVFromNodeChild, + curToNodeChild, + parentComponent + ); + } else { + morphChildren( + matchingFromEl, + curToNodeChild, + parentComponent, + ); + } + } else { insertVirtualNodeBefore( curToNodeChild, diff --git a/packages/marko/test/components-browser/fixtures/diffpatch-existing-key-component-to-element/components/app-hello/index.marko b/packages/marko/test/components-browser/fixtures/diffpatch-existing-key-component-to-element/components/app-hello/index.marko new file mode 100644 index 000000000..0fd9beb67 --- /dev/null +++ b/packages/marko/test/components-browser/fixtures/diffpatch-existing-key-component-to-element/components/app-hello/index.marko @@ -0,0 +1 @@ +
Hello
diff --git a/packages/marko/test/components-browser/fixtures/diffpatch-existing-key-component-to-element/index.marko b/packages/marko/test/components-browser/fixtures/diffpatch-existing-key-component-to-element/index.marko new file mode 100644 index 000000000..75253a6b6 --- /dev/null +++ b/packages/marko/test/components-browser/fixtures/diffpatch-existing-key-component-to-element/index.marko @@ -0,0 +1,19 @@ +import Hello from "./components/app-hello/index.marko" +class { + onCreate() { + this.state = { + tagName: Hello + } + } + toggle() { + this.state.tagName = this.state.tagName === Hello ? "div" : Hello; + } +} + +
+ <${state.tagName}/> + <${state.tagName} key="a"/> + +
+ +
diff --git a/packages/marko/test/components-browser/fixtures/diffpatch-existing-key-component-to-element/test.js b/packages/marko/test/components-browser/fixtures/diffpatch-existing-key-component-to-element/test.js new file mode 100644 index 000000000..600c828b6 --- /dev/null +++ b/packages/marko/test/components-browser/fixtures/diffpatch-existing-key-component-to-element/test.js @@ -0,0 +1,17 @@ +var expect = require("chai").expect; + +module.exports = function (helpers) { + var component = helpers.mount(require.resolve("./index.marko")); + + var renderTarget = component.getEl("renderTarget"); + expect(renderTarget.innerHTML).to.equal("
Hello
Hello
"); + component.toggle(); + component.update(); + expect(renderTarget.innerHTML).to.equal("
"); + component.toggle(); + component.update(); + expect(renderTarget.innerHTML).to.equal("
Hello
Hello
"); + component.toggle(); + component.update(); + expect(renderTarget.innerHTML).to.equal("
"); +}; diff --git a/packages/marko/test/components-browser/fixtures/diffpatch-existing-key-component-to-fragment/components/app-hello/index.marko b/packages/marko/test/components-browser/fixtures/diffpatch-existing-key-component-to-fragment/components/app-hello/index.marko new file mode 100644 index 000000000..0fd9beb67 --- /dev/null +++ b/packages/marko/test/components-browser/fixtures/diffpatch-existing-key-component-to-fragment/components/app-hello/index.marko @@ -0,0 +1 @@ +
Hello
diff --git a/packages/marko/test/components-browser/fixtures/diffpatch-existing-key-component-to-fragment/index.marko b/packages/marko/test/components-browser/fixtures/diffpatch-existing-key-component-to-fragment/index.marko new file mode 100644 index 000000000..e6ca4ef92 --- /dev/null +++ b/packages/marko/test/components-browser/fixtures/diffpatch-existing-key-component-to-fragment/index.marko @@ -0,0 +1,19 @@ +class { + onCreate() { + this.state = { + toggle: false + } + } + toggle() { + this.state.toggle = !this.state.toggle; + } +} + + + + <${renderBody} key=state.toggle ? "c" : "b"/> + + +
+ A +
diff --git a/packages/marko/test/components-browser/fixtures/diffpatch-existing-key-component-to-fragment/test.js b/packages/marko/test/components-browser/fixtures/diffpatch-existing-key-component-to-fragment/test.js new file mode 100644 index 000000000..1c31a25f7 --- /dev/null +++ b/packages/marko/test/components-browser/fixtures/diffpatch-existing-key-component-to-fragment/test.js @@ -0,0 +1,21 @@ +var expect = require("chai").expect; + +module.exports = function (helpers) { + var component = helpers.mount(require.resolve("./index.marko")); + + var renderTarget = component.getEl("renderTarget"); + expect(renderTarget.innerHTML).to.equal("
Hello
A"); + component.toggle(); + component.update(); + expect(renderTarget.innerHTML).to.equal( + "
Hello
A", + ); + component.toggle(); + component.update(); + expect(renderTarget.innerHTML).to.equal("
Hello
A"); + component.toggle(); + component.update(); + expect(renderTarget.innerHTML).to.equal( + "
Hello
A", + ); +}; From 9648f0fb852c16ba0033d4b97f5ed00b2db85888 Mon Sep 17 00:00:00 2001 From: DylanPiercey Date: Thu, 15 Feb 2024 23:03:07 +0000 Subject: [PATCH 03/20] [ci] format --- packages/marko/src/runtime/vdom/morphdom/index.js | 3 +-- .../diffpatch-existing-key-component-to-fragment/test.js | 8 ++------ .../translator-default/src/tag/native-tag[vdom]/index.js | 4 +--- 3 files changed, 4 insertions(+), 11 deletions(-) diff --git a/packages/marko/src/runtime/vdom/morphdom/index.js b/packages/marko/src/runtime/vdom/morphdom/index.js index 4c7c89d3c..7c580788c 100644 --- a/packages/marko/src/runtime/vdom/morphdom/index.js +++ b/packages/marko/src/runtime/vdom/morphdom/index.js @@ -478,7 +478,7 @@ function morphdom(fromNode, toNode, host, componentsContext) { matchingFromEl, curVFromNodeChild, curToNodeChild, - parentComponent + parentComponent, ); } else { morphChildren( @@ -487,7 +487,6 @@ function morphdom(fromNode, toNode, host, componentsContext) { parentComponent, ); } - } else { insertVirtualNodeBefore( curToNodeChild, diff --git a/packages/marko/test/components-browser/fixtures/diffpatch-existing-key-component-to-fragment/test.js b/packages/marko/test/components-browser/fixtures/diffpatch-existing-key-component-to-fragment/test.js index 1c31a25f7..3f59b4385 100644 --- a/packages/marko/test/components-browser/fixtures/diffpatch-existing-key-component-to-fragment/test.js +++ b/packages/marko/test/components-browser/fixtures/diffpatch-existing-key-component-to-fragment/test.js @@ -7,15 +7,11 @@ module.exports = function (helpers) { expect(renderTarget.innerHTML).to.equal("
Hello
A"); component.toggle(); component.update(); - expect(renderTarget.innerHTML).to.equal( - "
Hello
A", - ); + expect(renderTarget.innerHTML).to.equal("
Hello
A"); component.toggle(); component.update(); expect(renderTarget.innerHTML).to.equal("
Hello
A"); component.toggle(); component.update(); - expect(renderTarget.innerHTML).to.equal( - "
Hello
A", - ); + expect(renderTarget.innerHTML).to.equal("
Hello
A"); }; diff --git a/packages/translator-default/src/tag/native-tag[vdom]/index.js b/packages/translator-default/src/tag/native-tag[vdom]/index.js index 21f6405af..ca3f712f3 100644 --- a/packages/translator-default/src/tag/native-tag[vdom]/index.js +++ b/packages/translator-default/src/tag/native-tag[vdom]/index.js @@ -109,9 +109,7 @@ function tagArguments(path) { attrsObj, key, file._componentInstanceIdentifier, - body.length - ? t.nullLiteral() - : t.numericLiteral(0), + body.length ? t.nullLiteral() : t.numericLiteral(0), ]; if (node.preserveAttrs) { From 0c6b9bd569adf188771d741b9c33924d3f50d632 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 15 Feb 2024 23:14:46 +0000 Subject: [PATCH 04/20] [ci] release --- .changeset/gentle-dogs-hammer.md | 6 ------ .changeset/red-panthers-own.md | 6 ------ package-lock.json | 8 ++++---- packages/marko/CHANGELOG.md | 11 +++++++++++ packages/marko/package.json | 4 ++-- packages/translator-default/CHANGELOG.md | 8 ++++++++ packages/translator-default/package.json | 4 ++-- 7 files changed, 27 insertions(+), 20 deletions(-) delete mode 100644 .changeset/gentle-dogs-hammer.md delete mode 100644 .changeset/red-panthers-own.md diff --git a/.changeset/gentle-dogs-hammer.md b/.changeset/gentle-dogs-hammer.md deleted file mode 100644 index 7a9ad9c74..000000000 --- a/.changeset/gentle-dogs-hammer.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@marko/translator-default": patch -"marko": patch ---- - -Fix and optimize the output for vdom hoisting. diff --git a/.changeset/red-panthers-own.md b/.changeset/red-panthers-own.md deleted file mode 100644 index 57bc70799..000000000 --- a/.changeset/red-panthers-own.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@marko/translator-default": patch -"marko": patch ---- - -Fix diffing issues when swapping keyed elements between native tags, custom tags and fragments. diff --git a/package-lock.json b/package-lock.json index cf17cc5d5..05ad35a88 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11940,11 +11940,11 @@ "license": "Apache-2.0" }, "packages/marko": { - "version": "5.32.7", + "version": "5.32.8", "license": "MIT", "dependencies": { "@marko/compiler": "^5.34.6", - "@marko/translator-default": "^5.31.13", + "@marko/translator-default": "^5.31.14", "app-module-path": "^2.2.0", "argly": "^1.2.0", "browser-refresh-client": "1.1.4", @@ -11968,7 +11968,7 @@ }, "packages/translator-default": { "name": "@marko/translator-default", - "version": "5.31.13", + "version": "5.31.14", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.8", @@ -11978,7 +11978,7 @@ }, "devDependencies": { "@marko/compiler": "^5.34.6", - "marko": "^5.32.7" + "marko": "^5.32.8" }, "peerDependencies": { "@marko/compiler": "^5.16.1", diff --git a/packages/marko/CHANGELOG.md b/packages/marko/CHANGELOG.md index fb0c4fa9e..868105fab 100644 --- a/packages/marko/CHANGELOG.md +++ b/packages/marko/CHANGELOG.md @@ -1,5 +1,16 @@ # Change Log +## 5.32.8 + +### Patch Changes + +- [#2108](https://github.com/marko-js/marko/pull/2108) [`9a18ced`](https://github.com/marko-js/marko/commit/9a18ced27b04b6fbd391d84c61d97269bcf7f851) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix and optimize the output for vdom hoisting. + +- [#2108](https://github.com/marko-js/marko/pull/2108) [`a87b692`](https://github.com/marko-js/marko/commit/a87b69212f8b204dbe3d5a1396d95ddafd1adb85) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix diffing issues when swapping keyed elements between native tags, custom tags and fragments. + +- Updated dependencies [[`9a18ced`](https://github.com/marko-js/marko/commit/9a18ced27b04b6fbd391d84c61d97269bcf7f851), [`a87b692`](https://github.com/marko-js/marko/commit/a87b69212f8b204dbe3d5a1396d95ddafd1adb85)]: + - @marko/translator-default@5.31.14 + ## 5.32.7 ### Patch Changes diff --git a/packages/marko/package.json b/packages/marko/package.json index e43bfc6d5..86e169061 100644 --- a/packages/marko/package.json +++ b/packages/marko/package.json @@ -1,6 +1,6 @@ { "name": "marko", - "version": "5.32.7", + "version": "5.32.8", "description": "UI Components + streaming, async, high performance, HTML templating for Node.js and the browser.", "keywords": [ "front-end", @@ -65,7 +65,7 @@ }, "dependencies": { "@marko/compiler": "^5.34.6", - "@marko/translator-default": "^5.31.13", + "@marko/translator-default": "^5.31.14", "app-module-path": "^2.2.0", "argly": "^1.2.0", "browser-refresh-client": "1.1.4", diff --git a/packages/translator-default/CHANGELOG.md b/packages/translator-default/CHANGELOG.md index e32f373a5..fc3f863bd 100644 --- a/packages/translator-default/CHANGELOG.md +++ b/packages/translator-default/CHANGELOG.md @@ -1,5 +1,13 @@ # Change Log +## 5.31.14 + +### Patch Changes + +- [#2108](https://github.com/marko-js/marko/pull/2108) [`9a18ced`](https://github.com/marko-js/marko/commit/9a18ced27b04b6fbd391d84c61d97269bcf7f851) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix and optimize the output for vdom hoisting. + +- [#2108](https://github.com/marko-js/marko/pull/2108) [`a87b692`](https://github.com/marko-js/marko/commit/a87b69212f8b204dbe3d5a1396d95ddafd1adb85) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Fix diffing issues when swapping keyed elements between native tags, custom tags and fragments. + ## 5.31.13 ### Patch Changes diff --git a/packages/translator-default/package.json b/packages/translator-default/package.json index ee3dfd07d..f8f81d7ab 100644 --- a/packages/translator-default/package.json +++ b/packages/translator-default/package.json @@ -1,6 +1,6 @@ { "name": "@marko/translator-default", - "version": "5.31.13", + "version": "5.31.14", "description": "Translates Marko templates to the default Marko runtime.", "keywords": [ "babel", @@ -35,7 +35,7 @@ }, "devDependencies": { "@marko/compiler": "^5.34.6", - "marko": "^5.32.7" + "marko": "^5.32.8" }, "peerDependencies": { "@marko/compiler": "^5.16.1", From 022879da1a7589f6207d7bbf47b97d1a2d596781 Mon Sep 17 00:00:00 2001 From: Luke LaValva Date: Fri, 16 Feb 2024 13:26:49 -0800 Subject: [PATCH 05/20] feat: add componentIdPrefix to await id (#2111) * feat: add componentIdPrefix to await id * chore: add changeset * fix: update to also use runtimeId * chore: change to patch --- .changeset/modern-tigers-cheat.md | 5 +++ .../src/core-tags/core/await/renderer.js | 10 ++++-- .../core/await/reorderer-renderer.js | 14 ++++++--- .../expected.html | 2 +- .../expected.html | 2 +- .../await-client-reorder-mixed/expected.html | 2 +- .../await-client-reorder/expected.html | 2 +- .../expected.html | 2 +- .../expected.html | 2 +- .../await-client-reorder-mixed/expected.html | 2 +- .../expected-events-vdom.json | 24 ++++++++++++++ .../expected-events.json | 30 ++++++++++++++++++ .../expected.html | 1 + .../template.marko | 8 +++++ .../test.js | 31 +++++++++++++++++++ .../await-client-reorder/expected.html | 2 +- 16 files changed, 124 insertions(+), 15 deletions(-) create mode 100644 .changeset/modern-tigers-cheat.md create mode 100644 packages/marko/test/render/fixtures/await-client-reorder-with-runtimeId/expected-events-vdom.json create mode 100644 packages/marko/test/render/fixtures/await-client-reorder-with-runtimeId/expected-events.json create mode 100644 packages/marko/test/render/fixtures/await-client-reorder-with-runtimeId/expected.html create mode 100644 packages/marko/test/render/fixtures/await-client-reorder-with-runtimeId/template.marko create mode 100644 packages/marko/test/render/fixtures/await-client-reorder-with-runtimeId/test.js diff --git a/.changeset/modern-tigers-cheat.md b/.changeset/modern-tigers-cheat.md new file mode 100644 index 000000000..62655f5da --- /dev/null +++ b/.changeset/modern-tigers-cheat.md @@ -0,0 +1,5 @@ +--- +"marko": patch +--- + +add componentIdPrefix to id of await client-reorder diff --git a/packages/marko/src/core-tags/core/await/renderer.js b/packages/marko/src/core-tags/core/await/renderer.js index 89a2e8a2a..673e47d4e 100644 --- a/packages/marko/src/core-tags/core/await/renderer.js +++ b/packages/marko/src/core-tags/core/await/renderer.js @@ -115,8 +115,14 @@ module.exports = function awaitTag(input, out) { nextId: 0, }); - var id = (awaitInfo.id = input.name || clientReorderContext.nextId++); - var placeholderIdAttrValue = "afph" + id; + /** SHOULD MATCH THE reorder-renderer.js IMPLEMENTATION */ + var reorderFunctionId = + out.global.runtimeId !== "M" ? "af" + out.global.runtimeId : "af"; + + var id = (awaitInfo.id = + input.name || + (out.global.componentIdPrefix || 0) + clientReorderContext.nextId++); + var placeholderIdAttrValue = reorderFunctionId + "ph" + id; if (placeholderRenderer) { out.write(''); diff --git a/packages/marko/src/core-tags/core/await/reorderer-renderer.js b/packages/marko/src/core-tags/core/await/reorderer-renderer.js index 4b8ecedce..671f67f61 100644 --- a/packages/marko/src/core-tags/core/await/reorderer-renderer.js +++ b/packages/marko/src/core-tags/core/await/reorderer-renderer.js @@ -24,6 +24,10 @@ module.exports = function (input, out) { out.flush(); } + /** SHOULD MATCH THE renderer.js IMPLEMENTATION */ + var reorderFunctionId = + out.global.runtimeId !== "M" ? "af" + out.global.runtimeId : "af"; + var asyncOut = out.beginAsync({ last: true, timeout: -1, @@ -52,7 +56,7 @@ module.exports = function (input, out) { if (!global._afRuntime) { // Minified version of ./client-reorder-runtime.js asyncOut.script( - `function $af(d,a,e,l,g,h,k,b,f,c){c=$af;if(a&&!c[a])(c[a+="$"]||(c[a]=[])).push(d);else{e=document;l=e.getElementById("af"+d);g=e.getElementById("afph"+d);h=e.createDocumentFragment();k=l.childNodes;b=0;for(f=k.length;b' + - "#af" + + `#${reorderFunctionId}` + awaitInfo.id + "{display:none;}" + "" + - '
' + result.toString() + @@ -74,7 +78,7 @@ module.exports = function (input, out) { ); } else { asyncOut.write( - ' \ No newline at end of file + at packages/translator-default/test/fixtures/error-at-tags-native-tag-parent/template.marko:3:6 + 1 |
+ 2 | + > 3 | <@header class="my-header"> + | ^^^^^^^ @tags must be nested within another element. + 4 | Header content + 5 | + 6 | \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-at-tags-native-tag-parent/snapshots/html-error-expected.txt b/packages/translator-default/test/fixtures/error-at-tags-native-tag-parent/snapshots/html-error-expected.txt index 45088d7aa..8f80f0c67 100644 --- a/packages/translator-default/test/fixtures/error-at-tags-native-tag-parent/snapshots/html-error-expected.txt +++ b/packages/translator-default/test/fixtures/error-at-tags-native-tag-parent/snapshots/html-error-expected.txt @@ -1,9 +1,9 @@ CompileError: - at packages/translator-default/test/fixtures/error-at-tags-native-tag-parent/template.marko:9:6 - 7 | Body content - 8 | - > 9 | <@footer class="my-footer"> - | ^^^^^^^ @tags must be within a custom element. - 10 | Footer content - 11 | - 12 |
\ No newline at end of file + at packages/translator-default/test/fixtures/error-at-tags-native-tag-parent/template.marko:3:6 + 1 |
+ 2 | + > 3 | <@header class="my-header"> + | ^^^^^^^ @tags must be nested within another element. + 4 | Header content + 5 | + 6 | \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-at-tags-native-tag-parent/snapshots/htmlProduction-error-expected.txt b/packages/translator-default/test/fixtures/error-at-tags-native-tag-parent/snapshots/htmlProduction-error-expected.txt index 45088d7aa..8f80f0c67 100644 --- a/packages/translator-default/test/fixtures/error-at-tags-native-tag-parent/snapshots/htmlProduction-error-expected.txt +++ b/packages/translator-default/test/fixtures/error-at-tags-native-tag-parent/snapshots/htmlProduction-error-expected.txt @@ -1,9 +1,9 @@ CompileError: - at packages/translator-default/test/fixtures/error-at-tags-native-tag-parent/template.marko:9:6 - 7 | Body content - 8 | - > 9 | <@footer class="my-footer"> - | ^^^^^^^ @tags must be within a custom element. - 10 | Footer content - 11 | - 12 |
\ No newline at end of file + at packages/translator-default/test/fixtures/error-at-tags-native-tag-parent/template.marko:3:6 + 1 |
+ 2 | + > 3 | <@header class="my-header"> + | ^^^^^^^ @tags must be nested within another element. + 4 | Header content + 5 | + 6 | \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-at-tags-native-tag-parent/snapshots/vdom-error-expected.txt b/packages/translator-default/test/fixtures/error-at-tags-native-tag-parent/snapshots/vdom-error-expected.txt index 45088d7aa..8f80f0c67 100644 --- a/packages/translator-default/test/fixtures/error-at-tags-native-tag-parent/snapshots/vdom-error-expected.txt +++ b/packages/translator-default/test/fixtures/error-at-tags-native-tag-parent/snapshots/vdom-error-expected.txt @@ -1,9 +1,9 @@ CompileError: - at packages/translator-default/test/fixtures/error-at-tags-native-tag-parent/template.marko:9:6 - 7 | Body content - 8 | - > 9 | <@footer class="my-footer"> - | ^^^^^^^ @tags must be within a custom element. - 10 | Footer content - 11 | - 12 |
\ No newline at end of file + at packages/translator-default/test/fixtures/error-at-tags-native-tag-parent/template.marko:3:6 + 1 |
+ 2 | + > 3 | <@header class="my-header"> + | ^^^^^^^ @tags must be nested within another element. + 4 | Header content + 5 | + 6 | \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-at-tags-native-tag-parent/snapshots/vdomProduction-error-expected.txt b/packages/translator-default/test/fixtures/error-at-tags-native-tag-parent/snapshots/vdomProduction-error-expected.txt index 45088d7aa..8f80f0c67 100644 --- a/packages/translator-default/test/fixtures/error-at-tags-native-tag-parent/snapshots/vdomProduction-error-expected.txt +++ b/packages/translator-default/test/fixtures/error-at-tags-native-tag-parent/snapshots/vdomProduction-error-expected.txt @@ -1,9 +1,9 @@ CompileError: - at packages/translator-default/test/fixtures/error-at-tags-native-tag-parent/template.marko:9:6 - 7 | Body content - 8 | - > 9 | <@footer class="my-footer"> - | ^^^^^^^ @tags must be within a custom element. - 10 | Footer content - 11 | - 12 |
\ No newline at end of file + at packages/translator-default/test/fixtures/error-at-tags-native-tag-parent/template.marko:3:6 + 1 |
+ 2 | + > 3 | <@header class="my-header"> + | ^^^^^^^ @tags must be nested within another element. + 4 | Header content + 5 | + 6 | \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/cjs-error-expected.txt b/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/cjs-error-expected.txt deleted file mode 100644 index 49b3ce9e6..000000000 --- a/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/cjs-error-expected.txt +++ /dev/null @@ -1,8 +0,0 @@ -packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/template.marko(5,6): Only one "@header" tag is allowed here. - 3 | Header content - 4 | -> 5 | <@header class="my-header"> - | ^^^^^^^ - 6 | Header content - 7 | - 8 | \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/cjs-expected.js b/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/cjs-expected.js index a547ad387..ae202542a 100644 --- a/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/cjs-expected.js +++ b/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/cjs-expected.js @@ -3,7 +3,7 @@ exports.__esModule = true; exports.default = void 0; var _index = require("marko/src/runtime/html/index.js"); -var _selfIterator = _interopRequireDefault(require("marko/src/runtime/helpers/self-iterator.js")); +var _attrTag = require("marko/src/runtime/helpers/attr-tag.js"); var _index2 = _interopRequireDefault(require("./components/some-tag/index.marko")); var _renderTag = _interopRequireDefault(require("marko/src/runtime/helpers/render-tag.js")); var _renderer = _interopRequireDefault(require("marko/src/runtime/components/renderer.js")); @@ -13,21 +13,20 @@ const _marko_componentType = "packages/translator-default/test/fixtures/error-at var _default = exports.default = _marko_template; const _marko_component = {}; _marko_template._ = (0, _renderer.default)(function (input, out, _componentDef, _component, state, $global) { - (0, _renderTag.default)(_index2.default, { - "header": [{ + (0, _renderTag.default)(_index2.default, (0, _attrTag.i)(() => { + (0, _attrTag.a)("header", { "class": "my-header", "renderBody": out => { out.w("Header content"); - }, - [Symbol.iterator]: _selfIterator.default - }, { + } + }); + (0, _attrTag.a)("header", { "class": "my-header", "renderBody": out => { out.w("Header content"); - }, - [Symbol.iterator]: _selfIterator.default - }] - }, out, _componentDef, "0"); + } + }); + }), out, _componentDef, "0"); }, { t: _marko_componentType, i: true, diff --git a/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/html-error-expected.txt b/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/html-error-expected.txt deleted file mode 100644 index 49b3ce9e6..000000000 --- a/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/html-error-expected.txt +++ /dev/null @@ -1,8 +0,0 @@ -packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/template.marko(5,6): Only one "@header" tag is allowed here. - 3 | Header content - 4 | -> 5 | <@header class="my-header"> - | ^^^^^^^ - 6 | Header content - 7 | - 8 | \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/html-expected.js b/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/html-expected.js index 170e78325..802cca015 100644 --- a/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/html-expected.js +++ b/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/html-expected.js @@ -2,27 +2,26 @@ import { t as _t } from "marko/src/runtime/html/index.js"; const _marko_componentType = "packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/template.marko", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_self_iterator from "marko/src/runtime/helpers/self-iterator.js"; +import { a as _marko_repeatable_attr_tag, i as _marko_render_input } from "marko/src/runtime/helpers/attr-tag.js"; import _someTag from "./components/some-tag/index.marko"; import _marko_tag from "marko/src/runtime/helpers/render-tag.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) { - _marko_tag(_someTag, { - "header": [{ + _marko_tag(_someTag, _marko_render_input(() => { + _marko_repeatable_attr_tag("header", { "class": "my-header", "renderBody": out => { out.w("Header content"); - }, - [Symbol.iterator]: _marko_self_iterator - }, { + } + }); + _marko_repeatable_attr_tag("header", { "class": "my-header", "renderBody": out => { out.w("Header content"); - }, - [Symbol.iterator]: _marko_self_iterator - }] - }, out, _componentDef, "0"); + } + }); + }), out, _componentDef, "0"); }, { t: _marko_componentType, i: true, diff --git a/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/htmlProduction-error-expected.txt b/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/htmlProduction-error-expected.txt deleted file mode 100644 index 49b3ce9e6..000000000 --- a/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/htmlProduction-error-expected.txt +++ /dev/null @@ -1,8 +0,0 @@ -packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/template.marko(5,6): Only one "@header" tag is allowed here. - 3 | Header content - 4 | -> 5 | <@header class="my-header"> - | ^^^^^^^ - 6 | Header content - 7 | - 8 | \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/htmlProduction-expected.js b/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/htmlProduction-expected.js index 2497293df..8ea3dba20 100644 --- a/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/htmlProduction-expected.js +++ b/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/htmlProduction-expected.js @@ -2,27 +2,26 @@ import { t as _t } from "marko/dist/runtime/html/index.js"; const _marko_componentType = "QmMQupx3", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_self_iterator from "marko/dist/runtime/helpers/self-iterator.js"; +import { a as _marko_repeatable_attr_tag, i as _marko_render_input } from "marko/dist/runtime/helpers/attr-tag.js"; import _someTag from "./components/some-tag/index.marko"; import _marko_tag from "marko/dist/runtime/helpers/render-tag.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) { - _marko_tag(_someTag, { - "header": [{ + _marko_tag(_someTag, _marko_render_input(() => { + _marko_repeatable_attr_tag("header", { "class": "my-header", "renderBody": out => { out.w("Header content"); - }, - [Symbol.iterator]: _marko_self_iterator - }, { + } + }); + _marko_repeatable_attr_tag("header", { "class": "my-header", "renderBody": out => { out.w("Header content"); - }, - [Symbol.iterator]: _marko_self_iterator - }] - }, out, _componentDef, "0"); + } + }); + }), out, _componentDef, "0"); }, { t: _marko_componentType, i: true diff --git a/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/vdom-error-expected.txt b/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/vdom-error-expected.txt deleted file mode 100644 index 49b3ce9e6..000000000 --- a/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/vdom-error-expected.txt +++ /dev/null @@ -1,8 +0,0 @@ -packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/template.marko(5,6): Only one "@header" tag is allowed here. - 3 | Header content - 4 | -> 5 | <@header class="my-header"> - | ^^^^^^^ - 6 | Header content - 7 | - 8 | \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/vdom-expected.js b/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/vdom-expected.js index 2764e26bb..db835cf72 100644 --- a/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/vdom-expected.js +++ b/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/vdom-expected.js @@ -2,7 +2,7 @@ import { t as _t } from "marko/src/runtime/vdom/index.js"; const _marko_componentType = "packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/template.marko", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_self_iterator from "marko/src/runtime/helpers/self-iterator.js"; +import { a as _marko_repeatable_attr_tag, i as _marko_render_input } from "marko/src/runtime/helpers/attr-tag.js"; import _someTag from "./components/some-tag/index.marko"; import _marko_tag from "marko/src/runtime/helpers/render-tag.js"; import _marko_renderer from "marko/src/runtime/components/renderer.js"; @@ -10,21 +10,20 @@ import { r as _marko_registerComponent } from "marko/src/runtime/components/regi _marko_registerComponent(_marko_componentType, () => _marko_template); const _marko_component = {}; _marko_template._ = _marko_renderer(function (input, out, _componentDef, _component, state, $global) { - _marko_tag(_someTag, { - "header": [{ + _marko_tag(_someTag, _marko_render_input(() => { + _marko_repeatable_attr_tag("header", { "class": "my-header", "renderBody": out => { out.t("Header content", _component); - }, - [Symbol.iterator]: _marko_self_iterator - }, { + } + }); + _marko_repeatable_attr_tag("header", { "class": "my-header", "renderBody": out => { out.t("Header content", _component); - }, - [Symbol.iterator]: _marko_self_iterator - }] - }, out, _componentDef, "0"); + } + }); + }), out, _componentDef, "0"); }, { t: _marko_componentType, i: true, diff --git a/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/vdomProduction-error-expected.txt b/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/vdomProduction-error-expected.txt deleted file mode 100644 index 49b3ce9e6..000000000 --- a/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/vdomProduction-error-expected.txt +++ /dev/null @@ -1,8 +0,0 @@ -packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/template.marko(5,6): Only one "@header" tag is allowed here. - 3 | Header content - 4 | -> 5 | <@header class="my-header"> - | ^^^^^^^ - 6 | Header content - 7 | - 8 | \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/vdomProduction-expected.js index 180102098..fd036b493 100644 --- a/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/error-at-tags-repeated-not-allowed/snapshots/vdomProduction-expected.js @@ -2,7 +2,7 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "QmMQupx3", _marko_template = _t(_marko_componentType); export default _marko_template; -import _marko_self_iterator from "marko/dist/runtime/helpers/self-iterator.js"; +import { a as _marko_repeatable_attr_tag, i as _marko_render_input } from "marko/dist/runtime/helpers/attr-tag.js"; import _someTag from "./components/some-tag/index.marko"; import _marko_tag from "marko/dist/runtime/helpers/render-tag.js"; import _marko_renderer from "marko/dist/runtime/components/renderer.js"; @@ -10,21 +10,20 @@ import { r as _marko_registerComponent } from "marko/dist/runtime/components/reg _marko_registerComponent(_marko_componentType, () => _marko_template); const _marko_component = {}; _marko_template._ = _marko_renderer(function (input, out, _componentDef, _component, state, $global) { - _marko_tag(_someTag, { - "header": [{ + _marko_tag(_someTag, _marko_render_input(() => { + _marko_repeatable_attr_tag("header", { "class": "my-header", "renderBody": out => { out.t("Header content", _component); - }, - [Symbol.iterator]: _marko_self_iterator - }, { + } + }); + _marko_repeatable_attr_tag("header", { "class": "my-header", "renderBody": out => { out.t("Header content", _component); - }, - [Symbol.iterator]: _marko_self_iterator - }] - }, out, _componentDef, "0"); + } + }); + }), out, _componentDef, "0"); }, { t: _marko_componentType, i: true diff --git a/packages/translator-default/test/fixtures/error-class-with-name/snapshots/cjs-error-expected.txt b/packages/translator-default/test/fixtures/error-class-with-name/snapshots/cjs-error-expected.txt deleted file mode 100644 index cc1d3f512..000000000 --- a/packages/translator-default/test/fixtures/error-class-with-name/snapshots/cjs-error-expected.txt +++ /dev/null @@ -1,7 +0,0 @@ -CompileError - at packages/translator-default/test/fixtures/error-class-with-name/template.marko:1:7 - > 1 | class Test { - | ^^^^ Component class cannot have a name. - 2 | onCreate() { - 3 | - 4 | } \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-class-with-name/snapshots/generated-error-expected.txt b/packages/translator-default/test/fixtures/error-class-with-name/snapshots/generated-error-expected.txt deleted file mode 100644 index cc1d3f512..000000000 --- a/packages/translator-default/test/fixtures/error-class-with-name/snapshots/generated-error-expected.txt +++ /dev/null @@ -1,7 +0,0 @@ -CompileError - at packages/translator-default/test/fixtures/error-class-with-name/template.marko:1:7 - > 1 | class Test { - | ^^^^ Component class cannot have a name. - 2 | onCreate() { - 3 | - 4 | } \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-class-with-name/snapshots/html-error-expected.txt b/packages/translator-default/test/fixtures/error-class-with-name/snapshots/html-error-expected.txt deleted file mode 100644 index cc1d3f512..000000000 --- a/packages/translator-default/test/fixtures/error-class-with-name/snapshots/html-error-expected.txt +++ /dev/null @@ -1,7 +0,0 @@ -CompileError - at packages/translator-default/test/fixtures/error-class-with-name/template.marko:1:7 - > 1 | class Test { - | ^^^^ Component class cannot have a name. - 2 | onCreate() { - 3 | - 4 | } \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-class-with-name/snapshots/htmlProduction-error-expected.txt b/packages/translator-default/test/fixtures/error-class-with-name/snapshots/htmlProduction-error-expected.txt deleted file mode 100644 index cc1d3f512..000000000 --- a/packages/translator-default/test/fixtures/error-class-with-name/snapshots/htmlProduction-error-expected.txt +++ /dev/null @@ -1,7 +0,0 @@ -CompileError - at packages/translator-default/test/fixtures/error-class-with-name/template.marko:1:7 - > 1 | class Test { - | ^^^^ Component class cannot have a name. - 2 | onCreate() { - 3 | - 4 | } \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-class-with-name/snapshots/hydrate-error-expected.txt b/packages/translator-default/test/fixtures/error-class-with-name/snapshots/hydrate-error-expected.txt deleted file mode 100644 index cc1d3f512..000000000 --- a/packages/translator-default/test/fixtures/error-class-with-name/snapshots/hydrate-error-expected.txt +++ /dev/null @@ -1,7 +0,0 @@ -CompileError - at packages/translator-default/test/fixtures/error-class-with-name/template.marko:1:7 - > 1 | class Test { - | ^^^^ Component class cannot have a name. - 2 | onCreate() { - 3 | - 4 | } \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-class-with-name/snapshots/vdom-error-expected.txt b/packages/translator-default/test/fixtures/error-class-with-name/snapshots/vdom-error-expected.txt deleted file mode 100644 index cc1d3f512..000000000 --- a/packages/translator-default/test/fixtures/error-class-with-name/snapshots/vdom-error-expected.txt +++ /dev/null @@ -1,7 +0,0 @@ -CompileError - at packages/translator-default/test/fixtures/error-class-with-name/template.marko:1:7 - > 1 | class Test { - | ^^^^ Component class cannot have a name. - 2 | onCreate() { - 3 | - 4 | } \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-class-with-name/snapshots/vdomProduction-error-expected.txt b/packages/translator-default/test/fixtures/error-class-with-name/snapshots/vdomProduction-error-expected.txt deleted file mode 100644 index cc1d3f512..000000000 --- a/packages/translator-default/test/fixtures/error-class-with-name/snapshots/vdomProduction-error-expected.txt +++ /dev/null @@ -1,7 +0,0 @@ -CompileError - at packages/translator-default/test/fixtures/error-class-with-name/template.marko:1:7 - > 1 | class Test { - | ^^^^ Component class cannot have a name. - 2 | onCreate() { - 3 | - 4 | } \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-macro-invalid-attributes/snapshots/generated-error-expected.txt b/packages/translator-default/test/fixtures/error-macro-invalid-attributes/snapshots/generated-error-expected.txt deleted file mode 100644 index d0edaf3a0..000000000 --- a/packages/translator-default/test/fixtures/error-macro-invalid-attributes/snapshots/generated-error-expected.txt +++ /dev/null @@ -1,6 +0,0 @@ -CompileError - at packages/translator-default/test/fixtures/error-macro-invalid-attributes/template.marko:1:28 - > 1 | - | ^^^ The "macro" tag can only have a "name" attribute. - 2 |
- 3 | \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-macro-invalid-attributes/snapshots/hydrate-error-expected.txt b/packages/translator-default/test/fixtures/error-macro-invalid-attributes/snapshots/hydrate-error-expected.txt deleted file mode 100644 index d0edaf3a0..000000000 --- a/packages/translator-default/test/fixtures/error-macro-invalid-attributes/snapshots/hydrate-error-expected.txt +++ /dev/null @@ -1,6 +0,0 @@ -CompileError - at packages/translator-default/test/fixtures/error-macro-invalid-attributes/template.marko:1:28 - > 1 | - | ^^^ The "macro" tag can only have a "name" attribute. - 2 |
- 3 | \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-macro-invalid-name-attribute/snapshots/generated-error-expected.txt b/packages/translator-default/test/fixtures/error-macro-invalid-name-attribute/snapshots/generated-error-expected.txt deleted file mode 100644 index f0e83a336..000000000 --- a/packages/translator-default/test/fixtures/error-macro-invalid-name-attribute/snapshots/generated-error-expected.txt +++ /dev/null @@ -1,6 +0,0 @@ -CompileError - at packages/translator-default/test/fixtures/error-macro-invalid-name-attribute/template.marko:1:20 - > 1 | - | ^ The "name" attribute for "macro" tags must be a string literal. - 2 |
- 3 | \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-macro-invalid-name-attribute/snapshots/hydrate-error-expected.txt b/packages/translator-default/test/fixtures/error-macro-invalid-name-attribute/snapshots/hydrate-error-expected.txt deleted file mode 100644 index f0e83a336..000000000 --- a/packages/translator-default/test/fixtures/error-macro-invalid-name-attribute/snapshots/hydrate-error-expected.txt +++ /dev/null @@ -1,6 +0,0 @@ -CompileError - at packages/translator-default/test/fixtures/error-macro-invalid-name-attribute/template.marko:1:20 - > 1 | - | ^ The "name" attribute for "macro" tags must be a string literal. - 2 |
- 3 | \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-macro-missing-name/snapshots/generated-error-expected.txt b/packages/translator-default/test/fixtures/error-macro-missing-name/snapshots/generated-error-expected.txt deleted file mode 100644 index be1e1e3c7..000000000 --- a/packages/translator-default/test/fixtures/error-macro-missing-name/snapshots/generated-error-expected.txt +++ /dev/null @@ -1,6 +0,0 @@ -CompileError - at packages/translator-default/test/fixtures/error-macro-missing-name/template.marko:1:2 - > 1 | - | ^^^^^ The "name" attribute is required on "macro" tags. - 2 |
- 3 | \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-macro-missing-name/snapshots/hydrate-error-expected.txt b/packages/translator-default/test/fixtures/error-macro-missing-name/snapshots/hydrate-error-expected.txt deleted file mode 100644 index be1e1e3c7..000000000 --- a/packages/translator-default/test/fixtures/error-macro-missing-name/snapshots/hydrate-error-expected.txt +++ /dev/null @@ -1,6 +0,0 @@ -CompileError - at packages/translator-default/test/fixtures/error-macro-missing-name/template.marko:1:2 - > 1 | - | ^^^^^ The "name" attribute is required on "macro" tags. - 2 |
- 3 | \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-missing-entry-marko-tag-json/snapshots/generated-error-expected.txt b/packages/translator-default/test/fixtures/error-missing-entry-marko-tag-json/snapshots/generated-error-expected.txt deleted file mode 100644 index 7dc1fa1e2..000000000 --- a/packages/translator-default/test/fixtures/error-missing-entry-marko-tag-json/snapshots/generated-error-expected.txt +++ /dev/null @@ -1,3 +0,0 @@ -Invalid tag file: packages/translator-default/test/fixtures/error-missing-entry-marko-tag-json/components/some-tag/marko-tag.json. Neither a renderer or a template was found for tag. { - "@a": "string" -} \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/error-missing-entry-marko-tag-json/snapshots/hydrate-error-expected.txt b/packages/translator-default/test/fixtures/error-missing-entry-marko-tag-json/snapshots/hydrate-error-expected.txt deleted file mode 100644 index 7dc1fa1e2..000000000 --- a/packages/translator-default/test/fixtures/error-missing-entry-marko-tag-json/snapshots/hydrate-error-expected.txt +++ /dev/null @@ -1,3 +0,0 @@ -Invalid tag file: packages/translator-default/test/fixtures/error-missing-entry-marko-tag-json/components/some-tag/marko-tag.json. Neither a renderer or a template was found for tag. { - "@a": "string" -} \ No newline at end of file diff --git a/packages/translator-default/test/fixtures/sanity-check/snapshots/cjs-expected.js b/packages/translator-default/test/fixtures/sanity-check/snapshots/cjs-expected.js index 2cb593722..24ef496d5 100644 --- a/packages/translator-default/test/fixtures/sanity-check/snapshots/cjs-expected.js +++ b/packages/translator-default/test/fixtures/sanity-check/snapshots/cjs-expected.js @@ -11,7 +11,7 @@ var _classValue = _interopRequireDefault(require("marko/src/runtime/helpers/clas var _dynamicTag = _interopRequireDefault(require("marko/src/runtime/helpers/dynamic-tag.js")); var _index2 = _interopRequireDefault(require("./components/other/index.marko")); var _renderTag = _interopRequireDefault(require("marko/src/runtime/helpers/render-tag.js")); -var _selfIterator = _interopRequireDefault(require("marko/src/runtime/helpers/self-iterator.js")); +var _attrTag = require("marko/src/runtime/helpers/attr-tag.js"); var _escapeXml = require("marko/src/runtime/html/helpers/escape-xml.js"); var _mergeAttrs = _interopRequireDefault(require("marko/src/runtime/html/helpers/merge-attrs.js")); var _attrs = _interopRequireDefault(require("marko/src/runtime/html/helpers/attrs.js")); @@ -71,31 +71,31 @@ _marko_template._ = (0, _renderer.default)(function (input, out, _componentDef, out.w("
"); } }, out, _componentDef, "12", [["click", "handleClick", false, [_b.default, b, ...d]]]); - (0, _renderTag.default)(_index2.default, { + (0, _renderTag.default)(_index2.default, (0, _attrTag.i)(() => { + (0, _attrTag.a)("c", (0, _attrTag.i)(() => { + (0, _attrTag.a)("d", { + "d": 1, + "renderBody": out => { + out.w("
"); + } + }); + return out => { + out.w("
"); + }; + }, { + "c": 1 + })); + return out => { + out.w("
"); + }; + }, { "x": 1, ...thing, "b": { a: 1 }, - ...c, - "c": { - "c": 1, - "d": { - "d": 1, - "renderBody": out => { - out.w("
"); - }, - [Symbol.iterator]: _selfIterator.default - }, - "renderBody": out => { - out.w("
"); - }, - [Symbol.iterator]: _selfIterator.default - }, - "renderBody": (out, b) => { - out.w("
"); - } - }, out, _componentDef, "14"); + ...c + }), out, _componentDef, "14"); out.w(`
-
diff --git a/packages/translator-default/test/fixtures/sanity-check/snapshots/html-expected.js b/packages/translator-default/test/fixtures/sanity-check/snapshots/html-expected.js index c14e8b836..7f7fd7e02 100644 --- a/packages/translator-default/test/fixtures/sanity-check/snapshots/html-expected.js +++ b/packages/translator-default/test/fixtures/sanity-check/snapshots/html-expected.js @@ -15,7 +15,7 @@ import _marko_class_merge from "marko/src/runtime/helpers/class-value.js"; import _marko_dynamic_tag from "marko/src/runtime/helpers/dynamic-tag.js"; import _other from "./components/other/index.marko"; import _marko_tag from "marko/src/runtime/helpers/render-tag.js"; -import _marko_self_iterator from "marko/src/runtime/helpers/self-iterator.js"; +import { a as _marko_repeatable_attr_tag, i as _marko_render_input } from "marko/src/runtime/helpers/attr-tag.js"; import { x as _marko_escapeXml } from "marko/src/runtime/html/helpers/escape-xml.js"; import _marko_merge_attrs from "marko/src/runtime/html/helpers/merge-attrs.js"; import _marko_attrs from "marko/src/runtime/html/helpers/attrs.js"; @@ -66,31 +66,31 @@ _marko_template._ = _marko_renderer(function (input, out, _componentDef, _compon out.w("
"); } }, out, _componentDef, "12", [["click", "handleClick", false, [a, b, ...d]]]); - _marko_tag(_other, { + _marko_tag(_other, _marko_render_input(() => { + _marko_repeatable_attr_tag("c", _marko_render_input(() => { + _marko_repeatable_attr_tag("d", { + "d": 1, + "renderBody": out => { + out.w("
"); + } + }); + return out => { + out.w("
"); + }; + }, { + "c": 1 + })); + return out => { + out.w("
"); + }; + }, { "x": 1, ...thing, "b": { a: 1 }, - ...c, - "c": { - "c": 1, - "d": { - "d": 1, - "renderBody": out => { - out.w("
"); - }, - [Symbol.iterator]: _marko_self_iterator - }, - "renderBody": out => { - out.w("
"); - }, - [Symbol.iterator]: _marko_self_iterator - }, - "renderBody": (out, b) => { - out.w("
"); - } - }, out, _componentDef, "14"); + ...c + }), out, _componentDef, "14"); out.w(`
"); } }, out, _componentDef, "12", [["click", "handleClick", false, [a, b, ...d]]]); - _marko_tag(_other, { + _marko_tag(_other, _marko_render_input(() => { + _marko_repeatable_attr_tag("c", _marko_render_input(() => { + _marko_repeatable_attr_tag("d", { + "d": 1, + "renderBody": out => { + out.w("
"); + } + }); + return out => { + out.w("
"); + }; + }, { + "c": 1 + })); + return out => { + out.w("
"); + }; + }, { "x": 1, ...thing, "b": { a: 1 }, - ...c, - "c": { - "c": 1, - "d": { - "d": 1, - "renderBody": out => { - out.w("
"); - }, - [Symbol.iterator]: _marko_self_iterator - }, - "renderBody": out => { - out.w("
"); - }, - [Symbol.iterator]: _marko_self_iterator - }, - "renderBody": (out, b) => { - out.w("
"); - } - }, out, _componentDef, "14"); + ...c + }), out, _componentDef, "14"); out.w(` { + _marko_repeatable_attr_tag("c", _marko_render_input(() => { + _marko_repeatable_attr_tag("d", { + "d": 1, + "renderBody": out => { + out.e("div", null, "15", _component, 0, 0); + } + }); + return out => { + out.e("div", null, "16", _component, 0, 0); + }; + }, { + "c": 1 + })); + return out => { + out.e("div", null, "17", _component, 0, 0); + }; + }, { "x": 1, ...thing, "b": { a: 1 }, - ...c, - "c": { - "c": 1, - "d": { - "d": 1, - "renderBody": out => { - out.e("div", null, "17", _component, 0, 0); - }, - [Symbol.iterator]: _marko_self_iterator - }, - "renderBody": out => { - out.e("div", null, "16", _component, 0, 0); - }, - [Symbol.iterator]: _marko_self_iterator - }, - "renderBody": (out, b) => { - out.e("div", null, "15", _component, 0, 0); - } - }, out, _componentDef, "14"); + ...c + }), out, _componentDef, "14"); out.be("div", _marko_merge_attrs({ "class": "b c", "a": "{\"a\":1}", diff --git a/packages/translator-default/test/fixtures/sanity-check/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/sanity-check/snapshots/vdomProduction-expected.js index 213d04620..a57a1a526 100644 --- a/packages/translator-default/test/fixtures/sanity-check/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/sanity-check/snapshots/vdomProduction-expected.js @@ -19,9 +19,9 @@ const _marko_node3 = _marko_constElement("div", null, 0); import _other from "./components/other/index.marko"; import _marko_tag from "marko/dist/runtime/helpers/render-tag.js"; const _marko_node4 = _marko_constElement("div", null, 0); +import { a as _marko_repeatable_attr_tag, i as _marko_render_input } from "marko/dist/runtime/helpers/attr-tag.js"; const _marko_node5 = _marko_constElement("div", null, 0); const _marko_node6 = _marko_constElement("div", null, 0); -import _marko_self_iterator from "marko/dist/runtime/helpers/self-iterator.js"; const _marko_node7 = _marko_constElement("div", { "c": "1" }, 0); @@ -100,31 +100,31 @@ _marko_template._ = _marko_renderer(function (input, out, _componentDef, _compon out.n(_marko_node3, _component); } }, out, _componentDef, "12", [["click", "handleClick", false, [a, b, ...d]]]); - _marko_tag(_other, { + _marko_tag(_other, _marko_render_input(() => { + _marko_repeatable_attr_tag("c", _marko_render_input(() => { + _marko_repeatable_attr_tag("d", { + "d": 1, + "renderBody": out => { + out.n(_marko_node4, _component); + } + }); + return out => { + out.n(_marko_node5, _component); + }; + }, { + "c": 1 + })); + return out => { + out.n(_marko_node6, _component); + }; + }, { "x": 1, ...thing, "b": { a: 1 }, - ...c, - "c": { - "c": 1, - "d": { - "d": 1, - "renderBody": out => { - out.n(_marko_node6, _component); - }, - [Symbol.iterator]: _marko_self_iterator - }, - "renderBody": out => { - out.n(_marko_node5, _component); - }, - [Symbol.iterator]: _marko_self_iterator - }, - "renderBody": (out, b) => { - out.n(_marko_node4, _component); - } - }, out, _componentDef, "14"); + ...c + }), out, _componentDef, "14"); out.be("div", _marko_merge_attrs({ "class": "b c", "a": "{\"a\":1}", diff --git a/packages/translator-default/test/fixtures/sanity-check/template.marko b/packages/translator-default/test/fixtures/sanity-check/template.marko index f185c01ff..da74c2bb5 100644 --- a/packages/translator-default/test/fixtures/sanity-check/template.marko +++ b/packages/translator-default/test/fixtures/sanity-check/template.marko @@ -61,7 +61,7 @@ $ let c = thing;
- +
<@c c=1>
From 9dd7c75b5df5bc0ccc67c13f46251039a727aa9c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 22 Feb 2024 22:19:24 +0000 Subject: [PATCH 09/20] [ci] release --- .changeset/friendly-doors-sit.md | 7 ------- package-lock.json | 16 ++++++++-------- packages/compiler/CHANGELOG.md | 6 ++++++ packages/compiler/package.json | 4 ++-- packages/marko/CHANGELOG.md | 10 ++++++++++ packages/marko/package.json | 6 +++--- packages/translator-default/CHANGELOG.md | 6 ++++++ packages/translator-default/package.json | 6 +++--- 8 files changed, 38 insertions(+), 23 deletions(-) delete mode 100644 .changeset/friendly-doors-sit.md diff --git a/.changeset/friendly-doors-sit.md b/.changeset/friendly-doors-sit.md deleted file mode 100644 index 591b80816..000000000 --- a/.changeset/friendly-doors-sit.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@marko/translator-default": patch -"marko": patch -"@marko/compiler": patch ---- - -Improve nested attribute tag handling with scriptlets. diff --git a/package-lock.json b/package-lock.json index 56347ff3b..58b21c1bf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11894,7 +11894,7 @@ }, "packages/compiler": { "name": "@marko/compiler", - "version": "5.34.6", + "version": "5.34.7", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.23.5", @@ -11922,7 +11922,7 @@ "source-map-support": "^0.5.21" }, "devDependencies": { - "@marko/translator-default": "^5.31.13" + "@marko/translator-default": "^5.31.15" } }, "packages/compiler/node_modules/jsesc": { @@ -11940,11 +11940,11 @@ "license": "Apache-2.0" }, "packages/marko": { - "version": "5.32.9", + "version": "5.32.10", "license": "MIT", "dependencies": { - "@marko/compiler": "^5.34.6", - "@marko/translator-default": "^5.31.14", + "@marko/compiler": "^5.34.7", + "@marko/translator-default": "^5.31.15", "app-module-path": "^2.2.0", "argly": "^1.2.0", "browser-refresh-client": "1.1.4", @@ -11968,7 +11968,7 @@ }, "packages/translator-default": { "name": "@marko/translator-default", - "version": "5.31.14", + "version": "5.31.15", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.8", @@ -11977,8 +11977,8 @@ "self-closing-tags": "^1.0.1" }, "devDependencies": { - "@marko/compiler": "^5.34.6", - "marko": "^5.32.8" + "@marko/compiler": "^5.34.7", + "marko": "^5.32.10" }, "peerDependencies": { "@marko/compiler": "^5.16.1", diff --git a/packages/compiler/CHANGELOG.md b/packages/compiler/CHANGELOG.md index b2c7a57ab..5ad4bb863 100644 --- a/packages/compiler/CHANGELOG.md +++ b/packages/compiler/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## 5.34.7 + +### Patch Changes + +- [#2115](https://github.com/marko-js/marko/pull/2115) [`a55fb06`](https://github.com/marko-js/marko/commit/a55fb06ec638eb830eb72c71cb766fc05b6ea8cb) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Improve nested attribute tag handling with scriptlets. + ## 5.34.6 ### Patch Changes diff --git a/packages/compiler/package.json b/packages/compiler/package.json index 1c9047333..79329d611 100644 --- a/packages/compiler/package.json +++ b/packages/compiler/package.json @@ -1,6 +1,6 @@ { "name": "@marko/compiler", - "version": "5.34.6", + "version": "5.34.7", "description": "Marko template to JS compiler.", "keywords": [ "babel", @@ -60,7 +60,7 @@ "source-map-support": "^0.5.21" }, "devDependencies": { - "@marko/translator-default": "^5.31.13" + "@marko/translator-default": "^5.31.15" }, "publishConfig": { "access": "public" diff --git a/packages/marko/CHANGELOG.md b/packages/marko/CHANGELOG.md index 18441d908..98550f30b 100644 --- a/packages/marko/CHANGELOG.md +++ b/packages/marko/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## 5.32.10 + +### Patch Changes + +- [#2115](https://github.com/marko-js/marko/pull/2115) [`a55fb06`](https://github.com/marko-js/marko/commit/a55fb06ec638eb830eb72c71cb766fc05b6ea8cb) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Improve nested attribute tag handling with scriptlets. + +- Updated dependencies [[`a55fb06`](https://github.com/marko-js/marko/commit/a55fb06ec638eb830eb72c71cb766fc05b6ea8cb)]: + - @marko/translator-default@5.31.15 + - @marko/compiler@5.34.7 + ## 5.32.9 ### Patch Changes diff --git a/packages/marko/package.json b/packages/marko/package.json index d8d232e46..1398de79a 100644 --- a/packages/marko/package.json +++ b/packages/marko/package.json @@ -1,6 +1,6 @@ { "name": "marko", - "version": "5.32.9", + "version": "5.32.10", "description": "UI Components + streaming, async, high performance, HTML templating for Node.js and the browser.", "keywords": [ "front-end", @@ -64,8 +64,8 @@ "build": "babel ./src --out-dir ./dist --delete-dir-on-start --copy-files --config-file ../../babel.config.js --env-name=production" }, "dependencies": { - "@marko/compiler": "^5.34.6", - "@marko/translator-default": "^5.31.14", + "@marko/compiler": "^5.34.7", + "@marko/translator-default": "^5.31.15", "app-module-path": "^2.2.0", "argly": "^1.2.0", "browser-refresh-client": "1.1.4", diff --git a/packages/translator-default/CHANGELOG.md b/packages/translator-default/CHANGELOG.md index fc3f863bd..f9cc86f9d 100644 --- a/packages/translator-default/CHANGELOG.md +++ b/packages/translator-default/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## 5.31.15 + +### Patch Changes + +- [#2115](https://github.com/marko-js/marko/pull/2115) [`a55fb06`](https://github.com/marko-js/marko/commit/a55fb06ec638eb830eb72c71cb766fc05b6ea8cb) Thanks [@DylanPiercey](https://github.com/DylanPiercey)! - Improve nested attribute tag handling with scriptlets. + ## 5.31.14 ### Patch Changes diff --git a/packages/translator-default/package.json b/packages/translator-default/package.json index f8f81d7ab..0233f0557 100644 --- a/packages/translator-default/package.json +++ b/packages/translator-default/package.json @@ -1,6 +1,6 @@ { "name": "@marko/translator-default", - "version": "5.31.14", + "version": "5.31.15", "description": "Translates Marko templates to the default Marko runtime.", "keywords": [ "babel", @@ -34,8 +34,8 @@ "self-closing-tags": "^1.0.1" }, "devDependencies": { - "@marko/compiler": "^5.34.6", - "marko": "^5.32.8" + "@marko/compiler": "^5.34.7", + "marko": "^5.32.10" }, "peerDependencies": { "@marko/compiler": "^5.16.1", From 64281b3602bbba47464f7fe192ce521f981aef20 Mon Sep 17 00:00:00 2001 From: dpiercey Date: Thu, 22 Feb 2024 20:22:08 -0700 Subject: [PATCH 10/20] fix: optimize and simplify preserved attr handling --- packages/marko/src/runtime/vdom/VElement.js | 46 ++++++------------- .../marko/src/runtime/vdom/morphdom/index.js | 3 +- .../marko/src/runtime/vdom/preserve-attrs.js | 15 ------ packages/translator-default/src/index.js | 1 - .../src/tag/attribute/modifiers/no-update.js | 15 +----- .../translator-default/src/tag/dynamic-tag.js | 11 ++++- .../src/tag/native-tag[html]/index.js | 11 ++++- .../src/tag/native-tag[vdom]/index.js | 11 ++++- .../snapshots/cjs-expected.js | 4 +- .../snapshots/html-expected.js | 4 +- .../snapshots/htmlProduction-expected.js | 4 +- .../snapshots/vdom-expected.js | 5 +- .../snapshots/vdomProduction-expected.js | 5 +- .../snapshots/cjs-expected.js | 9 +++- .../snapshots/html-expected.js | 9 +++- .../snapshots/htmlProduction-expected.js | 9 +++- .../snapshots/vdom-expected.js | 10 ++-- .../snapshots/vdomProduction-expected.js | 10 ++-- .../snapshots/cjs-expected.js | 4 +- .../snapshots/html-expected.js | 4 +- .../snapshots/htmlProduction-expected.js | 4 +- .../snapshots/vdom-expected.js | 5 +- .../snapshots/vdomProduction-expected.js | 5 +- .../snapshots/cjs-expected.js | 4 +- .../snapshots/html-expected.js | 4 +- .../snapshots/htmlProduction-expected.js | 4 +- .../snapshots/vdom-expected.js | 5 +- .../snapshots/vdomProduction-expected.js | 5 +- 28 files changed, 124 insertions(+), 102 deletions(-) delete mode 100644 packages/marko/src/runtime/vdom/preserve-attrs.js diff --git a/packages/marko/src/runtime/vdom/VElement.js b/packages/marko/src/runtime/vdom/VElement.js index 15e8e9dae..9728e304c 100644 --- a/packages/marko/src/runtime/vdom/VElement.js +++ b/packages/marko/src/runtime/vdom/VElement.js @@ -25,7 +25,7 @@ var FLAG_SPREAD_ATTRS = 4; var defineProperty = Object.defineProperty; var ATTR_HREF = "href"; -var EMPTY_OBJECT = Object.freeze({}); +var EMPTY_OBJECT = Object.freeze(Object.create(null)); function convertAttrValue(type, value) { if (value === true) { @@ -243,14 +243,6 @@ defineProperty(proto, "___value", { }, }); -VElement.___removePreservedAttributes = function (attrs) { - // By default this static method is a no-op, but if there are any - // compiled components that have "no-update" attributes then - // `preserve-attrs.js` will be imported and this method will be replaced - // with a method that actually does something - return attrs; -}; - function virtualizeElement(node, virtualizeChildNodes, ownerComponent) { var attributes = node.attributes; var attrCount = attributes.length; @@ -303,20 +295,15 @@ function virtualizeElement(node, virtualizeChildNodes, ownerComponent) { VElement.___virtualize = virtualizeElement; VElement.___morphAttrs = function (fromEl, vFromEl, toEl) { - var removePreservedAttributes = VElement.___removePreservedAttributes; - var fromFlags = vFromEl.___flags; var toFlags = toEl.___flags; - - vElementByDOMNode.set(fromEl, toEl); - var attrs = toEl.___attributes; - var props = toEl.___properties; if (toFlags & FLAG_CUSTOM_ELEMENT) { return assign(fromEl, attrs); } + var props = toEl.___properties; var attrName; // We use expando properties to associate the previous HTML @@ -329,16 +316,12 @@ VElement.___morphAttrs = function (fromEl, vFromEl, toEl) { var oldAttrs = vFromEl.___attributes; - if (oldAttrs) { - if (oldAttrs === attrs) { - // For constant attributes the same object will be provided - // every render and we can use that to our advantage to - // not waste time diffing a constant, immutable attribute - // map. - return; - } else { - oldAttrs = removePreservedAttributes(oldAttrs, props); - } + if (oldAttrs === attrs) { + // For constant attributes the same object will be provided + // every render and we can use that to our advantage to + // not waste time diffing a constant, immutable attribute + // map. + return; } var attrValue; @@ -356,12 +339,7 @@ VElement.___morphAttrs = function (fromEl, vFromEl, toEl) { return; } - // In some cases we only want to set an attribute value for the first - // render or we don't want certain attributes to be touched. To support - // that use case we delete out all of the preserved attributes - // so it's as if they never existed. - attrs = removePreservedAttributes(attrs, props, true); - + var preserve = (props && props.pa) || EMPTY_OBJECT; var namespaceURI; // Loop over all of the attributes in the attribute map and compare @@ -369,6 +347,10 @@ VElement.___morphAttrs = function (fromEl, vFromEl, toEl) { // null/undefined/false then we want to remove the attribute for (attrName in attrs) { attrValue = attrs[attrName]; + if (preserve[attrName] || oldAttrs[attrName] === attrValue) { + continue; + } + namespaceURI = null; if (attrName === ATTR_XLINK_HREF) { @@ -378,7 +360,7 @@ VElement.___morphAttrs = function (fromEl, vFromEl, toEl) { if (attrValue == null || attrValue === false) { removeAttribute(fromEl, namespaceURI, attrName); - } else if (oldAttrs[attrName] !== attrValue) { + } else { var type = typeof attrValue; if (type !== "string") { diff --git a/packages/marko/src/runtime/vdom/morphdom/index.js b/packages/marko/src/runtime/vdom/morphdom/index.js index 7c580788c..71edce2bc 100644 --- a/packages/marko/src/runtime/vdom/morphdom/index.js +++ b/packages/marko/src/runtime/vdom/morphdom/index.js @@ -680,8 +680,9 @@ function morphdom(fromNode, toNode, host, componentsContext) { function morphEl(fromEl, vFromEl, toEl, parentComponent) { var nodeName = toEl.___nodeName; - var constId = toEl.___constId; + vElementByDOMNode.set(fromEl, toEl); + if (constId !== undefined && vFromEl.___constId === constId) { return; } diff --git a/packages/marko/src/runtime/vdom/preserve-attrs.js b/packages/marko/src/runtime/vdom/preserve-attrs.js deleted file mode 100644 index 7d462ff30..000000000 --- a/packages/marko/src/runtime/vdom/preserve-attrs.js +++ /dev/null @@ -1,15 +0,0 @@ -var extend = require("raptor-util/extend"); - -function removePreservedAttributes(attrs, props) { - var preservedAttrs = props && props.pa; - if (preservedAttrs) { - attrs = extend({}, attrs); - preservedAttrs.forEach(function (preservedAttrName) { - delete attrs[preservedAttrName]; - }); - } - - return attrs; -} - -require("./VElement").___removePreservedAttributes = removePreservedAttributes; diff --git a/packages/translator-default/src/index.js b/packages/translator-default/src/index.js index aa79be769..3cca57659 100644 --- a/packages/translator-default/src/index.js +++ b/packages/translator-default/src/index.js @@ -505,7 +505,6 @@ export function getRuntimeEntryFiles(output, optimize) { `${base}runtime/vdom/hot-reload.js`, `${base}runtime/vdom/helpers/attrs.js`, `${base}runtime/vdom/helpers/const-element.js`, - `${base}runtime/vdom/preserve-attrs.js`, ]), ]; } diff --git a/packages/translator-default/src/tag/attribute/modifiers/no-update.js b/packages/translator-default/src/tag/attribute/modifiers/no-update.js index e728664b9..bf9c2a535 100644 --- a/packages/translator-default/src/tag/attribute/modifiers/no-update.js +++ b/packages/translator-default/src/tag/attribute/modifiers/no-update.js @@ -1,25 +1,12 @@ -import { importDefault } from "@marko/babel-utils"; - -const hasMonkeyPatch = new WeakSet(); - /** * Does nothing in html mode. */ export default { exit(tag, attr) { - const { - node, - hub: { file }, - } = tag; - const isVDOM = file.markoOpts.output !== "html"; + const { node } = tag; if (!node.preserveAttrs) { node.preserveAttrs = []; - - if (isVDOM && !hasMonkeyPatch.has(file)) { - hasMonkeyPatch.add(file); - importDefault(file, "marko/src/runtime/vdom/preserve-attrs.js"); - } } node.preserveAttrs.push(attr.node.name); diff --git a/packages/translator-default/src/tag/dynamic-tag.js b/packages/translator-default/src/tag/dynamic-tag.js index 970e26d70..2cd9eff58 100644 --- a/packages/translator-default/src/tag/dynamic-tag.js +++ b/packages/translator-default/src/tag/dynamic-tag.js @@ -18,8 +18,15 @@ export default function (path) { tagProperties.push( t.objectProperty( t.identifier("pa"), - t.arrayExpression( - node.preserveAttrs.map((name) => t.stringLiteral(name)), + t.objectExpression( + node.preserveAttrs.map((name) => + t.objectProperty( + t.isValidIdentifier(name) + ? t.identifier(name) + : t.stringLiteral(name), + t.numericLiteral(1), + ), + ), ), ), ); diff --git a/packages/translator-default/src/tag/native-tag[html]/index.js b/packages/translator-default/src/tag/native-tag[html]/index.js index e0d8cb027..166710c1b 100644 --- a/packages/translator-default/src/tag/native-tag[html]/index.js +++ b/packages/translator-default/src/tag/native-tag[html]/index.js @@ -75,8 +75,15 @@ export default function (path, isNullable) { tagProperties.push( t.objectProperty( t.identifier("pa"), - t.arrayExpression( - node.preserveAttrs.map((name) => t.stringLiteral(name)), + t.objectExpression( + node.preserveAttrs.map((name) => + t.objectProperty( + t.isValidIdentifier(name) + ? t.identifier(name) + : t.stringLiteral(name), + t.numericLiteral(1), + ), + ), ), ), ); diff --git a/packages/translator-default/src/tag/native-tag[vdom]/index.js b/packages/translator-default/src/tag/native-tag[vdom]/index.js index ca3f712f3..2bb2adcbe 100644 --- a/packages/translator-default/src/tag/native-tag[vdom]/index.js +++ b/packages/translator-default/src/tag/native-tag[vdom]/index.js @@ -116,8 +116,15 @@ function tagArguments(path) { tagProperties.push( t.objectProperty( t.identifier("pa"), - t.arrayExpression( - node.preserveAttrs.map((name) => t.stringLiteral(name)), + t.objectExpression( + node.preserveAttrs.map((name) => + t.objectProperty( + t.isValidIdentifier(name) + ? t.identifier(name) + : t.stringLiteral(name), + t.numericLiteral(1), + ), + ), ), ), ); diff --git a/packages/translator-default/test/fixtures/data-marko-implicit-component/snapshots/cjs-expected.js b/packages/translator-default/test/fixtures/data-marko-implicit-component/snapshots/cjs-expected.js index 6cc423be8..900a00597 100644 --- a/packages/translator-default/test/fixtures/data-marko-implicit-component/snapshots/cjs-expected.js +++ b/packages/translator-default/test/fixtures/data-marko-implicit-component/snapshots/cjs-expected.js @@ -13,7 +13,9 @@ var _default = exports.default = _marko_template; const _marko_component = {}; _marko_template._ = (0, _renderer.default)(function (input, out, _componentDef, _component, state, $global) { out.w(``); out.w("Hello "); out.w((0, _escapeXml.x)(input.name)); diff --git a/packages/translator-default/test/fixtures/data-marko-implicit-component/snapshots/html-expected.js b/packages/translator-default/test/fixtures/data-marko-implicit-component/snapshots/html-expected.js index 23901aedf..55d48a9f5 100644 --- a/packages/translator-default/test/fixtures/data-marko-implicit-component/snapshots/html-expected.js +++ b/packages/translator-default/test/fixtures/data-marko-implicit-component/snapshots/html-expected.js @@ -8,7 +8,9 @@ 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(``); out.w("Hello "); out.w(_marko_escapeXml(input.name)); diff --git a/packages/translator-default/test/fixtures/data-marko-implicit-component/snapshots/htmlProduction-expected.js b/packages/translator-default/test/fixtures/data-marko-implicit-component/snapshots/htmlProduction-expected.js index 57034c231..5544ca044 100644 --- a/packages/translator-default/test/fixtures/data-marko-implicit-component/snapshots/htmlProduction-expected.js +++ b/packages/translator-default/test/fixtures/data-marko-implicit-component/snapshots/htmlProduction-expected.js @@ -8,7 +8,9 @@ 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(`Hello ${_marko_escapeXml(input.name)}
`); }, { t: _marko_componentType, diff --git a/packages/translator-default/test/fixtures/data-marko-implicit-component/snapshots/vdom-expected.js b/packages/translator-default/test/fixtures/data-marko-implicit-component/snapshots/vdom-expected.js index 3a5bad913..2e71ce631 100644 --- a/packages/translator-default/test/fixtures/data-marko-implicit-component/snapshots/vdom-expected.js +++ b/packages/translator-default/test/fixtures/data-marko-implicit-component/snapshots/vdom-expected.js @@ -2,7 +2,6 @@ import { t as _t } from "marko/src/runtime/vdom/index.js"; const _marko_componentType = "packages/translator-default/test/fixtures/data-marko-implicit-component/template.marko", _marko_template = _t(_marko_componentType); export default _marko_template; -import "marko/src/runtime/vdom/preserve-attrs.js"; import _marko_renderer from "marko/src/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/src/runtime/components/registry.js"; _marko_registerComponent(_marko_componentType, () => _marko_template); @@ -11,7 +10,9 @@ _marko_template._ = _marko_renderer(function (input, out, _componentDef, _compon out.be("div", { "class": "test" }, "0", _component, null, 0, { - pa: ["class"] + pa: { + "class": 1 + } }); out.t("Hello ", _component); out.t(input.name, _component); diff --git a/packages/translator-default/test/fixtures/data-marko-implicit-component/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/data-marko-implicit-component/snapshots/vdomProduction-expected.js index 64fc54883..dd38d80ee 100644 --- a/packages/translator-default/test/fixtures/data-marko-implicit-component/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/data-marko-implicit-component/snapshots/vdomProduction-expected.js @@ -2,7 +2,6 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "qc7Y7xBI", _marko_template = _t(_marko_componentType); export default _marko_template; -import "marko/dist/runtime/vdom/preserve-attrs.js"; import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; _marko_registerComponent(_marko_componentType, () => _marko_template); @@ -11,7 +10,9 @@ _marko_template._ = _marko_renderer(function (input, out, _componentDef, _compon out.be("div", { "class": "test" }, "0", _component, null, 0, { - pa: ["class"] + pa: { + "class": 1 + } }); out.t("Hello ", _component); out.t(input.name, _component); diff --git a/packages/translator-default/test/fixtures/no-update-modifier-multiple/snapshots/cjs-expected.js b/packages/translator-default/test/fixtures/no-update-modifier-multiple/snapshots/cjs-expected.js index 4420b0385..37b93779d 100644 --- a/packages/translator-default/test/fixtures/no-update-modifier-multiple/snapshots/cjs-expected.js +++ b/packages/translator-default/test/fixtures/no-update-modifier-multiple/snapshots/cjs-expected.js @@ -14,10 +14,15 @@ const _marko_component = {}; _marko_template._ = (0, _renderer.default)(function (input, out, _componentDef, _component, state, $global) { out.w("
"); out.w(``); out.w(``); out.w("
"); }, { diff --git a/packages/translator-default/test/fixtures/no-update-modifier-multiple/snapshots/html-expected.js b/packages/translator-default/test/fixtures/no-update-modifier-multiple/snapshots/html-expected.js index 113319329..6d064003b 100644 --- a/packages/translator-default/test/fixtures/no-update-modifier-multiple/snapshots/html-expected.js +++ b/packages/translator-default/test/fixtures/no-update-modifier-multiple/snapshots/html-expected.js @@ -9,10 +9,15 @@ const _marko_component = {}; _marko_template._ = _marko_renderer(function (input, out, _componentDef, _component, state, $global) { out.w("
"); out.w(``); out.w(``); out.w("
"); }, { diff --git a/packages/translator-default/test/fixtures/no-update-modifier-multiple/snapshots/htmlProduction-expected.js b/packages/translator-default/test/fixtures/no-update-modifier-multiple/snapshots/htmlProduction-expected.js index 5c8ce3207..5a04c55f2 100644 --- a/packages/translator-default/test/fixtures/no-update-modifier-multiple/snapshots/htmlProduction-expected.js +++ b/packages/translator-default/test/fixtures/no-update-modifier-multiple/snapshots/htmlProduction-expected.js @@ -8,9 +8,14 @@ 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(`
`); }, { t: _marko_componentType, diff --git a/packages/translator-default/test/fixtures/no-update-modifier-multiple/snapshots/vdom-expected.js b/packages/translator-default/test/fixtures/no-update-modifier-multiple/snapshots/vdom-expected.js index 11a17940f..8910db17c 100644 --- a/packages/translator-default/test/fixtures/no-update-modifier-multiple/snapshots/vdom-expected.js +++ b/packages/translator-default/test/fixtures/no-update-modifier-multiple/snapshots/vdom-expected.js @@ -2,7 +2,6 @@ import { t as _t } from "marko/src/runtime/vdom/index.js"; const _marko_componentType = "packages/translator-default/test/fixtures/no-update-modifier-multiple/template.marko", _marko_template = _t(_marko_componentType); export default _marko_template; -import "marko/src/runtime/vdom/preserve-attrs.js"; import _marko_renderer from "marko/src/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/src/runtime/components/registry.js"; _marko_registerComponent(_marko_componentType, () => _marko_template); @@ -12,14 +11,19 @@ _marko_template._ = _marko_renderer(function (input, out, _componentDef, _compon out.e("input", { "value": input.defaultValue }, "1", _component, 0, 0, { - pa: ["value"] + pa: { + value: 1 + } }); out.e("input", { "type": "checkbox", "value": input.defaultValue, "checked": input.checked }, "2", _component, 0, 0, { - pa: ["value", "checked"] + pa: { + value: 1, + checked: 1 + } }); out.ee(); }, { diff --git a/packages/translator-default/test/fixtures/no-update-modifier-multiple/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/no-update-modifier-multiple/snapshots/vdomProduction-expected.js index 0397e1cb9..8cd0353be 100644 --- a/packages/translator-default/test/fixtures/no-update-modifier-multiple/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/no-update-modifier-multiple/snapshots/vdomProduction-expected.js @@ -2,7 +2,6 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "r46whWwu", _marko_template = _t(_marko_componentType); export default _marko_template; -import "marko/dist/runtime/vdom/preserve-attrs.js"; import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; _marko_registerComponent(_marko_componentType, () => _marko_template); @@ -12,14 +11,19 @@ _marko_template._ = _marko_renderer(function (input, out, _componentDef, _compon out.e("input", { "value": input.defaultValue }, "1", _component, 0, 0, { - pa: ["value"] + pa: { + value: 1 + } }); out.e("input", { "type": "checkbox", "value": input.defaultValue, "checked": input.checked }, "2", _component, 0, 0, { - pa: ["value", "checked"] + pa: { + value: 1, + checked: 1 + } }); out.ee(); }, { diff --git a/packages/translator-default/test/fixtures/no-update-modifier/snapshots/cjs-expected.js b/packages/translator-default/test/fixtures/no-update-modifier/snapshots/cjs-expected.js index b95154ea1..bcb98595f 100644 --- a/packages/translator-default/test/fixtures/no-update-modifier/snapshots/cjs-expected.js +++ b/packages/translator-default/test/fixtures/no-update-modifier/snapshots/cjs-expected.js @@ -13,7 +13,9 @@ var _default = exports.default = _marko_template; const _marko_component = {}; _marko_template._ = (0, _renderer.default)(function (input, out, _componentDef, _component, state, $global) { out.w(``); }, { t: _marko_componentType, diff --git a/packages/translator-default/test/fixtures/no-update-modifier/snapshots/html-expected.js b/packages/translator-default/test/fixtures/no-update-modifier/snapshots/html-expected.js index c5748ba8f..7f12d2b27 100644 --- a/packages/translator-default/test/fixtures/no-update-modifier/snapshots/html-expected.js +++ b/packages/translator-default/test/fixtures/no-update-modifier/snapshots/html-expected.js @@ -8,7 +8,9 @@ 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(``); }, { t: _marko_componentType, diff --git a/packages/translator-default/test/fixtures/no-update-modifier/snapshots/htmlProduction-expected.js b/packages/translator-default/test/fixtures/no-update-modifier/snapshots/htmlProduction-expected.js index f9f78054a..8b50ca9ba 100644 --- a/packages/translator-default/test/fixtures/no-update-modifier/snapshots/htmlProduction-expected.js +++ b/packages/translator-default/test/fixtures/no-update-modifier/snapshots/htmlProduction-expected.js @@ -8,7 +8,9 @@ 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(``); }, { t: _marko_componentType, diff --git a/packages/translator-default/test/fixtures/no-update-modifier/snapshots/vdom-expected.js b/packages/translator-default/test/fixtures/no-update-modifier/snapshots/vdom-expected.js index 73364e289..1c0e46686 100644 --- a/packages/translator-default/test/fixtures/no-update-modifier/snapshots/vdom-expected.js +++ b/packages/translator-default/test/fixtures/no-update-modifier/snapshots/vdom-expected.js @@ -2,7 +2,6 @@ import { t as _t } from "marko/src/runtime/vdom/index.js"; const _marko_componentType = "packages/translator-default/test/fixtures/no-update-modifier/template.marko", _marko_template = _t(_marko_componentType); export default _marko_template; -import "marko/src/runtime/vdom/preserve-attrs.js"; import _marko_renderer from "marko/src/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/src/runtime/components/registry.js"; _marko_registerComponent(_marko_componentType, () => _marko_template); @@ -11,7 +10,9 @@ _marko_template._ = _marko_renderer(function (input, out, _componentDef, _compon out.e("input", { "value": input.defaultValue }, "0", _component, 0, 0, { - pa: ["value"] + pa: { + value: 1 + } }); }, { t: _marko_componentType, diff --git a/packages/translator-default/test/fixtures/no-update-modifier/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/no-update-modifier/snapshots/vdomProduction-expected.js index d7e6d97c0..d98ea55a3 100644 --- a/packages/translator-default/test/fixtures/no-update-modifier/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/no-update-modifier/snapshots/vdomProduction-expected.js @@ -2,7 +2,6 @@ import { t as _t } from "marko/dist/runtime/vdom/index.js"; const _marko_componentType = "az9GXCCR", _marko_template = _t(_marko_componentType); export default _marko_template; -import "marko/dist/runtime/vdom/preserve-attrs.js"; import _marko_renderer from "marko/dist/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/dist/runtime/components/registry.js"; _marko_registerComponent(_marko_componentType, () => _marko_template); @@ -11,7 +10,9 @@ _marko_template._ = _marko_renderer(function (input, out, _componentDef, _compon out.e("input", { "value": input.defaultValue }, "0", _component, 0, 0, { - pa: ["value"] + pa: { + value: 1 + } }); }, { t: _marko_componentType, diff --git a/packages/translator-default/test/fixtures/simple-attrs-tag/snapshots/cjs-expected.js b/packages/translator-default/test/fixtures/simple-attrs-tag/snapshots/cjs-expected.js index 71aaf09de..1a3c8206b 100644 --- a/packages/translator-default/test/fixtures/simple-attrs-tag/snapshots/cjs-expected.js +++ b/packages/translator-default/test/fixtures/simple-attrs-tag/snapshots/cjs-expected.js @@ -15,7 +15,9 @@ _marko_template._ = (0, _renderer.default)(function (input, out, _componentDef, out.w("
"); out.w("
"); out.w(`
`); out.w("
"); }, { diff --git a/packages/translator-default/test/fixtures/simple-attrs-tag/snapshots/html-expected.js b/packages/translator-default/test/fixtures/simple-attrs-tag/snapshots/html-expected.js index 00071c49a..ec0b8c6e9 100644 --- a/packages/translator-default/test/fixtures/simple-attrs-tag/snapshots/html-expected.js +++ b/packages/translator-default/test/fixtures/simple-attrs-tag/snapshots/html-expected.js @@ -10,7 +10,9 @@ _marko_template._ = _marko_renderer(function (input, out, _componentDef, _compon out.w("
"); out.w("
"); out.w(`
`); out.w("
"); }, { diff --git a/packages/translator-default/test/fixtures/simple-attrs-tag/snapshots/htmlProduction-expected.js b/packages/translator-default/test/fixtures/simple-attrs-tag/snapshots/htmlProduction-expected.js index 2637be3b3..3f4b230d9 100644 --- a/packages/translator-default/test/fixtures/simple-attrs-tag/snapshots/htmlProduction-expected.js +++ b/packages/translator-default/test/fixtures/simple-attrs-tag/snapshots/htmlProduction-expected.js @@ -7,7 +7,9 @@ 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(`
`); }, { t: _marko_componentType, diff --git a/packages/translator-default/test/fixtures/simple-attrs-tag/snapshots/vdom-expected.js b/packages/translator-default/test/fixtures/simple-attrs-tag/snapshots/vdom-expected.js index b18bf36ee..92587d50e 100644 --- a/packages/translator-default/test/fixtures/simple-attrs-tag/snapshots/vdom-expected.js +++ b/packages/translator-default/test/fixtures/simple-attrs-tag/snapshots/vdom-expected.js @@ -2,7 +2,6 @@ import { t as _t } from "marko/src/runtime/vdom/index.js"; const _marko_componentType = "packages/translator-default/test/fixtures/simple-attrs-tag/template.marko", _marko_template = _t(_marko_componentType); export default _marko_template; -import "marko/src/runtime/vdom/preserve-attrs.js"; import _marko_renderer from "marko/src/runtime/components/renderer.js"; import { r as _marko_registerComponent } from "marko/src/runtime/components/registry.js"; _marko_registerComponent(_marko_componentType, () => _marko_template); @@ -23,7 +22,9 @@ _marko_template._ = _marko_renderer(function (input, out, _componentDef, _compon out.e("div", { "style": "c:1px" }, "3", _component, 0, 0, { - pa: ["style"] + pa: { + style: 1 + } }); out.e("div", { "a": "1", diff --git a/packages/translator-default/test/fixtures/simple-attrs-tag/snapshots/vdomProduction-expected.js b/packages/translator-default/test/fixtures/simple-attrs-tag/snapshots/vdomProduction-expected.js index a34b0a701..01b37dc17 100644 --- a/packages/translator-default/test/fixtures/simple-attrs-tag/snapshots/vdomProduction-expected.js +++ b/packages/translator-default/test/fixtures/simple-attrs-tag/snapshots/vdomProduction-expected.js @@ -15,7 +15,6 @@ const _marko_node2 = _marko_constElement("div", { const _marko_node3 = _marko_constElement("div", { "style": "c:1px" }, 0); -import "marko/dist/runtime/vdom/preserve-attrs.js"; const _marko_node4 = _marko_constElement("div", { "a": "1", "style": "c:1px" @@ -31,7 +30,9 @@ _marko_template._ = _marko_renderer(function (input, out, _componentDef, _compon out.e("div", { "style": "c:1px" }, "3", _component, 0, 0, { - pa: ["style"] + pa: { + style: 1 + } }); out.n(_marko_node4, _component); }, { From 462992ee51fea27e56894b367870e608ea1009a0 Mon Sep 17 00:00:00 2001 From: dpiercey Date: Fri, 23 Feb 2024 10:01:44 -0700 Subject: [PATCH 11/20] fix: refactor how special attributes are handled --- .changeset/chatty-boxes-deny.md | 6 + .changeset/famous-oranges-pull.md | 6 + .changeset/shy-chicken-visit.md | 6 + .changeset/tender-emus-obey.md | 6 + packages/marko/src/runtime/vdom/VElement.js | 160 ++++++++---------- packages/marko/src/runtime/vdom/VNode.js | 2 - .../marko/src/runtime/vdom/morphdom/index.js | 14 +- .../vdom/morphdom/specialElHandlers.js | 106 ------------ packages/marko/test/__util__/domToString.js | 2 +- packages/marko/test/__util__/toHTML.js | 5 +- .../textarea-value-attribute/index.marko | 2 +- .../fixtures/textarea-value-attribute/test.js | 5 - .../no-update/components/app/index.marko | 2 + .../no-update-body-textarea/index.marko | 5 + .../no-update-input-value/index.marko | 5 + .../fixtures/no-update/tests.js | 33 +++- packages/marko/test/morphdom/index.test.js | 41 ++++- .../fixtures/input-checked/index.js | 2 +- .../fixtures/input-disabled/index.js | 2 +- .../vdom-create/fixtures/input-value/index.js | 2 +- .../fixtures/option-selected/index.js | 2 +- .../vdom-create/fixtures/textarea/index.js | 2 +- 22 files changed, 188 insertions(+), 228 deletions(-) create mode 100644 .changeset/chatty-boxes-deny.md create mode 100644 .changeset/famous-oranges-pull.md create mode 100644 .changeset/shy-chicken-visit.md create mode 100644 .changeset/tender-emus-obey.md delete mode 100644 packages/marko/src/runtime/vdom/morphdom/specialElHandlers.js create mode 100644 packages/marko/test/components-pages/fixtures/no-update/components/no-update-body-textarea/index.marko create mode 100644 packages/marko/test/components-pages/fixtures/no-update/components/no-update-input-value/index.marko diff --git a/.changeset/chatty-boxes-deny.md b/.changeset/chatty-boxes-deny.md new file mode 100644 index 000000000..f197c95aa --- /dev/null +++ b/.changeset/chatty-boxes-deny.md @@ -0,0 +1,6 @@ +--- +"@marko/translator-default": patch +"marko": patch +--- + +Fix issue where `:no-update` modifier was not working on special element handlers. diff --git a/.changeset/famous-oranges-pull.md b/.changeset/famous-oranges-pull.md new file mode 100644 index 000000000..53b6d8655 --- /dev/null +++ b/.changeset/famous-oranges-pull.md @@ -0,0 +1,6 @@ +--- +"@marko/translator-default": patch +"marko": patch +--- + +Use vdom to vdom comparison for special attributes (input.value, input.checked and option.selected) to improve consistency with how other attributes are handled. diff --git a/.changeset/shy-chicken-visit.md b/.changeset/shy-chicken-visit.md new file mode 100644 index 000000000..2518ccc24 --- /dev/null +++ b/.changeset/shy-chicken-visit.md @@ -0,0 +1,6 @@ +--- +"@marko/translator-default": patch +"marko": patch +--- + +Avoid setting attribute value for special properties (like input.value, input.checked and option.selected) diff --git a/.changeset/tender-emus-obey.md b/.changeset/tender-emus-obey.md new file mode 100644 index 000000000..495a9a095 --- /dev/null +++ b/.changeset/tender-emus-obey.md @@ -0,0 +1,6 @@ +--- +"@marko/translator-default": patch +"marko": patch +--- + +Normalize attribute values before setting value to avoid unnecessary work. diff --git a/packages/marko/src/runtime/vdom/VElement.js b/packages/marko/src/runtime/vdom/VElement.js index 9728e304c..6a2848c76 100644 --- a/packages/marko/src/runtime/vdom/VElement.js +++ b/packages/marko/src/runtime/vdom/VElement.js @@ -22,28 +22,51 @@ var FLAG_SIMPLE_ATTRS = 1; var FLAG_CUSTOM_ELEMENT = 2; var FLAG_SPREAD_ATTRS = 4; -var defineProperty = Object.defineProperty; - var ATTR_HREF = "href"; var EMPTY_OBJECT = Object.freeze(Object.create(null)); +var specialElHandlers = { + option: { + selected: function (fromEl, value) { + fromEl.selected = value !== undefined; + }, + }, + input: { + value: function (fromEl, value) { + fromEl.value = value === undefined ? "" : value; + }, + checked: function (fromEl, value) { + fromEl.checked = value !== undefined; + }, + }, +}; -function convertAttrValue(type, value) { +function normalizeValue(value) { if (value === true) { return ""; - } else if (type == "object") { - switch (value.toString) { - case Object.prototype.toString: - case Array.prototype.toString: - // eslint-disable-next-line no-constant-condition - if ("MARKO_DEBUG") { - complain( - "Relying on JSON.stringify for attribute values is deprecated, in future versions of Marko these will be cast to strings instead.", - ); - } - return JSON.stringify(value); - case RegExp.prototype.toString: - return value.source; - } + } + + if (value == null || value === false) { + return; + } + + switch (typeof value) { + case "string": + return value; + case "object": + switch (value.toString) { + case Object.prototype.toString: + case Array.prototype.toString: + // eslint-disable-next-line no-constant-condition + if ("MARKO_DEBUG") { + complain( + "Relying on JSON.stringify for attribute values is deprecated, in future versions of Marko these will be cast to strings instead.", + ); + } + return JSON.stringify(value); + case RegExp.prototype.toString: + return value.source; + } + break; } return value + ""; @@ -57,22 +80,6 @@ function assign(a, b) { } } -function setAttribute(el, namespaceURI, name, value) { - if (namespaceURI === null) { - el.setAttribute(name, value); - } else { - el.setAttributeNS(namespaceURI, name, value); - } -} - -function removeAttribute(el, namespaceURI, name) { - if (namespaceURI === null) { - el.removeAttribute(name); - } else { - el.removeAttributeNS(namespaceURI, name); - } -} - function VElementClone(other) { this.___firstChildInternal = other.___firstChildInternal; this.___parentNode = null; @@ -177,19 +184,11 @@ VElement.prototype = { assign(el, attributes); } else { for (var attrName in attributes) { - var attrValue = attributes[attrName]; - - if (attrValue !== false && attrValue != null) { - var type = typeof attrValue; - - if (type !== "string") { - // Special attributes aren't copied to the real DOM. They are only - // kept in the virtual attributes map - attrValue = convertAttrValue(type, attrValue); - } + var attrValue = normalizeValue(attributes[attrName]); + if (attrValue !== undefined) { if (attrName == ATTR_XLINK_HREF) { - setAttribute(el, NS_XLINK, ATTR_HREF, attrValue); + el.setAttributeNS(NS_XLINK, ATTR_HREF, attrValue); } else { el.setAttribute(attrName, attrValue); } @@ -197,7 +196,7 @@ VElement.prototype = { } if (tagName === "textarea") { - el.defaultValue = el.value = this.___value; + el.defaultValue = this.___valueInternal; } } @@ -217,31 +216,7 @@ VElement.prototype = { inherit(VElement, VNode); -var proto = (VElementClone.prototype = VElement.prototype); - -["checked", "selected", "disabled"].forEach(function (name) { - defineProperty(proto, name, { - get: function () { - var value = this.___attributes[name]; - return value !== false && value != null; - }, - }); -}); - -defineProperty(proto, "___value", { - get: function () { - var value = this.___valueInternal; - if (value == null) { - value = this.___attributes.value; - } - return value != null && value !== false - ? value + "" - : this.___attributes.type === "checkbox" || - this.___attributes.type === "radio" - ? "on" - : ""; - }, -}); +VElementClone.prototype = VElement.prototype; function virtualizeElement(node, virtualizeChildNodes, ownerComponent) { var attributes = node.attributes; @@ -340,34 +315,31 @@ VElement.___morphAttrs = function (fromEl, vFromEl, toEl) { } var preserve = (props && props.pa) || EMPTY_OBJECT; - var namespaceURI; + var specialAttrs = specialElHandlers[toEl.___nodeName] || EMPTY_OBJECT; + var specialAttr; // Loop over all of the attributes in the attribute map and compare // them to the value in the old map. However, if the value is // null/undefined/false then we want to remove the attribute for (attrName in attrs) { - attrValue = attrs[attrName]; - if (preserve[attrName] || oldAttrs[attrName] === attrValue) { - continue; - } - - namespaceURI = null; - - if (attrName === ATTR_XLINK_HREF) { - namespaceURI = NS_XLINK; - attrName = ATTR_HREF; - } - - if (attrValue == null || attrValue === false) { - removeAttribute(fromEl, namespaceURI, attrName); - } else { - var type = typeof attrValue; - - if (type !== "string") { - attrValue = convertAttrValue(type, attrValue); + if ( + !preserve[attrName] && + normalizeValue(oldAttrs[attrName]) !== + (attrValue = normalizeValue(attrs[attrName])) + ) { + if ((specialAttr = specialAttrs[attrName])) { + specialAttr(fromEl, attrValue); + } else if (attrName === ATTR_XLINK_HREF) { + if (attrValue === undefined) { + fromEl.removeAttributeNS(NS_XLINK, ATTR_HREF); + } else { + fromEl.setAttributeNS(NS_XLINK, ATTR_HREF, attrValue); + } + } else if (attrValue === undefined) { + fromEl.removeAttribute(attrName); + } else { + fromEl.setAttribute(attrName, attrValue); } - - setAttribute(fromEl, namespaceURI, attrName, attrValue); } } @@ -384,7 +356,9 @@ VElement.___morphAttrs = function (fromEl, vFromEl, toEl) { if (toEl.___key === null || fromFlags & FLAG_SPREAD_ATTRS) { for (attrName in oldAttrs) { if (!(attrName in attrs)) { - if (attrName === ATTR_XLINK_HREF) { + if ((specialAttr = specialAttrs[attrName])) { + specialAttr(fromEl, undefined); + } else if (attrName === ATTR_XLINK_HREF) { fromEl.removeAttributeNS(ATTR_XLINK_HREF, ATTR_HREF); } else { fromEl.removeAttribute(attrName); diff --git a/packages/marko/src/runtime/vdom/VNode.js b/packages/marko/src/runtime/vdom/VNode.js index 3f64aacf3..b41c64df6 100644 --- a/packages/marko/src/runtime/vdom/VNode.js +++ b/packages/marko/src/runtime/vdom/VNode.js @@ -52,8 +52,6 @@ VNode.prototype = { if (child.___Text) { var childValue = child.___nodeValue; this.___valueInternal = (this.___valueInternal || "") + childValue; - } else if (child.___preserve || child.___preserveBody) { - this.___preserveTextAreaValue = true; } else { throw TypeError(); } diff --git a/packages/marko/src/runtime/vdom/morphdom/index.js b/packages/marko/src/runtime/vdom/morphdom/index.js index 71edce2bc..1cb544f3b 100644 --- a/packages/marko/src/runtime/vdom/morphdom/index.js +++ b/packages/marko/src/runtime/vdom/morphdom/index.js @@ -11,7 +11,6 @@ var KeySequence = require("../../components/KeySequence"); var VElement = require("../vdom").___VElement; var fragment = require("./fragment"); var helpers = require("./helpers"); -var specialElHandlers = require("./specialElHandlers"); var virtualizeElement = VElement.___virtualize; var morphAttrs = VElement.___morphAttrs; var keysByDOMNode = domData.___keyByDOMNode; @@ -693,14 +692,15 @@ function morphdom(fromNode, toNode, host, componentsContext) { return; } - if (nodeName !== "textarea") { + if (nodeName === "textarea") { + var newValue = toEl.___valueInternal || ""; + var oldValue = vFromEl.___valueInternal || ""; + if (oldValue !== newValue) { + fromEl.value = newValue; + } + } else { morphChildren(fromEl, toEl, parentComponent); } - - var specialElHandler = specialElHandlers[nodeName]; - if (specialElHandler !== undefined) { - specialElHandler(fromEl, toEl); - } } // END: morphEl(...) // eslint-disable-next-line no-constant-condition diff --git a/packages/marko/src/runtime/vdom/morphdom/specialElHandlers.js b/packages/marko/src/runtime/vdom/morphdom/specialElHandlers.js deleted file mode 100644 index 01462eea7..000000000 --- a/packages/marko/src/runtime/vdom/morphdom/specialElHandlers.js +++ /dev/null @@ -1,106 +0,0 @@ -function syncBooleanAttrProp(fromEl, toEl, name) { - if (fromEl[name] !== toEl[name]) { - fromEl[name] = toEl[name]; - if (fromEl[name]) { - fromEl.setAttribute(name, ""); - } else { - fromEl.removeAttribute(name, ""); - } - } -} - -function forEachOption(el, fn, i) { - var curChild = el.___firstChild; - - while (curChild) { - if (curChild.___nodeName === "option") { - fn(curChild, ++i); - } else { - i = forEachOption(curChild, fn, i); - } - - curChild = curChild.___nextSibling; - } - - return i; -} - -// We use a JavaScript class to benefit from fast property lookup -function SpecialElHandlers() {} -SpecialElHandlers.prototype = { - /** - * Needed for IE. Apparently IE doesn't think that "selected" is an - * attribute when reading over the attributes using selectEl.attributes - */ - option: function (fromEl, toEl) { - syncBooleanAttrProp(fromEl, toEl, "selected"); - }, - button: function (fromEl, toEl) { - syncBooleanAttrProp(fromEl, toEl, "disabled"); - }, - /** - * The "value" attribute is special for the element since it sets - * the initial value. Changing the "value" attribute without changing the - * "value" property will have no effect since it is only used to the set the - * initial value. Similar for the "checked" attribute, and "disabled". - */ - input: function (fromEl, toEl) { - syncBooleanAttrProp(fromEl, toEl, "checked"); - syncBooleanAttrProp(fromEl, toEl, "disabled"); - - if (fromEl.value != toEl.___value) { - fromEl.value = toEl.___value; - } - - if (fromEl.hasAttribute("value") && !toEl.___hasAttribute("value")) { - fromEl.removeAttribute("value"); - } - }, - - textarea: function (fromEl, toEl) { - if (toEl.___preserveTextAreaValue) { - return; - } - - var newValue = toEl.___value; - if (fromEl.value != newValue) { - fromEl.value = newValue; - } - - var firstChild = fromEl.firstChild; - if (firstChild) { - // Needed for IE. Apparently IE sets the placeholder as the - // node value and vise versa. This ignores an empty update. - var oldValue = firstChild.nodeValue; - - if ( - oldValue == newValue || - (!newValue && oldValue == fromEl.placeholder) - ) { - return; - } - - firstChild.nodeValue = newValue; - } - }, - select: function (fromEl, toEl) { - if (!toEl.___hasAttribute("multiple")) { - var selected = 0; - forEachOption( - toEl, - function (option, i) { - if (option.___hasAttribute("selected")) { - selected = i; - } - }, - -1, - ); - - if (fromEl.selectedIndex !== selected) { - fromEl.selectedIndex = selected; - } - } - }, -}; - -module.exports = new SpecialElHandlers(); diff --git a/packages/marko/test/__util__/domToString.js b/packages/marko/test/__util__/domToString.js index 8309b865a..c67e774a0 100644 --- a/packages/marko/test/__util__/domToString.js +++ b/packages/marko/test/__util__/domToString.js @@ -100,7 +100,7 @@ function vdomToHTML(node, options) { html += indent + " VALUE: " + - JSON.stringify(ltrim(el.value || el.___value)) + + JSON.stringify(ltrim(el.value || el.___valueInternal)) + "\n"; } else { var curChild = getFirstChild(el); diff --git a/packages/marko/test/__util__/toHTML.js b/packages/marko/test/__util__/toHTML.js index bd3a01f9c..ca2c192bf 100644 --- a/packages/marko/test/__util__/toHTML.js +++ b/packages/marko/test/__util__/toHTML.js @@ -86,7 +86,10 @@ function toHTML(node) { if (tagName.toUpperCase() === "TEXTAREA") { html += - indent + " VALUE: " + JSON.stringify(el.value || el.___value) + "\n"; + indent + + " VALUE: " + + JSON.stringify(el.value || el.___valueInternal) + + "\n"; } else { var curChild = getFirstChild(el); while (curChild) { diff --git a/packages/marko/test/components-browser/fixtures/textarea-value-attribute/index.marko b/packages/marko/test/components-browser/fixtures/textarea-value-attribute/index.marko index 75e1b017c..146803dc1 100644 --- a/packages/marko/test/components-browser/fixtures/textarea-value-attribute/index.marko +++ b/packages/marko/test/components-browser/fixtures/textarea-value-attribute/index.marko @@ -6,4 +6,4 @@ class { } } -