fileify-lm
Version:
Larry Maccherone's fork of James Halliday fileify browserify middleware
128 lines (112 loc) • 4.35 kB
JavaScript
var fs = require('fs');
var path = require('path');
var findit = require('findit');
var Seq = require('seq');
module.exports = function (target, dir, optsOrEx) {
if (!target) throw new Error('Target name required');
if (!dir) throw new Error('Directory or files required');
var opts = typeof optsOrEx === 'object' && !Array.isArray(optsOrEx)
? optsOrEx
: { extension : optsOrEx }
;
var filter = function (file) {
var ext = path.extname(file);
if (!opts.extension) {
return true;
}
else if (typeof opts.extension === 'function') {
return opts.extension(file);
}
else if (typeof opts.extension === 'string') {
return opts.extension === ext;
}
else if (Array.isArray(opts.extension)) {
return opts.extension.some(function (e) { return e === ext });
}
else {
return true;
}
};
var watches = {};
var self = function (bundle) {
var files = [];
function finder (file, stat) {
if (stat.isDirectory()) {
if (opts.watch) {
watches[file] = true;
fs.watchFile(file, function (curr, prev) {
if (curr.nlink === 0) {
// deleted
}
else {
// modified
fs.readdir(file, function (err, xs) {
var rescan = false;
xs.forEach(function (x) {
var f = path.resolve(file, x);
if (fs.statSync(f).isDirectory()) {
findit.sync(f, finder);
}
else if (files.indexOf(f) < 0) {
files.push(f);
include(files);
}
});
});
}
});
}
}
else if (filter(file)) {
var i = files.length;
files.push(file);
if (opts.watch) {
watches[file] = true;
fs.watchFile(file, function (curr, prev) {
if (curr.nlink === 0) {
// deleted
var i = files.indexOf(file);
if (i >= 0) files.splice(i, 1);
include(files);
}
else {
include(files);
}
});
}
}
}
finder(dir, { isDirectory : function () { return true }});
findit.sync(dir, finder);
var include = function (files) {
var dst = path.normalize('/node_modules/' + target);
Object.keys(bundle.files).forEach(function (key) {
if (bundle.files[key].target === dst) {
delete bundle.files[key];
}
});
var bodies = files.reduce(function (acc, file) {
var rel = file.slice(dir.length + 1);
tempFile = fs.readFileSync(file, 'utf8');
acc[rel] = tempFile;
return acc;
}, {});
var file = __dirname + '/browser/files.js';
var body = fs.readFileSync(file, 'utf8')
.replace(/\$bodies/, function () {
tempString = JSON.stringify(bodies);
tempString = tempString.replace(/\\n/g, '\\n"+\n"'); // break the string on each line break
return tempString;
})
;
bundle.include(null, dst, body);
};
include(files);
};
self.end = function () {
Object.keys(watches).forEach(function (file) {
fs.unwatchFile(file);
});
};
return self;
};