Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Newer
Older
100755 423 lines (366 sloc) 9.132 kB
3056369 @tj Started bin/express
tj authored
1 #!/usr/bin/env node
2
3 /**
4 * Module dependencies.
5 */
6
5a74d94 @tj require package.json for .version in express(1)
tj authored
7 var exec = require('child_process').exec
426ba62 @tj rewrote express(1) to use commander.js
tj authored
8 , program = require('commander')
fb031d1 @tj Added mkdirp to express(1). Closes #795
tj authored
9 , mkdirp = require('mkdirp')
5a74d94 @tj require package.json for .version in express(1)
tj authored
10 , pkg = require('../package.json')
c998b91 @tj refactoring
tj authored
11 , version = pkg.version
7c66db2 @ksato9700 Change the eol character based on platform type
ksato9700 authored
12 , os = require('os')
426ba62 @tj rewrote express(1) to use commander.js
tj authored
13 , fs = require('fs');
544d688 @tj Fixed express(1) support for < 0.3.x
tj authored
14
426ba62 @tj rewrote express(1) to use commander.js
tj authored
15 // CLI
3056369 @tj Started bin/express
tj authored
16
426ba62 @tj rewrote express(1) to use commander.js
tj authored
17 program
c998b91 @tj refactoring
tj authored
18 .version(version)
426ba62 @tj rewrote express(1) to use commander.js
tj authored
19 .option('-s, --sessions', 'add session support')
a751346 @tj port some express(1) stuff from 2.x
tj authored
20 .option('-e, --ejs', 'add ejs engine support (defaults to jade)')
21 .option('-J, --jshtml', 'add jshtml engine support (defaults to jade)')
d5e5647 @tj fix express(1) -h flag, use -H for hogan. Closes #1245
tj authored
22 .option('-H, --hogan', 'add hogan.js engine support')
db9b2bf @Zoramite Adding support back in for less CSS.
Zoramite authored
23 .option('-c, --css <engine>', 'add stylesheet <engine> support (less|stylus) (defaults to plain css)')
892b605 @tj shorten --force desc
tj authored
24 .option('-f, --force', 'force on non-empty directory')
426ba62 @tj rewrote express(1) to use commander.js
tj authored
25 .parse(process.argv);
3056369 @tj Started bin/express
tj authored
26
426ba62 @tj rewrote express(1) to use commander.js
tj authored
27 // Path
1a6d245 @tj Added -s, --session[s] support to express(1)
tj authored
28
426ba62 @tj rewrote express(1) to use commander.js
tj authored
29 var path = program.args.shift() || '.';
8338432 @tj Added app generation to bin/express
tj authored
30
7c66db2 @ksato9700 Change the eol character based on platform type
ksato9700 authored
31 // end-of-line code
32
6c01e9a @tj Update bin/express
tj authored
33 var eol = 'win32' == os.platform() ? '\r\n' : '\n'
7c66db2 @ksato9700 Change the eol character based on platform type
ksato9700 authored
34
29508f1 @tj changed -css, --template to --stylus, --ejs
tj authored
35 // Template engine
36
37 program.template = 'jade';
38 if (program.ejs) program.template = 'ejs';
47ff0dc @JonDum Add JSHTML template engine for cli helper
JonDum authored
39 if (program.jshtml) program.template = 'jshtml';
72eea7e @nullfirm modify from --hjs to --hogan.
nullfirm authored
40 if (program.hogan) program.template = 'hjs';
29508f1 @tj changed -css, --template to --stylus, --ejs
tj authored
41
8338432 @tj Added app generation to bin/express
tj authored
42 /**
a751346 @tj port some express(1) stuff from 2.x
tj authored
43 * Routes index template.
44 */
45
46 var index = [
47 ''
48 , '/*'
49 , ' * GET home page.'
50 , ' */'
51 , ''
52 , 'exports.index = function(req, res){'
39ae443 @tj semi
tj authored
53 , ' res.render(\'index\', { title: \'Express\' });'
a751346 @tj port some express(1) stuff from 2.x
tj authored
54 , '};'
7c66db2 @ksato9700 Change the eol character based on platform type
ksato9700 authored
55 ].join(eol);
a751346 @tj port some express(1) stuff from 2.x
tj authored
56
57 /**
4403f13 @tj add another route example to express(1) so people are not so confused
tj authored
58 * Routes users template.
59 */
60
61 var users = [
62 ''
63 , '/*'
64 , ' * GET users listing.'
65 , ' */'
66 , ''
67 , 'exports.list = function(req, res){'
68 , ' res.send("respond with a resource");'
69 , '};'
70 ].join(eol);
71
72 /**
8338432 @tj Added app generation to bin/express
tj authored
73 * Jade layout template.
74 */
75
76 var jadeLayout = [
f1ac6ab @adrianolaru changed jade default doctype to html5
adrianolaru authored
77 'doctype 5'
ebba6ca @tj 2 spaces in bin/express
tj authored
78 , 'html'
c28f153 @tj Started ejs template support for express(1)
tj authored
79 , ' head'
80 , ' title= title'
81 , ' link(rel=\'stylesheet\', href=\'/stylesheets/style.css\')'
b69199f @tj fixed express(1) jade tmpl inheritance
tj authored
82 , ' body'
83 , ' block content'
7c66db2 @ksato9700 Change the eol character based on platform type
ksato9700 authored
84 ].join(eol);
c28f153 @tj Started ejs template support for express(1)
tj authored
85
86 /**
87 * Jade index template.
88 */
89
90 var jadeIndex = [
b69199f @tj fixed express(1) jade tmpl inheritance
tj authored
91 'extends layout'
92 , ''
93 , 'block content'
94 , ' h1= title'
95 , ' p Welcome to #{title}'
7c66db2 @ksato9700 Change the eol character based on platform type
ksato9700 authored
96 ].join(eol);
c28f153 @tj Started ejs template support for express(1)
tj authored
97
98 /**
d72a666 @tj removed ejs layout.ejs from express(1)
tj authored
99 * EJS index template.
c28f153 @tj Started ejs template support for express(1)
tj authored
100 */
101
d72a666 @tj removed ejs layout.ejs from express(1)
tj authored
102 var ejsIndex = [
c28f153 @tj Started ejs template support for express(1)
tj authored
103 '<!DOCTYPE html>'
104 , '<html>'
105 , ' <head>'
106 , ' <title><%= title %></title>'
107 , ' <link rel=\'stylesheet\' href=\'/stylesheets/style.css\' />'
108 , ' </head>'
109 , ' <body>'
d72a666 @tj removed ejs layout.ejs from express(1)
tj authored
110 , ' <h1><%= title %></h1>'
111 , ' <p>Welcome to <%= title %></p>'
c28f153 @tj Started ejs template support for express(1)
tj authored
112 , ' </body>'
113 , '</html>'
7c66db2 @ksato9700 Change the eol character based on platform type
ksato9700 authored
114 ].join(eol);
c28f153 @tj Started ejs template support for express(1)
tj authored
115
116 /**
47ff0dc @JonDum Add JSHTML template engine for cli helper
JonDum authored
117 * JSHTML layout template.
118 */
119
120 var jshtmlLayout = [
121 '<!DOCTYPE html>'
122 , '<html>'
123 , ' <head>'
124 , ' <title> @write(title) </title>'
125 , ' <link rel=\'stylesheet\' href=\'/stylesheets/style.css\' />'
126 , ' </head>'
127 , ' <body>'
128 , ' @write(body)'
129 , ' </body>'
130 , '</html>'
7c66db2 @ksato9700 Change the eol character based on platform type
ksato9700 authored
131 ].join(eol);
47ff0dc @JonDum Add JSHTML template engine for cli helper
JonDum authored
132
133 /**
134 * JSHTML index template.
135 */
136
137 var jshtmlIndex = [
138 '<h1>@write(title)</h1>'
139 , '<p>Welcome to @write(title)</p>'
6368ab4 @tj ocd
tj authored
140 ].join(eol);
47ff0dc @JonDum Add JSHTML template engine for cli helper
JonDum authored
141
142 /**
0a874ad @nullfirm add hogan.js template engine for express@3.0
nullfirm authored
143 * Hogan.js index template.
144 */
72eea7e @nullfirm modify from --hjs to --hogan.
nullfirm authored
145 var hoganIndex = [
0a874ad @nullfirm add hogan.js template engine for express@3.0
nullfirm authored
146 '<!DOCTYPE html>'
147 , '<html>'
148 , ' <head>'
149 , ' <title>{{ title }}</title>'
150 , ' <link rel=\'stylesheet\' href=\'/stylesheets/style.css\' />'
151 , ' </head>'
152 , ' <body>'
153 , ' <h1>{{ title }}</h1>'
154 , ' <p>Welcome to {{ title }}</p>'
155 , ' </body>'
156 , '</html>'
157 ].join(eol);
158
159 /**
7bb466d @tj Added -c, -css ENGINE option to express(1)
tj authored
160 * Default css template.
161 */
162
163 var css = [
164 'body {'
165 , ' padding: 50px;'
166 , ' font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;'
167 , '}'
ebbe481 @tj Added default link color for express(1) generated apps
tj authored
168 , ''
169 , 'a {'
170 , ' color: #00B7FF;'
171 , '}'
7c66db2 @ksato9700 Change the eol character based on platform type
ksato9700 authored
172 ].join(eol);
7bb466d @tj Added -c, -css ENGINE option to express(1)
tj authored
173
174 /**
c9e41db @tj Updated express(1). Closes #365
tj authored
175 * Default less template.
8338432 @tj Added app generation to bin/express
tj authored
176 */
177
c9e41db @tj Updated express(1). Closes #365
tj authored
178 var less = [
ebba6ca @tj 2 spaces in bin/express
tj authored
179 'body {'
180 , ' padding: 50px;'
7bb466d @tj Added -c, -css ENGINE option to express(1)
tj authored
181 , ' font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;'
ebba6ca @tj 2 spaces in bin/express
tj authored
182 , '}'
ebbe481 @tj Added default link color for express(1) generated apps
tj authored
183 , ''
184 , 'a {'
185 , ' color: #00B7FF;'
186 , '}'
7c66db2 @ksato9700 Change the eol character based on platform type
ksato9700 authored
187 ].join(eol);
8338432 @tj Added app generation to bin/express
tj authored
188
189 /**
4330f49 @tj Added stylus support to express(1) generated app
tj authored
190 * Default stylus template.
191 */
192
193 var stylus = [
194 'body'
05a929d @tj tweak generated stylus
tj authored
195 , ' padding: 50px'
196 , ' font: 14px "Lucida Grande", Helvetica, Arial, sans-serif'
4330f49 @tj Added stylus support to express(1) generated app
tj authored
197 , 'a'
05a929d @tj tweak generated stylus
tj authored
198 , ' color: #00B7FF'
7c66db2 @ksato9700 Change the eol character based on platform type
ksato9700 authored
199 ].join(eol);
4330f49 @tj Added stylus support to express(1) generated app
tj authored
200
201 /**
8338432 @tj Added app generation to bin/express
tj authored
202 * App template.
203 */
204
205 var app = [
6b54c1b @tj listen in generated app
tj authored
206 ''
ebba6ca @tj 2 spaces in bin/express
tj authored
207 , '/**'
208 , ' * Module dependencies.'
209 , ' */'
210 , ''
a751346 @tj port some express(1) stuff from 2.x
tj authored
211 , 'var express = require(\'express\')'
9205d63 @tj Fixing express(1) for upcomming express
tj authored
212 , ' , routes = require(\'./routes\')'
4403f13 @tj add another route example to express(1) so people are not so confused
tj authored
213 , ' , user = require(\'./routes/user\')'
e79f72b @saintedlama Fixes path joining in win32 systems
saintedlama authored
214 , ' , http = require(\'http\')'
215 , ' , path = require(\'path\');'
ebba6ca @tj 2 spaces in bin/express
tj authored
216 , ''
b69199f @tj fixed express(1) jade tmpl inheritance
tj authored
217 , 'var app = express();'
ebba6ca @tj 2 spaces in bin/express
tj authored
218 , ''
219 , 'app.configure(function(){'
d64bb2f @benatkin use process.env.PORT. fix for #1118
benatkin authored
220 , ' app.set(\'port\', process.env.PORT || 3000);'
ebba6ca @tj 2 spaces in bin/express
tj authored
221 , ' app.set(\'views\', __dirname + \'/views\');'
da8d036 @tj Implemented --template support
tj authored
222 , ' app.set(\'view engine\', \':TEMPLATE\');'
2a13db3 @tj Added favicon() to express(1) generated app
tj authored
223 , ' app.use(express.favicon());'
58cfd60 @tj moved executable css middleware lower
tj authored
224 , ' app.use(express.logger(\'dev\'));'
2a7a5ae @tj Renaming usage of old connect middleware
tj authored
225 , ' app.use(express.bodyParser());'
db9b2bf @Zoramite Adding support back in for less CSS.
Zoramite authored
226 , ' app.use(express.methodOverride());{sess}'
58cfd60 @tj moved executable css middleware lower
tj authored
227 , ' app.use(app.router);{css}'
e79f72b @saintedlama Fixes path joining in win32 systems
saintedlama authored
228 , ' app.use(express.static(path.join(__dirname, \'public\')));'
ebba6ca @tj 2 spaces in bin/express
tj authored
229 , '});'
230 , ''
231 , 'app.configure(\'development\', function(){'
e46431e @tj ws
tj authored
232 , ' app.use(express.errorHandler());'
ebba6ca @tj 2 spaces in bin/express
tj authored
233 , '});'
234 , ''
a751346 @tj port some express(1) stuff from 2.x
tj authored
235 , 'app.get(\'/\', routes.index);'
4403f13 @tj add another route example to express(1) so people are not so confused
tj authored
236 , 'app.get(\'/users\', user.list);'
ebba6ca @tj 2 spaces in bin/express
tj authored
237 , ''
30d71c8 @tj ocd
tj authored
238 , 'http.createServer(app).listen(app.get(\'port\'), function(){'
5f65c36 @benatkin use get() with single argument to read setting vars
benatkin authored
239 , ' console.log("Express server listening on port " + app.get(\'port\'));'
d64bb2f @benatkin use process.env.PORT. fix for #1118
benatkin authored
240 , '});'
ebba6ca @tj 2 spaces in bin/express
tj authored
241 , ''
7c66db2 @ksato9700 Change the eol character based on platform type
ksato9700 authored
242 ].join(eol);
3056369 @tj Started bin/express
tj authored
243
02e32a7 @tj App generation in bin/express
tj authored
244 // Generate application
245
246 (function createApplication(path) {
ebba6ca @tj 2 spaces in bin/express
tj authored
247 emptyDirectory(path, function(empty){
cbf0eaa "Add the ability to force install express to non-empty directory."
tstrimple authored
248 if (empty || program.force) {
ebba6ca @tj 2 spaces in bin/express
tj authored
249 createApplicationAt(path);
250 } else {
426ba62 @tj rewrote express(1) to use commander.js
tj authored
251 program.confirm('destination is not empty, continue? ', function(ok){
ebba6ca @tj 2 spaces in bin/express
tj authored
252 if (ok) {
27d8bf6 @tj refactored express(1) stdin usage
tj authored
253 process.stdin.destroy();
ebba6ca @tj 2 spaces in bin/express
tj authored
254 createApplicationAt(path);
ec286ee @tj Added confirmation for express(1) app generation. Closes #391
tj authored
255 } else {
ebba6ca @tj 2 spaces in bin/express
tj authored
256 abort('aborting');
ec286ee @tj Added confirmation for express(1) app generation. Closes #391
tj authored
257 }
ebba6ca @tj 2 spaces in bin/express
tj authored
258 });
259 }
260 });
ec286ee @tj Added confirmation for express(1) app generation. Closes #391
tj authored
261 })(path);
262
263 /**
264 * Create application at the given directory `path`.
265 *
266 * @param {String} path
267 */
268
269 function createApplicationAt(path) {
a751346 @tj port some express(1) stuff from 2.x
tj authored
270 console.log();
271 process.on('exit', function(){
272 console.log();
a7a8dcd @tj Added note to express(1) for running the app
tj authored
273 console.log(' install dependencies:');
274 console.log(' $ cd %s && npm install', path);
275 console.log();
276 console.log(' run the app:');
277 console.log(' $ node app');
a751346 @tj port some express(1) stuff from 2.x
tj authored
278 console.log();
279 });
280
ebba6ca @tj 2 spaces in bin/express
tj authored
281 mkdir(path, function(){
04ebd88 @tj Fixed express(1) public dir for windows. Closes #866
tj authored
282 mkdir(path + '/public');
ebba6ca @tj 2 spaces in bin/express
tj authored
283 mkdir(path + '/public/javascripts');
284 mkdir(path + '/public/images');
285 mkdir(path + '/public/stylesheets', function(){
426ba62 @tj rewrote express(1) to use commander.js
tj authored
286 switch (program.css) {
db9b2bf @Zoramite Adding support back in for less CSS.
Zoramite authored
287 case 'less':
288 write(path + '/public/stylesheets/style.less', less);
289 break;
4330f49 @tj Added stylus support to express(1) generated app
tj authored
290 case 'stylus':
291 write(path + '/public/stylesheets/style.styl', stylus);
292 break;
7bb466d @tj Added -c, -css ENGINE option to express(1)
tj authored
293 default:
294 write(path + '/public/stylesheets/style.css', css);
295 }
02e32a7 @tj App generation in bin/express
tj authored
296 });
426ba62 @tj rewrote express(1) to use commander.js
tj authored
297
a751346 @tj port some express(1) stuff from 2.x
tj authored
298 mkdir(path + '/routes', function(){
299 write(path + '/routes/index.js', index);
4403f13 @tj add another route example to express(1) so people are not so confused
tj authored
300 write(path + '/routes/user.js', users);
a751346 @tj port some express(1) stuff from 2.x
tj authored
301 });
302
9e337fa @tj Removed ./views/partials generation in express(1)
tj authored
303 mkdir(path + '/views', function(){
426ba62 @tj rewrote express(1) to use commander.js
tj authored
304 switch (program.template) {
da8d036 @tj Implemented --template support
tj authored
305 case 'ejs':
306 write(path + '/views/index.ejs', ejsIndex);
307 break;
308 case 'jade':
309 write(path + '/views/layout.jade', jadeLayout);
310 write(path + '/views/index.jade', jadeIndex);
311 break;
47ff0dc @JonDum Add JSHTML template engine for cli helper
JonDum authored
312 case 'jshtml':
313 write(path + '/views/layout.jshtml', jshtmlLayout);
314 write(path + '/views/index.jshtml', jshtmlIndex);
315 break;
0a874ad @nullfirm add hogan.js template engine for express@3.0
nullfirm authored
316 case 'hjs':
72eea7e @nullfirm modify from --hjs to --hogan.
nullfirm authored
317 write(path + '/views/index.hjs', hoganIndex);
0a874ad @nullfirm add hogan.js template engine for express@3.0
nullfirm authored
318 break;
47ff0dc @JonDum Add JSHTML template engine for cli helper
JonDum authored
319
da8d036 @tj Implemented --template support
tj authored
320 }
ebba6ca @tj 2 spaces in bin/express
tj authored
321 });
1a6d245 @tj Added -s, --session[s] support to express(1)
tj authored
322
323 // CSS Engine support
426ba62 @tj rewrote express(1) to use commander.js
tj authored
324 switch (program.css) {
db9b2bf @Zoramite Adding support back in for less CSS.
Zoramite authored
325 case 'less':
326 app = app.replace('{css}', eol + ' app.use(require(\'less-middleware\')({ src: __dirname + \'/public\' }));');
327 break;
4330f49 @tj Added stylus support to express(1) generated app
tj authored
328 case 'stylus':
3dc88b2 @tj refine express(1) generated stylus middleware
tj authored
329 app = app.replace('{css}', eol + ' app.use(require(\'stylus\').middleware(__dirname + \'/public\'));');
4330f49 @tj Added stylus support to express(1) generated app
tj authored
330 break;
7bb466d @tj Added -c, -css ENGINE option to express(1)
tj authored
331 default:
5528f0d @tj Misc refactoring
tj authored
332 app = app.replace('{css}', '');
7bb466d @tj Added -c, -css ENGINE option to express(1)
tj authored
333 }
1a6d245 @tj Added -s, --session[s] support to express(1)
tj authored
334
335 // Session support
426ba62 @tj rewrote express(1) to use commander.js
tj authored
336 app = app.replace('{sess}', program.sessions
7c66db2 @ksato9700 Change the eol character based on platform type
ksato9700 authored
337 ? eol + ' app.use(express.cookieParser(\'your secret here\'));' + eol + ' app.use(express.session());'
1a6d245 @tj Added -s, --session[s] support to express(1)
tj authored
338 : '');
339
da8d036 @tj Implemented --template support
tj authored
340 // Template support
426ba62 @tj rewrote express(1) to use commander.js
tj authored
341 app = app.replace(':TEMPLATE', program.template);
da8d036 @tj Implemented --template support
tj authored
342
6e69c88 @tj Added package.json generation support to express(1)
tj authored
343 // package.json
16b6a64 @tj refactored express(1) package.json generation
tj authored
344 var pkg = {
345 name: 'application-name'
346 , version: '0.0.1'
347 , private: true
bdf0b26 @tj Added `node app` for npm scripts.start Closes #1032
tj authored
348 , scripts: { start: 'node app' }
16b6a64 @tj refactored express(1) package.json generation
tj authored
349 , dependencies: {
c998b91 @tj refactoring
tj authored
350 express: version
16b6a64 @tj refactored express(1) package.json generation
tj authored
351 }
352 }
353
354 if (program.template) pkg.dependencies[program.template] = '*';
355
db9b2bf @Zoramite Adding support back in for less CSS.
Zoramite authored
356 // CSS Engine support
357 switch (program.css) {
358 case 'less':
359 pkg.dependencies['less-middleware'] = '*';
360 break;
4c1afb2 @Zoramite Making the default case for the dependencies be more dynamic.
Zoramite authored
361 default:
c483dab @tj ocd
tj authored
362 if (program.css) {
4c1afb2 @Zoramite Making the default case for the dependencies be more dynamic.
Zoramite authored
363 pkg.dependencies[program.css] = '*';
364 }
db9b2bf @Zoramite Adding support back in for less CSS.
Zoramite authored
365 }
366
16b6a64 @tj refactored express(1) package.json generation
tj authored
367 write(path + '/package.json', JSON.stringify(pkg, null, 2));
ebba6ca @tj 2 spaces in bin/express
tj authored
368 write(path + '/app.js', app);
369 });
ec286ee @tj Added confirmation for express(1) app generation. Closes #391
tj authored
370 }
371
372 /**
373 * Check if the given directory `path` is empty.
374 *
375 * @param {String} path
376 * @param {Function} fn
377 */
378
379 function emptyDirectory(path, fn) {
ebba6ca @tj 2 spaces in bin/express
tj authored
380 fs.readdir(path, function(err, files){
29eed65 @tj removed constants from express(1)
tj authored
381 if (err && 'ENOENT' != err.code) throw err;
ebba6ca @tj 2 spaces in bin/express
tj authored
382 fn(!files || !files.length);
383 });
ec286ee @tj Added confirmation for express(1) app generation. Closes #391
tj authored
384 }
02e32a7 @tj App generation in bin/express
tj authored
385
386 /**
387 * echo str > path.
388 *
389 * @param {String} path
390 * @param {String} str
391 */
392
393 function write(path, str) {
ebba6ca @tj 2 spaces in bin/express
tj authored
394 fs.writeFile(path, str);
8c229a8 @tj fixed express(1) confirmation for 0.4.x
tj authored
395 console.log(' \x1b[36mcreate\x1b[0m : ' + path);
02e32a7 @tj App generation in bin/express
tj authored
396 }
397
398 /**
399 * Mkdir -p.
400 *
401 * @param {String} path
402 * @param {Function} fn
403 */
404
405 function mkdir(path, fn) {
fb031d1 @tj Added mkdirp to express(1). Closes #795
tj authored
406 mkdirp(path, 0755, function(err){
ebba6ca @tj 2 spaces in bin/express
tj authored
407 if (err) throw err;
fb031d1 @tj Added mkdirp to express(1). Closes #795
tj authored
408 console.log(' \033[36mcreate\033[0m : ' + path);
ebba6ca @tj 2 spaces in bin/express
tj authored
409 fn && fn();
410 });
02e32a7 @tj App generation in bin/express
tj authored
411 }
412
3056369 @tj Started bin/express
tj authored
413 /**
414 * Exit with the given `str`.
415 *
416 * @param {String} str
417 */
418
419 function abort(str) {
b3222dc @tj fixed bin/express
tj authored
420 console.error(str);
ebba6ca @tj 2 spaces in bin/express
tj authored
421 process.exit(1);
422 }
Something went wrong with that request. Please try again.