@marko/translator-default 5.24.0 → 5.25.0

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
@@ -468,6 +468,8 @@ function getRuntimeEntryFiles(output, optimize) {
468
468
  `${base}runtime/helpers/dynamic-tag.js`,
469
469
  `${base}runtime/helpers/load-nested-tag.js`,
470
470
  `${base}runtime/helpers/merge.js`,
471
+ `${base}runtime/helpers/repeatable.js`,
472
+ `${base}runtime/helpers/self-iterator.js`,
471
473
  `${base}runtime/helpers/render-tag.js`,
472
474
  `${base}runtime/helpers/style-value.js`,
473
475
  `${base}runtime/helpers/to-string.js`,
@@ -6,6 +6,7 @@ var _babelUtils = require("@marko/babel-utils");
6
6
 
7
7
 
8
8
 
9
+
9
10
  var _util = require("./util");
10
11
  var _withPreviousLocation = _interopRequireDefault(require("../util/with-previous-location"));
11
12
 
@@ -14,13 +15,13 @@ const parentIdentifierLookup = new WeakMap();
14
15
 
15
16
  // TODO: optimize inline repeated @tags.
16
17
 
17
- function _default(path) {
18
- const { node } = path;
19
- const namePath = path.get("name");
18
+ function _default(tag) {
19
+ const { node } = tag;
20
+ const namePath = tag.get("name");
20
21
  const tagName = namePath.node.value;
21
- const parentPath = (0, _babelUtils.findParentTag)(path);
22
+ const parentPath = (0, _babelUtils.findParentTag)(tag);
22
23
 
23
- (0, _babelUtils.assertNoArgs)(path);
24
+ (0, _babelUtils.assertNoArgs)(tag);
24
25
 
25
26
  if (!parentPath) {
26
27
  throw namePath.buildCodeFrameError(
@@ -29,10 +30,10 @@ function _default(path) {
29
30
  }
30
31
 
31
32
  const parentAttributes = parentPath.get("attributes");
32
- const tagDef = (0, _babelUtils.getTagDef)(path);
33
+ const tagDef = (0, _babelUtils.getTagDef)(tag);
33
34
  const { isRepeated, targetProperty = tagName.slice(1) } =
34
35
  tagDef || EMPTY_OBJECT;
35
- const isDynamic = isRepeated || parentPath !== path.parentPath.parentPath;
36
+ const isDynamic = isRepeated || parentPath !== tag.parentPath.parentPath;
36
37
  parentPath.node.exampleAttributeTag = node;
37
38
 
38
39
  if (isDynamic) {
@@ -49,28 +50,40 @@ function _default(path) {
49
50
  }
50
51
  }
51
52
  } else {
52
- if (
53
- parentAttributes.some((attr) => attr.get("name").node === targetProperty))
54
- {
55
- throw namePath.buildCodeFrameError(
56
- `Only one "${tagName}" tag is allowed here.`);
53
+ const previousAttr = parentAttributes.find(
54
+ (attr) => attr.get("name").node === targetProperty);
57
55
 
58
- }
59
56
 
60
- let attrs = (0, _util.getAttrs)(path);
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)]));
61
63
 
62
- if (_compiler.types.isNullLiteral(attrs)) {
63
- // TODO: this could be left as a null literal, but would require changes in the
64
- // await tag runtime to handle `<@catch/>`. (this would be a breaking change though)
65
- attrs = _compiler.types.objectExpression([]);
66
- }
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)]));
67
76
 
68
- parentPath.pushContainer(
69
- "attributes",
70
- _compiler.types.markoAttribute(targetProperty, attrs));
71
77
 
78
+ }
79
+ } else {
80
+ parentPath.pushContainer(
81
+ "attributes",
82
+ _compiler.types.markoAttribute(targetProperty, getAttrTagObject(tag)));
83
+
84
+ }
72
85
 
73
- path.remove();
86
+ tag.remove();
74
87
  return;
75
88
  }
76
89
 
@@ -84,7 +97,7 @@ function _default(path) {
84
97
 
85
98
  if (!identifier) {
86
99
  identifier = identifiers[targetProperty] =
87
- path.scope.generateUidIdentifier(targetProperty);
100
+ tag.scope.generateUidIdentifier(targetProperty);
88
101
  parentPath.
89
102
  get("body").
90
103
  unshiftContainer(
@@ -103,22 +116,33 @@ function _default(path) {
103
116
  }
104
117
 
105
118
  if (isRepeated) {
106
- path.replaceWith(
119
+ tag.replaceWith(
107
120
  (0, _withPreviousLocation.default)(
108
121
  _compiler.types.expressionStatement(
109
122
  _compiler.types.callExpression(
110
123
  _compiler.types.memberExpression(identifier, _compiler.types.identifier("push")),
111
- [(0, _util.getAttrs)(path)])),
124
+ [getAttrTagObject(tag)])),
112
125
 
113
126
 
114
127
  node));
115
128
 
116
129
 
117
130
  } else {
118
- path.replaceWith(
131
+ tag.replaceWith(
119
132
  (0, _withPreviousLocation.default)(
120
133
  _compiler.types.expressionStatement(
121
- _compiler.types.assignmentExpression("=", identifier, (0, _util.getAttrs)(path))),
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
+
122
146
 
123
147
  node));
124
148
 
@@ -126,6 +150,30 @@ function _default(path) {
126
150
  }
127
151
  }
128
152
 
153
+ function getAttrTagObject(tag) {
154
+ 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
+
165
+ 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;
172
+ }
173
+
174
+ return _compiler.types.objectExpression([iteratorProp, _compiler.types.spreadElement(attrs)]);
175
+ }
176
+
129
177
  function isAttributeTagChild(tag) {
130
178
  if ((0, _babelUtils.isAttributeTag)(tag)) {
131
179
  return true;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@marko/translator-default",
3
3
  "description": "Translates Marko templates to the default Marko runtime.",
4
- "version": "5.24.0",
4
+ "version": "5.25.0",
5
5
  "author": "Dylan Piercey <dpiercey@ebay.com>",
6
6
  "bugs": "https://github.com/marko-js/marko/issues/new?template=Bug_report.md",
7
7
  "dependencies": {
@@ -12,8 +12,8 @@
12
12
  "self-closing-tags": "^1.0.1"
13
13
  },
14
14
  "devDependencies": {
15
- "@marko/compiler": "^5.26.0",
16
- "marko": "^5.24.0"
15
+ "@marko/compiler": "^5.27.0",
16
+ "marko": "^5.25.0"
17
17
  },
18
18
  "files": [
19
19
  "dist"