bifocal/node_modules/gscan/app/index.js

114 lines
3.5 KiB
JavaScript

const express = require('express');
const debug = require('@tryghost/debug')('app');
const hbs = require('express-hbs');
const multer = require('multer');
const server = require('@tryghost/server');
const config = require('@tryghost/config');
const errors = require('@tryghost/errors');
const gscan = require('../lib');
const fs = require('fs-extra');
const logRequest = require('./middlewares/log-request');
const uploadValidation = require('./middlewares/upload-validation');
const sentry = require('./middlewares/sentry');
const ghostVer = require('./ghost-version');
const pkgJson = require('../package.json');
const ghostVersions = require('../lib/utils').versions;
const upload = multer({dest: __dirname + '/uploads/'});
const app = express();
const scanHbs = hbs.create();
app.use(sentry.requestHandler);
// Configure express
app.set('x-powered-by', false);
app.set('query parser', false);
app.engine('hbs', scanHbs.express4({
partialsDir: __dirname + '/tpl/partials',
layoutsDir: __dirname + '/tpl/layouts',
defaultLayout: __dirname + '/tpl/layouts/default',
templateOptions: {data: {version: pkgJson.version}}
}));
app.set('view engine', 'hbs');
app.set('views', __dirname + '/tpl');
app.use(logRequest);
app.use(express.static(__dirname + '/public'));
app.use(ghostVer);
app.get('/', function (req, res) {
res.render('index', {ghostVersions});
});
app.post('/',
upload.single('theme'),
uploadValidation,
function (req, res, next) {
const zip = {
path: req.file.path,
name: req.file.originalname
};
const options = {
checkVersion: req.body.version || ghostVersions.default
};
debug('Uploaded: ' + zip.name + ' to ' + zip.path);
debug('Version to check: ' + options.checkVersion);
gscan.checkZip(zip, options)
.then(function processResult(theme) {
debug('Checked: ' + zip.name);
res.theme = theme;
debug('attempting to remove: ' + req.file.path);
fs.remove(req.file.path)
.then(function () {
debug('Calling next');
return next();
})
.catch(function () {
// NOTE: transform to `.finally(...) once package is compatible with node >=10
debug('Calling next');
return next();
});
}).catch(function (error) {
debug('Calling next with error');
return next(error);
});
},
function doRender(req, res) {
const options = {
checkVersion: req.body.version || ghostVersions.default
};
debug('Formatting result');
const result = gscan.format(res.theme, options);
debug('Rendering result');
scanHbs.handlebars.logger.level = 0;
res.render('result', result);
}
);
app.use(sentry.errorHandler);
app.use(function (req, res, next) {
next(new errors.NotFoundError({message: 'Page not found'}));
});
// eslint-disable-next-line no-unused-vars
app.use(function (err, req, res, next) {
let template = 'error';
req.err = err;
let statusCode = err.statusCode || 500;
res.status(statusCode);
if (res.statusCode === 404) {
template = 'error-404';
}
res.render(template, {message: err.message, stack: err.stack, details: err.errorDetails, context: err.context});
});
server.start(app, config.get('port'));