remove and rename references to <async-fragment> in the code (except deprecated events, tests, and transforms)

This commit is contained in:
Michael Rawlings 2016-06-18 12:49:31 -07:00
parent 22e81c92bb
commit 4c9ceb0aa8
10 changed files with 97 additions and 92 deletions

View File

@ -5,22 +5,22 @@ module.exports = function(input, out) {
out.flush(); out.flush();
var asyncOut = out.beginAsync({ last: true, timeout: -1, name: 'async-fragments' }); var asyncOut = out.beginAsync({ last: true, timeout: -1, name: 'await-reorderer' });
out.onLast(function(next) { out.onLast(function(next) {
var asyncFragmentsContext = global.__asyncFragments; var awaitContext = global.__awaitContext;
if (!asyncFragmentsContext || !asyncFragmentsContext.fragments.length) { if (!awaitContext || !awaitContext.instances.length) {
asyncOut.end(); asyncOut.end();
next(); next();
return; return;
} }
var remaining = asyncFragmentsContext.fragments.length; var remaining = awaitContext.instances.length;
var done = false; var done = false;
function handleAsyncFragment(fragmentInfo) { function handleAwait(awaitInfo) {
fragmentInfo.asyncValue.done(function(err, html) { awaitInfo.asyncValue.done(function(err, html) {
if (done) { if (done) {
return; return;
} }
@ -35,17 +35,18 @@ module.exports = function(input, out) {
global._afRuntime = true; global._afRuntime = true;
} }
asyncOut.write('<div id="af' + fragmentInfo.id + '" style="display:none">' + asyncOut.write('<div id="af' + awaitInfo.id + '" style="display:none">' +
html + html +
'</div>' + '</div>' +
'<script type="text/javascript">$af(' + '<script type="text/javascript">$af(' +
(typeof fragmentInfo.id === 'number' ? fragmentInfo.id : '"' + fragmentInfo.id + '"') + (typeof awaitInfo.id === 'number' ? awaitInfo.id : '"' + awaitInfo.id + '"') +
(fragmentInfo.after ? (',"' + fragmentInfo.after + '"') : '' ) + (awaitInfo.after ? (',"' + awaitInfo.after + '"') : '' ) +
')</script>'); ')</script>');
fragmentInfo.out.writer = asyncOut.writer; awaitInfo.out.writer = asyncOut.writer;
out.emit('asyncFragmentFinish', fragmentInfo); out.emit('await:finish', awaitInfo);
out.emit('asyncFragmentFinish', awaitInfo); // TODO: remove deprecated event
out.flush(); out.flush();
@ -57,15 +58,15 @@ module.exports = function(input, out) {
}); });
} }
asyncFragmentsContext.fragments.forEach(handleAsyncFragment); awaitContext.instances.forEach(handleAwait);
out.on('asyncFragmentClientReorder', function(fragmentInfo) { out.on('await:clientReorder', function(awaitInfo) {
remaining++; remaining++;
handleAsyncFragment(fragmentInfo); handleAwait(awaitInfo);
}); });
// Now that we have a listener attached, we want to receive any additional // Now that we have a listener attached, we want to receive any additional
// out-of-sync fragments via an event // out-of-sync instances via an event
delete asyncFragmentsContext.fragments; delete awaitContext.instances;
}); });
}; };

View File

@ -78,7 +78,7 @@ module.exports = function render(input, out) {
dataProvider = dataProvider[method].bind(dataProvider); dataProvider = dataProvider[method].bind(dataProvider);
} }
var fragmentInfo = { var awaitInfo = {
name: name, name: name,
clientReorder: clientReorder, clientReorder: clientReorder,
dataProvider: dataProvider dataProvider: dataProvider
@ -86,26 +86,28 @@ module.exports = function render(input, out) {
var beforeRenderEmitted = false; var beforeRenderEmitted = false;
out.emit('asyncFragmentBegin', fragmentInfo); out.emit('await:begin', awaitInfo);
out.emit('asyncFragmentBegin', awaitInfo); // TODO: remove deprecated event
function renderBody(err, data, renderTimeout) { function renderBody(err, data, renderTimeout) {
if (fragmentInfo.finished) return; if (awaitInfo.finished) return;
if (timeoutId) { if (timeoutId) {
clearTimeout(timeoutId); clearTimeout(timeoutId);
timeoutId = null; timeoutId = null;
} }
var targetOut = fragmentInfo.out = asyncOut || out; var targetOut = awaitInfo.out = asyncOut || out;
if (!beforeRenderEmitted) { if (!beforeRenderEmitted) {
beforeRenderEmitted = true; beforeRenderEmitted = true;
out.emit('asyncFragmentBeforeRender', fragmentInfo); out.emit('await:beforeRender', awaitInfo);
out.emit('asyncFragmentBeforeRender', awaitInfo); // TODO: remove deprecated event
} }
if (err) { if (err) {
if (input.renderError) { if (input.renderError) {
console.error('Async fragment (' + name + ') failed. Error:', (err.stack || err)); console.error('Await (' + name + ') failed. Error:', (err.stack || err));
input.renderError(targetOut); input.renderError(targetOut);
} else { } else {
targetOut.error(err); targetOut.error(err);
@ -118,10 +120,11 @@ module.exports = function render(input, out) {
} }
} }
fragmentInfo.finished = true; awaitInfo.finished = true;
if (!clientReorder) { if (!clientReorder) {
out.emit('asyncFragmentFinish', fragmentInfo); out.emit('await:finish', awaitInfo);
out.emit('asyncFragmentFinish', awaitInfo); // TODO: remove deprecated event
} }
if (asyncOut) { if (asyncOut) {
@ -137,7 +140,7 @@ module.exports = function render(input, out) {
requestData(dataProvider, arg, renderBody, scope); requestData(dataProvider, arg, renderBody, scope);
if (!fragmentInfo.finished) { if (!awaitInfo.finished) {
var timeout = input.timeout; var timeout = input.timeout;
var renderTimeout = input.renderTimeout; var renderTimeout = input.renderTimeout;
var renderPlaceholder = input.renderPlaceholder; var renderPlaceholder = input.renderPlaceholder;
@ -150,9 +153,9 @@ module.exports = function render(input, out) {
if (timeout != null) { if (timeout != null) {
timeoutId = setTimeout(function() { timeoutId = setTimeout(function() {
var message = 'Async fragment (' + name + ') timed out after ' + timeout + 'ms'; var message = 'Await (' + name + ') timed out after ' + timeout + 'ms';
fragmentInfo.timedout = true; awaitInfo.timedout = true;
if (renderTimeout) { if (renderTimeout) {
logger.error(message); logger.error(message);
@ -164,12 +167,12 @@ module.exports = function render(input, out) {
} }
if (clientReorder) { if (clientReorder) {
var asyncFragmentContext = out.global.__asyncFragments || (asyncFragmentContext = out.global.__asyncFragments = { var awaitContext = out.global.__awaitContext || (awaitContext = out.global.__awaitContext = {
fragments: [], instances: [],
nextId: 0 nextId: 0
}); });
var id = fragmentInfo.id = input.name || (asyncFragmentContext.nextId++); var id = awaitInfo.id = input.name || (awaitContext.nextId++);
if (renderPlaceholder) { if (renderPlaceholder) {
out.write('<span id="afph' + id + '">'); out.write('<span id="afph' + id + '">');
@ -179,28 +182,28 @@ module.exports = function render(input, out) {
out.write('<noscript id="afph' + id + '"></noscript>'); out.write('<noscript id="afph' + id + '"></noscript>');
} }
var asyncValue = fragmentInfo.asyncValue = new AsyncValue(); var asyncValue = awaitInfo.asyncValue = new AsyncValue();
// If `client-reorder` is enabled then we asynchronously render the async fragment to a new // If `client-reorder` is enabled then we asynchronously render the await instance to a new
// AsyncWriter instance so that we can Write to a temporary in-memory buffer. // AsyncWriter instance so that we can Write to a temporary in-memory buffer.
asyncOut = fragmentInfo.out = asyncWriter.create(null, {global: out.global}); asyncOut = awaitInfo.out = asyncWriter.create(null, {global: out.global});
fragmentInfo.after = input.showAfter; awaitInfo.after = input.showAfter;
var oldEmit = asyncOut.emit; var oldEmit = asyncOut.emit;
// Since we are rendering the async fragment to a new and separate AsyncWriter instance, // Since we are rendering the await instance to a new and separate AsyncWriter instance,
// we want to proxy any child events to the main AsyncWriter in case anyone is interested // we want to proxy any child events to the main AsyncWriter in case anyone is interested
// in those events. This is also needed for the following events to be handled correctly: // in those events. This is also needed for the following events to be handled correctly:
// //
// - asyncFragmentBegin // - await:begin
// - asyncFragmentBeforeRender // - await:beforeRender
// - asyncFragmentFinish // - await:finish
// //
asyncOut.emit = function(event) { asyncOut.emit = function(event) {
if (event !== 'finish' && event !== 'error') { if (event !== 'finish' && event !== 'error') {
// We don't want to proxy the finish and error events since those are // We don't want to proxy the finish and error events since those are
// very specific to the AsyncWriter associated with the async fragment // very specific to the AsyncWriter associated with the await instance
out.emit.apply(out, arguments); out.emit.apply(out, arguments);
} }
@ -215,14 +218,15 @@ module.exports = function render(input, out) {
asyncValue.reject(err); asyncValue.reject(err);
}); });
if (asyncFragmentContext.fragments) { if (awaitContext.instances) {
asyncFragmentContext.fragments.push(fragmentInfo); awaitContext.instances.push(awaitInfo);
} }
out.emit('asyncFragmentClientReorder', fragmentInfo); out.emit('await:clientReorder', awaitInfo);
out.emit('asyncFragmentClientReorder', awaitInfo); // TODO: remove deprecated event
} else { } else {
out.flush(); // Flush everything up to this async fragment out.flush(); // Flush everything up to this await instance
asyncOut = fragmentInfo.out = out.beginAsync({ asyncOut = awaitInfo.out = out.beginAsync({
timeout: 0, // We will use our code for controlling timeout timeout: 0, // We will use our code for controlling timeout
name: name name: name
}); });

View File

@ -11,7 +11,7 @@ var fs = require('fs');
require('../node-require').install(); require('../node-require').install();
describe('render', function() { describe('async-fragments (deprecated)', function() {
var autoTestDir = path.join(__dirname, 'autotests/async-fragments-deprecated'); var autoTestDir = path.join(__dirname, 'autotests/async-fragments-deprecated');
autotest.scanDir( autotest.scanDir(

View File

@ -11,7 +11,7 @@ var fs = require('fs');
require('../node-require').install(); require('../node-require').install();
describe('render', function() { describe('async render', function() {
var autoTestDir = path.join(__dirname, 'autotests/async-render'); var autoTestDir = path.join(__dirname, 'autotests/async-render');
autotest.scanDir( autotest.scanDir(
@ -43,17 +43,17 @@ describe('render', function() {
var templateData = main.templateData || {}; var templateData = main.templateData || {};
var out = marko.createWriter(); var out = marko.createWriter();
var events = []; var events = [];
var eventsByFragmentName = {}; var eventsByAwaitInstance = {};
var addEventListener = function(event) { var addEventListener = function(event) {
out.on(event, function(arg) { out.on(event, function(arg) {
var name = arg.name; var name = arg.name;
if (!eventsByFragmentName[name]) { if (!eventsByAwaitInstance[name]) {
eventsByFragmentName[name] = []; eventsByAwaitInstance[name] = [];
} }
eventsByFragmentName[name].push(event); eventsByAwaitInstance[name].push(event);
events.push({ events.push({
event: event, event: event,
@ -62,9 +62,9 @@ describe('render', function() {
}); });
}; };
addEventListener('asyncFragmentBegin'); addEventListener('await:begin');
addEventListener('asyncFragmentBeforeRender'); addEventListener('await:beforeRender');
addEventListener('asyncFragmentFinish'); addEventListener('await:finish');
template.render(templateData, out, function(err, html) { template.render(templateData, out, function(err, html) {
if (err) { if (err) {
@ -81,13 +81,13 @@ describe('render', function() {
main.checkEvents(events, helpers); main.checkEvents(events, helpers);
} }
// Make sure all of the async fragments were correctly ended // Make sure all of the await instances were correctly ended
Object.keys(eventsByFragmentName).forEach(function(fragmentName) { Object.keys(eventsByAwaitInstance).forEach(function(name) {
var events = eventsByFragmentName[fragmentName]; var events = eventsByAwaitInstance[name];
expect(events).to.deep.equal([ expect(events).to.deep.equal([
'asyncFragmentBegin', 'await:begin',
'asyncFragmentBeforeRender', 'await:beforeRender',
'asyncFragmentFinish' 'await:finish'
]); ]);
}); });

View File

@ -1,3 +1,3 @@
<async-fragment data-provider=data.nameDataProvider var="name"> <await(name from data.nameDataProvider)>
Hello ${name}! Hello ${name}!
</async-fragment> </await>

View File

@ -1,6 +1,6 @@
[ [
{ {
"event": "asyncFragmentBegin", "event": "await:begin",
"arg": { "arg": {
"name": "data.outer", "name": "data.outer",
"finished":true, "finished":true,
@ -9,7 +9,7 @@
} }
}, },
{ {
"event": "asyncFragmentBeforeRender", "event": "await:beforeRender",
"arg": { "arg": {
"name": "data.outer", "name": "data.outer",
"finished":true, "finished":true,
@ -18,7 +18,7 @@
} }
}, },
{ {
"event": "asyncFragmentBegin", "event": "await:begin",
"arg": { "arg": {
"name": "data.inner1", "name": "data.inner1",
"finished":true, "finished":true,
@ -26,7 +26,7 @@
} }
}, },
{ {
"event": "asyncFragmentBeforeRender", "event": "await:beforeRender",
"arg": { "arg": {
"name": "data.inner1", "name": "data.inner1",
"finished":true, "finished":true,
@ -34,7 +34,7 @@
} }
}, },
{ {
"event": "asyncFragmentFinish", "event": "await:finish",
"arg": { "arg": {
"name": "data.inner1", "name": "data.inner1",
"finished":true, "finished":true,
@ -42,7 +42,7 @@
} }
}, },
{ {
"event": "asyncFragmentFinish", "event": "await:finish",
"arg": { "arg": {
"name": "data.outer", "name": "data.outer",
"finished":true, "finished":true,

View File

@ -1,6 +1,6 @@
[ [
{ {
"event": "asyncFragmentBegin", "event": "await:begin",
"arg": { "arg": {
"name": "data.outer", "name": "data.outer",
"finished":true, "finished":true,
@ -9,7 +9,7 @@
} }
}, },
{ {
"event": "asyncFragmentBeforeRender", "event": "await:beforeRender",
"arg": { "arg": {
"name": "data.outer", "name": "data.outer",
"finished":true, "finished":true,
@ -18,7 +18,7 @@
} }
}, },
{ {
"event": "asyncFragmentBegin", "event": "await:begin",
"arg": { "arg": {
"name": "data.inner1", "name": "data.inner1",
"finished":true, "finished":true,
@ -27,7 +27,7 @@
} }
}, },
{ {
"event": "asyncFragmentBegin", "event": "await:begin",
"arg": { "arg": {
"name": "data.inner2", "name": "data.inner2",
"finished":true, "finished":true,
@ -36,7 +36,7 @@
} }
}, },
{ {
"event": "asyncFragmentFinish", "event": "await:finish",
"arg": { "arg": {
"name": "data.outer", "name": "data.outer",
"finished":true, "finished":true,
@ -45,7 +45,7 @@
} }
}, },
{ {
"event": "asyncFragmentBeforeRender", "event": "await:beforeRender",
"arg": { "arg": {
"name": "data.inner1", "name": "data.inner1",
"finished":true, "finished":true,
@ -54,7 +54,7 @@
} }
}, },
{ {
"event": "asyncFragmentFinish", "event": "await:finish",
"arg": { "arg": {
"name": "data.inner1", "name": "data.inner1",
"finished":true, "finished":true,
@ -63,7 +63,7 @@
} }
}, },
{ {
"event": "asyncFragmentBeforeRender", "event": "await:beforeRender",
"arg": { "arg": {
"name": "data.inner2", "name": "data.inner2",
"finished":true, "finished":true,
@ -72,7 +72,7 @@
} }
}, },
{ {
"event": "asyncFragmentFinish", "event": "await:finish",
"arg": { "arg": {
"name": "data.inner2", "name": "data.inner2",
"finished":true, "finished":true,

View File

@ -19,7 +19,7 @@ exports.templateData = {
} }
}; };
exports.checkHtml = function() {}
exports.checkEvents = function(events, helpers) { exports.checkEvents = function(events, helpers) {
events = events.map(function(eventInfo) { events = events.map(function(eventInfo) {
var arg = extend({}, eventInfo.arg); var arg = extend({}, eventInfo.arg);

View File

@ -1,6 +1,6 @@
[ [
{ {
"event": "asyncFragmentBegin", "event": "await:begin",
"arg": { "arg": {
"name": "data.outer", "name": "data.outer",
"finished":true, "finished":true,
@ -9,7 +9,7 @@
} }
}, },
{ {
"event": "asyncFragmentBeforeRender", "event": "await:beforeRender",
"arg": { "arg": {
"name": "data.outer", "name": "data.outer",
"finished":true, "finished":true,
@ -18,7 +18,7 @@
} }
}, },
{ {
"event": "asyncFragmentFinish", "event": "await:finish",
"arg": { "arg": {
"name": "data.outer", "name": "data.outer",
"finished":true, "finished":true,

View File

@ -1,6 +1,6 @@
[ [
{ {
"event": "asyncFragmentBegin", "event": "await:begin",
"arg": { "arg": {
"name": "userInfo1", "name": "userInfo1",
"clientReorder": false, "clientReorder": false,
@ -9,7 +9,7 @@
} }
}, },
{ {
"event": "asyncFragmentBegin", "event": "await:begin",
"arg": { "arg": {
"name": "userInfo2", "name": "userInfo2",
"clientReorder": false, "clientReorder": false,
@ -18,7 +18,7 @@
} }
}, },
{ {
"event": "asyncFragmentBegin", "event": "await:begin",
"arg": { "arg": {
"name": "userInfo3", "name": "userInfo3",
"clientReorder": false, "clientReorder": false,
@ -27,7 +27,7 @@
} }
}, },
{ {
"event": "asyncFragmentBegin", "event": "await:begin",
"arg": { "arg": {
"name": "userInfo4", "name": "userInfo4",
"clientReorder": false, "clientReorder": false,
@ -36,7 +36,7 @@
} }
}, },
{ {
"event": "asyncFragmentBeforeRender", "event": "await:beforeRender",
"arg": { "arg": {
"name": "userInfo1", "name": "userInfo1",
"clientReorder": false, "clientReorder": false,
@ -45,7 +45,7 @@
} }
}, },
{ {
"event": "asyncFragmentFinish", "event": "await:finish",
"arg": { "arg": {
"name": "userInfo1", "name": "userInfo1",
"clientReorder": false, "clientReorder": false,
@ -54,7 +54,7 @@
} }
}, },
{ {
"event": "asyncFragmentBeforeRender", "event": "await:beforeRender",
"arg": { "arg": {
"name": "userInfo2", "name": "userInfo2",
"clientReorder": false, "clientReorder": false,
@ -63,7 +63,7 @@
} }
}, },
{ {
"event": "asyncFragmentFinish", "event": "await:finish",
"arg": { "arg": {
"name": "userInfo2", "name": "userInfo2",
"clientReorder": false, "clientReorder": false,
@ -72,7 +72,7 @@
} }
}, },
{ {
"event": "asyncFragmentBeforeRender", "event": "await:beforeRender",
"arg": { "arg": {
"name": "userInfo3", "name": "userInfo3",
"clientReorder": false, "clientReorder": false,
@ -81,7 +81,7 @@
} }
}, },
{ {
"event": "asyncFragmentFinish", "event": "await:finish",
"arg": { "arg": {
"name": "userInfo3", "name": "userInfo3",
"clientReorder": false, "clientReorder": false,
@ -90,7 +90,7 @@
} }
}, },
{ {
"event": "asyncFragmentBeforeRender", "event": "await:beforeRender",
"arg": { "arg": {
"name": "userInfo4", "name": "userInfo4",
"clientReorder": false, "clientReorder": false,
@ -99,7 +99,7 @@
} }
}, },
{ {
"event": "asyncFragmentFinish", "event": "await:finish",
"arg": { "arg": {
"name": "userInfo4", "name": "userInfo4",
"clientReorder": false, "clientReorder": false,