var fs = require('fs');
var path = require('path');
var mkpath = require('mkpath');
var coffee;
try {
coffee = require('coffee-script');
if (typeof coffee.register === 'function') {
coffee.register();
}
} catch (e) {
process.stderr.write("coffee-cache: No coffee-script package found.\n");
return;
}
var cacheDir = process.env['COFFEE_CACHE_DIR'] || '.coffee';
var rootDir = process.env['COFFEE_ROOT_DIR'] || '.';
var coffeeExtension = require.extensions['.coffee'];
var logCouldNotWriteCache = function() {
process.stderr.write(
"coffee-cache: Could not write cache at " + cacheDir + ".\n"
);
logCouldNotWriteCache = function(){};
}
function cacheFile(filename) {
var cachePath = path.join(cacheDir, path.relative(rootDir, filename)).replace(/\.coffee$/, '.js');
var content;
try {
var cacheTime = fs.statSync(cachePath).mtime;
var sourceTime = fs.statSync(filename).mtime;
if (cacheTime > sourceTime) {
content = fs.readFileSync(cachePath, 'utf8');
}
} catch (err) {
}
if (!content) {
var mapPath = path.resolve(cachePath.replace(/\.js$/, '.map'));
var compiled = coffee.compile(fs.readFileSync(filename, 'utf8'), {
filename: filename,
sourceMap: true
});
content = compiled.js;
if (content == null)
content = compiled;
try {
mkpath.sync(path.dirname(cachePath));
fs.writeFileSync(cachePath, content, 'utf8');
if (mapPath)
fs.writeFileSync(mapPath, compiled.v3SourceMap, 'utf8');
} catch (err) {
logCouldNotWriteCache()
}
}
return content;
}
require.extensions['.coffee'] = function(module, filename) {
var content = cacheFile(filename);
if (content)
return module._compile(content, filename);
else
return coffeeExtension.apply(this, arguments);
};
module.exports = {
setCacheDir: function(dir, root){
if(root) {
rootDir = root;
}
cacheDir = dir;
return this;
},
cacheFile: cacheFile,
};