UNPKG

4.63 kBJavaScriptView Raw
1/**
2 * This task starts a dev server that provides a script loader for OpenLayers
3 * and Closure Library. In addition, a static server hosts all files in the
4 * repository.
5 */
6
7var path = require('path');
8var url = require('url');
9
10var Gaze = require('gaze').Gaze;
11var closure = require('closure-util');
12var debounce = require('debounce');
13var fs = require('fs-extra');
14var nomnom = require('nomnom');
15
16var buildExamples = require('./build-examples');
17var log = closure.log;
18
19
20/**
21 * Create a debug server for ol and Closure Library sources.
22 * @param {function(Error, closure.Server)} callback Callback.
23 */
24var createServer = exports.createServer = function(callback) {
25 var server;
26 var manager = new closure.Manager({
27 lib: [
28 'src/**/*.js',
29 'build/ol.ext/*.js',
30 'test/spec/**/*.test.js',
31 'test_rendering/spec/**/*.test.js',
32 'build/test_requires.js',
33 'build/test_rendering_requires.js'
34 ],
35 main: 'build/examples/*.js'
36 });
37 manager.on('error', function(err) {
38 if (server) {
39 log.error('serve', err.message);
40 } else {
41 callback(err);
42 }
43 });
44 manager.on('ready', function() {
45 server = new closure.Server({
46 manager: manager,
47 loader: /^\/(?:(?:build\/examples)|(?:test(?:_rendering)?))\/loader\.js/,
48 getMain: function(req) {
49 var main;
50 var query = url.parse(req.url, true).query;
51 var referer = req.headers.referer;
52 var pathName = url.parse(referer).pathname;
53 if (pathName.indexOf('/test/') === 0) {
54 main = path.resolve(
55 path.join(process.cwd(), 'build'), 'test_requires.js');
56 } else if (pathName.indexOf('/test_rendering/') === 0) {
57 main = path.resolve(
58 path.join(process.cwd(), 'build'), 'test_rendering_requires.js');
59 } else {
60 if (query.id) {
61 if (referer) {
62 var from = path.join(process.cwd(),
63 path.dirname(url.parse(referer).pathname));
64 main = path.resolve(from, query.id + '.js');
65 }
66 }
67 }
68 return main;
69 }
70 });
71 callback(null, server);
72 });
73};
74
75/**
76 * Build the examples and exit on any error.
77 * @param {Function=} opt_callback Called when done building examples.
78 */
79function buildExamplesOrFatal(opt_callback) {
80 log.info('serve', 'Building examples.');
81 buildExamples(function(err) {
82 if (err) {
83 log.error('serve', 'Building examples failed.');
84 log.error('serve', err.message);
85 log.error('serve', 'Use "verbose" logging to see the full stack trace.');
86 log.verbose('serve', err.stack);
87 process.exit(1);
88 }
89 // This is awkward, but then so is CSS itself
90 var src = path.join(__dirname, '..', 'css', 'ol.css');
91 var dest = path.join(__dirname, '..', 'build', 'css', 'ol.css');
92 fs.copy(src, dest, function(err2) {
93 if (err2) {
94 log.error('serve', 'Failed to copy CSS.');
95 log.error('serve', err.message);
96 log.error('serve',
97 'Use "verbose" logging to see the full stack trace.');
98 log.verbose('serve', err.stack);
99 process.exit(1);
100 }
101 log.verbose('serve', 'Done building examples.');
102 if (opt_callback) {
103 opt_callback();
104 }
105 });
106 });
107}
108
109/**
110 * If running this module directly start the server.
111 */
112if (require.main === module) {
113 var options = nomnom.options({
114 port: {
115 abbr: 'p',
116 default: 3000,
117 help: 'Port for incoming connections',
118 metavar: 'PORT'
119 },
120 loglevel: {
121 abbr: 'l',
122 choices: ['silly', 'verbose', 'info', 'warn', 'error'],
123 default: 'info',
124 help: 'Log level',
125 metavar: 'LEVEL'
126 }
127 }).parse();
128
129 /** @type {string} */
130 log.level = options.loglevel;
131
132 buildExamplesOrFatal(function() {
133 log.info('serve', 'Parsing dependencies.');
134 createServer(function(err, server) {
135 if (err) {
136 log.error('serve', 'Parsing failed');
137 log.error('serve', err.message);
138 process.exit(1);
139 }
140 server.listen(options.port, function() {
141 log.info('serve', 'Listening on http://localhost:' +
142 options.port + '/ (Ctrl+C to stop)');
143 });
144 server.on('error', function(err) {
145 log.error('serve', 'Server failed to start: ' + err.message);
146 process.exit(1);
147 });
148 });
149
150 var gaze = new Gaze('examples/**/*');
151 var debouncedBuild = debounce(buildExamplesOrFatal, 250);
152 gaze.on('all', function(event, filepath) {
153 log.verbose('serve', 'Watch event: ' + event + ' ' + filepath);
154 debouncedBuild();
155 });
156 });
157
158}