muffin
Version:
The 21st century way of building websites
194 lines (131 loc) • 5.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _chalk = require('chalk');
var _chalk2 = _interopRequireDefault(_chalk);
var _http = require('http');
var _http2 = _interopRequireDefault(_http);
var _fsExtra = require('fs-extra');
var _fsExtra2 = _interopRequireDefault(_fsExtra);
var _koa = require('koa');
var _koa2 = _interopRequireDefault(_koa);
var _koaStatic = require('koa-static');
var _koaStatic2 = _interopRequireDefault(_koaStatic);
var _koaMount = require('koa-mount');
var _koaMount2 = _interopRequireDefault(_koaMount);
var _koaCompress = require('koa-compress');
var _koaCompress2 = _interopRequireDefault(_koaCompress);
var _koaRouter = require('koa-router');
var _koaRouter2 = _interopRequireDefault(_koaRouter);
var _koaBody = require('koa-body');
var _koaBody2 = _interopRequireDefault(_koaBody);
var _koaJwt = require('koa-jwt');
var _koaJwt2 = _interopRequireDefault(_koaJwt);
var _koaConvert = require('koa-convert');
var _koaConvert2 = _interopRequireDefault(_koaConvert);
var _db = require('./utils/db');
var _utils = require('./utils');
var _front = require('./routes/front');
var _front2 = _interopRequireDefault(_front);
var _config = require('./utils/config');
var _config2 = _interopRequireDefault(_config);
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) { 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 { return Promise.resolve(value).then(function (value) { return step("next", value); }, function (err) { return step("throw", err); }); } } return step("next"); }); }; }
const router = new _koaRouter2.default();
const app = new _koa2.default();
// Loads .env and puts variables into process.env
const envFile = new _config2.default();
app.use((0, _koaCompress2.default)());
router.use('/api', (0, _koaConvert2.default)((0, _koaJwt2.default)({
secret: process.env.SESSION_SECRET
}).unless({
path: [/token-auth/, /token-refresh/, /reset-password/]
})));
router.use((0, _koaConvert2.default)((0, _koaBody2.default)({
multipart: true
})));
// Retrieve routes from passed path
const getRouter = path => require('./routes/' + path);
const APIroutes = ['content', 'reset-password', 'token', 'upload'];
// Register media routes and API
const uploadRouter = getRouter('uploads');
router.use('/uploads*', uploadRouter.routes());
router.use('/uploads*', uploadRouter.allowedMethods());
for (let route of APIroutes) {
let subRouter = getRouter('api/' + route);
router.use('/api', subRouter.routes());
router.use('/api', subRouter.allowedMethods());
}
// Serve assets of admin area...
app.use((0, _koaMount2.default)('/admin', (0, _koaStatic2.default)(__dirname + '/client')));
// ...and the Ember app
router.get('/admin*', (() => {
var ref = _asyncToGenerator(function* (ctx, next) {
let indexContent = false;
let indexPath = __dirname + '/client/index.html';
try {
indexContent = _fsExtra2.default.readFileSync(indexPath, {
encoding: 'utf8'
});
} catch (err) {
return (0, _utils.log)(err);
}
ctx.body = indexContent;
yield next();
});
return function (_x, _x2) {
return ref.apply(this, arguments);
};
})());
// Serve frontend assets
app.use((0, _koaMount2.default)('/assets', (0, _koaStatic2.default)(process.cwd() + '/dist')));
// Redirect users from "/login" to the Ember app login
router.get('/login', (() => {
var ref = _asyncToGenerator(function* (ctx, next) {
ctx.redirect('/admin/login');
yield next();
});
return function (_x3, _x4) {
return ref.apply(this, arguments);
};
})());
// Log HTTP requests to console
app.use((() => {
var ref = _asyncToGenerator(function* (ctx, next) {
let start = new Date();
try {
yield next();
} catch (err) {
ctx.body = { message: err.message };
ctx.status = err.status || 500;
}
let ms = new Date() - start;
if (ctx.url.split('/')[1] == 'api') {
return;
}
console.log(_chalk2.default.blue('[muffin]') + ' %s %s - %sms', ctx.method, ctx.url, ms);
});
return function (_x5, _x6) {
return ref.apply(this, arguments);
};
})());
function listening() {
const port = this.address().port;
const url = 'http://localhost:' + port;
// Output message as soon as server is running
console.log(_chalk2.default.blue('[muffin]') + ' ' + 'Running at ' + _chalk2.default.grey(url));
}
// Export front router
app.router = _front2.default;
app.run = outerRouter => {
// Register front routes
router.use('/', outerRouter.routes());
router.use('/', outerRouter.allowedMethods());
// Register dashboard routes
app.use(router.routes());
app.use(router.allowedMethods());
app.listen(process.env.PORT, listening);
};
exports.default = app;
module.exports = exports['default'];