documentation/bin/documentation.js
Tom MacWright 50aaf9d35b --watch and --serve flags
These new flags replace the functionality of
dev-documentation
2015-11-24 11:21:11 -05:00

85 lines
2.0 KiB
JavaScript
Executable File

#!/usr/bin/env node
/* eslint no-console: 0 */
'use strict';
var documentation = require('../'),
chokidar = require('chokidar'),
debounce = require('debounce'),
streamArray = require('stream-array'),
fs = require('fs'),
vfs = require('vinyl-fs'),
errorPage = require('../lib/error_page'),
Server = require('../lib/server'),
args = require('../lib/args');
var parsedArgs = args(process.argv.slice(2));
var generator = documentation.bind(null,
parsedArgs.inputs, parsedArgs.options, onDocumented.bind(null, parsedArgs));
var server = new Server();
server.on('listening', function () {
process.stdout.write('documentation.js serving on port 4001\n');
});
function onDocumented(parsedArgs, err, comments) {
if (err) {
if (parsedArgs.command === 'serve') {
return server.setFiles([errorPage(err)]).start();
}
throw err;
}
documentation.formats[parsedArgs.formatter](
comments, parsedArgs.formatterOptions,
onFormatted.bind(null, parsedArgs));
}
function onFormatted(parsedArgs, err, output) {
if (parsedArgs.watch) {
updateWatcher();
}
if (parsedArgs.command === 'serve') {
server.setFiles(output).start();
} else if (parsedArgs.output === 'stdout') {
process.stdout.write(output);
} else if (Array.isArray(output)) {
streamArray(output).pipe(vfs.dest(parsedArgs.output));
} else {
fs.writeFileSync(parsedArgs.output, output);
}
}
if (parsedArgs.command === 'lint') {
documentation.lint(parsedArgs.inputs, parsedArgs.options, function (err, lintOutput) {
if (err) {
throw err;
}
if (lintOutput) {
console.log(lintOutput);
process.exit(1);
} else {
process.exit(0);
}
});
} else {
generator();
if (parsedArgs.watch) {
var watcher = chokidar.watch(parsedArgs.inputs);
watcher.on('all', debounce(generator, 300));
}
}
function updateWatcher() {
documentation.expandInputs(parsedArgs.inputs, parsedArgs.options, addNewFiles);
}
function addNewFiles(err, files) {
watcher.add(files.map(function (data) {
return data.file;
}));
}