1 | #! /usr/bin/env node
|
2 |
|
3 |
|
4 |
|
5 | 'use strict';
|
6 |
|
7 | const SPECS_GLOB = '!(node_modules|jspm_packages)/**/*spec.js';
|
8 |
|
9 | let _ = require('lodash'),
|
10 | glob = require('glob'),
|
11 | path = require('path'),
|
12 | express = require('express'),
|
13 | http = require('http'),
|
14 | program = require('commander'),
|
15 | serveIndex = require('serve-index'),
|
16 | webpack = require('webpack'),
|
17 | webpackDevServer = require('webpack-dev-server');
|
18 |
|
19 | program
|
20 | .usage('[options] <file ...>')
|
21 | .option('--webpackConfig <webpackConfig>', 'webpackConfigLocation')
|
22 | .option('--port <portNumber>', 'serve spec list on the specified local port number', parseInt, 5678)
|
23 | .option('--webpackPort <webpackPort>', 'local webpack dev server port ', parseInt, 8080)
|
24 | .parse(process.argv);
|
25 |
|
26 | if(!program.webpackConfig){
|
27 | console.log('add a webpack config');
|
28 | process.exit(1);
|
29 | }
|
30 | let webpackConfig = require(process.cwd() + '/' + program.webpackConfig);
|
31 | if(!webpackConfig){
|
32 | console.log('missing webpack config');
|
33 | process.exit(1);
|
34 | }
|
35 |
|
36 |
|
37 | let projectDir = path.resolve(process.cwd(), program.args && program.args.length > 0 ? program.args[0] : ''),
|
38 | go = {cwd: projectDir},
|
39 | projectName = projectDir.split(path.sep).pop(),
|
40 | jasmineDir = `${process.cwd()}/node_modules/jasmine-core`,
|
41 | webpackBaseUrl = `http://localhost:${program.webpackPort}/`,
|
42 | webpackLiveReloadBaseUrl = `${webpackBaseUrl}webpack-dev-server/`;
|
43 |
|
44 | function getSpecs() {
|
45 | return new Promise((res, rej) => {
|
46 | glob(SPECS_GLOB, go, (err, files) => {
|
47 | if (err) {
|
48 | rej(err);
|
49 | } else {
|
50 | res(_.sortBy(_.map(_.filter(files, file => !_.includes(file, 'e2e')), file => ({
|
51 | name: path.basename(file, '.js'),
|
52 | path: file,
|
53 | url: `${webpackLiveReloadBaseUrl}${file.toString().slice(0, -2)}html`,
|
54 | debugUrl: `${webpackBaseUrl}${file.toString().slice(0, -2)}html`
|
55 | })), 'name'));
|
56 | }
|
57 | });
|
58 | });
|
59 | }
|
60 |
|
61 | let app = express();
|
62 |
|
63 | app.set('view engine', 'jade');
|
64 | app.set('views', `${__dirname}/views`);
|
65 | app.use('/jasmine', serveIndex(jasmineDir, {icons: true}));
|
66 | app.use('/jasmine', express.static(jasmineDir));
|
67 |
|
68 | app.get('/', (req, res) => {
|
69 | getSpecs()
|
70 | .then(specs => {
|
71 | res.render('home', {
|
72 | projectName,
|
73 | specs
|
74 | });
|
75 | })
|
76 | .catch(error => {
|
77 | res.status(500).render('500', {error});
|
78 | });
|
79 | });
|
80 |
|
81 | let compiler = webpack(webpackConfig);
|
82 | let server = new webpackDevServer(compiler, {
|
83 | stats: {
|
84 | colors: true
|
85 | },
|
86 | inline: true,
|
87 | progress: false
|
88 | });
|
89 | server.listen(program.webpackPort);
|
90 |
|
91 | http
|
92 | .createServer(app)
|
93 | .listen(program.port, () => console.log(`HTTP server listening on port ${program.port}`)); |
\ | No newline at end of file |