Skip to content

Commit

Permalink
updated render api. fixes #389.
Browse files Browse the repository at this point in the history
  • Loading branch information
mlrawlings committed Nov 22, 2016
1 parent 270ae3d commit 152717c
Show file tree
Hide file tree
Showing 38 changed files with 292 additions and 212 deletions.
58 changes: 26 additions & 32 deletions runtime/OutMixins.js → runtime/RenderResult.js
Original file line number Diff line number Diff line change
@@ -1,26 +1,30 @@
var events = require('./events');
var dom = require('./dom');

function checkAddedToDOM(asyncStream, method) {
if (!asyncStream.data._added) {
function checkAddedToDOM(result, method) {
if (!result.out.data._added) {
throw new Error('Cannot call ' + method + '() until after HTML fragment is added to DOM.');
}
}

function getWidgetDefs(asyncStream) {
var widgetDefs = asyncStream.data.widgets;
function getWidgetDefs(result) {
var widgetDefs = result.out.data.widgets;

if (!widgetDefs || widgetDefs.length === 0) {
throw new Error('No widget rendered');
}
return widgetDefs;
}

module.exports = {
var RenderResult = module.exports = function RenderResult(out) {
this.out = out;
};

RenderResult.prototype = {
getWidget: function() {
checkAddedToDOM(this, 'getWidget');

var rerenderWidget = this.global.__rerenderWidget;
var rerenderWidget = this.out.global.__rerenderWidget;
if (rerenderWidget) {
return rerenderWidget;
}
Expand Down Expand Up @@ -54,46 +58,24 @@ module.exports = {
},

afterInsert: function(node) {
var data = this.data;
var data = this.out.data;
data._added = true;

var widgetsContext = this.global.widgets;
var widgetsContext = this.out.global.widgets;
var widgetDefs = widgetsContext ? widgetsContext.widgets : null;

data.widgets = widgetDefs;

events.emit('mountNode', {
node: node,
out: this,
result: this,
out: this.out,
document: node.ownerDocument
}); // NOTE: This will trigger widgets to be initialized if there were any

return this;
},

then: function(fn, fnErr) {
var self = this;
var promise = new Promise(function(resolve, reject) {
self.on('error', reject);
self.on('finish', function(data) {
try {
resolve(fn(data));
} catch(err) {
reject(err);
}
});
});

if (fnErr) {
promise = promise.catch(fnErr);
}
return promise;
},

catch: function(fnErr) {
return this.then(undefined, fnErr);
},

appendTo: function(referenceEl) {
var newNode = this.getNode(referenceEl.ownerDocument);
dom.appendTo(newNode, referenceEl);
Expand Down Expand Up @@ -124,5 +106,17 @@ module.exports = {
dom.prependTo(newNode, referenceEl);
return this.afterInsert(newNode);
},
getNode: function() {
return this.out.getNode();
},
getOutput: function() {
return this.out.getOutput();
},
toString: function() {
return this.out.toString();
},
toJSON: function() {
return this.getOutput();
},
document: typeof document !== 'undefined' && document
};
20 changes: 17 additions & 3 deletions runtime/html/AsyncStream.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
var EventEmitter = require('events').EventEmitter;
var StringWriter = require('./StringWriter');
var BufferedWriter = require('./BufferedWriter');
var extend = require('raptor-util/extend');
var documentProvider = require('../document-provider');
var RenderResult = require('../RenderResult');
var helpers;

var voidWriter = { write:function(){} };
Expand Down Expand Up @@ -471,6 +471,22 @@ var proto = AsyncStream.prototype = {
return this.getOutput();
},

then: function(fn, fnErr) {
var out = this;
var promise = new Promise(function(resolve, reject) {
out.on('error', reject);
out.on('finish', function() {
resolve(new RenderResult(out));
});
});

return Promise.resolve(promise).then(fn, fnErr);
},

catch: function(fnErr) {
return this.then(undefined, fnErr);
},

// END DOM METHODS

// Deprecated BEGIN:
Expand Down Expand Up @@ -498,8 +514,6 @@ var proto = AsyncStream.prototype = {
// alias:
proto.w = proto.write;

extend(proto, require('../OutMixins'));

module.exports = AsyncStream;

helpers = require('./helpers');
7 changes: 4 additions & 3 deletions runtime/html/index.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
'use strict';
// helpers provide a core set of various utility methods to compiled templates
var helpers;
var RenderResult = require('../RenderResult');

/**
* Method is for internal usage only. This method
Expand Down Expand Up @@ -49,7 +50,7 @@ Template.prototype = {
out.sync();

this._(localData, out);
return out.getOutput();
return new RenderResult(out);
},

/**
Expand Down Expand Up @@ -94,7 +95,7 @@ Template.prototype = {
if (callback) {
out
.on('finish', function() {
callback(null, out.getOutput(), out);
callback(null, new RenderResult(out), out);
})
.once('error', callback);
}
Expand All @@ -119,7 +120,7 @@ Template.prototype = {
if (callback) {
finalOut
.on('finish', function() {
callback(null, finalOut.getOutput(), finalOut);
callback(null, new RenderResult(finalOut), finalOut);
})
.once('error', callback);
}
Expand Down
29 changes: 22 additions & 7 deletions runtime/vdom/AsyncVDOMBuilder.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ var HTMLElement = require('./HTMLElement');
var DocumentFragment = require('./DocumentFragment');
var Comment = require('./Comment');
var Text = require('./Text');
var extend = require('raptor-util/extend');
var virtualizeHTML = require('./virtualizeHTML');
var documentProvider = require('../document-provider');
var RenderResult = require('../RenderResult');

function State(tree) {
this.remaining = 1;
Expand Down Expand Up @@ -139,7 +139,7 @@ var proto = AsyncVDOMBuilder.prototype = {

if (!remaining) {
state.finished = true;
state.events.emit('finish', state.tree);
state.events.emit('finish', this);
}

return this;
Expand Down Expand Up @@ -175,7 +175,7 @@ var proto = AsyncVDOMBuilder.prototype = {

flush: function() {
var state = this._state;
state.events.emit('update', state.tree);
state.events.emit('update', this);
},

getOutput: function() {
Expand All @@ -186,7 +186,7 @@ var proto = AsyncVDOMBuilder.prototype = {
var state = this._state;

if (event === 'finish' && state.finished) {
callback(state.tree);
callback(this);
return this;
}

Expand All @@ -198,7 +198,7 @@ var proto = AsyncVDOMBuilder.prototype = {
var state = this._state;

if (event === 'finish' && state.finished) {
callback(state.tree);
callback(this);
return this;
}

Expand Down Expand Up @@ -266,6 +266,7 @@ var proto = AsyncVDOMBuilder.prototype = {
lastArray.push(callback);
return this;
},

getNode: function(doc) {
var node = this._node;
if (!node) {
Expand All @@ -291,6 +292,22 @@ var proto = AsyncVDOMBuilder.prototype = {
return node;
},

then: function(fn, fnErr) {
var out = this;
var promise = new Promise(function(resolve, reject) {
out.on('error', reject);
out.on('finish', function() {
resolve(new RenderResult(out));
});
});

return Promise.resolve(promise).then(fn, fnErr);
},

catch: function(fnErr) {
return this.then(undefined, fnErr);
},

isVDOM: true
};

Expand All @@ -300,6 +317,4 @@ proto.ee = proto.endElement;
proto.t = proto.text;
proto.h = proto.write = proto.html;

extend(proto, require('../OutMixins'));

module.exports = AsyncVDOMBuilder;
9 changes: 5 additions & 4 deletions runtime/vdom/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,15 @@
// helpers provide a core set of various utility methods
// that are available in every template
var helpers;
var RenderResult = require('../RenderResult');

/**
* Method is for internal usage only. This method
* is invoked by code in a compiled Marko template and
* it is used to create a new Template instance.
* @private
*/
exports.c = function createTemplate(path) {
exports.c = function createTemplate(path) {
return new Template(path);
};

Expand Down Expand Up @@ -45,7 +46,7 @@ Template.prototype = {
var out = new AsyncVDOMBuilder(globalData);
out.sync();
this._(localData, out);
return out.getOutput();
return new RenderResult(out);
},

/**
Expand Down Expand Up @@ -90,7 +91,7 @@ Template.prototype = {
if (callback) {
out
.on('finish', function() {
callback(null, out.getOutput(), out);
callback(null, new RenderResult(out), out);
})
.once('error', callback);
}
Expand All @@ -113,7 +114,7 @@ Template.prototype = {
if (callback) {
finalOut
.on('finish', function() {
callback(null, finalOut.getOutput(), finalOut);
callback(null, new RenderResult(finalOut), out);
})
.once('error', callback);
}
Expand Down
6 changes: 3 additions & 3 deletions test/AsyncStream-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ function createAsyncStream(options) {
}
}

describe('async-writer' , function() {
describe('AsyncStream', function() {

beforeEach(function(done) {
// for (var k in require.cache) {
Expand Down Expand Up @@ -63,10 +63,10 @@ describe('async-writer' , function() {
out.write('1');
out.write('2');

return out.end().then((data) => {
return out.end().then((result) => {
const output = out.getOutput();
expect(output).to.equal('12');
expect(data.getOutput()).to.equal('12');
expect(result.toString()).to.equal('12');
});
});

Expand Down
Loading

0 comments on commit 152717c

Please sign in to comment.