4 * Copyright(c) 2010 Sencha Inc.
5 * Copyright(c) 2011 TJ Holowaychuk
10 * Module dependencies.
13 var fs = require('fs')
14 , path = require('path')
15 , parse = require('url').parse;
28 * - `src` Source directory, defaults to **CWD**.
29 * - `dest` Destination directory, defaults `src`.
30 * - `enable` Array of enabled compilers.
34 * - `sass` Compiles cass to css
35 * - `less` Compiles less to css
36 * - `coffeescript` Compiles coffee to js
38 * @param {Object} options
42 exports = module.exports = function compiler(options){
43 options = options || {};
45 var srcDir = options.src || process.cwd()
46 , destDir = options.dest || srcDir
47 , enable = options.enable;
49 if (!enable || enable.length === 0) {
50 throw new Error('compiler\'s "enable" option is not set, nothing will be compiled.');
53 return function compiler(req, res, next){
54 if ('GET' != req.method) return next();
55 var pathname = parse(req.url).pathname;
56 for (var i = 0, len = enable.length; i < len; ++i) {
58 , compiler = compilers[name];
59 if (compiler.match.test(pathname)) {
60 var src = (srcDir + pathname).replace(compiler.match, compiler.ext)
61 , dest = destDir + pathname;
64 fs.stat(src, function(err, srcStats){
66 if ('ENOENT' == err.code) {
72 fs.stat(dest, function(err, destStats){
74 // Oh snap! it does not exist, compile it
75 if ('ENOENT' == err.code) {
81 // Source has changed, compile it
82 if (srcStats.mtime > destStats.mtime) {
93 // Compile to the destination
95 fs.readFile(src, 'utf8', function(err, str){
99 compiler.compile(str, function(err, str){
103 fs.writeFile(dest, str, 'utf8', function(err){
121 * - [sass](http://github.com/visionmedia/sass.js) to _css_
122 * - [less](http://github.com/cloudhead/less.js) to _css_
123 * - [coffee](http://github.com/jashkenas/coffee-script) to _js_
126 var compilers = exports.compilers = {
130 compile: function(str, fn){
131 var sass = cache.sass || (cache.sass = require('sass'));
133 fn(null, sass.render(str));
142 compile: function(str, fn){
143 var less = cache.less || (cache.less = require('less'));
145 less.render(str, fn);
154 compile: function(str, fn){
155 var coffee = cache.coffee || (cache.coffee = require('coffee-script'));
157 fn(null, coffee.compile(str));