You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

133 lines
2.6 KiB

4 years ago
'use strict';
/*!
* concatenate dependencies
*/
var fs = require('fs')
, globs = require('globs');
/**
* Simple callback generator for `concatenate()`
*
* @api private
* @param {String} file
* @return {Function}
*/
function makeCb(file) {
return function (err, data) {
if (err) {
throw err;
}
fs.writeFileSync(file, data);
};
}
/**
* Concatenate files and such. Will maintain order of files.
*
* Examples:
*
* ```js
* // write all logs to `logs.txt`
* concatenate([ '*.txt', '*.log' ], 'logs.txt');
*
* // output the contents of all local javascript files
* concatenate('*.js', function (err, js) {
* if (err) throw err;
*
* console.log(js);
* });
* ```
*
* @api public
* @param {String|Array} patterns Files/wildcard patterns to concatenate
* @param {String|Function} cb File to write or callback
*/
var concatenate = module.exports = function (patterns, cb) {
// concatenate('*.txt', function () { ... })
if (!Array.isArray(patterns)) {
patterns = [ patterns ];
}
// concatenate([ '*.txt' ], 'all-text.js')
if (typeof cb === 'string') {
cb = makeCb(cb);
}
globs(patterns, function (err, files) {
if (err) {
return cb(err);
}
var done = false
, res = [];
/**
* Add the `file` at the `index` to the stack
*
* Will add the next `file` at `index++`, or fire
* `cb` if there is not another `file`.
*
* This is rather ugly, but maintains order
* of the provided files.
*
* @api private
* @param {Number} index
*/
function add(index) {
var file = files[index];
if (!file) {
done = true;
return cb(new Error('Invalid file "' + file + '"'));
}
fs.readFile(files[index], 'utf-8', function (err, data) {
if (done) { return; }
if (err) {
done = true;
return cb(err);
}
res.push(data);
index++;
if (!files[index]) {
done = true;
cb(null, res.join('\n'));
} else {
add(index);
}
});
}
// start the loop by adding the first file
add(0);
});
};
/**
* Synchronously concatenate files and such
*
* @api public
* @param {String|Array} patterns
* @param {String} [out] Output file
*/
concatenate.sync = function (patterns, out) {
var index
, files = globs.sync(patterns)
, length = files.length
, all = [];
for (index = 0; index < length; index++) {
all.push(fs.readFileSync(files[index], 'utf-8'));
}
all = all.join('\n');
if (out) {
// write file
fs.writeFileSync(out, all);
}
// return concatenated stuff
return all;
};