#!/usr/bin/env node /*jshint latedef:nofunc, node:true*/ // Modules var fs = require('fs'); var path = require('path'); var UglifyJS = require('uglify-js'); var CleanCSS = require('clean-css'); var ngAnnotate = require('ng-annotate'); // Process var rootDir = process.argv[2]; var platformPath = path.join(rootDir, 'platforms'); var platforms = process.env.CORDOVA_PLATFORMS.split(','); var cliCommand = process.env.CORDOVA_CMDLINE; // Hook configuration var configFilePath = path.join(rootDir, 'hooks/uglify-config.json'); var hookConfig = JSON.parse(fs.readFileSync(configFilePath)); var isRelease = hookConfig.alwaysRun || (cliCommand.indexOf('--release') > -1); var recursiveFolderSearch = hookConfig.recursiveFolderSearch; // set this to false to manually indicate the folders to process var foldersToProcess = hookConfig.foldersToProcess; // add other www folders in here if needed (ex. js/controllers) var cssMinifier = new CleanCSS(hookConfig.cleanCssOptions); // Exit if (!isRelease) { return; } // Run uglifier // PP disabled on Jul 10 2016 - something is going wrong //run(); /** * Run compression for all specified platforms. * @return {undefined} */ function run() { platforms.forEach(function(platform) { var wwwPath; switch (platform) { case 'android': wwwPath = path.join(platformPath, platform, 'assets', 'www'); break; case 'ios': case 'browser': wwwPath = path.join(platformPath, platform, 'www'); break; default: console.log('this hook only supports android, ios, and browser currently'); return; } processFolders(wwwPath); }); } /** * Processes defined folders. * @param {string} wwwPath - Path to www directory * @return {undefined} */ function processFolders(wwwPath) { foldersToProcess.forEach(function(folder) { processFiles(path.join(wwwPath, folder)); }); } /** * Processes files in directories. * @param {string} dir - Directory path * @return {undefined} */ function processFiles(dir) { fs.readdir(dir, function (err, list) { if (err) { console.log('processFiles err: ' + err); return; } list.forEach(function(file) { file = path.join(dir, file); fs.stat(file, function(err, stat) { if (stat.isFile()) { compress(file); return; } if (recursiveFolderSearch && stat.isDirectory()) { processFiles(file); return; } }); }); }); } /** * Compresses file. * @param {string} file - File path * @return {undefined} */ function compress(file) { var ext = path.extname(file), res, source, result; switch (ext) { case '.js': console.log('uglifying js file ' + file); res = ngAnnotate(String(fs.readFileSync(file)), { add: true }); result = UglifyJS.minify(res.src, hookConfig.uglifyJsOptions); fs.writeFileSync(file, result.code, 'utf8'); // overwrite the original unminified file break; case '.css': console.log('minifying css file ' + file); source = fs.readFileSync(file, 'utf8'); result = cssMinifier.minify(source); fs.writeFileSync(file, result, 'utf8'); // overwrite the original unminified file break; default: console.log('encountered a ' + ext + ' file, not compressing it'); break; } }