#!/usr/bin/env node 'use strict'; var argv = require('minimist')(process.argv.slice(2), { alias: { output: ['o', 'out'], pretty: 'p', watch: 'w' } }); var fs = require('fs'); var path = require('path'); var glob = require('glob'); var contra = require('contra'); var mkdirp = require('mkdirp'); var monocle = require('monocle')(); var jade = require('..'); var files = argv._; var extname = '.js'; var re = /\.jade$/; var options = {}; // worth a shot, tell jade it can use ultramarked for this thing try { var transformers = require('jade/node_modules/transformers'); transformers.markdown.engines.push('ultramarked'); } catch (e) { } if (argv.obj) { options = JSON.parse(argv.obj); } options.compileDebug = argv.debug !== false; options.out = argv.out || argv.o; options.pretty = argv.pretty || argv.p; if (files.length === 1 && files[0].indexOf('*') !== -1) { files = glob.sync(files[0]); // `npm run` doesn't expand the pattern :( } contra.each(files, renderFile); if (argv.watch) { monocle.watchFiles({ files: files, listener: listener }); } function renderFile (file, done) { contra.waterfall([ function (next) { fs.lstat(file, next); }, function (stat, next) { if ((stat.isFile() || stat.isSymbolicLink()) && re.test(file)) { render(next); } else if (stat.isDirectory()) { dir(next); } else { next(); } } ], done); function render (done) { var prefix = 'var jade = require("jadum/runtime");\nmodule.exports = '; var fn; contra.waterfall([ function (next) { fs.readFile(file, 'utf8', next); }, function (data, next) { options.filename = file; fn = jade.compileClient(data, options); file = file.replace(re, extname); if (options.out) { file = path.join(options.out, file); } var dir = path.resolve(path.dirname(file)); mkdirp(dir, next); }, function (next) { fs.writeFile(file, prefix + fn, 'utf8', next); } ], done); } function dir (done) { contra.waterfall([ function (next) { fs.readdir(file, next); }, function (files, next) { contra.each(files.map(expand), renderFile, next); } ], done); } function expand (filename) { return file + '/' + filename; } } function listener (file) { var relative = path.relative(process.cwd(), file.absolutePath); console.log('jadum: Changes detected in %s, recompiling.', relative); renderFile(relative); }