UNPKG

3.39 kBJavaScriptView Raw
1const debug = require('debug')('app:demos');
2const commander = require('commander');
3const connect = require('connect');
4const getPort = require('get-port');
5const http = require('http');
6const open = require('open');
7const serveStatic = require('serve-static');
8const parseurl = require('parseurl');
9const assign = require('lodash').assign;
10const path = require('path');
11const resolve = path.resolve;
12const extname = path.extname;
13const basename = path.basename;
14const join = path.join;
15const fs = require('fs');
16const lstatSync = fs.lstatSync;
17const readdirSync = fs.readdirSync;
18const readFileSync = fs.readFileSync;
19const nunjucks = require('nunjucks');
20const renderString = nunjucks.renderString;
21const pkg = require('../package.json');
22
23function isFile(source) {
24 return lstatSync(source).isFile();
25}
26
27function getFiles(source) {
28 return readdirSync(source).map(function(name) {
29 return join(source, name);
30 }).filter(isFile);
31}
32
33commander
34 .version(pkg.version)
35 .option('-w, --web')
36 .option('-p, --port <port>', 'specify a port number to run on', parseInt)
37 .parse(process.argv);
38
39function startService(port) {
40 const server = connect();
41 server.use((req, res, next) => {
42 if (req.method === 'GET') {
43 const pathname = parseurl(req).pathname;
44 if (pathname === '/demos/index.html') {
45 const demoFiles = getFiles(__dirname)
46 .filter(filename => {
47 return extname(filename) === '.html';
48 })
49 .map(filename => {
50 const bn = basename(filename, '.html');
51 const file = {
52 screenshot: `/demos/assets/screenshots/${bn}.png`,
53 basename: bn,
54 content: readFileSync(filename),
55 filename
56 };
57 return file;
58 });
59 const template = readFileSync(join(__dirname, './index.njk'), 'utf8');
60 res.end(renderString(template, {
61 demoFiles
62 }));
63 } else {
64 next();
65 }
66 } else {
67 next();
68 }
69 });
70 server.use(serveStatic(process.cwd()));
71 http.createServer(server).listen(port);
72
73 const url = `http://127.0.0.1:${port}/demos/index.html`;
74 debug(`server started, demos available! ${url}`);
75
76 if (commander.web) {
77 debug('running on web!');
78 open(url);
79 } else {
80 debug('running on electron!');
81 const app = require('electron').app;
82 const BrowserWindow = require('electron').BrowserWindow;
83 const watch = require('torchjs/lib/watch');
84 const windowBoundsConfig = require('torchjs/lib/windowBoundsConfig')(
85 resolve(app.getPath('userData'), './data-set-config.json')
86 );
87
88 let win;
89 app.once('ready', () => {
90 win = new BrowserWindow(assign({
91 // transparent: true
92 webPreferences: {
93 nodeIntegration: false
94 }
95 }, windowBoundsConfig.get('demos')));
96 win.loadURL(url);
97 win.openDevTools();
98
99 win.on('close', () => {
100 windowBoundsConfig.set('demos', win.getBounds());
101 });
102 win.on('closed', () => {
103 win = null;
104 });
105 watch([
106 'demos/**/*.*',
107 'src/**/*.*'
108 ], () => {
109 win.webContents.reloadIgnoringCache();
110 });
111 });
112 app.on('window-all-closed', () => {
113 app.quit();
114 });
115 }
116}
117
118if (commander.port) {
119 startService(commander.port);
120} else {
121 getPort().then(port => {
122 startService(port);
123 });
124}