@marko/translator-default 5.31.13 → 5.31.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -472,10 +472,9 @@ function getRuntimeEntryFiles(output, optimize) {
472
472
  `${base}runtime/helpers/assign.js`,
473
473
  `${base}runtime/helpers/class-value.js`,
474
474
  `${base}runtime/helpers/dynamic-tag.js`,
475
- `${base}runtime/helpers/load-nested-tag.js`,
475
+ `${base}runtime/helpers/attr-tag.js`,
476
476
  `${base}runtime/helpers/merge.js`,
477
477
  `${base}runtime/helpers/repeatable.js`,
478
- `${base}runtime/helpers/self-iterator.js`,
479
478
  `${base}runtime/helpers/render-tag.js`,
480
479
  `${base}runtime/helpers/style-value.js`,
481
480
  `${base}runtime/helpers/to-string.js`,
@@ -505,9 +504,7 @@ function getRuntimeEntryFiles(output, optimize) {
505
504
  `${base}runtime/vdom/index.js`,
506
505
  `${base}runtime/vdom/hot-reload.js`,
507
506
  `${base}runtime/vdom/helpers/attrs.js`,
508
- `${base}runtime/vdom/helpers/const.js`,
509
- `${base}runtime/vdom/helpers/v-element.js`,
510
- `${base}runtime/vdom/helpers/v-text.js`,
507
+ `${base}runtime/vdom/helpers/const-element.js`,
511
508
  `${base}runtime/vdom/preserve-attrs.js`])];
512
509
 
513
510
 
@@ -1,4 +1,5 @@
1
- "use strict";var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");exports.__esModule = true;exports.default = _default;var _babelUtils = require("@marko/babel-utils");
1
+ "use strict";exports.__esModule = true;exports.analyzeAttributeTags = analyzeAttributeTags;exports.default = translateAttributeTag;var _babelUtils = require("@marko/babel-utils");
2
+
2
3
 
3
4
 
4
5
 
@@ -7,182 +8,179 @@
7
8
 
8
9
 
9
10
  var _compiler = require("@marko/compiler");
10
- var _withPreviousLocation = _interopRequireDefault(require("../util/with-previous-location"));
11
11
  var _util = require("./util");
12
12
 
13
- const EMPTY_OBJECT = {};
14
- const parentIdentifierLookup = new WeakMap();
15
-
16
- // TODO: optimize inline repeated @tags.
17
-
18
- function _default(tag) {
19
- const { node } = tag;
20
- const namePath = tag.get("name");
21
- const tagName = namePath.node.value;
22
- const parentPath = (0, _babelUtils.findParentTag)(tag);
23
-
24
- (0, _babelUtils.assertNoArgs)(tag);
25
-
26
- if (!parentPath) {
27
- throw namePath.buildCodeFrameError(
28
- "@tags must be nested within another element."
29
- );
30
- }
13
+ const contentTypeCache = new WeakMap();
14
+ const ContentType = {
15
+ attribute: 0,
16
+ render: 1,
17
+ mixed: 2
18
+ };
19
+
20
+ function analyzeAttributeTags(rootTag) {
21
+ const visit = [rootTag];
22
+ const parentTags = [rootTag];
23
+ let i = 0;
24
+ let attributeTags;
25
+
26
+ while (i < visit.length) {
27
+ const tag = visit[i++];
28
+ for (const child of tag.get("body").get("body")) {
29
+ if ((0, _babelUtils.isAttributeTag)(child)) {
30
+ (0, _babelUtils.assertNoArgs)(child);
31
+ const tagDef = (0, _babelUtils.getTagDef)(child) || {};
32
+ const name = (0, _babelUtils.getFullyResolvedTagName)(child);
33
+ let {
34
+ targetProperty = child.node.name.value.slice(1),
35
+ isRepeated = false
36
+ } = tagDef;
37
+
38
+ const preserveName =
39
+ tagDef.preserveName === true || tagDef.removeDashes === false;
40
+
41
+ if (!preserveName) {
42
+ targetProperty = removeDashes(targetProperty);
43
+ }
31
44
 
32
- const parentAttributes = parentPath.get("attributes");
33
- const tagDef = (0, _babelUtils.getTagDef)(tag);
34
- const { isRepeated, targetProperty = tagName.slice(1) } =
35
- tagDef || EMPTY_OBJECT;
36
- const isDynamic = isRepeated || parentPath !== tag.parentPath.parentPath;
37
- parentPath.node.exampleAttributeTag = node;
38
-
39
- if (isDynamic) {
40
- if (!parentPath.node.hasDynamicAttrTags) {
41
- const body = parentPath.get("body").get("body");
42
- parentPath.node.hasDynamicAttrTags = true;
43
-
44
- for (let i = body.length; i--;) {
45
- const child = body[i];
46
- if (isAttributeTagChild(child)) {
47
- child.insertAfter(_compiler.types.stringLiteral("END_ATTRIBUTE_TAGS"));
48
- break;
45
+ const attrTagMeta = (attributeTags ||= {})[name] ||= {
46
+ targetProperty,
47
+ isRepeated
48
+ };
49
+
50
+ (child.node.extra ||= {}).attributeTag = attrTagMeta;
51
+
52
+ const parentTag = (0, _babelUtils.findParentTag)(child);
53
+ const parentTagExtra = parentTag.node.extra ||= {};
54
+ parentTagExtra.hasAttributeTags = true;
55
+ parentTags.push(child);
56
+ visit.push(child);
57
+ } else if ((0, _babelUtils.isTransparentTag)(child)) {
58
+ switch (getContentType(child)) {
59
+ case ContentType.mixed:
60
+ throw child.buildCodeFrameError(
61
+ "Cannot mix @tags with other content when under a control flow."
62
+ );
63
+ case ContentType.attribute:
64
+ visit.push(child);
65
+ break;
66
+ case ContentType.render:
67
+ break;
49
68
  }
50
69
  }
51
70
  }
52
- } else {
53
- const previousAttr = parentAttributes.find(
54
- (attr) => attr.get("name").node === targetProperty
55
- );
56
-
57
- if (previousAttr) {
58
- const previousValue = previousAttr.get("value").node;
59
- if (_compiler.types.isObjectExpression(previousValue)) {
60
- previousAttr.set(
61
- "value",
62
- _compiler.types.arrayExpression([previousValue, getAttrTagObject(tag)])
63
- );
64
- } else if (_compiler.types.isArrayExpression(previousAttr)) {
65
- previousAttr.elements.push(getAttrTagObject(tag));
66
- } else {
67
- previousAttr.set(
68
- "value",
69
- _compiler.types.callExpression(
70
- (0, _babelUtils.importDefault)(
71
- tag.hub.file,
72
- "marko/src/runtime/helpers/repeatable.js",
73
- "marko_repeatable"
74
- ),
75
- [previousValue, getAttrTagObject(tag)]
76
- )
77
- );
78
- }
79
- } else {
80
- parentPath.pushContainer(
81
- "attributes",
82
- _compiler.types.markoAttribute(targetProperty, getAttrTagObject(tag))
83
- );
84
- }
85
-
86
- tag.remove();
87
- return;
88
71
  }
89
72
 
90
- let identifiers = parentIdentifierLookup.get(parentPath);
73
+ if (attributeTags) {
74
+ (rootTag.node.extra ??= {}).attributeTags = attributeTags;
75
+
76
+ for (const parentTag of parentTags) {
77
+ if (getContentType(parentTag) === ContentType.mixed) {
78
+ // move all non scriptlet / attribute tag children to the end of the renderbody
79
+ const renderBody = [
80
+ _compiler.types.expressionStatement(_compiler.types.stringLiteral("END_ATTRIBUTE_TAGS"))];
81
+
82
+ const body = parentTag.get("body");
83
+ for (const child of body.get("body")) {
84
+ if (
85
+ child.isMarkoScriptlet() ||
86
+ (0, _babelUtils.isAttributeTag)(child) ||
87
+ (0, _babelUtils.isTransparentTag)(child) &&
88
+ getContentType(child) === ContentType.attribute)
89
+ {
90
+ continue;
91
+ }
92
+
93
+ renderBody.push(child.node);
94
+ child.remove();
95
+ }
91
96
 
92
- if (!identifiers) {
93
- parentIdentifierLookup.set(parentPath, identifiers = {});
97
+ body.node.body = body.node.body.concat(renderBody);
98
+ }
99
+ }
94
100
  }
101
+ }
95
102
 
96
- let identifier = identifiers[targetProperty];
97
-
98
- if (!identifier) {
99
- identifier = identifiers[targetProperty] =
100
- tag.scope.generateUidIdentifier(targetProperty);
101
- parentPath.
102
- get("body").
103
- unshiftContainer(
104
- "body",
105
- _compiler.types.variableDeclaration(isRepeated ? "const" : "let", [
106
- _compiler.types.variableDeclarator(
107
- identifier,
108
- isRepeated ? _compiler.types.arrayExpression([]) : _compiler.types.nullLiteral()
109
- )]
110
- )
111
- );
112
- parentPath.pushContainer(
113
- "attributes",
114
- _compiler.types.markoAttribute(targetProperty, identifier)
115
- );
103
+ function translateAttributeTag(tag) {
104
+ const { node } = tag;
105
+ const meta = node.extra?.attributeTag;
106
+ if (!meta) {
107
+ throw tag.
108
+ get("name").
109
+ buildCodeFrameError("@tags must be nested within another element.");
116
110
  }
117
111
 
118
- if (isRepeated) {
119
- tag.replaceWith(
120
- (0, _withPreviousLocation.default)(
121
- _compiler.types.expressionStatement(
122
- _compiler.types.callExpression(
123
- _compiler.types.memberExpression(identifier, _compiler.types.identifier("push")),
124
- [getAttrTagObject(tag)]
125
- )
126
- ),
127
- node
128
- )
129
- );
130
- } else {
131
- tag.replaceWith(
132
- (0, _withPreviousLocation.default)(
133
- _compiler.types.expressionStatement(
134
- _compiler.types.assignmentExpression(
135
- "=",
136
- identifier,
137
- _compiler.types.callExpression(
138
- (0, _babelUtils.importDefault)(
139
- tag.hub.file,
140
- "marko/src/runtime/helpers/repeatable.js",
141
- "marko_repeatable"
142
- ),
143
- [identifier, getAttrTagObject(tag)]
144
- )
145
- )
112
+ (0, _babelUtils.assertNoArgs)(tag);
113
+
114
+ tag.replaceWith(
115
+ _compiler.types.expressionStatement(
116
+ _compiler.types.callExpression(
117
+ (0, _babelUtils.importNamed)(
118
+ tag.hub.file,
119
+ "marko/src/runtime/helpers/attr-tag.js",
120
+ meta.isRepeated ? "r" : "a",
121
+ meta.isRepeated ?
122
+ "marko_repeated_attr_tag" :
123
+ "marko_repeatable_attr_tag"
146
124
  ),
147
- node
125
+ [_compiler.types.stringLiteral(meta.targetProperty), getAttrTagObject(tag)]
148
126
  )
149
- );
150
- }
127
+ )
128
+ );
151
129
  }
152
130
 
153
131
  function getAttrTagObject(tag) {
154
132
  const attrs = (0, _util.getAttrs)(tag);
155
- const iteratorProp = _compiler.types.objectProperty(
156
- _compiler.types.memberExpression(_compiler.types.identifier("Symbol"), _compiler.types.identifier("iterator")),
157
- (0, _babelUtils.importDefault)(
158
- tag.hub.file,
159
- "marko/src/runtime/helpers/self-iterator.js",
160
- "marko_self_iterator"
161
- ),
162
- true
163
- );
164
133
 
165
134
  if (_compiler.types.isNullLiteral(attrs)) {
166
- return _compiler.types.objectExpression([iteratorProp]);
167
- }
168
-
169
- if (_compiler.types.isObjectExpression(attrs)) {
170
- attrs.properties.push(iteratorProp);
171
- return attrs;
135
+ return _compiler.types.objectExpression([]);
172
136
  }
173
137
 
174
- return _compiler.types.objectExpression([iteratorProp, _compiler.types.spreadElement(attrs)]);
138
+ return attrs;
175
139
  }
176
140
 
177
- function isAttributeTagChild(tag) {
178
- if ((0, _babelUtils.isAttributeTag)(tag)) {
179
- return true;
180
- }
141
+ function getContentType(tag) {
142
+ const { node } = tag;
143
+ const cached = contentTypeCache.get(node);
144
+ if (cached !== undefined) return cached;
145
+
146
+ const body = tag.get("body").get("body");
147
+ let hasAttributeTag = false;
148
+ let hasRenderBody = false;
149
+
150
+ for (const child of body) {
151
+ if ((0, _babelUtils.isAttributeTag)(child)) {
152
+ hasAttributeTag = true;
153
+ } else if ((0, _babelUtils.isTransparentTag)(child)) {
154
+ switch (getContentType(child)) {
155
+ case ContentType.mixed:
156
+ contentTypeCache.set(node, ContentType.mixed);
157
+ return ContentType.mixed;
158
+ case ContentType.attribute:
159
+ hasAttributeTag = true;
160
+ break;
161
+ case ContentType.render:
162
+ hasRenderBody = true;
163
+ break;
164
+ }
165
+ } else if (!child.isMarkoScriptlet()) {
166
+ hasRenderBody = true;
167
+ }
181
168
 
182
- if ((0, _babelUtils.isTransparentTag)(tag)) {
183
- const body = tag.get("body").get("body");
184
- return isAttributeTagChild(body[body.length - 1]);
169
+ if (hasAttributeTag && hasRenderBody) {
170
+ contentTypeCache.set(node, ContentType.mixed);
171
+ return ContentType.mixed;
172
+ }
185
173
  }
186
174
 
187
- return false;
175
+ const result = hasAttributeTag ? ContentType.attribute : ContentType.render;
176
+ contentTypeCache.set(node, result);
177
+ return result;
178
+ }
179
+
180
+ function removeDashes(str) {
181
+ return str.replace(/-([a-z])/g, matchToUpperCase);
182
+ }
183
+
184
+ function matchToUpperCase(_match, lower) {
185
+ return lower.toUpperCase();
188
186
  }
package/dist/tag/index.js CHANGED
@@ -13,11 +13,11 @@ var _keyManager = require("../util/key-manager");
13
13
  var _optimizeVdomCreate = require("../util/optimize-vdom-create");
14
14
  var _pluginHooks = require("../util/plugin-hooks");
15
15
  var _attribute = _interopRequireDefault(require("./attribute"));
16
- var _attributeTag = _interopRequireDefault(require("./attribute-tag"));
16
+ var _attributeTag = _interopRequireWildcard(require("./attribute-tag"));
17
17
  var _customTag = _interopRequireDefault(require("./custom-tag"));
18
18
  var _dynamicTag = _interopRequireDefault(require("./dynamic-tag"));
19
19
  var _macroTag = _interopRequireDefault(require("./macro-tag"));
20
- var _nativeTag = _interopRequireDefault(require("./native-tag"));var _default = exports.default =
20
+ var _nativeTag = _interopRequireDefault(require("./native-tag"));function _getRequireWildcardCache(e) {if ("function" != typeof WeakMap) return null;var r = new WeakMap(),t = new WeakMap();return (_getRequireWildcardCache = function (e) {return e ? t : r;})(e);}function _interopRequireWildcard(e, r) {if (!r && e && e.__esModule) return e;if (null === e || "object" != typeof e && "function" != typeof e) return { default: e };var t = _getRequireWildcardCache(r);if (t && t.has(e)) return t.get(e);var n = { __proto__: null },a = Object.defineProperty && Object.getOwnPropertyDescriptor;for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) {var i = a ? Object.getOwnPropertyDescriptor(e, u) : null;i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u];}return n.default = e, t && t.set(e, n), n;}var _default = exports.default =
21
21
 
22
22
  {
23
23
  enter(path) {
@@ -54,6 +54,10 @@ var _nativeTag = _interopRequireDefault(require("./native-tag"));var _default =
54
54
  }
55
55
 
56
56
  if (!(0, _babelUtils.isAttributeTag)(path)) {
57
+ if ((0, _babelUtils.isDynamicTag)(path) || !((0, _babelUtils.isMacroTag)(path) || (0, _babelUtils.isNativeTag)(path))) {
58
+ (0, _attributeTag.analyzeAttributeTags)(path);
59
+ }
60
+
57
61
  (0, _keyManager.getKeyManager)(path).resolveKey(path);
58
62
  }
59
63
 
@@ -1,4 +1,4 @@
1
- "use strict";var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");exports.__esModule = true;exports.default = _default;exports.tagArguments = tagArguments;var _babelUtils = require("@marko/babel-utils");
1
+ "use strict";var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");exports.__esModule = true;exports.default = _default;var _babelUtils = require("@marko/babel-utils");
2
2
  var _compiler = require("@marko/compiler");
3
3
  var FLAGS = _interopRequireWildcard(require("../../util/runtime-flags"));
4
4
  var _vdomOutWrite = _interopRequireDefault(require("../../util/vdom-out-write"));
@@ -7,7 +7,85 @@ var _attributes = _interopRequireDefault(require("./attributes"));function _getR
7
7
 
8
8
  const SIMPLE_ATTRS = ["id", "class", "style"];
9
9
 
10
- function tagArguments(path, isStatic) {
10
+ /**
11
+ * Translates the html streaming version of a standard html element.
12
+ */
13
+ function _default(path, isNullable) {
14
+ const { node } = path;
15
+ const {
16
+ name,
17
+ key,
18
+ body: { body }
19
+ } = node;
20
+
21
+ const isEmpty = !body.length;
22
+ const writeArgs = tagArguments(path, false);
23
+ let writeStartNode = (0, _withPreviousLocation.default)(
24
+ (0, _vdomOutWrite.default)(isEmpty ? "e" : "be", ...writeArgs),
25
+ node.name
26
+ );
27
+
28
+ if (isNullable) {
29
+ writeStartNode = _compiler.types.ifStatement(
30
+ name,
31
+ writeStartNode,
32
+ _compiler.types.expressionStatement(
33
+ _compiler.types.callExpression(
34
+ _compiler.types.memberExpression(_compiler.types.identifier("out"), _compiler.types.identifier("bf")),
35
+ [
36
+ (0, _babelUtils.normalizeTemplateString)`f_${key}`,
37
+ path.hub.file._componentInstanceIdentifier]
38
+
39
+ )
40
+ )
41
+ );
42
+ }
43
+
44
+ if (isEmpty) {
45
+ path.replaceWith(writeStartNode);
46
+ return;
47
+ }
48
+
49
+ let writeEndNode = (0, _vdomOutWrite.default)("ee");
50
+ if (isNullable) {
51
+ writeEndNode = _compiler.types.ifStatement(
52
+ name,
53
+ writeEndNode,
54
+ _compiler.types.expressionStatement(
55
+ _compiler.types.callExpression(
56
+ _compiler.types.memberExpression(_compiler.types.identifier("out"), _compiler.types.identifier("ef")),
57
+ []
58
+ )
59
+ )
60
+ );
61
+ }
62
+
63
+ let needsBlock;
64
+ for (const childNode of body) {
65
+ if (_compiler.types.isVariableDeclaration(childNode)) {
66
+ if (childNode.kind === "const" || childNode.kind === "let") {
67
+ needsBlock = true;
68
+ break;
69
+ }
70
+ }
71
+ }
72
+
73
+ path.replaceWithMultiple(
74
+ [writeStartNode].
75
+ concat(needsBlock ? _compiler.types.blockStatement(body) : body).
76
+ concat(writeEndNode)
77
+ );
78
+ }
79
+
80
+ function isPropertyName({ key }, names) {
81
+ if (_compiler.types.isStringLiteral(key)) {
82
+ return names.includes(key.value);
83
+ } else if (_compiler.types.isIdentifier(key)) {
84
+ return names.includes(key.name);
85
+ }
86
+ }
87
+
88
+ function tagArguments(path) {
11
89
  const {
12
90
  hub: { file },
13
91
  node
@@ -29,13 +107,9 @@ function tagArguments(path, isStatic) {
29
107
  const writeArgs = [
30
108
  name,
31
109
  attrsObj,
32
- !key && isStatic ? _compiler.types.nullLiteral() : key,
33
- isStatic ? _compiler.types.nullLiteral() : file._componentInstanceIdentifier,
34
- isStatic ?
35
- _compiler.types.numericLiteral(body.length) :
36
- body.length ?
37
- _compiler.types.nullLiteral() :
38
- _compiler.types.numericLiteral(0)];
110
+ key,
111
+ file._componentInstanceIdentifier,
112
+ body.length ? _compiler.types.nullLiteral() : _compiler.types.numericLiteral(0)];
39
113
 
40
114
 
41
115
  if (node.preserveAttrs) {
@@ -101,82 +175,4 @@ function tagArguments(path, isStatic) {
101
175
  writeArgs.push(_compiler.types.objectExpression(tagProperties));
102
176
  }
103
177
  return writeArgs;
104
- }
105
-
106
- /**
107
- * Translates the html streaming version of a standard html element.
108
- */
109
- function _default(path, isNullable) {
110
- const { node } = path;
111
- const {
112
- name,
113
- key,
114
- body: { body }
115
- } = node;
116
-
117
- const isEmpty = !body.length;
118
- const writeArgs = tagArguments(path, false);
119
- let writeStartNode = (0, _withPreviousLocation.default)(
120
- (0, _vdomOutWrite.default)(isEmpty ? "e" : "be", ...writeArgs),
121
- node.name
122
- );
123
-
124
- if (isNullable) {
125
- writeStartNode = _compiler.types.ifStatement(
126
- name,
127
- writeStartNode,
128
- _compiler.types.expressionStatement(
129
- _compiler.types.callExpression(
130
- _compiler.types.memberExpression(_compiler.types.identifier("out"), _compiler.types.identifier("bf")),
131
- [
132
- (0, _babelUtils.normalizeTemplateString)`f_${key}`,
133
- path.hub.file._componentInstanceIdentifier]
134
-
135
- )
136
- )
137
- );
138
- }
139
-
140
- if (isEmpty) {
141
- path.replaceWith(writeStartNode);
142
- return;
143
- }
144
-
145
- let writeEndNode = (0, _vdomOutWrite.default)("ee");
146
- if (isNullable) {
147
- writeEndNode = _compiler.types.ifStatement(
148
- name,
149
- writeEndNode,
150
- _compiler.types.expressionStatement(
151
- _compiler.types.callExpression(
152
- _compiler.types.memberExpression(_compiler.types.identifier("out"), _compiler.types.identifier("ef")),
153
- []
154
- )
155
- )
156
- );
157
- }
158
-
159
- let needsBlock;
160
- for (const childNode of body) {
161
- if (_compiler.types.isVariableDeclaration(childNode)) {
162
- if (childNode.kind === "const" || childNode.kind === "let") {
163
- needsBlock = true;
164
- break;
165
- }
166
- }
167
- }
168
-
169
- path.replaceWithMultiple(
170
- [writeStartNode].
171
- concat(needsBlock ? _compiler.types.blockStatement(body) : body).
172
- concat(writeEndNode)
173
- );
174
- }
175
-
176
- function isPropertyName({ key }, names) {
177
- if (_compiler.types.isStringLiteral(key)) {
178
- return names.includes(key.value);
179
- } else if (_compiler.types.isIdentifier(key)) {
180
- return names.includes(key.name);
181
- }
182
178
  }
package/dist/tag/util.js CHANGED
@@ -3,12 +3,12 @@ var _compiler = require("@marko/compiler");
3
3
  var _classValue = _interopRequireDefault(require("marko/src/runtime/helpers/class-value"));
4
4
  var _styleValue = _interopRequireDefault(require("marko/src/runtime/helpers/style-value"));
5
5
 
6
- function getAttrs(path, preserveNames, skipRenderBody) {
6
+ function getAttrs(path, preserveNames) {
7
7
  const { node } = path;
8
8
  const {
9
+ extra,
9
10
  attributes,
10
- body: { body, params },
11
- hasDynamicAttrTags
11
+ body: { body, params }
12
12
  } = node;
13
13
  const attrsLen = attributes.length;
14
14
  const childLen = body.length;
@@ -16,6 +16,7 @@ function getAttrs(path, preserveNames, skipRenderBody) {
16
16
  const targetObjects = {};
17
17
  const tagDef = (0, _babelUtils.getTagDef)(path);
18
18
  const foundProperties = {};
19
+ const hasAttributeTags = extra?.hasAttributeTags;
19
20
 
20
21
  for (let i = 0; i < attrsLen; i++) {
21
22
  const { name, value } = attributes[i];
@@ -69,34 +70,16 @@ function getAttrs(path, preserveNames, skipRenderBody) {
69
70
  }
70
71
  }
71
72
 
72
- if (!skipRenderBody && childLen) {
73
- let endDynamicAttrTagsIndex = -1;
74
-
75
- if (hasDynamicAttrTags) {
76
- endDynamicAttrTagsIndex = findLastIndex(
77
- body,
78
- ({ value }) => value === "END_ATTRIBUTE_TAGS"
79
- );
80
- path.
81
- insertBefore(body.slice(0, endDynamicAttrTagsIndex)).
82
- map((child) => child.skip());
83
- }
84
-
85
- if (!hasDynamicAttrTags || endDynamicAttrTagsIndex !== childLen - 1) {
86
- properties.push(
87
- _compiler.types.objectProperty(
88
- _compiler.types.stringLiteral("renderBody"),
89
- _compiler.types.arrowFunctionExpression(
90
- [_compiler.types.identifier("out"), ...params],
91
- _compiler.types.blockStatement(
92
- hasDynamicAttrTags ?
93
- body.slice(endDynamicAttrTagsIndex + 1) :
94
- body
95
- )
96
- )
73
+ if (childLen && !hasAttributeTags) {
74
+ properties.push(
75
+ _compiler.types.objectProperty(
76
+ _compiler.types.stringLiteral("renderBody"),
77
+ _compiler.types.arrowFunctionExpression(
78
+ [_compiler.types.identifier("out"), ...params],
79
+ _compiler.types.blockStatement(body)
97
80
  )
98
- );
99
- }
81
+ )
82
+ );
100
83
  }
101
84
 
102
85
  // Default parameters
@@ -121,15 +104,55 @@ function getAttrs(path, preserveNames, skipRenderBody) {
121
104
  }
122
105
  });
123
106
 
124
- if (properties.length === 0) {
125
- return _compiler.types.nullLiteral();
126
- }
107
+ let attrsObject =
108
+ properties.length === 0 ?
109
+ _compiler.types.nullLiteral() :
110
+ !hasAttributeTags &&
111
+ properties.length === 1 &&
112
+ _compiler.types.isSpreadElement(properties[0]) ?
113
+ properties[0].argument :
114
+ _compiler.types.objectExpression(properties);
115
+
116
+ if (hasAttributeTags) {
117
+ const endAttributeTagsIndex = findLastIndex(
118
+ body,
119
+ (node) =>
120
+ _compiler.types.isExpressionStatement(node) &&
121
+ _compiler.types.isStringLiteral(node.expression) &&
122
+ node.expression.value === "END_ATTRIBUTE_TAGS"
123
+ );
124
+
125
+ let attrTagBody = body;
126
+
127
+ if (endAttributeTagsIndex !== -1) {
128
+ attrTagBody = body.slice(0, endAttributeTagsIndex);
129
+ attrTagBody.push(
130
+ _compiler.types.returnStatement(
131
+ _compiler.types.arrowFunctionExpression(
132
+ [_compiler.types.identifier("out"), ...params],
133
+ _compiler.types.blockStatement(body.slice(endAttributeTagsIndex + 1))
134
+ )
135
+ )
136
+ );
137
+ }
127
138
 
128
- if (properties.length === 1 && _compiler.types.isSpreadElement(properties[0])) {
129
- return properties[0].argument;
139
+ const attrTagFn = _compiler.types.arrowFunctionExpression(
140
+ [],
141
+ _compiler.types.blockStatement(attrTagBody)
142
+ );
143
+
144
+ attrsObject = _compiler.types.callExpression(
145
+ (0, _babelUtils.importNamed)(
146
+ path.hub.file,
147
+ "marko/src/runtime/helpers/attr-tag.js",
148
+ "i",
149
+ "marko_render_input"
150
+ ),
151
+ properties.length === 0 ? [attrTagFn] : [attrTagFn, attrsObject]
152
+ );
130
153
  }
131
154
 
132
- return _compiler.types.objectExpression(properties);
155
+ return attrsObject;
133
156
  }
134
157
 
135
158
  function buildEventHandlerArray(path) {
@@ -207,6 +230,8 @@ function findLastIndex(arr, check) {
207
230
  return i;
208
231
  }
209
232
  }
233
+
234
+ return -1;
210
235
  }
211
236
 
212
237
  function mergeSpread(properties, value) {
@@ -7,7 +7,7 @@
7
7
 
8
8
  var _compiler = require("@marko/compiler");
9
9
  var _he = require("he");
10
- var _nativeTagVdom = require("../tag/native-tag[vdom]");
10
+ var _attributes = _interopRequireDefault(require("../tag/native-tag[vdom]/attributes"));
11
11
  var _keyManager = require("./key-manager");
12
12
  var _vdomOutWrite = _interopRequireDefault(require("./vdom-out-write"));
13
13
 
@@ -40,10 +40,9 @@ const mergeStaticCreateVisitor = {
40
40
  },
41
41
  MarkoTag(path, state) {
42
42
  (0, _keyManager.getKeyManager)(path).resolveKey(path);
43
- const writeArgs = (0, _nativeTagVdom.tagArguments)(path, true);
44
43
  state.currentRoot = _compiler.types.callExpression(
45
44
  _compiler.types.memberExpression(state.currentRoot, _compiler.types.identifier("e")),
46
- writeArgs
45
+ getConstElementArgs(path)
47
46
  );
48
47
  }
49
48
  };
@@ -70,7 +69,8 @@ const analyzeStaticVisitor = {
70
69
  let isStatic =
71
70
  (0, _babelUtils.isNativeTag)(path) &&
72
71
  !path.node.body.params.length &&
73
- !path.node.arguments;
72
+ !path.node.arguments &&
73
+ !(0, _keyManager.hasUserKey)(path);
74
74
 
75
75
  const tagDef = (0, _babelUtils.getTagDef)(path);
76
76
  isStatic = isStatic && !tagDef.translator;
@@ -118,15 +118,14 @@ function optimizeStaticVDOM(path) {
118
118
  }
119
119
 
120
120
  const identifier = path.scope.generateUidIdentifier("marko_node");
121
- const writeArgs = (0, _nativeTagVdom.tagArguments)(path, true);
122
121
  const state = {
123
122
  currentRoot: _compiler.types.callExpression(
124
123
  (0, _babelUtils.importDefault)(
125
124
  file,
126
- "marko/src/runtime/vdom/helpers/v-element.js",
127
- "marko_createElement"
125
+ "marko/src/runtime/vdom/helpers/const-element.js",
126
+ "marko_constElement"
128
127
  ),
129
- writeArgs
128
+ getConstElementArgs(path)
130
129
  )
131
130
  };
132
131
 
@@ -148,4 +147,13 @@ function analyzeStaticVDOM(path) {
148
147
 
149
148
  function shouldRun(markoOpts) {
150
149
  return markoOpts.optimize && markoOpts.output !== "html";
150
+ }
151
+
152
+ function getConstElementArgs(path) {
153
+ const { node } = path;
154
+ return [
155
+ node.name,
156
+ (0, _attributes.default)(path, path.get("attributes")),
157
+ _compiler.types.numericLiteral(node.body.body.length)];
158
+
151
159
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@marko/translator-default",
3
- "version": "5.31.13",
3
+ "version": "5.31.15",
4
4
  "description": "Translates Marko templates to the default Marko runtime.",
5
5
  "keywords": [
6
6
  "babel",
@@ -34,8 +34,8 @@
34
34
  "self-closing-tags": "^1.0.1"
35
35
  },
36
36
  "devDependencies": {
37
- "@marko/compiler": "^5.34.6",
38
- "marko": "^5.32.7"
37
+ "@marko/compiler": "^5.34.7",
38
+ "marko": "^5.32.10"
39
39
  },
40
40
  "peerDependencies": {
41
41
  "@marko/compiler": "^5.16.1",