seitime-frappe/rollup/watch.js

98 lines
2 KiB
JavaScript

const path = require('path');
const chalk = require('chalk');
const rollup = require('rollup');
const log = console.log; // eslint-disable-line
const {
apps_list
} = require('./rollup.utils');
const {
get_options_for
} = require('./config');
const { get_redis_subscriber } = require('../node_utils');
const subscriber = get_redis_subscriber();
watch_assets();
function watch_assets() {
let watchOptions = [];
apps_list.map(app => {
watchOptions.push(...get_watch_options(app));
});
log(chalk.green(`\nRollup Watcher Started`));
let watcher = rollup.watch(watchOptions);
watcher.on('event', event => {
switch(event.code) {
case 'START': {
log(chalk.yellow(`\nWatching...`));
break;
}
case 'BUNDLE_START': {
const output = event.output[0];
if (output.endsWith('.js')) {
log('Rebuilding', path.basename(event.output[0]));
}
break;
}
case 'ERROR': {
log_error(event.error);
break;
}
case 'FATAL': {
log_error(event.error);
break;
}
default: break;
}
});
}
function get_watch_options(app) {
const options = get_options_for(app);
return options.map(({ inputOptions, outputOptions, output_file}) => {
return Object.assign({}, inputOptions, {
output: outputOptions,
plugins: [log_css_change({output: output_file})].concat(inputOptions.plugins)
});
});
}
function log_css_change({output}) {
return {
name: 'log-css-change',
ongenerate() {
if (!output.endsWith('.css')) return null;
log('Rebuilding', path.basename(output));
return null;
}
};
}
function log_error(error) {
log(chalk.yellow('Error in: ' + error.id));
log(chalk.red(error.toString()));
if (error.frame) {
log(chalk.red(error.frame));
}
// notify redis which in turns tells socketio to publish this to browser
const payload = {
event: 'build_error',
message: `
Error in: ${error.id}
${error.toString()}
${error.frame ? error.frame : ''}
`
}
subscriber.publish('events', JSON.stringify(payload));
}