jamiebarrow
jamiebarrow

Reputation: 2517

convert gulp.src stream to array?

Is it possible to get the list of files coming from a gulp.src stream as an array, e.g.:

var files = convertToArray(gulp.src('**/*.js'));

Update:

I was trying to move away from the gulp-karma plugin:

gulp.task('test', function () {
    return gulp.src(files)
        .pipe($.order(ordering))
        .pipe($.karma({
            karma.conf.js'
         });
});

So my idea was:

gulp.task('test', function (done) {
    var karmaFiles = convertToArray(gulp.src(files)
        .pipe($.order(ordering)));

    new Server({
        configFile: karma.conf.js',
        files: karmaFiles
    }, done).start();
});

But as pointed out, this won't work because of it being async. Here's my solution:

gulp.task('test', function (done) {
    gulp.src(files)
        .pipe($.order(ordering)))
        .pipe(gutil.buffer())
        .on('data', function(data) {
            var karmaFiles = data.map(function(f) { return f.path; });
            new Server({
                configFile: __dirname + '/karma.conf.js',
                files: karmaFiles
            }, done).start();
        });

});

Upvotes: 1

Views: 1447

Answers (1)

Sven Schoenung
Sven Schoenung

Reputation: 30574

Gulp streams are always asynchronous so your hypothetical convertToArray function (which takes a stream and returns an array) is impossible.

The only way to get all the files in a stream is through some kind of callback function. The gulp-util package, which bundles various helper functions, provides the nice gutil.buffer() :

var gutil = require('gulp-util');

gulp.src('**/*.js').pipe(gutil.buffer(function(err, files) {
  console.log('Path of first file:');
  console.log(files[0].path);
  console.log('Contents of first file:');
  console.log(files[0].contents.toString());
}));

In the above files will be an array of vinyl files. That means for each file you have access to both the contents and the path of the file.

If you don't care about the file contents and only want the path of each file you shouldn't be using gulp.src() at all. You should be using glob instead (which is what gulp is using internally). It gives you a synchronous method that returns an array of matching file paths:

var glob = require('glob');

var files = glob.sync('**/*.js');
console.log(files);

Upvotes: 4

Related Questions