diff --git a/package.json b/package.json index 12d6b94db4..38fce1137e 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,6 @@ ], "dependencies": { "async": "2.4.0", - "browserify": "14.3.0", "closure-util": "1.19.0", "derequire": "2.0.6", "fs-extra": "3.0.0", @@ -46,6 +45,10 @@ "pbf": "3.0.5", "pixelworks": "1.1.0", "rbush": "2.0.1", + "rollup": "^0.41.6", + "rollup-plugin-cleanup": "^1.0.0", + "rollup-plugin-commonjs": "^8.0.2", + "rollup-plugin-node-resolve": "^3.0.0", "temp": "0.8.3", "@mapbox/vector-tile": "1.3.0", "walk": "2.3.9" @@ -102,24 +105,20 @@ }, "ext": [ { - "module": "rbush", - "browserify": true + "module": "rbush" }, { "module": "pbf", - "name": "PBF", - "browserify": true + "name": "PBF" }, { "module": "pixelworks", - "import": "Processor", - "browserify": true + "import": "Processor" }, { "module": "@mapbox/vector-tile", "name": "vectortile", - "import": "VectorTile", - "browserify": true + "import": "VectorTile" } ] } diff --git a/tasks/.eslintrc b/tasks/.eslintrc new file mode 100644 index 0000000000..13e216f583 --- /dev/null +++ b/tasks/.eslintrc @@ -0,0 +1,6 @@ +{ + "env": { + "node": true, + "es6": true + } +} diff --git a/tasks/build-ext.js b/tasks/build-ext.js index 907f2f354a..2357e431e8 100644 --- a/tasks/build-ext.js +++ b/tasks/build-ext.js @@ -1,129 +1,69 @@ -var fs = require('fs-extra'); -var path = require('path'); - -var async = require('async'); -var browserify = require('browserify'); -var derequire = require('derequire'); - -var pkg = require('../package.json'); - -var root = path.join(__dirname, '..'); -var buildDir = path.join(root, 'build', 'ol.ext'); - +const cleanup = require('rollup-plugin-cleanup'); +const common = require('rollup-plugin-commonjs'); +const node = require('rollup-plugin-node-resolve'); +const path = require('path'); +const pkg = require('../package.json'); +const rollup = require('rollup').rollup; /** - * Get external module metadata. - * @return {Array.} Array of objects representing external modules. + * Wrap a bundled dependency for consumption by the Compiler. + * @param {Object} ext Details from the `ext` object in package.json. + * @return {Object} A rollup plugin. */ -function getExternalModules() { - return pkg.ext.map(function(item) { - if (typeof item === 'string') { - return { - name: item, - module: item, - main: require.resolve(item), - browserify: false - }; - } else { - return { - module: item.module, - name: item.name !== undefined ? item.name : item.module, - main: require.resolve(item.module), - import: item.import, - browserify: item.browserify !== undefined ? item.browserify : false - }; +function wrap(ext) { + return { + name: 'googup', + transformBundle: function(source) { + let name = `ol.ext.${ext.name || ext.module}`; + let postamble = ''; + if (ext.import) { + name += '.' + ext.import; + } else { + postamble = `${name} = ${name}.default;\n`; + } + return ` +/** + * @fileoverview + * @suppress {accessControls, ambiguousFunctionDecl, checkDebuggerStatement, checkRegExp, checkTypes, checkVars, const, constantProperty, deprecated, duplicate, es5Strict, fileoverviewTags, missingProperties, nonStandardJsDocs, strictModuleDepCheck, suspiciousCode, undefinedNames, undefinedVars, unknownDefines, unusedLocalVariables, uselessCode, visibility} + */ +goog.provide('${name}'); + +/** @typedef {function(*)} */ +${name} = function() {}; + +(function() {${source}}).call(ol.ext); +${postamble}`; } - }); -} - - -/** - * 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) { - var name = 'ol.ext.' + mod.name; - var member = 'module.exports'; - if (mod.import) { - name += '.' + mod.import; - member += '.' + mod.import; - } - var wrap = function(code) { - return 'goog.provide(\'' + name + '\');\n' + - '/** @typedef {function(*)} */\n' + - name + ';\n' + - '(function() {\n' + - 'var exports = {};\n' + - 'var module = {exports: exports};\n' + - 'var define;\n' + - '/**\n' + - ' * @fileoverview\n' + - ' * @suppress {accessControls, ambiguousFunctionDecl, ' + - 'checkDebuggerStatement, checkRegExp, checkTypes, checkVars, const, ' + - 'constantProperty, deprecated, duplicate, es5Strict, ' + - 'fileoverviewTags, missingProperties, nonStandardJsDocs, ' + - 'strictModuleDepCheck, suspiciousCode, undefinedNames, ' + - 'undefinedVars, unknownDefines, unusedLocalVariables, uselessCode, visibility}\n' + - ' */\n' + code + '\n' + - name + ' = ' + member + ';\n' + - '})();\n'; }; - - if (mod.browserify) { - browserify(mod.main, {standalone: mod.name}).bundle(function(err, buf) { - if (err) { - callback(err); - return; - } - callback(null, wrap(derequire(buf.toString()))); - }); - } else { - fs.readFile(mod.main, function(err, data) { - if (err) { - callback(err); - return; - } - callback(null, wrap(data.toString())); - }); - } } - -/** - * 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), - fs.outputFile.bind(fs, output) - ], done); - }, callback); -} - - /** * Build all external modules. - * @param {function(Error)} callback Called with any error. + * @return {Promise} Resolves on successful completion. */ -function main(callback) { - var modules = getExternalModules(); - buildModules(modules, callback); +function main() { + return Promise.all(pkg.ext.map(ext => { + const moduleName = ext.name || ext.module; + const options = { + entry: require.resolve(ext.module), + dest: `${path.join(__dirname, '..', 'build', 'ol.ext', moduleName.toLowerCase())}.js`, + format: 'iife', + moduleName: moduleName, + exports: 'named', + plugins: [ + node(), + common(), + cleanup(), + wrap(ext) + ] + }; + return rollup(options).then(bundle => bundle.write(options)); + })); } if (require.main === module) { - main(function(err) { - if (err) { - process.stderr.write(err.message + '\n'); - process.exit(1); - } else { - process.exit(0); - } + main().catch(err => { + process.stderr.write(`${err.message}\n`, () => process.exit(1)); }); }