define(<%= imports %>, function(<%= args %>){ var renderer = stache(<%= intermediate %>); var __export = { render: function(scope, options){ var moduleOptions = { module: module }; options = (options && options.add) ? options.add(moduleOptions) : moduleOptions; return renderer(scope, options); }, start: function(){ var state = this.state = new this.viewModel; can.route.map(state); can.route.ready(); this.rerender(); }, rerender: function(){ var keep = { "SCRIPT": true, "STYLE": true, "LINK": true }; function eachChild(parent, callback){ can.each(can.makeArray(parent.childNodes), function(el){ if(!keep[el.nodeName]) { callback(el); } }); } function remove(el) { can.remove(el); } function appendTo(parent){ return function(el){ can.appendChild(parent, el); } } this.renderAsync().then(function(result){ var frag = result.fragment; var head = document.head; var body = document.body; // Move elements from the fragment's head to the document head. eachChild(head, remove); eachChild(can.$("head", frag)[0], appendTo(head)); // Move elements from the fragment's body to the document body. eachChild(body, remove); eachChild(can.$("body", frag)[0], appendTo(body)); }); }, promiseAll: function(promises){ var dfd = new can.Deferred(); var left = promises.length, failed = false; function done(){ left--; if(!left && !failed) { dfd.resolve(); } } function fail(e){ failed = true; dfd.reject(e); } can.each(promises, function(p){ p.then(done, fail); }); return dfd; }, renderAsync: function(renderer, data, options, doc){ renderer = renderer || this.render; data = data || this.state; options = options || {}; var promiseAll = this.promiseAll; var frag = renderer(data, options); function waitForPromises(){ var readyPromises = []; if(data.__readyPromises) { readyPromises = data.__readyPromises; data.__readyPromises = []; } if(readyPromises.length === 0) { if(doc) { var oldDoc = can.document; can.document = doc; can.appendChild(doc.body, frag, doc); can.document = oldDoc; } return new can.Deferred().resolve(); } return promiseAll(readyPromises).then(waitForPromises); } return waitForPromises().then(function(){ return { fragment: frag, data: data.__pageData }; }); }, <%= ases %> }; var __isNW = (function(){ try{var nr = System._nodeRequire; return nr && nr('nw.gui') !== 'undefined';}catch(e){return false;} })(); if(typeof steal !== 'undefined' && (__isNW || !(typeof process === 'object' && {}.toString.call(process) === '[object process]'))) steal.done().then(function() { __export.start(); }); return __export; });