motion
Version:
motion - moving development forward
236 lines (182 loc) • 7.79 kB
JavaScript
exports.__esModule = true;
exports['default'] = wport;
var readScripts = _asyncToGenerator(function* () {
try {
var dir = yield _libFns.readdir(OPTS.outDir);
var files = dir.filter(function (f) {
return (/\.jsf?$/.test(f.name)
);
}); // filter sourcemaps
var hasFiles = files.length;
var paths = [];
// deterministic order
if (hasFiles) {
paths = files.map(function (file) {
return file.path;
}).sort();
var mainIndex = 0;
paths.forEach(function (p, i) {
if (/[Mm]ain\.jsf?$/.test(p)) mainIndex = i;
});
if (mainIndex !== -1) paths.move(mainIndex, 0);
}
return paths;
} catch (e) {
_libFns.handleError(e);
}
});
var getScripts = _asyncToGenerator(function* (_ref) {
var disableTools = _ref.disableTools;
try {
var files = yield readScripts();
return ['<div id="_motiondevtools" class="_motiondevtools"></div>', newLine, '<!-- MOTION JS -->', '<script src="/__/react.dev.js"></script>', '<script src="/__/motion.dev.js"></script>', '<script>_MOTION_WEBSOCKET_PORT = ' + wport() + '</script>', '<script src="/__/devtools.dev.js"></script>', '\n <script>\n var Motion = exports[\'motion\']\n Motion.init()\n </script>\n',
// devtools
disableTools ? '' : ['<script src="/__/tools/externals.js"></script>', '<script src="/__/tools/internals.js"></script>', '<script src="/__/tools/motiontools.js"></script>', '\n <script>\n Motion.run("motiontools", { node: "_motiondevtools" })\n </script>\n'].join(newLine),
// user files
newLine, '<!-- APP -->', '\n <script>\n // set up for dev mode, essentially faking a closure on window\n Motion = Motion.run("' + OPTS.saneName + '")\n </script>\n', '<script src="/__/externals.js" id="__motionExternals"></script>', '<script src="/__/internals.js" id="__motionInternals"></script>', scriptTags(files), '<script>Motion.start()</script>', '<!-- END APP -->'].join(newLine);
} catch (e) {
_libFns.handleError(e);
}
});
var getPathsInDir = _asyncToGenerator(function* (_dir) {
var dir = yield _libFns.readdir(_dir);
if (!dir || !dir.length) return [];
return dir.map(function (file) {
return file.path;
}).sort();
});
var getStyles = _asyncToGenerator(function* () {
var styles = yield getPathsInDir(OPTS.styleDir);
return styles.map(function (p) {
return stylesheetLink('styles/' + p);
}).join(newLine);
});
var getExternalStyles = _asyncToGenerator(function* () {
try {
var styles = yield getPathsInDir(_libFns.p(OPTS.deps.assetsDir, 'styles'));
return styles.map(function (p) {
return stylesheetLink('externalStyles/' + p);
}).join(newLine);
} catch (e) {
return [];
}
});
var makeTemplate = _asyncToGenerator(function* (req) {
try {
var templatePath = _libFns.p(OPTS.appDir, OPTS.template);
var template = yield _libFns.readFile(templatePath);
var disableTools = devToolsDisabled(req);
var scripts = yield getScripts({ disableTools: disableTools });
var styles = yield getStyles();
var externalStyles = yield getExternalStyles();
return template.replace('<!-- STYLES -->', styles).replace('<!-- EXTERNAL STYLES -->', externalStyles).replace('<!-- SCRIPTS -->', scripts);
} catch (e) {
_libFns.handleError(e);
}
});
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { var callNext = step.bind(null, 'next'); var callThrow = step.bind(null, 'throw'); function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(callNext, callThrow); } } callNext(); }); }; }
var _regeneratorRuntimeOnly = require('regenerator-runtime-only');
var _regeneratorRuntimeOnly2 = _interopRequireDefault(_regeneratorRuntimeOnly);
var _express = require('express');
var _express2 = _interopRequireDefault(_express);
var _cors = require('cors');
var _cors2 = _interopRequireDefault(_cors);
var _portfinder = require('portfinder');
var _portfinder2 = _interopRequireDefault(_portfinder);
var _motionClient = require('motion-client');
var _motionClient2 = _interopRequireDefault(_motionClient);
var _motionTools = require('motion-tools');
var _motionTools2 = _interopRequireDefault(_motionTools);
var _libFns = require('./lib/fns');
global.regeneratorRuntime = _regeneratorRuntimeOnly2['default'];
global.print = console.log.bind(console);
var newLine = "\n";
var OPTS = undefined,
PORT = undefined;
function wport() {
return 2283 + parseInt(PORT, 10);
}
Array.prototype.move = function (from, to) {
this.splice(to, 0, this.splice(from, 1)[0]);
};
function scriptTags(files) {
return files.map(function (file) {
return '<script src="/_/' + file + '" class="__motionScript"></script>';
}).join(newLine);
}
function devToolsDisabled(req) {
return OPTS.config && OPTS.config.tools === 'false' || req && req.query && req.query['!dev'];
}
var stylesheetLink = function stylesheetLink(name) {
return '<link rel="stylesheet" href="/__/' + name + '" />';
};
function run() {
return new Promise(function (res, rej) {
var server = _express2['default']({
env: 'production'
});
server.use(_cors2['default']());
server.use(function (req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
next();
});
var staticOpts = {
redirect: false
};
// USER files
// user js files at '/_/filename.js'
server.use('/_', _express2['default']['static']('.motion/.internal/out'));
// user non-js files
server.use('/', _express2['default']['static']('.', staticOpts));
// user static files...
server.use('/_/static', _express2['default']['static']('.motion/static'));
// INTERNAL files
server.use('/__', _express2['default']['static']('.motion/.internal/deps'));
server.use('/__/styles', _express2['default']['static']('.motion/.internal/styles'));
server.use('/__/externalStyles', _express2['default']['static']('.motion/.internal/deps/assets/styles'));
// tools.js
server.use('/__/tools', _express2['default']['static'](_libFns.p(_motionTools2['default'](), 'build', '_')));
// motion.js & react.js
server.use('/__', _express2['default']['static'](_libFns.p(_motionClient2['default'](), 'dist')));
server.get('*', function (req, res) {
afterFirstBuild(_asyncToGenerator(function* () {
try {
var template = yield makeTemplate(req);
res.send(template.replace(/\/static/g, '/_/static'));
} catch (e) {
print(e, e.stack);
}
}));
});
function afterFirstBuild(cb) {
if (OPTS.hasRunInitialBuild) cb();else setTimeout(function () {
return afterFirstBuild(cb);
}, 150);
}
function serverListen(port) {
PORT = port;
server.listen(port, host);
process.send(JSON.stringify({ host: host, port: port }));
}
var host = OPTS.config.host || 'localhost';
var port = OPTS.config.port || OPTS.defaultPort;
// if no specified port, find open one
if (!OPTS.config.port) {
_portfinder2['default'].basePort = port;
_portfinder2['default'].getPort({ host: host }, _libFns.handleError(serverListen));
} else {
serverListen(port);
}
});
}
var ran = false;
process.on('message', function (opts) {
if (opts === 'EXIT') return process.exit(2);
OPTS = JSON.parse(opts);
if (ran) return;
ran = true;
run();
});
module.exports = exports['default'];
//# sourceMappingURL=serverProcess.js.map