marko 5.29.2 → 5.30.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (167) hide show
  1. package/README.md +1 -1
  2. package/bin/markoc.js +18 -18
  3. package/dist/core-tags/core/await/renderer.js +5 -1
  4. package/dist/node_modules/@internal/components-beginComponent/index.js +13 -3
  5. package/dist/node_modules/@internal/components-define-widget-legacy/index-browser.js +331 -0
  6. package/dist/node_modules/@internal/components-define-widget-legacy/index.js +18 -0
  7. package/dist/node_modules/@internal/components-define-widget-legacy/package.json +11 -0
  8. package/dist/node_modules/@internal/components-entry/index-browser.js +2 -2
  9. package/dist/node_modules/@internal/components-entry/index.js +73 -45
  10. package/dist/node_modules/@internal/components-entry-legacy/index-browser.js +74 -0
  11. package/dist/node_modules/@internal/components-entry-legacy/index.js +15 -0
  12. package/dist/node_modules/@internal/components-entry-legacy/package.json +11 -0
  13. package/dist/node_modules/@internal/components-registry/index-browser.js +70 -43
  14. package/dist/node_modules/@internal/components-registry/index.js +2 -2
  15. package/dist/node_modules/@internal/components-util/index-browser.js +17 -17
  16. package/dist/node_modules/@internal/components-util/index.js +18 -8
  17. package/dist/node_modules/@internal/create-readable/index-browser.js +1 -1
  18. package/dist/node_modules/@internal/create-readable/index.js +9 -9
  19. package/dist/node_modules/@internal/set-immediate/index-browser.js +1 -1
  20. package/dist/node_modules/@internal/set-immediate/index-worker.js +2 -2
  21. package/dist/node_modules/@internal/set-immediate/index.js +2 -2
  22. package/dist/runtime/RenderResult.js +3 -3
  23. package/dist/runtime/components/Component.js +146 -148
  24. package/dist/runtime/components/ComponentDef.js +41 -27
  25. package/dist/runtime/components/ComponentsContext.js +6 -6
  26. package/dist/runtime/components/GlobalComponentsContext.js +3 -3
  27. package/dist/runtime/components/KeySequence.js +3 -3
  28. package/dist/runtime/components/ServerComponent.js +13 -13
  29. package/dist/runtime/components/State.js +27 -27
  30. package/dist/runtime/components/attach-detach.js +7 -7
  31. package/dist/runtime/components/defineComponent.js +5 -5
  32. package/dist/runtime/components/dom-data.js +6 -6
  33. package/dist/runtime/components/event-delegation.js +10 -10
  34. package/dist/runtime/components/legacy/browser.json +9 -0
  35. package/dist/runtime/components/legacy/defineComponent-legacy.js +32 -0
  36. package/dist/runtime/components/legacy/defineRenderer-legacy.js +171 -0
  37. package/dist/runtime/components/legacy/defineWidget-legacy.js +1 -0
  38. package/dist/runtime/components/legacy/dependencies/html.js +3 -0
  39. package/dist/runtime/components/legacy/dependencies/index.js +178 -0
  40. package/dist/runtime/components/legacy/dependencies/vdom.js +3 -0
  41. package/dist/runtime/components/legacy/index.js +1 -0
  42. package/dist/runtime/components/legacy/jquery.js +51 -0
  43. package/dist/runtime/components/legacy/ready.js +152 -0
  44. package/dist/runtime/components/legacy/renderer-legacy.js +230 -0
  45. package/dist/runtime/components/renderer.js +30 -26
  46. package/dist/runtime/components/update-manager.js +10 -10
  47. package/dist/runtime/createOut.js +1 -1
  48. package/dist/runtime/dom-insert.js +5 -5
  49. package/dist/runtime/helpers/_change-case.js +2 -2
  50. package/dist/runtime/helpers/dynamic-tag.js +7 -9
  51. package/dist/runtime/helpers/style-value.js +7 -2
  52. package/dist/runtime/html/AsyncStream.js +20 -20
  53. package/dist/runtime/html/BufferedWriter.js +2 -2
  54. package/dist/runtime/html/helpers/_dynamic-attr.js +2 -2
  55. package/dist/runtime/html/helpers/attr.js +19 -6
  56. package/dist/runtime/html/helpers/attrs.js +7 -0
  57. package/dist/runtime/html/helpers/data-marko.js +2 -2
  58. package/dist/runtime/html/helpers/escape-quotes.js +1 -1
  59. package/dist/runtime/html/helpers/escape-xml.js +1 -1
  60. package/dist/runtime/html/helpers/merge-attrs.js +38 -7
  61. package/dist/runtime/html/index.js +2 -2
  62. package/dist/runtime/renderable.js +9 -6
  63. package/dist/runtime/vdom/AsyncVDOMBuilder.js +86 -86
  64. package/dist/runtime/vdom/VComponent.js +3 -3
  65. package/dist/runtime/vdom/VDocumentFragment.js +7 -7
  66. package/dist/runtime/vdom/VElement.js +61 -50
  67. package/dist/runtime/vdom/VFragment.js +8 -8
  68. package/dist/runtime/vdom/VNode.js +36 -36
  69. package/dist/runtime/vdom/VText.js +8 -8
  70. package/dist/runtime/vdom/helpers/attrs.js +24 -4
  71. package/dist/runtime/vdom/helpers/merge-attrs.js +16 -0
  72. package/dist/runtime/vdom/helpers/v-element.js +1 -1
  73. package/dist/runtime/vdom/helpers/v-text.js +1 -1
  74. package/dist/runtime/vdom/hot-reload.js +19 -19
  75. package/dist/runtime/vdom/index.js +2 -2
  76. package/dist/runtime/vdom/morphdom/fragment.js +5 -5
  77. package/dist/runtime/vdom/morphdom/helpers.js +5 -5
  78. package/dist/runtime/vdom/morphdom/index.js +56 -56
  79. package/dist/runtime/vdom/morphdom/specialElHandlers.js +7 -7
  80. package/dist/runtime/vdom/preserve-attrs.js +1 -1
  81. package/dist/runtime/vdom/vdom.js +14 -14
  82. package/docs/10-awesome-marko-features.md +1 -1
  83. package/docs/body-content.md +3 -3
  84. package/docs/class-components.md +6 -6
  85. package/docs/cloudflare-workers.md +3 -3
  86. package/docs/compiler.md +5 -5
  87. package/docs/express.md +2 -2
  88. package/docs/http.md +1 -1
  89. package/docs/koa.md +1 -1
  90. package/docs/lasso.md +1 -1
  91. package/docs/marko-vs-react.md +2 -2
  92. package/docs/rendering.md +6 -6
  93. package/docs/rollup.md +30 -30
  94. package/docs/troubleshooting-streaming.md +1 -1
  95. package/docs/typescript.md +1 -1
  96. package/docs/vite.md +3 -3
  97. package/docs/webpack.md +25 -25
  98. package/docs/why-is-marko-fast.md +2 -2
  99. package/index.d.ts +1 -0
  100. package/legacy-components-browser.marko +15 -0
  101. package/legacy-components.js +7 -0
  102. package/package.json +51 -45
  103. package/src/compiler/config.js +1 -1
  104. package/src/compiler/index.js +5 -5
  105. package/src/core-tags/core/__flush_here_and_after__.js +1 -1
  106. package/src/core-tags/core/await/AsyncValue.js +1 -1
  107. package/src/core-tags/core/await/renderer.js +8 -4
  108. package/src/core-tags/core/await/reorderer-renderer.js +1 -1
  109. package/src/node-require/browser-refresh.js +2 -2
  110. package/src/node-require/index.js +2 -2
  111. package/src/node_modules/@internal/components-beginComponent/index.js +16 -6
  112. package/src/node_modules/@internal/components-define-widget-legacy/index-browser.js +331 -0
  113. package/src/node_modules/@internal/components-define-widget-legacy/index.js +18 -0
  114. package/src/node_modules/@internal/components-define-widget-legacy/package.json +11 -0
  115. package/src/node_modules/@internal/components-entry/index.js +65 -37
  116. package/src/node_modules/@internal/components-entry-legacy/index-browser.js +74 -0
  117. package/src/node_modules/@internal/components-entry-legacy/index.js +15 -0
  118. package/src/node_modules/@internal/components-entry-legacy/package.json +11 -0
  119. package/src/node_modules/@internal/components-registry/index-browser.js +33 -6
  120. package/src/node_modules/@internal/components-util/index.js +10 -0
  121. package/src/runtime/RenderResult.js +3 -3
  122. package/src/runtime/components/Component.js +16 -18
  123. package/src/runtime/components/ComponentDef.js +22 -8
  124. package/src/runtime/components/ComponentsContext.js +1 -1
  125. package/src/runtime/components/State.js +2 -2
  126. package/src/runtime/components/attach-detach.js +1 -1
  127. package/src/runtime/components/dom-data.js +1 -1
  128. package/src/runtime/components/legacy/browser.json +9 -0
  129. package/src/runtime/components/legacy/defineComponent-legacy.js +32 -0
  130. package/src/runtime/components/legacy/defineRenderer-legacy.js +171 -0
  131. package/src/runtime/components/legacy/defineWidget-legacy.js +1 -0
  132. package/src/runtime/components/legacy/dependencies/html.js +3 -0
  133. package/src/runtime/components/legacy/dependencies/index.js +178 -0
  134. package/src/runtime/components/legacy/dependencies/vdom.js +3 -0
  135. package/src/runtime/components/legacy/index.js +1 -0
  136. package/src/runtime/components/legacy/jquery.js +51 -0
  137. package/src/runtime/components/legacy/ready.js +152 -0
  138. package/src/runtime/components/legacy/renderer-legacy.js +230 -0
  139. package/src/runtime/components/renderer.js +4 -0
  140. package/src/runtime/components/update-manager.js +1 -1
  141. package/src/runtime/dom-insert.js +1 -1
  142. package/src/runtime/helpers/dynamic-tag.js +2 -4
  143. package/src/runtime/helpers/style-value.js +7 -2
  144. package/src/runtime/html/AsyncStream.js +5 -5
  145. package/src/runtime/html/BufferedWriter.js +1 -1
  146. package/src/runtime/html/StringWriter.js +1 -1
  147. package/src/runtime/html/helpers/attr.js +15 -2
  148. package/src/runtime/html/helpers/attrs.js +7 -0
  149. package/src/runtime/html/helpers/merge-attrs.js +38 -7
  150. package/src/runtime/html/hot-reload.js +1 -1
  151. package/src/runtime/html/index.js +2 -2
  152. package/src/runtime/renderable.js +5 -2
  153. package/src/runtime/vdom/AsyncVDOMBuilder.js +2 -2
  154. package/src/runtime/vdom/VComponent.js +1 -1
  155. package/src/runtime/vdom/VDocumentFragment.js +1 -1
  156. package/src/runtime/vdom/VElement.js +17 -6
  157. package/src/runtime/vdom/VFragment.js +1 -1
  158. package/src/runtime/vdom/VNode.js +1 -1
  159. package/src/runtime/vdom/VText.js +1 -1
  160. package/src/runtime/vdom/helpers/attrs.js +26 -6
  161. package/src/runtime/vdom/helpers/merge-attrs.js +16 -0
  162. package/src/runtime/vdom/hot-reload.js +1 -1
  163. package/src/runtime/vdom/index.js +2 -2
  164. package/src/runtime/vdom/morphdom/fragment.js +1 -1
  165. package/src/runtime/vdom/morphdom/specialElHandlers.js +1 -1
  166. package/src/taglib/index.js +1 -1
  167. package/tags-html.d.ts +9 -0
@@ -8,6 +8,7 @@ var createFragmentNode =
8
8
  var ComponentDef = require("../../../runtime/components/ComponentDef");
9
9
  var domData = require("../../../runtime/components/dom-data");
10
10
  var componentsUtil = require("@internal/components-util");
11
+ var loader = require("@internal/loader");
11
12
  var componentLookup = componentsUtil.___componentLookup;
12
13
  var addComponentRootToKeyedElements =
13
14
  componentsUtil.___addComponentRootToKeyedElements;
@@ -72,13 +73,23 @@ function addPendingDef(def, type, meta, host, runtimeId) {
72
73
  ]);
73
74
  }
74
75
 
75
- function load(typeName) {
76
+ function load(typeName, isLegacy) {
76
77
  var target = loaded[typeName];
77
78
  if (!target) {
78
79
  target = registered[typeName];
79
80
 
80
81
  if (target) {
81
82
  target = target();
83
+ } else if (isLegacy) {
84
+ target = exports.___legacy.load(typeName);
85
+ } else {
86
+ target = loader(typeName);
87
+ // eslint-disable-next-line no-constant-condition
88
+ if ("MARKO_DEBUG") {
89
+ complain(
90
+ "Looks like you used `require:` in your browser.json to load a component. This requires that Marko has knowledge of how lasso generates paths and will be removed in a future version. `marko-dependencies:/path/to/template.marko` should be used instead."
91
+ );
92
+ }
82
93
  }
83
94
 
84
95
  if (!target) {
@@ -91,14 +102,14 @@ function load(typeName) {
91
102
  return target;
92
103
  }
93
104
 
94
- function getComponentClass(typeName) {
105
+ function getComponentClass(typeName, isLegacy) {
95
106
  var ComponentClass = componentTypes[typeName];
96
107
 
97
108
  if (ComponentClass) {
98
109
  return ComponentClass;
99
110
  }
100
111
 
101
- ComponentClass = load(typeName);
112
+ ComponentClass = load(typeName, isLegacy);
102
113
 
103
114
  ComponentClass = ComponentClass.Component || ComponentClass;
104
115
 
@@ -124,6 +135,7 @@ function getComponentClass(typeName) {
124
135
  .replace(/^[^a-z$_]/i, "_$&")
125
136
  .replace(/[^0-9a-z$_]+/gi, "_");
126
137
  className = className[0].toUpperCase() + className.slice(1);
138
+ // eslint-disable-next-line no-unused-vars
127
139
  var OldComponentClass = ComponentClass;
128
140
  ComponentClass = {
129
141
  [className]: function (id, doc) {
@@ -138,8 +150,8 @@ function getComponentClass(typeName) {
138
150
  return ComponentClass;
139
151
  }
140
152
 
141
- function createComponent(typeName, id) {
142
- var ComponentClass = getComponentClass(typeName);
153
+ function createComponent(typeName, id, isLegacy) {
154
+ var ComponentClass = getComponentClass(typeName, isLegacy);
143
155
  return new ComponentClass(id);
144
156
  }
145
157
 
@@ -290,6 +302,10 @@ function addDOMEventListeners(
290
302
  function initComponent(componentDef, host) {
291
303
  var component = componentDef.___component;
292
304
 
305
+ if (!component || !component.___isComponent) {
306
+ return; // legacy
307
+ }
308
+
293
309
  component.___reset();
294
310
  component.___host = host;
295
311
 
@@ -479,7 +495,18 @@ function initServerRendered(renderedComponents, host) {
479
495
  .map(function (componentDef) {
480
496
  var typeName = meta.___types[componentDef[1]];
481
497
 
482
- return registered[typeName]
498
+ return (
499
+ registered[typeName] ||
500
+ document.readyState === "complete" ||
501
+ (
502
+ // loader.runtime is only going to exist for lasso apps
503
+ // this code is used to detect if a module was registered
504
+ // via a browser.json but not executed.
505
+ loader.runtime &&
506
+ loader.runtime.resolve &&
507
+ loader.runtime.resolve(typeName)
508
+ )
509
+ )
483
510
  ? tryHydrateComponent(componentDef, meta, host, runtimeId)
484
511
  : addPendingDef(componentDef, typeName, meta, host, runtimeId);
485
512
  })
@@ -5,6 +5,16 @@ function nextComponentIdProvider(out) {
5
5
  var prefix = out.global.componentIdPrefix || out.global.widgetIdPrefix || "s"; // "s" is for server (we use "b" for the browser)
6
6
  var nextId = 0;
7
7
 
8
+ // eslint-disable-next-line no-constant-condition
9
+ if ("MARKO_DEBUG") {
10
+ if (out.global.widgetIdPrefix) {
11
+ require("complain")(
12
+ "$global.widgetIdPrefix is deprecated. use $global.componentIdPrefix instead.",
13
+ { location: false }
14
+ );
15
+ }
16
+ }
17
+
8
18
  return function nextComponentId() {
9
19
  return prefix + nextId++;
10
20
  };
@@ -66,7 +66,7 @@ var proto = (RenderResult.prototype = {
66
66
  toString: function () {
67
67
  return this.___out.toString();
68
68
  },
69
- document: typeof document === "object" && document
69
+ document: typeof document === "object" && document,
70
70
  });
71
71
 
72
72
  Object.defineProperty(proto, "html", {
@@ -78,7 +78,7 @@ Object.defineProperty(proto, "html", {
78
78
  );
79
79
  }
80
80
  return this.toString();
81
- }
81
+ },
82
82
  });
83
83
 
84
84
  Object.defineProperty(proto, "context", {
@@ -90,7 +90,7 @@ Object.defineProperty(proto, "context", {
90
90
  );
91
91
  }
92
92
  return this.___out;
93
- }
93
+ },
94
94
  });
95
95
 
96
96
  // Add all of the following DOM methods to Component.prototype:
@@ -27,7 +27,7 @@ var slice = Array.prototype.slice;
27
27
 
28
28
  var COMPONENT_SUBSCRIBE_TO_OPTIONS;
29
29
  var NON_COMPONENT_SUBSCRIBE_TO_OPTIONS = {
30
- addDestroyListener: false
30
+ addDestroyListener: false,
31
31
  };
32
32
 
33
33
  var emit = EventEmitter.prototype.emit;
@@ -247,19 +247,17 @@ Component.prototype = componentProto = {
247
247
  },
248
248
  getEl: function (key, index) {
249
249
  if (key) {
250
- var keyedElement =
251
- this.___keyedElements["@" + resolveKeyHelper(key, index)];
252
-
253
- // eslint-disable-next-line no-constant-condition
254
- if ("MARKO_DEBUG") {
255
- if (
256
- keyedElement &&
257
- keyedElement.nodeType !== 1 /* Node.ELEMENT_NODE */
258
- ) {
259
- throw new Error(
260
- "Using 'getEl(key)' to get a component instance is not supported, did you mean 'getComponent(key)'?"
250
+ var resolvedKey = resolveKeyHelper(key, index);
251
+ var keyedElement = this.___keyedElements["@" + resolvedKey];
252
+ if (keyedElement && keyedElement.nodeType === 12 /** FRAGMENT_NODE */) {
253
+ // eslint-disable-next-line no-constant-condition
254
+ if ("MARKO_DEBUG") {
255
+ complain(
256
+ "Accessing the elements of a child component using 'component.getEl' is deprecated."
261
257
  );
262
258
  }
259
+
260
+ return walkFragments(keyedElement);
263
261
  }
264
262
 
265
263
  return keyedElement;
@@ -281,15 +279,15 @@ Component.prototype = componentProto = {
281
279
  },
282
280
  getComponent: function (key, index) {
283
281
  var rootNode = this.___keyedElements["@" + resolveKeyHelper(key, index)];
284
- // eslint-disable-next-line no-constant-condition
285
- if ("MARKO_DEBUG") {
286
- if (/\[\]$/.test(key)) {
287
- throw new Error(
282
+ if (/\[\]$/.test(key)) {
283
+ // eslint-disable-next-line no-constant-condition
284
+ if ("MARKO_DEBUG") {
285
+ complain(
288
286
  "A repeated key[] was passed to getComponent. Use a non-repeating key if there is only one of these components."
289
287
  );
290
288
  }
289
+ rootNode = rootNode && rootNode[Object.keys(rootNode)[0]];
291
290
  }
292
-
293
291
  return rootNode && componentsByDOMNode.get(rootNode);
294
292
  },
295
293
  getComponents: function (key) {
@@ -636,7 +634,7 @@ Component.prototype = componentProto = {
636
634
  ___emitDestroy() {
637
635
  this.onDestroy && this.onDestroy();
638
636
  this.___emit("destroy");
639
- }
637
+ },
640
638
  };
641
639
 
642
640
  componentProto.elId = componentProto.getElId;
@@ -11,6 +11,8 @@ var EMPTY_OBJECT = {};
11
11
 
12
12
  var FLAG_WILL_RERENDER_IN_BROWSER = 1;
13
13
  var FLAG_HAS_RENDER_BODY = 2;
14
+ var FLAG_IS_LEGACY = 4;
15
+ var FLAG_OLD_HYDRATE_NO_CREATE = 8;
14
16
 
15
17
  /**
16
18
  * A ComponentDef is used to hold the metadata collected at runtime for
@@ -81,7 +83,7 @@ ComponentDef.prototype = {
81
83
 
82
84
  get ___type() {
83
85
  return this.___component.___type;
84
- }
86
+ },
85
87
  };
86
88
 
87
89
  ComponentDef.prototype.nk = ComponentDef.prototype.___nextKey;
@@ -93,19 +95,31 @@ ComponentDef.___deserialize = function (o, types, global, registry) {
93
95
  var extra = o[3] || EMPTY_OBJECT;
94
96
 
95
97
  var state = extra.s;
96
- var componentProps = extra.w;
98
+ var componentProps = extra.w || EMPTY_OBJECT;
97
99
  var flags = extra.f;
98
- var component = registry.___createComponent(typeName, id);
100
+ var isLegacy = flags & FLAG_IS_LEGACY;
101
+ var renderBody = flags & FLAG_HAS_RENDER_BODY ? w10Noop : extra.r;
102
+
103
+ var component =
104
+ typeName /* legacy */ &&
105
+ registry.___createComponent(typeName, id, isLegacy);
99
106
 
100
107
  // Prevent newly created component from being queued for update since we area
101
108
  // just building it from the server info
102
109
  component.___updateQueued = true;
103
110
 
104
- if (flags & FLAG_HAS_RENDER_BODY) {
105
- (input || (input = {})).renderBody = w10Noop;
111
+ if (isLegacy) {
112
+ component.widgetConfig = componentProps;
113
+ component.___widgetBody = renderBody;
114
+ } else if (renderBody) {
115
+ (input || (input = {})).renderBody = renderBody;
106
116
  }
107
117
 
108
- if (flags & FLAG_WILL_RERENDER_IN_BROWSER) {
118
+ if (
119
+ !isLegacy &&
120
+ flags & FLAG_WILL_RERENDER_IN_BROWSER &&
121
+ !(flags & FLAG_OLD_HYDRATE_NO_CREATE)
122
+ ) {
109
123
  if (component.onCreate) {
110
124
  component.onCreate(input, { global: global });
111
125
  }
@@ -125,7 +139,7 @@ ComponentDef.___deserialize = function (o, types, global, registry) {
125
139
  component.state = state;
126
140
  }
127
141
 
128
- if (componentProps) {
142
+ if (!isLegacy && componentProps) {
129
143
  extend(component, componentProps);
130
144
  }
131
145
  }
@@ -148,7 +162,7 @@ ComponentDef.___deserialize = function (o, types, global, registry) {
148
162
  id: id,
149
163
  ___component: component,
150
164
  ___domEvents: extra.d,
151
- ___flags: extra.f || 0
165
+ ___flags: extra.f || 0,
152
166
  };
153
167
  };
154
168
 
@@ -47,7 +47,7 @@ ComponentsContext.prototype = {
47
47
  this.___out.global.___components = undefined;
48
48
 
49
49
  return componentDefs;
50
- }
50
+ },
51
51
  };
52
52
 
53
53
  function getComponentsContext(out) {
@@ -9,7 +9,7 @@ function ensure(state, propertyName) {
9
9
  },
10
10
  set: function (value) {
11
11
  this.___set(propertyName, value, false /* ensure:false */);
12
- }
12
+ },
13
13
  });
14
14
  }
15
15
  }
@@ -99,7 +99,7 @@ State.prototype = {
99
99
  },
100
100
  toJSON: function () {
101
101
  return this.___raw;
102
- }
102
+ },
103
103
  };
104
104
 
105
105
  module.exports = State;
@@ -48,7 +48,7 @@ function handleNodeDetach(node) {
48
48
  if (parentNode) {
49
49
  parentNode.removeChild(node);
50
50
  }
51
- }
51
+ },
52
52
  });
53
53
 
54
54
  return allowDetach;
@@ -4,5 +4,5 @@ module.exports = {
4
4
  ___componentByDOMNode: new WeakMap(),
5
5
  ___detachedByDOMNode: new WeakMap(),
6
6
  ___keyByDOMNode: new WeakMap(),
7
- ___ssrKeyedElementsByComponentId: {}
7
+ ___ssrKeyedElementsByComponentId: {},
8
8
  };
@@ -0,0 +1,9 @@
1
+ {
2
+ "dependencies": [
3
+ {
4
+ "type": "require",
5
+ "path": "./index",
6
+ "run": true
7
+ }
8
+ ]
9
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Define a new UI component that includes component and renderer.
3
+ *
4
+ * @param {Object} def The definition of the UI component (component methods, component constructor, rendering methods, etc.)
5
+ * @return {Component} The resulting Component with renderer
6
+ */
7
+ var defineRenderer;
8
+ var defineWidget;
9
+
10
+ module.exports = function defineComponent(def) {
11
+ // eslint-disable-next-line no-constant-condition
12
+ if ("MARKO_DEBUG") {
13
+ require("complain")("defineComponent is deprecated");
14
+ }
15
+
16
+ if (def.___isComponent) {
17
+ return def;
18
+ }
19
+
20
+ var renderer;
21
+
22
+ if (def.template || def.renderer) {
23
+ renderer = defineRenderer(def);
24
+ } else {
25
+ throw new Error('Expected "template" or "renderer"');
26
+ }
27
+
28
+ return defineWidget(def, renderer);
29
+ };
30
+
31
+ defineRenderer = require("./defineRenderer-legacy");
32
+ defineWidget = require("./defineWidget-legacy");
@@ -0,0 +1,171 @@
1
+ var complain = "MARKO_DEBUG" && require("complain");
2
+ var makeRenderable = require("../../renderable");
3
+ var getComponentsContext =
4
+ require("../ComponentsContext").___getComponentsContext;
5
+ var componentLookup = require("@internal/components-util").___componentLookup;
6
+ var modernRenderer = require("../renderer");
7
+ var loader = require("@internal/loader");
8
+ var resolveComponentKey = modernRenderer.___resolveComponentKey;
9
+
10
+ module.exports = function defineRenderer(renderingLogic) {
11
+ var renderer = renderingLogic.renderer;
12
+
13
+ // eslint-disable-next-line no-constant-condition
14
+ if ("MARKO_DEBUG") {
15
+ require("complain")("defineRenderer is deprecated");
16
+ }
17
+
18
+ if (renderer && renderer.___isRenderer) {
19
+ return renderer;
20
+ }
21
+
22
+ var template = renderingLogic.template;
23
+
24
+ if (typeof template === "string") {
25
+ template = loader(template);
26
+ }
27
+
28
+ if (!renderer) {
29
+ var getInitialProps;
30
+ var getTemplateData;
31
+ var getInitialState;
32
+ var getWidgetConfig;
33
+ var getInitialBody;
34
+
35
+ if (renderingLogic) {
36
+ getInitialProps = renderingLogic.getInitialProps;
37
+ getTemplateData = renderingLogic.getTemplateData;
38
+ getInitialState = renderingLogic.getInitialState;
39
+ getWidgetConfig = renderingLogic.getWidgetConfig;
40
+ getInitialBody = renderingLogic.getInitialBody;
41
+ }
42
+
43
+ // Create a renderer function that takes care of translating
44
+ // the input properties to a view state. Also, this renderer
45
+ // takes care of re-using existing components.
46
+ renderer = function renderer(input, out) {
47
+ var componentsContext = getComponentsContext(out);
48
+ var globalComponentsContext = componentsContext.___globalContext;
49
+ var component = globalComponentsContext.___rerenderComponent;
50
+ var isReceivingNewInput = !component || component.___isReceivingNewInput;
51
+ var parentComponentDef;
52
+
53
+ if (component) {
54
+ component.___isReceivingNewInput = false;
55
+ }
56
+
57
+ // Render the template associated with the component using the final template
58
+ // data that we constructed
59
+ var newProps = input;
60
+ var widgetConfig;
61
+ var widgetState;
62
+ var widgetBody;
63
+ var id;
64
+
65
+ if (!component && componentLookup) {
66
+ var key = out.___assignedKey;
67
+
68
+ if (
69
+ (parentComponentDef = componentsContext.___componentDef) &&
70
+ key != null
71
+ ) {
72
+ id = resolveComponentKey(key.toString(), parentComponentDef);
73
+ } else if (parentComponentDef) {
74
+ id = parentComponentDef.___nextComponentId();
75
+ } else {
76
+ id = globalComponentsContext.___nextComponentId();
77
+ }
78
+
79
+ component = componentLookup[id];
80
+ }
81
+
82
+ if (isReceivingNewInput) {
83
+ // If we do not have state then we need to go through the process
84
+ // of converting the input to a widget state, or simply normalizing
85
+ // the input using getInitialProps
86
+
87
+ if (getInitialProps) {
88
+ // This optional method is used to normalize input state
89
+ newProps = getInitialProps(newProps, out) || {};
90
+ }
91
+
92
+ if (getInitialState) {
93
+ // This optional method is used to derive the widget state
94
+ // from the input properties
95
+ widgetState = getInitialState(newProps, out);
96
+ }
97
+
98
+ if (getInitialBody) {
99
+ // If we have widget a widget body then pass it to the template
100
+ // so that it is available to the widget tag and can be inserted
101
+ // at the w-body marker
102
+ widgetBody = getInitialBody(newProps, out);
103
+ } else {
104
+ // Default to using the nested content as the widget body
105
+ // getInitialBody was not implemented
106
+ widgetBody = newProps.renderBody;
107
+ }
108
+ } else if (component) {
109
+ newProps = newProps || component.___widgetProps;
110
+ widgetBody = component.___widgetBody;
111
+ widgetState = component.___rawState;
112
+ widgetConfig = component.widgetConfig;
113
+ }
114
+
115
+ // Use getTemplateData(state, props, out) to get the template
116
+ // data. If that method is not provided then just use the
117
+ // the state (if provided) or the input data.
118
+ var templateData = clone(
119
+ getTemplateData
120
+ ? getTemplateData(widgetState, newProps, out)
121
+ : widgetState || newProps
122
+ );
123
+
124
+ if (isReceivingNewInput && getWidgetConfig) {
125
+ // If getWidgetConfig() was implemented then use that to
126
+ // get the widget config. The widget config will be passed
127
+ // to the widget constructor. If rendered on the server the
128
+ // widget config will be serialized.
129
+ widgetConfig = getWidgetConfig(newProps, out);
130
+ }
131
+ // eslint-disable-next-line no-constant-condition
132
+ if ("MARKO_DEBUG") {
133
+ if (widgetState && "widgetState" in templateData) {
134
+ complain("Passing widgetState as input is deprecated.");
135
+ }
136
+
137
+ if (widgetConfig && "widgetConfig" in templateData) {
138
+ complain("Passing widgetConfig as input is deprecated.");
139
+ }
140
+ }
141
+
142
+ templateData.widgetProps = newProps;
143
+ widgetBody && (templateData.renderBody = widgetBody);
144
+ widgetState && (templateData.widgetState = widgetState);
145
+ widgetConfig && (templateData.widgetConfig = widgetConfig);
146
+
147
+ template._(templateData, out, id, renderingLogic);
148
+ };
149
+ }
150
+
151
+ renderer.___isRenderer = true;
152
+ renderer.createOut = template ? template.createOut : renderingLogic.createOut;
153
+ renderer.template = template;
154
+
155
+ makeRenderable(renderer, renderer);
156
+ renderer.render = renderer.render.bind(this);
157
+
158
+ return renderer;
159
+ };
160
+
161
+ function clone(src) {
162
+ var result = {};
163
+
164
+ if (src) {
165
+ for (var key in src) {
166
+ result[key] = src[key];
167
+ }
168
+ }
169
+
170
+ return result;
171
+ }
@@ -0,0 +1 @@
1
+ module.exports = require("@internal/components-define-widget-legacy");
@@ -0,0 +1,3 @@
1
+ var patch = require("./").patch;
2
+ var Template = require("../../../html").Template;
3
+ patch(Template);