97 lines
2.3 KiB
JavaScript
97 lines
2.3 KiB
JavaScript
/**
|
|
* Module dependencies.
|
|
*/
|
|
|
|
const Concat = require('concat-with-sourcemaps');
|
|
const through = require('through2');
|
|
const lodashTemplate = require('lodash.template');
|
|
const stream = require('stream');
|
|
const path = require('path');
|
|
|
|
/**
|
|
* gulp-header plugin
|
|
*/
|
|
|
|
module.exports = (headerText, data) => {
|
|
headerText = headerText || '';
|
|
|
|
function TransformStream(file, enc, cb) {
|
|
// format template
|
|
const filename = path.basename(file.path);
|
|
const template =
|
|
data === false ?
|
|
headerText
|
|
: lodashTemplate(headerText)(
|
|
Object.assign({}, file.data || {}, { file: file, filename: filename }, data)
|
|
);
|
|
|
|
if (file && typeof file === 'string') {
|
|
this.push(template + file);
|
|
return cb();
|
|
}
|
|
|
|
// if not an existing file, passthrough
|
|
if (!isExistingFile(file)) {
|
|
this.push(file);
|
|
return cb();
|
|
}
|
|
|
|
// handle file stream;
|
|
if (file.isStream()) {
|
|
const stream = through();
|
|
stream.write(Buffer.from(template));
|
|
stream.on('error', this.emit.bind(this, 'error'));
|
|
file.contents = file.contents.pipe(stream);
|
|
this.push(file);
|
|
return cb();
|
|
}
|
|
|
|
// variables to handle direct file content manipulation
|
|
const concat = new Concat(true, filename);
|
|
|
|
// add template
|
|
concat.add(null, Buffer.from(template));
|
|
|
|
// add sourcemap
|
|
concat.add(file.relative, file.contents, file.sourceMap);
|
|
|
|
// make sure streaming content is preserved
|
|
if (file.contents && !isStream(file.contents)) {
|
|
file.contents = concat.content;
|
|
}
|
|
|
|
// apply source map
|
|
if (concat.sourceMapping) {
|
|
file.sourceMap = JSON.parse(concat.sourceMap);
|
|
}
|
|
|
|
// make sure the file goes through the next gulp plugin
|
|
this.push(file);
|
|
|
|
// tell the stream engine that we are done with this file
|
|
cb();
|
|
}
|
|
|
|
return through.obj(TransformStream);
|
|
};
|
|
|
|
/**
|
|
* is stream?
|
|
*/
|
|
const isStream = (obj) => {
|
|
return obj instanceof stream.Stream;
|
|
};
|
|
|
|
/**
|
|
* Is File, and Exists
|
|
*/
|
|
const isExistingFile = (file) => {
|
|
try {
|
|
if (!(file && typeof file === 'object')) return false;
|
|
if (file.isDirectory()) return false;
|
|
if (file.isStream()) return true;
|
|
if (file.isBuffer()) return true;
|
|
if (typeof file.contents === 'string') return true;
|
|
} catch (err) {}
|
|
return false;
|
|
};
|