marko 5.36.5 → 5.37.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.
Files changed (244) hide show
  1. package/dist/compiler/index.js +11 -11
  2. package/dist/core-tags/components/init-components-tag.js +4 -4
  3. package/dist/core-tags/components/preferred-script-location-tag.js +2 -2
  4. package/dist/core-tags/core/__flush_here_and_after__.js +1 -1
  5. package/dist/core-tags/core/await/AsyncValue.js +21 -21
  6. package/dist/core-tags/core/await/renderer.js +24 -24
  7. package/dist/core-tags/core/await/reorderer-renderer.js +6 -6
  8. package/dist/node-require/browser-refresh.js +18 -1
  9. package/dist/node-require/index.js +7 -7
  10. package/dist/node_modules/@internal/components-beginComponent/index-browser.js +5 -5
  11. package/dist/node_modules/@internal/components-beginComponent/index.js +12 -12
  12. package/dist/node_modules/@internal/components-define-widget-legacy/index-browser.js +99 -99
  13. package/dist/node_modules/@internal/components-define-widget-legacy/index.js +3 -3
  14. package/dist/node_modules/@internal/components-endComponent/index.js +3 -3
  15. package/dist/node_modules/@internal/components-entry/index-browser.js +2 -2
  16. package/dist/node_modules/@internal/components-entry/index.js +29 -29
  17. package/dist/node_modules/@internal/components-entry-legacy/index-browser.js +13 -13
  18. package/dist/node_modules/@internal/components-entry-legacy/index.js +1 -1
  19. package/dist/node_modules/@internal/components-registry/index-browser.js +102 -102
  20. package/dist/node_modules/@internal/components-registry/index.js +2 -2
  21. package/dist/node_modules/@internal/components-util/index-browser.js +20 -20
  22. package/dist/node_modules/@internal/components-util/index.js +24 -20
  23. package/dist/node_modules/@internal/create-readable/index-browser.js +1 -1
  24. package/dist/node_modules/@internal/create-readable/index.js +9 -9
  25. package/dist/node_modules/@internal/preserve-tag/index-browser.js +8 -8
  26. package/dist/node_modules/@internal/preserve-tag/index.js +6 -6
  27. package/dist/node_modules/@internal/set-immediate/index-browser.js +2 -2
  28. package/dist/node_modules/@internal/set-immediate/index-worker.js +3 -3
  29. package/dist/node_modules/@internal/set-immediate/index.js +3 -3
  30. package/dist/runtime/RenderResult.js +24 -24
  31. package/dist/runtime/components/Component.js +163 -163
  32. package/dist/runtime/components/ComponentDef.js +34 -34
  33. package/dist/runtime/components/ComponentsContext.js +20 -20
  34. package/dist/runtime/components/GlobalComponentsContext.js +4 -4
  35. package/dist/runtime/components/KeySequence.js +3 -3
  36. package/dist/runtime/components/ServerComponent.js +17 -17
  37. package/dist/runtime/components/State.js +28 -28
  38. package/dist/runtime/components/attach-detach.js +8 -8
  39. package/dist/runtime/components/defineComponent.js +5 -5
  40. package/dist/runtime/components/dom-data.js +6 -6
  41. package/dist/runtime/components/event-delegation.js +10 -10
  42. package/dist/runtime/components/legacy/defineComponent-legacy.js +1 -1
  43. package/dist/runtime/components/legacy/defineRenderer-legacy.js +25 -25
  44. package/dist/runtime/components/legacy/dependencies/index.js +10 -10
  45. package/dist/runtime/components/legacy/renderer-legacy.js +56 -56
  46. package/dist/runtime/components/renderer.js +45 -45
  47. package/dist/runtime/components/update-manager.js +4 -4
  48. package/dist/runtime/createOut.js +1 -1
  49. package/dist/runtime/dom-insert.js +5 -5
  50. package/dist/runtime/helpers/_change-case.js +2 -2
  51. package/dist/runtime/helpers/dynamic-tag.js +33 -33
  52. package/dist/runtime/helpers/render-tag.js +1 -1
  53. package/dist/runtime/helpers/serialize-noop.js +2 -2
  54. package/dist/runtime/helpers/style-value.js +1 -1
  55. package/dist/runtime/helpers/tags-compat/runtime-dom.js +35 -35
  56. package/dist/runtime/helpers/tags-compat/runtime-html.js +16 -16
  57. package/dist/runtime/html/AsyncStream.js +28 -28
  58. package/dist/runtime/html/BufferedWriter.js +2 -2
  59. package/dist/runtime/html/StringWriter.js +2 -2
  60. package/dist/runtime/html/helpers/_dynamic-attr.js +2 -2
  61. package/dist/runtime/html/helpers/attr.js +11 -11
  62. package/dist/runtime/html/helpers/attrs.js +6 -6
  63. package/dist/runtime/html/helpers/data-marko.js +6 -6
  64. package/dist/runtime/html/helpers/escape-quotes.js +2 -2
  65. package/dist/runtime/html/helpers/escape-xml.js +1 -1
  66. package/dist/runtime/html/helpers/merge-attrs.js +11 -11
  67. package/dist/runtime/html/helpers/props-script.js +1 -1
  68. package/dist/runtime/html/index.js +2 -2
  69. package/dist/runtime/renderable.js +5 -5
  70. package/dist/runtime/vdom/AsyncVDOMBuilder.js +100 -100
  71. package/dist/runtime/vdom/VComment.js +7 -7
  72. package/dist/runtime/vdom/VComponent.js +5 -5
  73. package/dist/runtime/vdom/VDocumentFragment.js +8 -8
  74. package/dist/runtime/vdom/VElement.js +52 -52
  75. package/dist/runtime/vdom/VFragment.js +9 -9
  76. package/dist/runtime/vdom/VNode.js +34 -34
  77. package/dist/runtime/vdom/VText.js +8 -8
  78. package/dist/runtime/vdom/helpers/attrs.js +6 -6
  79. package/dist/runtime/vdom/helpers/const-element.js +3 -3
  80. package/dist/runtime/vdom/hot-reload.js +20 -20
  81. package/dist/runtime/vdom/index.js +2 -2
  82. package/dist/runtime/vdom/morphdom/fragment.js +10 -10
  83. package/dist/runtime/vdom/morphdom/helpers.js +5 -5
  84. package/dist/runtime/vdom/morphdom/index.js +81 -81
  85. package/dist/runtime/vdom/vdom.js +15 -15
  86. package/dist/taglib/index.js +7 -7
  87. package/dist/translator/cdata/index.js +15 -0
  88. package/dist/translator/cdata/index[html].js +15 -0
  89. package/dist/translator/cdata/index[vdom].js +12 -0
  90. package/dist/translator/class.js +65 -0
  91. package/dist/translator/comment/index.js +15 -0
  92. package/dist/translator/comment/index[html].js +17 -0
  93. package/dist/translator/comment/index[vdom].js +3 -0
  94. package/dist/translator/declaration/index.js +15 -0
  95. package/dist/translator/declaration/index[html].js +12 -0
  96. package/dist/translator/declaration/index[vdom].js +3 -0
  97. package/dist/translator/document-type/index.js +15 -0
  98. package/dist/translator/document-type/index[html].js +12 -0
  99. package/dist/translator/document-type/index[vdom].js +3 -0
  100. package/dist/translator/index.js +551 -0
  101. package/dist/translator/placeholder/index.js +15 -0
  102. package/dist/translator/placeholder/index[html].js +93 -0
  103. package/dist/translator/placeholder/index[vdom].js +22 -0
  104. package/dist/translator/scriptlet.js +4 -0
  105. package/dist/translator/tag/attribute/directives/class.js +42 -0
  106. package/dist/translator/tag/attribute/directives/index.js +15 -0
  107. package/dist/translator/tag/attribute/directives/no-update-body-if.js +15 -0
  108. package/dist/translator/tag/attribute/directives/no-update-body.js +10 -0
  109. package/dist/translator/tag/attribute/directives/no-update-if.js +12 -0
  110. package/dist/translator/tag/attribute/directives/no-update.js +48 -0
  111. package/dist/translator/tag/attribute/directives/style.js +42 -0
  112. package/dist/translator/tag/attribute/index.js +150 -0
  113. package/dist/translator/tag/attribute/modifiers/index.js +7 -0
  114. package/dist/translator/tag/attribute/modifiers/no-update.js +14 -0
  115. package/dist/translator/tag/attribute/modifiers/scoped.js +23 -0
  116. package/dist/translator/tag/attribute-tag.js +149 -0
  117. package/dist/translator/tag/custom-tag.js +146 -0
  118. package/dist/translator/tag/dynamic-tag.js +74 -0
  119. package/dist/translator/tag/index.js +287 -0
  120. package/dist/translator/tag/macro-tag.js +7 -0
  121. package/dist/translator/tag/native-tag.js +27 -0
  122. package/dist/translator/tag/native-tag[html]/attributes.js +151 -0
  123. package/dist/translator/tag/native-tag[html]/index.js +221 -0
  124. package/dist/translator/tag/native-tag[vdom]/attributes.js +105 -0
  125. package/dist/translator/tag/native-tag[vdom]/index.js +189 -0
  126. package/dist/translator/tag/util.js +246 -0
  127. package/dist/translator/taglib/core/conditional/translate-else-if.js +20 -0
  128. package/dist/translator/taglib/core/conditional/translate-else.js +20 -0
  129. package/dist/translator/taglib/core/conditional/translate-if.js +8 -0
  130. package/dist/translator/taglib/core/conditional/util.js +41 -0
  131. package/dist/translator/taglib/core/index.js +474 -0
  132. package/dist/translator/taglib/core/macro/parse.js +17 -0
  133. package/dist/translator/taglib/core/macro/translate.js +48 -0
  134. package/dist/translator/taglib/core/parse-class.js +79 -0
  135. package/dist/translator/taglib/core/parse-export.js +14 -0
  136. package/dist/translator/taglib/core/parse-import.js +14 -0
  137. package/dist/translator/taglib/core/parse-module-code.js +18 -0
  138. package/dist/translator/taglib/core/parse-static.js +18 -0
  139. package/dist/translator/taglib/core/transform-style.js +66 -0
  140. package/dist/translator/taglib/core/translate-await.js +41 -0
  141. package/dist/translator/taglib/core/translate-body.js +17 -0
  142. package/dist/translator/taglib/core/translate-for.js +156 -0
  143. package/dist/translator/taglib/core/translate-html-comment.js +52 -0
  144. package/dist/translator/taglib/core/translate-include-content.js +53 -0
  145. package/dist/translator/taglib/core/translate-server-only.js +5 -0
  146. package/dist/translator/taglib/core/translate-while.js +32 -0
  147. package/dist/translator/taglib/index.js +6 -0
  148. package/dist/translator/taglib/migrate/all-templates.js +46 -0
  149. package/dist/translator/taglib/migrate/index.js +5 -0
  150. package/dist/translator/text/index.js +10 -0
  151. package/dist/translator/text/index[html].js +12 -0
  152. package/dist/translator/text/index[vdom].js +20 -0
  153. package/dist/translator/util/add-dependencies.js +329 -0
  154. package/dist/translator/util/escape-regexp.js +4 -0
  155. package/dist/translator/util/get-component-files.js +86 -0
  156. package/dist/translator/util/html-out-write.js +15 -0
  157. package/dist/translator/util/key-manager.js +176 -0
  158. package/dist/translator/util/optimize-html-writes.js +52 -0
  159. package/dist/translator/util/optimize-vdom-create.js +164 -0
  160. package/dist/translator/util/plugin-hooks.js +22 -0
  161. package/dist/translator/util/runtime-flags.js +3 -0
  162. package/dist/translator/util/vdom-out-write.js +10 -0
  163. package/dist/translator/util/with-previous-location.js +6 -0
  164. package/package.json +7 -4
  165. package/src/taglib/index.js +2 -2
  166. package/src/translator/cdata/index.js +15 -0
  167. package/src/translator/cdata/index[html].js +15 -0
  168. package/src/translator/cdata/index[vdom].js +12 -0
  169. package/src/translator/class.js +65 -0
  170. package/src/translator/comment/index.js +15 -0
  171. package/src/translator/comment/index[html].js +17 -0
  172. package/src/translator/comment/index[vdom].js +3 -0
  173. package/src/translator/declaration/index.js +15 -0
  174. package/src/translator/declaration/index[html].js +12 -0
  175. package/src/translator/declaration/index[vdom].js +3 -0
  176. package/src/translator/document-type/index.js +15 -0
  177. package/src/translator/document-type/index[html].js +12 -0
  178. package/src/translator/document-type/index[vdom].js +3 -0
  179. package/src/translator/index.js +551 -0
  180. package/src/translator/placeholder/index.js +15 -0
  181. package/src/translator/placeholder/index[html].js +93 -0
  182. package/src/translator/placeholder/index[vdom].js +22 -0
  183. package/src/translator/scriptlet.js +4 -0
  184. package/src/translator/tag/attribute/directives/class.js +42 -0
  185. package/src/translator/tag/attribute/directives/index.js +15 -0
  186. package/src/translator/tag/attribute/directives/no-update-body-if.js +15 -0
  187. package/src/translator/tag/attribute/directives/no-update-body.js +10 -0
  188. package/src/translator/tag/attribute/directives/no-update-if.js +12 -0
  189. package/src/translator/tag/attribute/directives/no-update.js +48 -0
  190. package/src/translator/tag/attribute/directives/style.js +42 -0
  191. package/src/translator/tag/attribute/index.js +150 -0
  192. package/src/translator/tag/attribute/modifiers/index.js +7 -0
  193. package/src/translator/tag/attribute/modifiers/no-update.js +14 -0
  194. package/src/translator/tag/attribute/modifiers/scoped.js +23 -0
  195. package/src/translator/tag/attribute-tag.js +149 -0
  196. package/src/translator/tag/custom-tag.js +146 -0
  197. package/src/translator/tag/dynamic-tag.js +74 -0
  198. package/src/translator/tag/index.js +287 -0
  199. package/src/translator/tag/macro-tag.js +7 -0
  200. package/src/translator/tag/native-tag.js +27 -0
  201. package/src/translator/tag/native-tag[html]/attributes.js +151 -0
  202. package/src/translator/tag/native-tag[html]/index.js +221 -0
  203. package/src/translator/tag/native-tag[vdom]/attributes.js +105 -0
  204. package/src/translator/tag/native-tag[vdom]/index.js +189 -0
  205. package/src/translator/tag/util.js +246 -0
  206. package/src/translator/taglib/core/conditional/translate-else-if.js +20 -0
  207. package/src/translator/taglib/core/conditional/translate-else.js +20 -0
  208. package/src/translator/taglib/core/conditional/translate-if.js +8 -0
  209. package/src/translator/taglib/core/conditional/util.js +41 -0
  210. package/src/translator/taglib/core/index.js +474 -0
  211. package/src/translator/taglib/core/macro/parse.js +17 -0
  212. package/src/translator/taglib/core/macro/translate.js +48 -0
  213. package/src/translator/taglib/core/parse-class.js +79 -0
  214. package/src/translator/taglib/core/parse-export.js +14 -0
  215. package/src/translator/taglib/core/parse-import.js +14 -0
  216. package/src/translator/taglib/core/parse-module-code.js +18 -0
  217. package/src/translator/taglib/core/parse-static.js +18 -0
  218. package/src/translator/taglib/core/transform-style.js +66 -0
  219. package/src/translator/taglib/core/translate-await.js +41 -0
  220. package/src/translator/taglib/core/translate-body.js +17 -0
  221. package/src/translator/taglib/core/translate-for.js +156 -0
  222. package/src/translator/taglib/core/translate-html-comment.js +52 -0
  223. package/src/translator/taglib/core/translate-include-content.js +53 -0
  224. package/src/translator/taglib/core/translate-server-only.js +5 -0
  225. package/src/translator/taglib/core/translate-while.js +32 -0
  226. package/src/translator/taglib/index.js +7 -0
  227. package/src/translator/taglib/migrate/all-templates.js +46 -0
  228. package/src/translator/taglib/migrate/index.js +5 -0
  229. package/src/translator/text/index.js +10 -0
  230. package/src/translator/text/index[html].js +12 -0
  231. package/src/translator/text/index[vdom].js +20 -0
  232. package/src/translator/util/add-dependencies.js +329 -0
  233. package/src/translator/util/escape-regexp.js +4 -0
  234. package/src/translator/util/get-component-files.js +86 -0
  235. package/src/translator/util/html-out-write.js +15 -0
  236. package/src/translator/util/key-manager.js +176 -0
  237. package/src/translator/util/optimize-html-writes.js +52 -0
  238. package/src/translator/util/optimize-vdom-create.js +164 -0
  239. package/src/translator/util/plugin-hooks.js +22 -0
  240. package/src/translator/util/runtime-flags.js +3 -0
  241. package/src/translator/util/vdom-out-write.js +10 -0
  242. package/src/translator/util/with-previous-location.js +6 -0
  243. package/translator/index.d.ts +7 -0
  244. package/translator/package.json +5 -0
@@ -0,0 +1,146 @@
1
+ "use strict";var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");exports.__esModule = true;exports.default = _default;var _compiler = require("@marko/compiler");
2
+ var _babelUtils = require("@marko/compiler/babel-utils");
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+ var _withPreviousLocation = _interopRequireDefault(require("../util/with-previous-location"));
12
+ var _dynamicTag = _interopRequireDefault(require("./dynamic-tag"));
13
+ var _nativeTag = _interopRequireDefault(require("./native-tag"));
14
+ var _util = require("./util");
15
+
16
+ function _default(path, isNullable) {
17
+ const {
18
+ hub: { file },
19
+ node
20
+ } = path;
21
+ const { markoOpts } = file;
22
+ const { name, key } = node;
23
+
24
+ (0, _babelUtils.assertNoArgs)(path);
25
+
26
+ let tagIdentifier;
27
+
28
+ if (_compiler.types.isStringLiteral(name)) {
29
+ const tagName = name.value;
30
+ let relativePath = node.extra && node.extra.relativePath;
31
+
32
+ if (!relativePath) {
33
+ const tagDef = (0, _babelUtils.getTagDef)(path);
34
+ if (tagDef && tagDef.renderer) {
35
+ // Normally new tags should not be added in the translate stage.
36
+ // We make an exception here for core tags, init-components & _preserve being the primary culprits.
37
+ // TODO: in the future refactor so this is not needed.
38
+ relativePath = (0, _babelUtils.resolveRelativePath)(file, tagDef.renderer);
39
+ }
40
+ }
41
+
42
+ let binding = !relativePath && path.scope.getBinding(tagName);
43
+ if (binding && !binding.identifier.loc) binding = null;
44
+
45
+ if (binding && binding.kind === "module") {
46
+ const importSource = binding.path.parent.source;
47
+ relativePath =
48
+ (0, _babelUtils.resolveTagImport)(path, importSource.value) || importSource.value;
49
+ (node.extra ??= {}).tagNameImported = relativePath;
50
+ binding = undefined;
51
+ }
52
+
53
+ const childFile = (0, _babelUtils.loadFileForTag)(path);
54
+ const childProgram = childFile?.ast.program;
55
+
56
+ if (childProgram?.extra?.featureType === "tags") {
57
+ const compatRuntimeFile = `marko/src/runtime/helpers/tags-compat/${
58
+ markoOpts.output === "html" ? "html" : "dom"}${
59
+ markoOpts.optimize ? "" : "-debug"}.${markoOpts.modules === "esm" ? "mjs" : "js"}`;
60
+ (0, _babelUtils.importDefault)(file, compatRuntimeFile);
61
+ path.set("name", (0, _babelUtils.importDefault)(file, relativePath, path.node.name.value));
62
+ return (0, _dynamicTag.default)(path);
63
+ } else if (relativePath) {
64
+ if (binding) {
65
+
66
+
67
+
68
+
69
+
70
+
71
+
72
+ // TODO: implement auto migration for conflicts here
73
+ // and log below warning
74
+ // console.warn(
75
+ // path.buildCodeFrameError(
76
+ // `The <${tagName}> tag has been resolved from the filesystem, however a local variable with the same name exists. In the next major version of Marko the local variable will tag precedence.`
77
+ // )
78
+ // );
79
+ }tagIdentifier = (0, _babelUtils.importDefault)(file, relativePath, tagName);} else if (binding) {path.set("name", _compiler.types.identifier(tagName));return (0, _dynamicTag.default)(path);} else if (markoOpts.ignoreUnrecognizedTags) {return (0, _nativeTag.default)(path);
80
+ } else {
81
+ throw path.
82
+ get("name").
83
+ buildCodeFrameError(
84
+ `Unable to find entry point for custom tag <${tagName}>.`
85
+ );
86
+ }
87
+ } else {
88
+ tagIdentifier = name;
89
+ }
90
+
91
+ const foundAttrs = (0, _util.getAttrs)(path);
92
+ const customTagRenderCall = (0, _withPreviousLocation.default)(
93
+ _compiler.types.expressionStatement(
94
+ _compiler.types.callExpression(
95
+ (0, _babelUtils.importDefault)(
96
+ file,
97
+ "marko/src/runtime/helpers/render-tag.js",
98
+ "marko_tag"
99
+ ),
100
+ [
101
+ tagIdentifier,
102
+ // TODO: this could be left as null if we froze input mutations and used a default object in the runtime.
103
+ _compiler.types.isNullLiteral(foundAttrs) ? _compiler.types.objectExpression([]) : foundAttrs,
104
+ _compiler.types.identifier("out"),
105
+ file._componentDefIdentifier,
106
+ key,
107
+ ...(0, _util.buildEventHandlerArray)(path)]
108
+
109
+ )
110
+ ),
111
+ node
112
+ );
113
+
114
+ if (isNullable) {
115
+ let renderBodyIdentifier;
116
+ const renderBodyProp =
117
+ _compiler.types.isObjectExpression(foundAttrs) &&
118
+ foundAttrs.properties.find(
119
+ (prop) => prop.key && prop.key.value === "renderBody"
120
+ );
121
+
122
+ if (renderBodyProp) {
123
+ renderBodyIdentifier = path.scope.generateUidIdentifier("renderBody");
124
+ path.insertBefore(
125
+ _compiler.types.variableDeclaration("const", [
126
+ _compiler.types.variableDeclarator(renderBodyIdentifier, renderBodyProp.value)]
127
+ )
128
+ );
129
+
130
+ renderBodyProp.value = renderBodyIdentifier;
131
+ }
132
+
133
+ path.replaceWith(
134
+ _compiler.types.ifStatement(
135
+ name,
136
+ customTagRenderCall,
137
+ renderBodyIdentifier &&
138
+ _compiler.types.expressionStatement(
139
+ _compiler.types.callExpression(renderBodyIdentifier, [_compiler.types.identifier("out")])
140
+ )
141
+ )
142
+ );
143
+ } else {
144
+ path.replaceWith(customTagRenderCall);
145
+ }
146
+ }
@@ -0,0 +1,74 @@
1
+ "use strict";var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");exports.__esModule = true;exports.default = _default;var _compiler = require("@marko/compiler");
2
+ var _babelUtils = require("@marko/compiler/babel-utils");
3
+
4
+ var _withPreviousLocation = _interopRequireDefault(require("../util/with-previous-location"));
5
+ var _util = require("./util");
6
+
7
+ function _default(path) {
8
+ const {
9
+ node,
10
+ hub: { file }
11
+ } = path;
12
+ const tagProperties = path.node.extra && path.node.extra.properties || [];
13
+ const { key, arguments: args } = node;
14
+ const foundAttrs = (0, _util.getAttrs)(path, true);
15
+ let renderBodyProp;
16
+ let attrsLen = _compiler.types.isNullLiteral(foundAttrs) ? 0 : 1;
17
+
18
+ if (node.preserveAttrs) {
19
+ tagProperties.push(
20
+ _compiler.types.objectProperty(
21
+ _compiler.types.identifier("pa"),
22
+ _compiler.types.objectExpression(
23
+ node.preserveAttrs.map((name) =>
24
+ _compiler.types.objectProperty(
25
+ _compiler.types.isValidIdentifier(name) ?
26
+ _compiler.types.identifier(name) :
27
+ _compiler.types.stringLiteral(name),
28
+ _compiler.types.numericLiteral(1)
29
+ )
30
+ )
31
+ )
32
+ )
33
+ );
34
+ }
35
+
36
+ if (_compiler.types.isObjectExpression(foundAttrs)) {
37
+ const renderBodyIndex = foundAttrs.properties.findIndex(
38
+ (prop) => prop.key && prop.key.value === "renderBody"
39
+ );
40
+
41
+ attrsLen = foundAttrs.properties.length;
42
+
43
+ if (renderBodyIndex > -1) {
44
+ renderBodyProp = foundAttrs.properties[renderBodyIndex];
45
+ foundAttrs.properties.splice(renderBodyIndex, 1);
46
+ attrsLen--;
47
+ }
48
+ }
49
+
50
+ const dynamicTagRenderCall = _compiler.types.expressionStatement(
51
+ _compiler.types.callExpression(
52
+ (0, _babelUtils.importDefault)(
53
+ file,
54
+ `marko/src/runtime/helpers/dynamic-tag.js`,
55
+ "marko_dynamic_tag"
56
+ ),
57
+ [
58
+ _compiler.types.identifier("out"),
59
+ node.name,
60
+ attrsLen ? _compiler.types.arrowFunctionExpression([], foundAttrs) : _compiler.types.nullLiteral(),
61
+ renderBodyProp ? renderBodyProp.value : _compiler.types.nullLiteral(),
62
+ args && args.length ? _compiler.types.arrayExpression(args) : _compiler.types.nullLiteral(),
63
+ tagProperties.length ?
64
+ _compiler.types.objectExpression(tagProperties) :
65
+ _compiler.types.nullLiteral(),
66
+ file._componentDefIdentifier,
67
+ key,
68
+ ...(0, _util.buildEventHandlerArray)(path)]
69
+
70
+ )
71
+ );
72
+
73
+ path.replaceWith((0, _withPreviousLocation.default)(dynamicTagRenderCall, node));
74
+ }
@@ -0,0 +1,287 @@
1
+ "use strict";var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");exports.__esModule = true;exports.default = void 0;var _compiler = require("@marko/compiler");
2
+ var _babelUtils = require("@marko/compiler/babel-utils");
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+ var _path = _interopRequireDefault(require("path"));
14
+
15
+ var _keyManager = require("../util/key-manager");
16
+ var _optimizeVdomCreate = require("../util/optimize-vdom-create");
17
+ var _pluginHooks = require("../util/plugin-hooks");
18
+ var _attribute = _interopRequireDefault(require("./attribute"));
19
+ var _attributeTag = _interopRequireWildcard(require("./attribute-tag"));
20
+ var _customTag = _interopRequireDefault(require("./custom-tag"));
21
+ var _dynamicTag = _interopRequireDefault(require("./dynamic-tag"));
22
+ var _macroTag = _interopRequireDefault(require("./macro-tag"));
23
+ 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 && {}.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 =
24
+
25
+ {
26
+ enter(path) {
27
+ const tagDef = (0, _babelUtils.getTagDef)(path);
28
+
29
+ if (tagDef && tagDef.translator) {
30
+ const { node } = path;
31
+ (0, _pluginHooks.enter)(tagDef.translator.hook, path, _compiler.types);
32
+
33
+ if (path.node !== node) {
34
+ return;
35
+ }
36
+ }
37
+
38
+ (0, _babelUtils.assertNoVar)(path);
39
+
40
+ for (const attr of path.get("attributes")) {
41
+ if (attr.isMarkoAttribute()) {
42
+ const { node } = path;
43
+ _attribute.default.enter(attr);
44
+ if (path.node !== node) {
45
+ return;
46
+ }
47
+ }
48
+ }
49
+
50
+ if (!(0, _babelUtils.isAttributeTag)(path)) {
51
+ if (
52
+ !tagDef &&
53
+ path.hub.file.markoOpts.ignoreUnrecognizedTags && (
54
+ path.node.attributeTags.length || path.node.body.attributeTags) &&
55
+ !(0, _babelUtils.isDynamicTag)(path))
56
+ {
57
+ moveIgnoredAttrTags(path);
58
+ }
59
+
60
+ if ((0, _babelUtils.isDynamicTag)(path) || !((0, _babelUtils.isMacroTag)(path) || (0, _babelUtils.isNativeTag)(path))) {
61
+ (0, _attributeTag.analyzeAttributeTags)(path);
62
+ }
63
+
64
+ (0, _keyManager.getKeyManager)(path).resolveKey(path);
65
+ }
66
+
67
+ (0, _optimizeVdomCreate.optimizeStaticVDOM)(path);
68
+ },
69
+ exit(path) {
70
+ let isUnknownDynamic = false;
71
+ let isDynamicNullable = false;
72
+
73
+ if ((0, _babelUtils.isDynamicTag)(path)) {
74
+ const name = path.get("name");
75
+ const types = findDynamicTagTypes(name);
76
+ if (types && !(types.string && types.component)) {
77
+ if (!name.isIdentifier()) {
78
+ const tagIdentifier = path.scope.generateUidIdentifier(`tagName`);
79
+ path.insertBefore(
80
+ _compiler.types.variableDeclaration("const", [
81
+ _compiler.types.variableDeclarator(tagIdentifier, name.node)]
82
+ )
83
+ );
84
+
85
+ name.replaceWith(tagIdentifier);
86
+ }
87
+
88
+ isDynamicNullable = types.empty;
89
+ path.node._isDynamicString = types.string;
90
+ } else {
91
+ isUnknownDynamic = true;
92
+ }
93
+ }
94
+
95
+ for (const attr of path.get("attributes")) {
96
+ if (attr.isMarkoAttribute()) {
97
+ const { node } = path;
98
+ _attribute.default.exit(attr);
99
+ if (path.node !== node) {
100
+ return;
101
+ }
102
+ }
103
+ }
104
+
105
+ if (isUnknownDynamic) {
106
+ return (0, _dynamicTag.default)(path);
107
+ }
108
+
109
+ if ((0, _babelUtils.isAttributeTag)(path)) {
110
+ return (0, _attributeTag.default)(path);
111
+ }
112
+
113
+ if ((0, _babelUtils.isMacroTag)(path)) {
114
+ return (0, _macroTag.default)(path);
115
+ }
116
+
117
+ const tagDef = (0, _babelUtils.getTagDef)(path);
118
+
119
+ if (tagDef && tagDef.translator) {
120
+ const { node } = path;
121
+
122
+ (0, _pluginHooks.exit)(tagDef.translator.hook, path, _compiler.types);
123
+
124
+ if (path.node !== node) {
125
+ return;
126
+ }
127
+ }
128
+
129
+ if ((0, _babelUtils.isNativeTag)(path)) {
130
+ return (0, _nativeTag.default)(path, isDynamicNullable);
131
+ } else {
132
+ return (0, _customTag.default)(path, isDynamicNullable);
133
+ }
134
+ }
135
+ };
136
+
137
+ const HANDLE_BINDINGS = ["module", "var", "let", "const"];
138
+ function findDynamicTagTypes(root) {
139
+ const pending = [root];
140
+ const types = {
141
+ string: false,
142
+ empty: false,
143
+ component: false
144
+ };
145
+ let tagNameImported;
146
+
147
+ let path;
148
+ while (path = pending.pop()) {
149
+ switch (path.type) {
150
+ case "ConditionalExpression":
151
+ pending.push(path.get("consequent"));
152
+
153
+ if (path.get("alternate").node) {
154
+ pending.push(path.get("alternate"));
155
+ }
156
+ break;
157
+
158
+ case "LogicalExpression":
159
+ if (path.get("operator").node === "||") {
160
+ pending.push(path.get("left"));
161
+ } else {
162
+ types.empty = true;
163
+ }
164
+
165
+ pending.push(path.get("right"));
166
+ break;
167
+
168
+ case "AssignmentExpression":
169
+ pending.push(path.get("right"));
170
+ break;
171
+
172
+ case "BinaryExpression":
173
+ if (path.get("operator").node !== "+") {
174
+ return false;
175
+ }
176
+
177
+ types.string = true;
178
+ break;
179
+
180
+ case "StringLiteral":
181
+ case "TemplateLiteral":
182
+ types.string = true;
183
+ break;
184
+
185
+ case "NullLiteral":
186
+ types.empty = true;
187
+ break;
188
+
189
+ case "Identifier":
190
+ if (path.get("name").node === "undefined") {
191
+ types.empty = true;
192
+ } else {
193
+ const binding = path.scope.getBinding(path.node.name);
194
+
195
+ if (!binding || !HANDLE_BINDINGS.includes(binding.kind)) {
196
+ return false;
197
+ }
198
+
199
+ if (binding.kind === "module") {
200
+ const importSource = binding.path.parent.source;
201
+ if (
202
+ _compiler.types.isStringLiteral(importSource) &&
203
+ isMarkoFile(importSource.value))
204
+ {
205
+ const resolvedImport =
206
+ (0, _babelUtils.resolveTagImport)(root.parentPath, importSource.value) ||
207
+ importSource.value;
208
+
209
+ if (tagNameImported === undefined) {
210
+ tagNameImported = resolvedImport;
211
+ } else if (
212
+ tagNameImported &&
213
+ tagNameImported !== resolvedImport)
214
+ {
215
+ tagNameImported = null;
216
+ }
217
+
218
+ types.component = true;
219
+ } else {
220
+ return false;
221
+ }
222
+ } else {
223
+ const initialValue = binding.path.get("init");
224
+ if (initialValue.node) {
225
+ pending.push(initialValue);
226
+ } else {
227
+ types.empty = true;
228
+ }
229
+
230
+ const assignments = binding.constantViolations;
231
+ if (assignments && assignments.length) {
232
+ for (const assignment of assignments) {
233
+ const operator = assignment.get("operator").node;
234
+ if (operator === "=") {
235
+ pending.push(assignment.get("right"));
236
+ } else if (operator === "+=") {
237
+ types.string = true;
238
+ } else {
239
+ return false;
240
+ }
241
+ }
242
+ }
243
+ }
244
+ }
245
+ break;
246
+
247
+ default:
248
+ return false;
249
+ }
250
+ }
251
+
252
+ if (tagNameImported && !types.string) {
253
+ (root.parent.extra ??= {}).tagNameImported = tagNameImported;
254
+ }
255
+
256
+ return types;
257
+ }
258
+
259
+ function isMarkoFile(request) {
260
+ return _path.default.extname(request) === ".marko" || /^<.*>$/.test(request);
261
+ }
262
+
263
+ function moveIgnoredAttrTags(parentTag) {
264
+ const attrTags = parentTag.node.body.attributeTags ?
265
+ parentTag.get("body").get("body") :
266
+ parentTag.get("attributeTags");
267
+
268
+ if (!attrTags.length) return;
269
+
270
+ for (const attrTag of attrTags) {
271
+ if (attrTag.isMarkoTag()) {
272
+ if ((0, _babelUtils.isAttributeTag)(attrTag)) {
273
+ attrTag.set(
274
+ "name",
275
+ _compiler.types.stringLiteral(`at_${attrTag.get("name.value").node.slice(1)}`)
276
+ );
277
+ }
278
+
279
+ moveIgnoredAttrTags(attrTag);
280
+ }
281
+ }
282
+
283
+ parentTag.node.body.body = parentTag.node.attributeTags.concat(
284
+ parentTag.node.body.body
285
+ );
286
+ parentTag.node.attributeTags = [];
287
+ }
@@ -0,0 +1,7 @@
1
+ "use strict";exports.__esModule = true;exports.default = _default;var _babelUtils = require("@marko/compiler/babel-utils");
2
+
3
+ function _default(path) {
4
+ path.node.name = (0, _babelUtils.getMacroIdentifier)(path);
5
+ path.node._isMacroTagCall = true;
6
+ path.requeue();
7
+ }
@@ -0,0 +1,27 @@
1
+ "use strict";var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");exports.__esModule = true;exports.default = _default;var _babelUtils = require("@marko/compiler/babel-utils");
2
+
3
+
4
+
5
+
6
+
7
+ var _nativeTagHtml = _interopRequireDefault(require("./native-tag[html]"));
8
+ var _nativeTagVdom = _interopRequireDefault(require("./native-tag[vdom]"));
9
+
10
+ function _default(path, isNullable) {
11
+ const {
12
+ hub: { file }
13
+ } = path;
14
+ const { markoOpts } = file;
15
+
16
+ if (!markoOpts.ignoreUnrecognizedTags) {
17
+ (0, _babelUtils.assertNoArgs)(path);
18
+ (0, _babelUtils.assertNoParams)(path);
19
+ (0, _babelUtils.assertNoAttributeTags)(path);
20
+ }
21
+
22
+ if (markoOpts.output === "html") {
23
+ (0, _nativeTagHtml.default)(path, isNullable);
24
+ } else {
25
+ (0, _nativeTagVdom.default)(path, isNullable);
26
+ }
27
+ }
@@ -0,0 +1,151 @@
1
+ "use strict";var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");exports.__esModule = true;exports.default = _default;var _compiler = require("@marko/compiler");
2
+ var _babelUtils = require("@marko/compiler/babel-utils");
3
+
4
+
5
+
6
+
7
+ var _attr = _interopRequireDefault(require("marko/src/runtime/html/helpers/attr"));
8
+ var _escapeQuotes = require("marko/src/runtime/html/helpers/escape-quotes");
9
+
10
+ var _util = require("../util");
11
+
12
+ function _default(path, attrs) {
13
+ const len = attrs.length;
14
+ if (len === 0) return _compiler.types.stringLiteral("");
15
+ if (len === 1 && attrs[0].node.type === "MarkoSpreadAttribute") {
16
+ return _compiler.types.callExpression(
17
+ (0, _babelUtils.importDefault)(
18
+ path.hub.file,
19
+ "marko/src/runtime/html/helpers/attrs.js",
20
+ "marko_attrs"
21
+ ),
22
+ [attrs[0].node.value]
23
+ );
24
+ }
25
+
26
+ if (attrs.some((attr) => attr.node.type === "MarkoSpreadAttribute")) {
27
+ const attrsObjects = [];
28
+ let props;
29
+
30
+ for (let i = 0; i < len; i++) {
31
+ const attr = attrs[i];
32
+ const {
33
+ node: { name, value }
34
+ } = attr;
35
+
36
+ if (name) {
37
+ const computed = (0, _util.evaluateAttr)(attr);
38
+ const prop = _compiler.types.objectProperty(
39
+ _compiler.types.stringLiteral(name),
40
+ computed?.value !== undefined ?
41
+ _compiler.types.stringLiteral(computed.value) :
42
+ value
43
+ );
44
+ if (props) {
45
+ props.push(prop);
46
+ } else {
47
+ attrsObjects.push(_compiler.types.objectExpression(props = [prop]));
48
+ }
49
+ } else {
50
+ attrsObjects.push(value);
51
+ props = undefined;
52
+ }
53
+ }
54
+
55
+ return _compiler.types.callExpression(
56
+ (0, _babelUtils.importDefault)(
57
+ path.hub.file,
58
+ "marko/src/runtime/html/helpers/merge-attrs.js",
59
+ "marko_merge_attrs"
60
+ ),
61
+ attrsObjects
62
+ );
63
+ }
64
+
65
+ const file = path.hub.file;
66
+ const quasis = [];
67
+ const expressions = [];
68
+ const attrValues = new Map();
69
+ let curString = "";
70
+
71
+ // Remove duplicate attrs so last one wins.
72
+ for (let i = len; i--;) {
73
+ const attr = attrs[i];
74
+ const { name, value } = attr.node;
75
+ if (attrValues.has(name)) continue;
76
+ const computed = (0, _util.evaluateAttr)(attr);
77
+ attrValues.set(
78
+ name,
79
+ computed ?
80
+ {
81
+ confident: true,
82
+ computed: computed.value,
83
+ value
84
+ } :
85
+ {
86
+ confident: false,
87
+ computed: undefined,
88
+ value
89
+ }
90
+ );
91
+ }
92
+
93
+ for (const [name, { confident, computed, value }] of [
94
+ ...attrValues].
95
+ reverse()) {
96
+ if (confident) {
97
+ if (computed == null || computed === false) {
98
+ continue;
99
+ }
100
+
101
+ curString += (0, _attr.default)(name, computed);
102
+ } else if (value.type === "TemplateLiteral") {
103
+ curString += " " + name + '="';
104
+
105
+ for (let i = 0; i < value.expressions.length; i++) {
106
+ const quasi = value.quasis[i];
107
+ const expression = value.expressions[i];
108
+ curString += (0, _escapeQuotes.d)(quasi.value.cooked);
109
+ quasis.push(curString);
110
+ curString = "";
111
+ expressions.push(
112
+ _compiler.types.callExpression(
113
+ (0, _babelUtils.importNamed)(
114
+ file,
115
+ "marko/src/runtime/html/helpers/escape-quotes.js",
116
+ "d",
117
+ "marko_escape_double_quotes"
118
+ ),
119
+ [expression]
120
+ )
121
+ );
122
+ }
123
+
124
+ curString +=
125
+ (0, _escapeQuotes.d)(
126
+ value.quasis[value.expressions.length].value.cooked
127
+ ) + '"';
128
+ } else {
129
+ quasis.push(curString);
130
+ curString = "";
131
+ expressions.push(
132
+ _compiler.types.callExpression(
133
+ (0, _babelUtils.importDefault)(
134
+ file,
135
+ "marko/src/runtime/html/helpers/attr.js",
136
+ "marko_attr"
137
+ ),
138
+ [_compiler.types.stringLiteral(name), value]
139
+ )
140
+ );
141
+ }
142
+ }
143
+
144
+ quasis.push(curString);
145
+
146
+ if (expressions.length) {
147
+ return (0, _babelUtils.normalizeTemplateString)(quasis, ...expressions);
148
+ } else {
149
+ return _compiler.types.stringLiteral(quasis.join(""));
150
+ }
151
+ }