libreoffice-online/loleaflet/build/build.js
Pranav Kant e86e7a73f8 loleaflet: performance improvements in build process
Minifiying the js code was taking too much time. Minifying is not
really needed on developer's machine, so lets disable it by
default, otherwise it gets annoying during development having to
wait for so many seconds for it to build.

A simple 'make' now means no debug-info and non-minified
bundle.js. To add debug-info(source-maps), do 'make DEBUG=true'.
And to minify, similarly use the MINIFY=true variable with make.

'make dist' forcefully minifies the js code.
2016-08-16 11:11:16 +05:30

245 lines
5.7 KiB
JavaScript

var fs = require('fs'),
UglifyJS = require('uglify-js'),
zlib = require('zlib'),
browserify = require('browserify'),
browserifyCss = require('browserify-css'),
exorcist = require('exorcist'),
deps = require('./deps.js').deps,
adminDeps = require('./adminDeps.js').adminDeps;
function getFiles(compsBase32) {
var memo = {},
comps;
if (compsBase32) {
comps = parseInt(compsBase32, 32).toString(2).split('');
console.log('Managing dependencies...');
}
function addFiles(srcs) {
for (var j = 0, len = srcs.length; j < len; j++) {
memo[srcs[j]] = true;
}
}
for (var i in deps) {
if (comps) {
if (parseInt(comps.pop(), 2) === 1) {
console.log(' * ' + i);
addFiles(deps[i].src);
} else {
console.log(' ' + i);
}
} else {
addFiles(deps[i].src);
}
}
console.log('');
var files = [];
for (var src in memo) {
files.push('src/' + src);
}
return files;
}
function getAdminFiles() {
var files = [];
for (var i in adminDeps) {
for (var j = 0, len = adminDeps[i].src.length; j < len; j++) {
files.push('src/' + adminDeps[i].src[j]);
}
}
return files;
}
exports.getFiles = getFiles;
function getSizeDelta(newContent, oldContent, fixCRLF) {
if (!oldContent) {
return ' (new)';
}
if (newContent === oldContent) {
return ' (unchanged)';
}
if (fixCRLF) {
newContent = newContent.replace(/\r\n?/g, '\n');
oldContent = oldContent.replace(/\r\n?/g, '\n');
}
var delta = newContent.length - oldContent.length;
return delta === 0 ? '' : ' (' + (delta > 0 ? '+' : '') + delta + ' bytes)';
}
function loadSilently(path) {
try {
return fs.readFileSync(path, 'utf8');
} catch (e) {
return null;
}
}
function combineFiles(files) {
var content = '';
for (var i = 0, len = files.length; i < len; i++) {
content += fs.readFileSync(files[i], 'utf8') + '\n\n';
}
return content;
}
function bytesToKB(bytes) {
return (bytes / 1024).toFixed(2) + ' KB';
}
function bundle(files, destFilename, debug, minify) {
var bundler = browserify(files, {debug: debug});
bundler = bundler.transform(browserifyCss);
if (minify) {
console.log('uglifying');
bundler.transform({
global: true
}, 'uglifyify');
}
var bundleFs = fs.createWriteStream('dist/' + destFilename);
var res = bundler.bundle();
if (debug) {
res = res.pipe(exorcist('dist/' + destFilename + '.map'));
}
res.pipe(bundleFs);
bundleFs.on('finish', function() {
console.log('Finish writing to dist/' + destFilename);
});
};
exports.bundle = function(debug, minify) {
bundle(['main.js'], 'bundle.js', debug, minify);
};
exports.bundleAdmin = function(debug, minify) {
bundle(['main-admin.js'], 'admin-bundle.js', debug, minify);
};
exports.build = function (callback, version, compsBase32, buildName) {
var files = getFiles(compsBase32);
console.log('Concatenating and compressing ' + files.length + ' files...');
var copy = fs.readFileSync('src/copyright.js', 'utf8').replace('{VERSION}', version),
intro = '(function (window, document, undefined) {',
outro = '}(window, document));',
newSrc = copy + intro + combineFiles(files) + outro,
pathPart = 'dist/leaflet' + (buildName ? '-' + buildName : ''),
srcPath = pathPart + '-src.js',
oldSrc = loadSilently(srcPath),
srcDelta = getSizeDelta(newSrc, oldSrc, true);
console.log('\tUncompressed: ' + bytesToKB(newSrc.length) + srcDelta);
if (newSrc !== oldSrc) {
fs.writeFileSync(srcPath, newSrc);
console.log('\tSaved to ' + srcPath);
}
// Also combine and copy the admin JS files
// TODO: Also minify if admin complexity increases in future
var adminNewSrc = combineFiles(getAdminFiles()),
adminPath = 'dist/admin/admin-src.js',
adminOldSrc = loadSilently(adminPath);
if (adminNewSrc != adminOldSrc) {
fs.writeFileSync(adminPath, adminNewSrc);
console.log('\tAdmin files saved to ' + adminPath);
}
var path = pathPart + '.js',
oldCompressed = loadSilently(path),
newCompressed = copy + UglifyJS.minify(newSrc, {
warnings: true,
fromString: true
}).code,
delta = getSizeDelta(newCompressed, oldCompressed);
console.log('\tCompressed: ' + bytesToKB(newCompressed.length) + delta);
var newGzipped,
gzippedDelta = '';
function done() {
if (newCompressed !== oldCompressed) {
fs.writeFileSync(path, newCompressed);
console.log('\tSaved to ' + path);
}
console.log('\tGzipped: ' + bytesToKB(newGzipped.length) + gzippedDelta);
callback();
}
zlib.gzip(newCompressed, function (err, gzipped) {
if (err) { return; }
newGzipped = gzipped;
if (oldCompressed && (oldCompressed !== newCompressed)) {
zlib.gzip(oldCompressed, function (err, oldGzipped) {
if (err) { return; }
gzippedDelta = getSizeDelta(gzipped, oldGzipped);
done();
});
} else {
done();
}
});
};
exports.test = function(complete, fail) {
var karma = require('karma'),
testConfig = {configFile : __dirname + '/../spec/karma.conf.js'};
testConfig.browsers = ['PhantomJS'];
function isArgv(optName) {
return process.argv.indexOf(optName) !== -1;
}
if (isArgv('--chrome')) {
testConfig.browsers.push('Chrome');
}
if (isArgv('--safari')) {
testConfig.browsers.push('Safari');
}
if (isArgv('--ff')) {
testConfig.browsers.push('Firefox');
}
if (isArgv('--ie')) {
testConfig.browsers.push('IE');
}
if (isArgv('--cov')) {
testConfig.preprocessors = {
'src/**/*.js': 'coverage'
};
testConfig.coverageReporter = {
type : 'html',
dir : 'coverage/'
};
testConfig.reporters = ['coverage'];
}
console.log('Running tests...');
karma.server.start(testConfig, function(exitCode) {
if (!exitCode) {
console.log('\tTests ran successfully.\n');
complete();
} else {
process.exit(exitCode);
}
});
};