UNPKG

openlayers

Version:

Build tools and sources for developing OpenLayers based mapping applications

159 lines (147 loc) 4.63 kB
/** * This task starts a dev server that provides a script loader for OpenLayers * and Closure Library. In addition, a static server hosts all files in the * repository. */ var path = require('path'); var url = require('url'); var Gaze = require('gaze').Gaze; var closure = require('closure-util'); var debounce = require('debounce'); var fs = require('fs-extra'); var nomnom = require('nomnom'); var buildExamples = require('./build-examples'); var log = closure.log; /** * Create a debug server for ol and Closure Library sources. * @param {function(Error, closure.Server)} callback Callback. */ var createServer = exports.createServer = function(callback) { var server; var manager = new closure.Manager({ lib: [ 'src/**/*.js', 'build/ol.ext/*.js', 'test/spec/**/*.test.js', 'test_rendering/spec/**/*.test.js', 'build/test_requires.js', 'build/test_rendering_requires.js' ], main: 'build/examples/*.js' }); manager.on('error', function(err) { if (server) { log.error('serve', err.message); } else { callback(err); } }); manager.on('ready', function() { server = new closure.Server({ manager: manager, loader: /^\/(?:(?:build\/examples)|(?:test(?:_rendering)?))\/loader\.js/, getMain: function(req) { var main; var query = url.parse(req.url, true).query; var referer = req.headers.referer; var pathName = url.parse(referer).pathname; if (pathName.indexOf('/test/') === 0) { main = path.resolve( path.join(process.cwd(), 'build'), 'test_requires.js'); } else if (pathName.indexOf('/test_rendering/') === 0) { main = path.resolve( path.join(process.cwd(), 'build'), 'test_rendering_requires.js'); } else { if (query.id) { if (referer) { var from = path.join(process.cwd(), path.dirname(url.parse(referer).pathname)); main = path.resolve(from, query.id + '.js'); } } } return main; } }); callback(null, server); }); }; /** * Build the examples and exit on any error. * @param {Function=} opt_callback Called when done building examples. */ function buildExamplesOrFatal(opt_callback) { log.info('serve', 'Building examples.'); buildExamples(function(err) { if (err) { log.error('serve', 'Building examples failed.'); log.error('serve', err.message); log.error('serve', 'Use "verbose" logging to see the full stack trace.'); log.verbose('serve', err.stack); process.exit(1); } // This is awkward, but then so is CSS itself var src = path.join(__dirname, '..', 'css', 'ol.css'); var dest = path.join(__dirname, '..', 'build', 'css', 'ol.css'); fs.copy(src, dest, function(err2) { if (err2) { log.error('serve', 'Failed to copy CSS.'); log.error('serve', err.message); log.error('serve', 'Use "verbose" logging to see the full stack trace.'); log.verbose('serve', err.stack); process.exit(1); } log.verbose('serve', 'Done building examples.'); if (opt_callback) { opt_callback(); } }); }); } /** * If running this module directly start the server. */ if (require.main === module) { var options = nomnom.options({ port: { abbr: 'p', default: 3000, help: 'Port for incoming connections', metavar: 'PORT' }, loglevel: { abbr: 'l', choices: ['silly', 'verbose', 'info', 'warn', 'error'], default: 'info', help: 'Log level', metavar: 'LEVEL' } }).parse(); /** @type {string} */ log.level = options.loglevel; buildExamplesOrFatal(function() { log.info('serve', 'Parsing dependencies.'); createServer(function(err, server) { if (err) { log.error('serve', 'Parsing failed'); log.error('serve', err.message); process.exit(1); } server.listen(options.port, function() { log.info('serve', 'Listening on http://localhost:' + options.port + '/ (Ctrl+C to stop)'); }); server.on('error', function(err) { log.error('serve', 'Server failed to start: ' + err.message); process.exit(1); }); }); var gaze = new Gaze('examples/**/*'); var debouncedBuild = debounce(buildExamplesOrFatal, 250); gaze.on('all', function(event, filepath) { log.verbose('serve', 'Watch event: ' + event + ' ' + filepath); debouncedBuild(); }); }); }