From b6277e0a011af0692ef7bdff09bf299a281b5d71 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Fri, 11 Apr 2014 12:13:25 -0600 Subject: [PATCH] Build task for driving the compiler --- package.json | 2 +- tasks/build.js | 137 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 tasks/build.js diff --git a/package.json b/package.json index 540da3f5ed..72da183f6c 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "url": "https://github.com/openlayers/ol3/issues" }, "devDependencies": { - "closure-util": "~0.9.0", + "closure-util": "~0.10.0", "async": "~0.2.10", "htmlparser2": "~3.7.1", "jshint": "~2.4.4", diff --git a/tasks/build.js b/tasks/build.js new file mode 100644 index 0000000000..241904a207 --- /dev/null +++ b/tasks/build.js @@ -0,0 +1,137 @@ +/** + * This task builds OpenLayers with the Closure Compiler. + */ +var fs = require('fs'); +var path = require('path'); + +var async = require('async'); +var closure = require('closure-util'); +var fse = require('fs-extra'); + +var generateExports = require('./generate-exports'); + +var log = closure.log; +var root = path.join(__dirname, '..'); + + +/** + * Assert that a provided config object is valid. + * @param {Object} config Build configuration object. + * @param {function(Error)} callback Called with an error if config is invalid. + */ +function assertValidConfig(config, callback) { + process.nextTick(function() { + if (!Array.isArray(config.exports)) { + callback(new Error('Config missing "exports" array')); + return; + } + if (typeof config.compile !== 'object') { + callback(new Error('Config missing "compile" object')); + return; + } + callback(null); + }); +} + + +/** + * Read the build configuration file. + * @param {string} configPath Path to config file. + * @param {function(Error, Object)} callback Callback. + */ +function readConfig(configPath, callback) { + fs.readFile(configPath, function(err, data) { + if (err) { + if (err.code === 'ENOENT') { + err = new Error('Unable to find config file: ' + configPath); + } + callback(err); + return; + } + var config; + try { + config = JSON.parse(String(data)); + } catch (err2) { + callback(new Error('Trouble parsing config as JSON: ' + err2.message)); + return; + } + callback(null, config); + }); +} + + +/** + * Get the list of sources sorted in dependency order. + * @param {function(Error, Array.)} callback Called with a list of paths + * or any error. + */ +function getDependencies(callback) { + log.info('ol', 'Parsing dependencies ...'); + closure.getDependencies({lib: ['src/**/*.js']}, function(err, paths) { + if (err) { + callback(err); + return; + } + paths.push(path.join(root, 'build', 'exports.js')); + callback(null, paths); + }); +} + + +/** + * Run the compiler. + * @param {Object} options Options for Closure Compiler. + * @param {Array.} paths List of paths to source files. + * @param {function(Error, string)} callback Called with the compiled output or + * any error. + */ +function build(options, paths, callback) { + log.info('ol', 'Compiling ...'); + options.js = paths; + closure.compile(options, callback); +} + + +/** + * Generate a build of the library. + * @param {Object} config Build configuration object. Must have an "exports" + * array and a "compile" object with options for the compiler. + * @param {function(Error, string)} callback Called with the compiled source + * or any error. + */ +function main(config, callback) { + async.waterfall([ + assertValidConfig.bind(null, config), + generateExports.bind(null, config.exports), + getDependencies, + build.bind(null, config.compile) + ], callback); +} + + +/** + * If running this module directly, read the config file and call the main + * function. + */ +if (require.main === module) { + var configPath = process.argv[2]; + var outputPath = process.argv[3]; + async.waterfall([ + readConfig.bind(null, configPath), + main, + fse.outputFile.bind(fse, outputPath) + ], function(err) { + if (err) { + log.error(err.message); + process.exit(1); + } else { + process.exit(0); + } + }); +} + + +/** + * Export main function. + */ +module.exports = main;