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