View.prototype.inline = function(fn) { var script = "(" + fn + ")()"; if (racer.get('minify')) { script = racer.get('minifyJs')(script); } this._inline += script + ';'; };
view._loadTemplates(root, clientName, function(err, templates, instances, libraryData) { if (err) errors['Template'] = refresh.templateError(err); view._makeAll(templates, instances); view._makeComponents(libraryData); var templatesScript = loadTemplatesScript(templates, instances, libraryData); if (racer.get('minify')) { templatesScript = racer.get('minifyJs')(templatesScript); } // Don't include JS for static pages if (isStatic) return callback(null, errors, css); // JS files are only loaded once per process start if (view._js) return finish(view._js); files.js(appFilename, function(err, js, inline) { if (err) return callback(err); if (inline) view.inline("function(){" + inline + "}"); view._js = js; finish(js); }); function finish(js) { files.writeJs(root, js + '\n;' + templatesScript, false, function(err, jsFile, appHash) { if (err) return callback(err); callback(err, errors, css, jsFile, appHash); }); } });
View.prototype.pack = function(callback) { var view = this , appFilename = view._appFilename , fileInfo = files.parseName(appFilename) , root = fileInfo.root , clientName = fileInfo.clientName , minifyPrevious = racer.get('minify') function finish(err) { racer.set('minify', minifyPrevious); callback(err, clientName); } racer.set('minify', true); view._loadStyles(root, clientName, function(err, css) { if (err) return finish(err); view._loadTemplates(root, clientName, function(err, templates, instances, libraryData) { if (err) return finish(err); var templatesScript = loadTemplatesScript(templates, instances, libraryData); templatesScript = racer.get('minifyJs')(templatesScript); files.js(appFilename, function(err, js, inline) { files.writeJs(root, js + '\n;' + templatesScript, true, function(err, jsFile, appHash) { if (err) return finish(err); var filename = clientName + '.json' , file = JSON.stringify({ css: css , templates: templates , instances: instances , libraryData: libraryData , inline: inline , jsFile: jsFile , appHash: appHash }) files.writeGen(root, filename, file, true, finish); }); }); }); }); };
view._loadTemplates(root, clientName, function(err, templates, instances, libraryData) { if (err) return finish(err); var templatesScript = loadTemplatesScript(templates, instances, libraryData); templatesScript = racer.get('minifyJs')(templatesScript); files.js(appFilename, function(err, js, inline) { files.writeJs(root, js + '\n;' + templatesScript, true, function(err, jsFile, appHash) { if (err) return finish(err); var filename = clientName + '.json' , file = JSON.stringify({ css: css , templates: templates , instances: instances , libraryData: libraryData , inline: inline , jsFile: jsFile , appHash: appHash }) files.writeGen(root, filename, file, true, finish); }); }); });
View.prototype._loadStyles = function(root, clientName, callback) { var styleFiles = [] , out = [] , libraries = this._libraries , minify = racer.get('minify') , len, i, library, styles, finish function add(styles) { var file = path.resolve(library.root, styles); styleFiles.push(file); } for (i = 0, len = libraries.length; i < len; i++) { library = libraries[i]; styles = library.styles; if (!styles) continue; if (Array.isArray(styles)) { styles.forEach(add); } else { add(styles); } } styleFiles.push(clientName); finish = finishAfter(styleFiles.length, function(err) { if (err) return callback(err); callback(null, out.join('')); }); styleFiles.forEach(function(file, i) { files.css(root, file, minify, function(err, value) { out[i] = minify ? trimLeading(value) : '\n' + value; finish(err); }); }); };
var path = require('path') , EventDispatcher = require('./EventDispatcher') , racer = require('racer') , Promise = racer.util.Promise , isProduction = racer.util.isProduction , merge = racer.util.merge , finishAfter = racer.util.async.finishAfter , Model = racer["protected"].Model , minifyJs = racer.get('minifyJs') , files = require('./files') , htmlUtil = require('html-util') , escapeHtml = htmlUtil.escapeHtml , trimLeading = htmlUtil.trimLeading , refresh = require('./refresh.server') , errorHtml = refresh.errorHtml , cssError = refresh.cssError , templateError = refresh.templateError , View = module.exports = require('./View') , emptyModel = new Model , emptyRes = { getHeader: empty , setHeader: empty , write: empty , end: empty } , emptyPathMap = { id: empty } , emptyEventDispatcher = { bind: empty }