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
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;
|
||
|
};
|