Files
node/first-project/node_modules/derby/lib/refresh.server.js
2012-05-30 23:00:06 -04:00

76 lines
2.1 KiB
JavaScript

var isProduction = require('racer').util.isProduction
, files = require('./files')
, refresh = module.exports = require('./refresh');
refresh.cssError = cssError;
refresh.templateError = templateError;
refresh.autoRefresh = autoRefresh;
function cssError(err) {
if (err.stack) {
console.error('\nCSS PARSE ERROR\n' + err.stack);
return err.stack;
} else {
console.error('\nCSS PARSE ERROR\n' + err.message + '\n' + err.filename);
return err.message + '\n' + err.filename;
}
}
function templateError(err) {
console.error('\nTEMPLATE ERROR\n' + err.stack);
return err.stack;
}
function autoRefresh(store, options, view) {
if (isProduction || store._derbySocketsSetup) return;
store._derbySocketsSetup = true;
var listeners = {};
store.sockets.on('connection', function(socket) {
socket.on('derbyClient', function(appHash, callback) {
var appFilename, reload, sockets;
reload = appHash !== view._appHash;
callback(reload);
if (reload) return;
appFilename = view._appFilename;
if (listeners[appFilename]) {
return listeners[appFilename].push(socket);
}
sockets = listeners[appFilename] = [socket];
addWatches(appFilename, options, sockets, view);
});
});
}
function addWatches(appFilename, options, sockets, view) {
var parsed = files.parseName(appFilename, options)
, root = parsed.root
, clientName = parsed.clientName;
files.watch(root, 'css', function() {
view._loadCss(root, clientName, function(err, css) {
var errText;
if (err) errText = cssError(err);
for (var i = sockets.length; i--;) {
sockets[i].emit('refreshCss', errText, css);
}
});
});
files.watch(root, 'html', function() {
view._loadTemplates(root, clientName, function(err, templates, instances, libraryData) {
var errText;
if (err) errText = templateError(err);
for (var i = sockets.length; i--;) {
sockets[i].emit('refreshHtml', errText, templates, instances, libraryData);
}
});
});
files.watch(root, 'js', function() {
process.send({type: 'reload'});
});
}