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.
101 lines
2.5 KiB
101 lines
2.5 KiB
'use strict'; |
|
|
|
var through = require('through2'); |
|
var path = require('path'); |
|
var File = require('vinyl'); |
|
var Concat = require('concat-with-sourcemaps'); |
|
|
|
// file can be a vinyl file object or a string |
|
// when a string it will construct a new one |
|
module.exports = function(file, opt) { |
|
if (!file) { |
|
throw new Error('gulp-concat: Missing file option'); |
|
} |
|
opt = opt || {}; |
|
|
|
// to preserve existing |undefined| behaviour and to introduce |newLine: ""| for binaries |
|
if (typeof opt.newLine !== 'string') { |
|
opt.newLine = '\n'; |
|
} |
|
|
|
var isUsingSourceMaps = false; |
|
var latestFile; |
|
var latestMod; |
|
var fileName; |
|
var concat; |
|
|
|
if (typeof file === 'string') { |
|
fileName = file; |
|
} else if (typeof file.path === 'string') { |
|
fileName = path.basename(file.path); |
|
} else { |
|
throw new Error('gulp-concat: Missing path in file options'); |
|
} |
|
|
|
function bufferContents(file, enc, cb) { |
|
// ignore empty files |
|
if (file.isNull()) { |
|
cb(); |
|
return; |
|
} |
|
|
|
// we don't do streams (yet) |
|
if (file.isStream()) { |
|
this.emit('error', new Error('gulp-concat: Streaming not supported')); |
|
cb(); |
|
return; |
|
} |
|
|
|
// enable sourcemap support for concat |
|
// if a sourcemap initialized file comes in |
|
if (file.sourceMap && isUsingSourceMaps === false) { |
|
isUsingSourceMaps = true; |
|
} |
|
|
|
// set latest file if not already set, |
|
// or if the current file was modified more recently. |
|
if (!latestMod || file.stat && file.stat.mtime > latestMod) { |
|
latestFile = file; |
|
latestMod = file.stat && file.stat.mtime; |
|
} |
|
|
|
// construct concat instance |
|
if (!concat) { |
|
concat = new Concat(isUsingSourceMaps, fileName, opt.newLine); |
|
} |
|
|
|
// add file to concat instance |
|
concat.add(file.relative, file.contents, file.sourceMap); |
|
cb(); |
|
} |
|
|
|
function endStream(cb) { |
|
// no files passed in, no file goes out |
|
if (!latestFile || !concat) { |
|
cb(); |
|
return; |
|
} |
|
|
|
var joinedFile; |
|
|
|
// if file opt was a file path |
|
// clone everything from the latest file |
|
if (typeof file === 'string') { |
|
joinedFile = latestFile.clone({contents: false}); |
|
joinedFile.path = path.join(latestFile.base, file); |
|
} else { |
|
joinedFile = new File(file); |
|
} |
|
|
|
joinedFile.contents = concat.content; |
|
|
|
if (concat.sourceMapping) { |
|
joinedFile.sourceMap = JSON.parse(concat.sourceMap); |
|
} |
|
|
|
this.push(joinedFile); |
|
cb(); |
|
} |
|
|
|
return through.obj(bufferContents, endStream); |
|
};
|
|
|