Merge branch '410-await-reorderer-body-transform' of https://github.com/austinkelleher/marko

This commit is contained in:
Patrick Steele-Idem 2016-11-14 18:46:54 -07:00
commit afa870ad78
9 changed files with 143 additions and 6 deletions

View File

@ -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) {

View File

@ -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
}
}
]

View File

@ -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
}
}
]

View File

@ -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>

View File

@ -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>

View File

@ -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');
};

View File

@ -0,0 +1,4 @@
<DIV class="foo">
<H1>
"Foo"
" Hello World"

View File

@ -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>");

View File

@ -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);
};