Newer
Older
express-blog / src / middleware / index.js
// src/setupMiddleware.js
const express = require("express");
const path = require("path");
const exphbs = require("express-handlebars");
const bodyParser = require("body-parser");
const compression = require("compression");

const routes = require("../routes");
const formatHtml = require("./formatHtml");
const logEvent = require("./analytics.js");
const applyProductionSecurity = require("./applyProductionSecurity");
const validateRequestIntegrity = require("./validateRequestIntegrity");
const { registerHelpers } = require("../utils/hbsHelpers");

const {
  loggingMiddleware,
  morganInfo,
  morganWarn,
  morganError,
} = require("./logging");

function setupApp() {
  const app = express();
  // Setup logging
  app.use(logEvent, morganInfo, morganWarn, morganError, loggingMiddleware);

  // Setup view engine

  const hbs = exphbs.create({
    layoutsDir: path.join(__dirname, "../views/layouts"),
    partialsDir: path.join(__dirname, "../views/partials"),
    defaultLayout: "main",
    helpers: {
      section: function (name, options) {
        this._sections ??= {};
        this._sections[name] = options.fn(this);
        return null;
      },
    },
    extname: ".handlebars",
    runtimeOptions: {
      allowProtoPropertiesByDefault: true,
      allowProtoMethodsByDefault: true,
    },
  });
  registerHelpers(hbs);
  app.engine("handlebars", hbs.engine);
  app.set("view engine", "handlebars");
  app.set("views", path.join(__dirname, "../views"));

  // Setup production environment
  if (process.env.NODE_ENV === "production") {
    applyProductionSecurity(app);
  }

  app.use(express.json({ limit: "4kb" }));
  app.use(bodyParser.urlencoded({ extended: false, limit: "4kb" }));
  app.use(compression());
  app.use(validateRequestIntegrity);
  app.use(formatHtml);
  app.use(routes);
  return app;
}

module.exports = setupApp;