marko 5.29.2 → 5.30.0
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +1 -1
- package/bin/markoc.js +18 -18
- package/dist/core-tags/core/await/renderer.js +5 -1
- package/dist/node_modules/@internal/components-beginComponent/index.js +13 -3
- package/dist/node_modules/@internal/components-define-widget-legacy/index-browser.js +331 -0
- package/dist/node_modules/@internal/components-define-widget-legacy/index.js +18 -0
- package/dist/node_modules/@internal/components-define-widget-legacy/package.json +11 -0
- package/dist/node_modules/@internal/components-entry/index-browser.js +2 -2
- package/dist/node_modules/@internal/components-entry/index.js +73 -45
- package/dist/node_modules/@internal/components-entry-legacy/index-browser.js +74 -0
- package/dist/node_modules/@internal/components-entry-legacy/index.js +15 -0
- package/dist/node_modules/@internal/components-entry-legacy/package.json +11 -0
- package/dist/node_modules/@internal/components-registry/index-browser.js +70 -43
- package/dist/node_modules/@internal/components-registry/index.js +2 -2
- package/dist/node_modules/@internal/components-util/index-browser.js +17 -17
- package/dist/node_modules/@internal/components-util/index.js +18 -8
- package/dist/node_modules/@internal/create-readable/index-browser.js +1 -1
- package/dist/node_modules/@internal/create-readable/index.js +9 -9
- package/dist/node_modules/@internal/set-immediate/index-browser.js +1 -1
- package/dist/node_modules/@internal/set-immediate/index-worker.js +2 -2
- package/dist/node_modules/@internal/set-immediate/index.js +2 -2
- package/dist/runtime/RenderResult.js +3 -3
- package/dist/runtime/components/Component.js +146 -148
- package/dist/runtime/components/ComponentDef.js +41 -27
- package/dist/runtime/components/ComponentsContext.js +6 -6
- package/dist/runtime/components/GlobalComponentsContext.js +3 -3
- package/dist/runtime/components/KeySequence.js +3 -3
- package/dist/runtime/components/ServerComponent.js +13 -13
- package/dist/runtime/components/State.js +27 -27
- package/dist/runtime/components/attach-detach.js +7 -7
- package/dist/runtime/components/defineComponent.js +5 -5
- package/dist/runtime/components/dom-data.js +6 -6
- package/dist/runtime/components/event-delegation.js +10 -10
- package/dist/runtime/components/legacy/browser.json +9 -0
- package/dist/runtime/components/legacy/defineComponent-legacy.js +32 -0
- package/dist/runtime/components/legacy/defineRenderer-legacy.js +171 -0
- package/dist/runtime/components/legacy/defineWidget-legacy.js +1 -0
- package/dist/runtime/components/legacy/dependencies/html.js +3 -0
- package/dist/runtime/components/legacy/dependencies/index.js +178 -0
- package/dist/runtime/components/legacy/dependencies/vdom.js +3 -0
- package/dist/runtime/components/legacy/index.js +1 -0
- package/dist/runtime/components/legacy/jquery.js +51 -0
- package/dist/runtime/components/legacy/ready.js +152 -0
- package/dist/runtime/components/legacy/renderer-legacy.js +230 -0
- package/dist/runtime/components/renderer.js +30 -26
- package/dist/runtime/components/update-manager.js +10 -10
- package/dist/runtime/createOut.js +1 -1
- package/dist/runtime/dom-insert.js +5 -5
- package/dist/runtime/helpers/_change-case.js +2 -2
- package/dist/runtime/helpers/dynamic-tag.js +7 -9
- package/dist/runtime/helpers/style-value.js +7 -2
- package/dist/runtime/html/AsyncStream.js +20 -20
- package/dist/runtime/html/BufferedWriter.js +2 -2
- package/dist/runtime/html/helpers/_dynamic-attr.js +2 -2
- package/dist/runtime/html/helpers/attr.js +19 -6
- package/dist/runtime/html/helpers/attrs.js +7 -0
- package/dist/runtime/html/helpers/data-marko.js +2 -2
- package/dist/runtime/html/helpers/escape-quotes.js +1 -1
- package/dist/runtime/html/helpers/escape-xml.js +1 -1
- package/dist/runtime/html/helpers/merge-attrs.js +38 -7
- package/dist/runtime/html/index.js +2 -2
- package/dist/runtime/renderable.js +9 -6
- package/dist/runtime/vdom/AsyncVDOMBuilder.js +86 -86
- package/dist/runtime/vdom/VComponent.js +3 -3
- package/dist/runtime/vdom/VDocumentFragment.js +7 -7
- package/dist/runtime/vdom/VElement.js +61 -50
- package/dist/runtime/vdom/VFragment.js +8 -8
- package/dist/runtime/vdom/VNode.js +36 -36
- package/dist/runtime/vdom/VText.js +8 -8
- package/dist/runtime/vdom/helpers/attrs.js +24 -4
- package/dist/runtime/vdom/helpers/merge-attrs.js +16 -0
- package/dist/runtime/vdom/helpers/v-element.js +1 -1
- package/dist/runtime/vdom/helpers/v-text.js +1 -1
- package/dist/runtime/vdom/hot-reload.js +19 -19
- package/dist/runtime/vdom/index.js +2 -2
- package/dist/runtime/vdom/morphdom/fragment.js +5 -5
- package/dist/runtime/vdom/morphdom/helpers.js +5 -5
- package/dist/runtime/vdom/morphdom/index.js +56 -56
- package/dist/runtime/vdom/morphdom/specialElHandlers.js +7 -7
- package/dist/runtime/vdom/preserve-attrs.js +1 -1
- package/dist/runtime/vdom/vdom.js +14 -14
- package/docs/10-awesome-marko-features.md +1 -1
- package/docs/body-content.md +3 -3
- package/docs/class-components.md +6 -6
- package/docs/cloudflare-workers.md +3 -3
- package/docs/compiler.md +5 -5
- package/docs/express.md +2 -2
- package/docs/http.md +1 -1
- package/docs/koa.md +1 -1
- package/docs/lasso.md +1 -1
- package/docs/marko-vs-react.md +2 -2
- package/docs/rendering.md +6 -6
- package/docs/rollup.md +30 -30
- package/docs/troubleshooting-streaming.md +1 -1
- package/docs/typescript.md +1 -1
- package/docs/vite.md +3 -3
- package/docs/webpack.md +25 -25
- package/docs/why-is-marko-fast.md +2 -2
- package/index.d.ts +1 -0
- package/legacy-components-browser.marko +15 -0
- package/legacy-components.js +7 -0
- package/package.json +51 -45
- package/src/compiler/config.js +1 -1
- package/src/compiler/index.js +5 -5
- package/src/core-tags/core/__flush_here_and_after__.js +1 -1
- package/src/core-tags/core/await/AsyncValue.js +1 -1
- package/src/core-tags/core/await/renderer.js +8 -4
- package/src/core-tags/core/await/reorderer-renderer.js +1 -1
- package/src/node-require/browser-refresh.js +2 -2
- package/src/node-require/index.js +2 -2
- package/src/node_modules/@internal/components-beginComponent/index.js +16 -6
- package/src/node_modules/@internal/components-define-widget-legacy/index-browser.js +331 -0
- package/src/node_modules/@internal/components-define-widget-legacy/index.js +18 -0
- package/src/node_modules/@internal/components-define-widget-legacy/package.json +11 -0
- package/src/node_modules/@internal/components-entry/index.js +65 -37
- package/src/node_modules/@internal/components-entry-legacy/index-browser.js +74 -0
- package/src/node_modules/@internal/components-entry-legacy/index.js +15 -0
- package/src/node_modules/@internal/components-entry-legacy/package.json +11 -0
- package/src/node_modules/@internal/components-registry/index-browser.js +33 -6
- package/src/node_modules/@internal/components-util/index.js +10 -0
- package/src/runtime/RenderResult.js +3 -3
- package/src/runtime/components/Component.js +16 -18
- package/src/runtime/components/ComponentDef.js +22 -8
- package/src/runtime/components/ComponentsContext.js +1 -1
- package/src/runtime/components/State.js +2 -2
- package/src/runtime/components/attach-detach.js +1 -1
- package/src/runtime/components/dom-data.js +1 -1
- package/src/runtime/components/legacy/browser.json +9 -0
- package/src/runtime/components/legacy/defineComponent-legacy.js +32 -0
- package/src/runtime/components/legacy/defineRenderer-legacy.js +171 -0
- package/src/runtime/components/legacy/defineWidget-legacy.js +1 -0
- package/src/runtime/components/legacy/dependencies/html.js +3 -0
- package/src/runtime/components/legacy/dependencies/index.js +178 -0
- package/src/runtime/components/legacy/dependencies/vdom.js +3 -0
- package/src/runtime/components/legacy/index.js +1 -0
- package/src/runtime/components/legacy/jquery.js +51 -0
- package/src/runtime/components/legacy/ready.js +152 -0
- package/src/runtime/components/legacy/renderer-legacy.js +230 -0
- package/src/runtime/components/renderer.js +4 -0
- package/src/runtime/components/update-manager.js +1 -1
- package/src/runtime/dom-insert.js +1 -1
- package/src/runtime/helpers/dynamic-tag.js +2 -4
- package/src/runtime/helpers/style-value.js +7 -2
- package/src/runtime/html/AsyncStream.js +5 -5
- package/src/runtime/html/BufferedWriter.js +1 -1
- package/src/runtime/html/StringWriter.js +1 -1
- package/src/runtime/html/helpers/attr.js +15 -2
- package/src/runtime/html/helpers/attrs.js +7 -0
- package/src/runtime/html/helpers/merge-attrs.js +38 -7
- package/src/runtime/html/hot-reload.js +1 -1
- package/src/runtime/html/index.js +2 -2
- package/src/runtime/renderable.js +5 -2
- package/src/runtime/vdom/AsyncVDOMBuilder.js +2 -2
- package/src/runtime/vdom/VComponent.js +1 -1
- package/src/runtime/vdom/VDocumentFragment.js +1 -1
- package/src/runtime/vdom/VElement.js +17 -6
- package/src/runtime/vdom/VFragment.js +1 -1
- package/src/runtime/vdom/VNode.js +1 -1
- package/src/runtime/vdom/VText.js +1 -1
- package/src/runtime/vdom/helpers/attrs.js +26 -6
- package/src/runtime/vdom/helpers/merge-attrs.js +16 -0
- package/src/runtime/vdom/hot-reload.js +1 -1
- package/src/runtime/vdom/index.js +2 -2
- package/src/runtime/vdom/morphdom/fragment.js +1 -1
- package/src/runtime/vdom/morphdom/specialElHandlers.js +1 -1
- package/src/taglib/index.js +1 -1
- 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
|
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
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
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
|
-
|
285
|
-
|
286
|
-
if (
|
287
|
-
|
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
|
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 (
|
105
|
-
|
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 (
|
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
|
|
@@ -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;
|
@@ -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");
|