From 01b64bc655859c4c9b9ca749dfb27670f04cd35c Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Thu, 23 Oct 2014 12:06:14 -0600 Subject: [PATCH] General purpose task for building external modules --- package.json | 6 +++- tasks/build-ext.js | 84 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 tasks/build-ext.js diff --git a/package.json b/package.json index 93174fe4c4..5190d9467c 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "htmlparser2": "3.7.3", "jsdoc": "3.3.0-alpha9", "nomnom": "1.8.0", + "rbush": "1.3.4", "temp": "0.8.1", "walk": "2.3.4" }, @@ -43,5 +44,8 @@ "phantomjs": "1.9.10", "proj4": "2.3.3", "sinon": "1.10.3" - } + }, + "ext": [ + "rbush" + ] } diff --git a/tasks/build-ext.js b/tasks/build-ext.js new file mode 100644 index 0000000000..70e4aaf2f7 --- /dev/null +++ b/tasks/build-ext.js @@ -0,0 +1,84 @@ +var fs = require('fs'); +var path = require('path'); + +var async = require('async'); +var fse = require('fs-extra'); + +var pkg = require('../package.json'); + +var root = path.join(__dirname, '..'); +var buildDir = path.join(root, 'build', 'ol.ext'); + + +/** + * Get external module metadata. + * @return {Array.} Array of objects representing external modules. + */ +function getExternalModules() { + return pkg.ext.map(function(name) { + return { + name: name, + main: require.resolve(name) + }; + }); +} + + +/** + * Wrap a CommonJS module in Closure Library accessible code. + * @param {Object} mod Module metadata. + * @param {function(Error, string)} callback Called with any error and the + * wrapped module. + */ +function wrapModule(mod, callback) { + fs.readFile(mod.main, function(err, data) { + if (err) { + callback(err); + return; + } + var wrapped = 'goog.provide(\'ol.ext.' + mod.name + '\');\n' + + '(function() {\n' + + 'var module = {};\n' + + '/**\n' + + ' * @fileoverview\n' + + ' * @suppress {accessControls, ambiguousFunctionDecl, ' + + 'checkDebuggerStatement, checkRegExp, checkTypes, checkVars, const, ' + + 'constantProperty, deprecated, duplicate, es5Strict, ' + + 'fileoverviewTags, missingProperties, nonStandardJsDocs, ' + + 'strictModuleDepCheck, suspiciousCode, undefinedNames, ' + + 'undefinedVars, unknownDefines, uselessCode, visibility}\n' + + ' */\n' + data.toString() + '\n' + + 'ol.ext.' + mod.name + ' = module.exports;\n' + + '})();\n'; + callback(null, wrapped); + }); +} + + +/** + * Build external modules. + * @param {Array.} modules External modules. + * @param {function(Error)} callback Called with any error. + */ +function buildModules(modules, callback) { + async.each(modules, function(mod, done) { + var output = path.join(buildDir, mod.name) + '.js'; + async.waterfall([ + wrapModule.bind(null, mod), + fse.outputFile.bind(fse, output) + ], done); + }, callback); +} + + +if (require.main === module) { + var modules = getExternalModules(); + buildModules(modules, function(err) { + if (err) { + process.stderr.write(err.message + '\n'); + process.exit(1); + } else { + process.exit(0); + } + }); +}