blob: 42b7d51235a20a802b2e1ed2d69fe0f6ed507287 [file] [log] [blame]
"use strict";
module.exports = bundle;
var fs = require("fs"),
path = require("path");
var browserify = require("browserify");
var header = require("gulp-header");
var gulpif = require("gulp-if");
var sourcemaps = require("gulp-sourcemaps");
var uglify = require("gulp-uglify");
var buffer = require("vinyl-buffer");
var vinylfs = require("vinyl-fs");
var source = require("vinyl-source-stream");
var pkg = require(path.join(__dirname, "..", "package.json"));
/*eslint-disable no-template-curly-in-string*/
var license = [
"/*!",
" * protobuf.js v${version} (c) 2016, daniel wirtz",
" * compiled ${date}",
" * licensed under the bsd-3-clause license",
" * see: https://github.com/dcodeio/protobuf.js for details",
" */"
].join("\n") + "\n";
/*eslint-enable no-template-curly-in-string*/
var prelude = fs.readFileSync(require.resolve("../lib/prelude.js")).toString("utf8");
/**
* Bundles the library.
* @param {Object} options Bundler options
* @param {string} options.entry Entry file
* @param {string} options.target Target directory
* @param {boolean} [options.compress=false] Whether to minify or not
* @param {string[]} [options.exclude] Excluded source files
* @returns {undefined}
*/
function bundle(options) {
if (!options || !options.entry || !options.target)
throw TypeError("missing options");
var bundler = browserify({
entries: options.entry,
insertGlobalVars: false,
detectGlobals: false,
debug: true,
prelude: prelude,
preludePath: "./lib/prelude.js"
})
.external("long");
if (options.exclude)
options.exclude.forEach(bundler.exclude, bundler);
return bundler
.plugin(require("browserify-wrap"), {
// undefined var and global strict-mode for uglify
prefix: "(function(undefined){\"use strict\";",
suffix: "})();"
})
.plugin(require("bundle-collapser/plugin"))
.bundle()
.pipe(source(options.compress ? "protobuf.min.js" : "protobuf.js"))
.pipe(buffer())
.pipe(sourcemaps.init({ loadMaps: true }))
.pipe(
gulpif(options.compress, uglify({
mangle: {
eval: true,
properties: {
regex: /^_/
}
},
compress: {
keep_fargs: false,
unsafe: true
},
output: {
max_line_len: 0x7fffffff
}
}))
)
.pipe(header(license, {
date: (new Date()).toUTCString().replace("GMT", "UTC").toLowerCase(),
version: pkg.version
}))
.pipe(sourcemaps.write(".", { sourceRoot: "" }))
.pipe(vinylfs.dest(options.target))
.on("log", console.log)
.on("error", console.error);
}