mirror of
https://github.com/marko-js/marko.git
synced 2025-12-08 19:26:05 +00:00
Merge branch '410-await-reorderer-body-transform' of https://github.com/austinkelleher/marko
This commit is contained in:
commit
afa870ad78
@ -1,22 +1,38 @@
|
||||
var clientReorder = require('./client-reorder');
|
||||
'use strict';
|
||||
|
||||
const clientReorder = require('./client-reorder');
|
||||
|
||||
module.exports = function(input, out) {
|
||||
var global = out.global;
|
||||
|
||||
out.flush();
|
||||
|
||||
// We have already invoked an <await-reorderer. We do not need to do this
|
||||
// work again.
|
||||
if (global.__awaitReordererInvoked) {
|
||||
return;
|
||||
}
|
||||
|
||||
global.__awaitReordererInvoked = true;
|
||||
|
||||
// We cannot call beginSync() when using renderSync(). In this case we will
|
||||
// ignore the await-reorderer tag.
|
||||
if (out.isSync()) {
|
||||
return;
|
||||
}
|
||||
|
||||
var asyncOut = out.beginAsync({ last: true, timeout: -1, name: 'await-reorderer' });
|
||||
out.onLast(function(next) {
|
||||
var awaitContext = global.__awaitContext;
|
||||
var remaining;
|
||||
|
||||
if (!awaitContext || !awaitContext.instances.length) {
|
||||
// Validate that we have remaining <await> instances that need handled
|
||||
if (!awaitContext || !awaitContext.instances || !(remaining = awaitContext.instances.length)) {
|
||||
asyncOut.end();
|
||||
next();
|
||||
return;
|
||||
}
|
||||
|
||||
var remaining = awaitContext.instances.length;
|
||||
|
||||
var done = false;
|
||||
|
||||
function handleAwait(awaitInfo) {
|
||||
|
||||
@ -0,0 +1,26 @@
|
||||
[
|
||||
{
|
||||
"event": "await:begin",
|
||||
"arg": {
|
||||
"name": "data.outer",
|
||||
"clientReorder": false,
|
||||
"finished": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"event": "await:beforeRender",
|
||||
"arg": {
|
||||
"name": "data.outer",
|
||||
"clientReorder": false,
|
||||
"finished": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"event": "await:finish",
|
||||
"arg": {
|
||||
"name": "data.outer",
|
||||
"clientReorder": false,
|
||||
"finished": true
|
||||
}
|
||||
}
|
||||
]
|
||||
@ -0,0 +1,29 @@
|
||||
[
|
||||
{
|
||||
"event": "await:begin",
|
||||
"arg": {
|
||||
"name": "data.outer",
|
||||
"finished":true,
|
||||
"clientReorder": true,
|
||||
"id": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"event": "await:beforeRender",
|
||||
"arg": {
|
||||
"name": "data.outer",
|
||||
"finished":true,
|
||||
"clientReorder": true,
|
||||
"id": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"event": "await:finish",
|
||||
"arg": {
|
||||
"name": "data.outer",
|
||||
"finished":true,
|
||||
"clientReorder": true,
|
||||
"id": 0
|
||||
}
|
||||
}
|
||||
]
|
||||
@ -0,0 +1 @@
|
||||
<body><noscript id="afph0"></noscript><script type="text/javascript">function $af(d,a,e,l,g,h,k,b,f,c){c=$af;if(a&&!c[a])(c[a+="$"]||(c[a]=[])).push(d);else{e=document;l=e.getElementById("af"+d);g=e.getElementById("afph"+d);h=e.createDocumentFragment();k=l.childNodes;b=0;for(f=k.length;b<f;b++)h.appendChild(k.item(0));g.parentNode.replaceChild(h,g);c[d]=1;if(a=c[d+"$"])for(b=0,f=a.length;b<f;b++)c(a[b])}};</script><div id="af0" style="display:none"><div class="foo"><h1>Foo</h1> Hello World</div></div><script type="text/javascript">$af(0)</script></body>
|
||||
@ -0,0 +1,11 @@
|
||||
<body>
|
||||
<await(outer from data.outer) client-reorder>
|
||||
<div class="foo">
|
||||
<h1>Foo</h1>
|
||||
|
||||
Hello World
|
||||
</div>
|
||||
</await>
|
||||
|
||||
<await-reorderer/>
|
||||
</body>
|
||||
@ -0,0 +1,42 @@
|
||||
const extend = require('raptor-util/extend');
|
||||
const expect = require('chai').expect;
|
||||
|
||||
exports.templateData = {
|
||||
outer: function(callback) {
|
||||
setTimeout(function() {
|
||||
callback(null, {});
|
||||
}, 400);
|
||||
},
|
||||
inner1: function(callback) {
|
||||
setTimeout(function() {
|
||||
callback(null, {});
|
||||
}, 500);
|
||||
},
|
||||
inner2: function(callback) {
|
||||
setTimeout(function() {
|
||||
callback(null, {});
|
||||
}, 600);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
exports.checkEvents = function(events, helpers, out) {
|
||||
// Expect that we invoked the await reorderer. If true, it was only able to
|
||||
// be invoked once.
|
||||
expect(out.global.__awaitReordererInvoked).to.equal(true);
|
||||
|
||||
events = events.map(function(eventInfo) {
|
||||
var arg = extend({}, eventInfo.arg);
|
||||
expect(arg.out != null).to.equal(true);
|
||||
|
||||
delete arg.out; // Not serializable
|
||||
delete arg.asyncValue; // Not serializable
|
||||
|
||||
return {
|
||||
event: eventInfo.event,
|
||||
arg: arg
|
||||
};
|
||||
});
|
||||
|
||||
helpers.compare(events, out.isVDOM ? '-events-vdom.json' : '-events.json');
|
||||
};
|
||||
@ -0,0 +1,4 @@
|
||||
<DIV class="foo">
|
||||
<H1>
|
||||
"Foo"
|
||||
" Hello World"
|
||||
@ -9,7 +9,8 @@ var marko_helpers = require("marko/runtime/html/helpers"),
|
||||
lasso_body_tag = marko_loadTag(require("lasso/taglib/body-tag")),
|
||||
init_widgets_tag = marko_loadTag(require("marko/widgets/taglib/init-widgets-tag")),
|
||||
lasso_slot_tag = marko_loadTag(require("lasso/taglib/slot-tag")),
|
||||
browser_refresh_tag = marko_loadTag(require("browser-refresh-taglib/refresh-tag"));
|
||||
browser_refresh_tag = marko_loadTag(require("browser-refresh-taglib/refresh-tag")),
|
||||
await_reorderer_tag = marko_loadTag(require("marko/taglibs/async/await-reorderer-tag"));
|
||||
|
||||
function render(data, out) {
|
||||
lasso_page_tag({
|
||||
@ -37,6 +38,8 @@ function render(data, out) {
|
||||
|
||||
browser_refresh_tag({}, out);
|
||||
|
||||
await_reorderer_tag({}, out);
|
||||
|
||||
init_widgets_tag({}, out);
|
||||
|
||||
out.w("</body></html>");
|
||||
|
||||
@ -1,6 +1,11 @@
|
||||
'use strict';
|
||||
|
||||
module.exports = function transform(el, context) {
|
||||
var initWidgetsNode = context.createNodeForEl('init-widgets');
|
||||
// Make <await-reorderer> optional. Automatically insert it before the
|
||||
// body tag.
|
||||
let awaitReorderer = context.createNodeForEl('await-reorderer');
|
||||
el.appendChild(awaitReorderer);
|
||||
|
||||
let initWidgetsNode = context.createNodeForEl('init-widgets');
|
||||
el.appendChild(initWidgetsNode);
|
||||
};
|
||||
Loading…
x
Reference in New Issue
Block a user