jsm-core
Version:
Core library for JSM project
164 lines (163 loc) • 6.85 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const express_middleware_1 = require("@useoptic/express-middleware");
const cors_1 = __importDefault(require("cors"));
const express_1 = __importDefault(require("express"));
const express_session_1 = __importDefault(require("express-session"));
const cookie_parser_1 = __importDefault(require("cookie-parser"));
const helmet_1 = __importDefault(require("helmet"));
const jsm_logger_1 = __importStar(require("jsm-logger"));
const method_override_1 = __importDefault(require("method-override"));
const node_fs_1 = __importDefault(require("node:fs"));
const node_path_1 = __importDefault(require("node:path"));
const node_process_1 = require("node:process");
const typedi_1 = __importDefault(require("typedi"));
const context_1 = require("../../context");
const jsm_request_handler_1 = require("../../libraries/jsm-request-handler");
const middlewares_1 = __importDefault(require("../middlewares"));
const module_utilities_1 = require("../utilities/module.utilities");
const modules_loader_1 = __importDefault(require("./modules.loader"));
exports.default = ({ app }) => {
const logger = (0, jsm_logger_1.default)(jsm_logger_1.LoggerContext.LOADER, "express");
app.use((0, helmet_1.default)());
app.disable("x-powered-by");
/**
* Expose the public folder as static
*/
app.use(express_1.default.static(node_path_1.default.join((0, node_process_1.cwd)(), "public")));
/**
* Useful if you're behind a reverse proxy (Heroku, Bluemix, AWS ELB, Nginx, etc)
* It shows the real origin IP in the heroku or Cloudwatch logs
*/
app.enable("trust proxy");
// The magic package that prevents frontend developers going nuts
// Alternate description:
// Enable Cross Origin Resource Sharing to all origins by default
app.use((0, cors_1.default)({
origin: (origin, callback) => callback(null, origin), // Allow dynamic origin
methods: "GET,POST,PUT,DELETE,PATCH,OPTIONS", // Allow all methods (you can add more if needed)
allowedHeaders: "*", // Allow all custom headers
credentials: true, // Allow cookies to be sent (optional)
}));
// Some sauce that always add since 2014
// "Lets you use HTTP verbs such as PUT or DELETE in places where the client doesn't support it."
// Maybe not needed anymore ?
app.use((0, method_override_1.default)());
// Transforms the raw string of req.body into json
app.use(express_1.default.json({ limit: (0, context_1.getRegistry)().getConfig('http.bodySizeLimit') }));
app.use(express_1.default.urlencoded({
extended: true, limit: (0, context_1.getRegistry)().getConfig('http.bodySizeLimit')
}));
app.use((0, express_session_1.default)({
secret: "keyboard cat",
resave: false, // don't save session if unmodified
saveUninitialized: false, // don't create session until something stored
cookie: {
secure: true,
sameSite: 'none', // MUST be 'none' to allow third-party cookies
},
}));
// Parse cookies
app.use((0, cookie_parser_1.default)());
/**
* Handle JWT token
*/
app.use(middlewares_1.default.handleJWT);
/**
* Authenticate service
*/
app.use(middlewares_1.default.authenticateService);
/**
* Attach auth data to the request object
*/
const usersServicePath = (0, module_utilities_1.resolveModulePath)("modules/auth/modules/users/users.service");
const userModelPath = (0, module_utilities_1.resolveModulePath)("modules/auth/modules/users/user.model");
let usersService;
if (usersServicePath &&
node_fs_1.default.existsSync(usersServicePath) &&
userModelPath &&
node_fs_1.default.existsSync(userModelPath)) {
const User = require(userModelPath).User;
if (User) {
typedi_1.default.set("userModel", User);
const UsersService = require(usersServicePath).UsersService;
if (UsersService)
usersService = typedi_1.default.get(UsersService);
else
logger.error("UsersService not found");
}
else
logger.error("User model not found");
}
if (usersService) {
app.use(middlewares_1.default.gateAttachAuthDataMiddleWare({
usersService: usersService,
}));
}
else {
app.use(middlewares_1.default.gateAttachAuthDataMiddleWare({}));
}
/**
* Health Check endpoints
* TODO Explain why they are here
*/
// app.use(sharedRoutes());
/**
* Load Modules API routes
*/
app.get("/loader", (req, res) => {
res.send("Hello World");
});
(0, modules_loader_1.default)(app, (0, context_1.getRegistry)().getConfig('http.api.prefix') || '/api/v1');
/**
* API Documentation
*/
app.use((0, express_middleware_1.OpticMiddleware)({
enabled: (0, context_1.getRegistry)().getConfig('isDev'),
}));
app.use((0, jsm_request_handler_1.JsmRequestHandlerMiddleware)(middlewares_1.default.errorHandler()));
/**
* catch 404 and forward to error handler
*/
app.use(middlewares_1.default.endpointNotFoundHandler());
/**
* Error handler
*/
app.use(middlewares_1.default.errorHandler());
};