arkos 2.0.0-next.13 → 2.0.0-next.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/app.js +2 -0
- package/dist/cjs/app.js.map +1 -1
- package/dist/cjs/exports/error-handler/index.js +15 -0
- package/dist/cjs/exports/error-handler/index.js.map +1 -1
- package/dist/cjs/modules/auth/auth.router.js.map +1 -1
- package/dist/cjs/modules/base/base.middlewares.js +4 -2
- package/dist/cjs/modules/base/base.middlewares.js.map +1 -1
- package/dist/cjs/modules/error-handler/error-handler.controller.js +25 -42
- package/dist/cjs/modules/error-handler/error-handler.controller.js.map +1 -1
- package/dist/cjs/modules/error-handler/utils/app-error.js +0 -1
- package/dist/cjs/modules/error-handler/utils/app-error.js.map +1 -1
- package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js +8 -9
- package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js.map +1 -1
- package/dist/cjs/modules/error-handler/utils/errors.js +158 -0
- package/dist/cjs/modules/error-handler/utils/errors.js.map +1 -0
- package/dist/cjs/modules/error-handler/utils/multer-error-handler.js +39 -0
- package/dist/cjs/modules/error-handler/utils/multer-error-handler.js.map +1 -0
- package/dist/cjs/modules/file-upload/file-upload.controller.js +2 -10
- package/dist/cjs/modules/file-upload/file-upload.controller.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/openapi-schema-converter.js +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/openapi-schema-converter.js.map +1 -1
- package/dist/cjs/types/arkos-prisma-input.js.map +1 -1
- package/dist/cjs/types/new-arkos-config.js.map +1 -1
- package/dist/cjs/types/router-config.js.map +1 -1
- package/dist/cjs/utils/arkos-router/index.js +2 -1
- package/dist/cjs/utils/arkos-router/index.js.map +1 -1
- package/dist/cjs/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js +22 -24
- package/dist/cjs/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js.map +1 -1
- package/dist/cjs/utils/cli/build.js +1 -1
- package/dist/cjs/utils/cli/build.js.map +1 -1
- package/dist/cjs/utils/cli/dev.js +3 -1
- package/dist/cjs/utils/cli/dev.js.map +1 -1
- package/dist/cjs/utils/cli/generate.js +6 -8
- package/dist/cjs/utils/cli/generate.js.map +1 -1
- package/dist/cjs/utils/cli/index.js +22 -3
- package/dist/cjs/utils/cli/index.js.map +1 -1
- package/dist/cjs/utils/cli/utils/cli.helpers.js +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-controller-template.js +19 -7
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-controller-template.js.map +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-multiple-components.js +3 -5
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-multiple-components.js.map +1 -1
- package/dist/cjs/utils/dotenv.helpers.js +0 -6
- package/dist/cjs/utils/dotenv.helpers.js.map +1 -1
- package/dist/cjs/utils/helpers/arkos-config.helpers.js +17 -0
- package/dist/cjs/utils/helpers/arkos-config.helpers.js.map +1 -1
- package/dist/cjs/utils/helpers/exit-error.js +1 -0
- package/dist/cjs/utils/helpers/exit-error.js.map +1 -1
- package/dist/cjs/utils/helpers/prisma.helpers.js +2 -5
- package/dist/cjs/utils/helpers/prisma.helpers.js.map +1 -1
- package/dist/cjs/utils/helpers/url-helpers.js +14 -0
- package/dist/cjs/utils/helpers/url-helpers.js.map +1 -0
- package/dist/cjs/utils/initialize-app.js +7 -5
- package/dist/cjs/utils/initialize-app.js.map +1 -1
- package/dist/cjs/utils/prisma/prisma-json-schema-generator.js +12 -6
- package/dist/cjs/utils/prisma/prisma-json-schema-generator.js.map +1 -1
- package/dist/cjs/utils/prisma/prisma-schema-parser.js +10 -3
- package/dist/cjs/utils/prisma/prisma-schema-parser.js.map +1 -1
- package/dist/cjs/utils/setup-app.js +8 -8
- package/dist/cjs/utils/setup-app.js.map +1 -1
- package/dist/esm/app.js +2 -0
- package/dist/esm/app.js.map +1 -1
- package/dist/esm/exports/error-handler/index.js +1 -0
- package/dist/esm/exports/error-handler/index.js.map +1 -1
- package/dist/esm/modules/auth/auth.router.js.map +1 -1
- package/dist/esm/modules/base/base.middlewares.js +4 -2
- package/dist/esm/modules/base/base.middlewares.js.map +1 -1
- package/dist/esm/modules/error-handler/error-handler.controller.js +22 -42
- package/dist/esm/modules/error-handler/error-handler.controller.js.map +1 -1
- package/dist/esm/modules/error-handler/utils/app-error.js +0 -1
- package/dist/esm/modules/error-handler/utils/app-error.js.map +1 -1
- package/dist/esm/modules/error-handler/utils/error-handler.helpers.js +8 -9
- package/dist/esm/modules/error-handler/utils/error-handler.helpers.js.map +1 -1
- package/dist/esm/modules/error-handler/utils/errors.js +127 -0
- package/dist/esm/modules/error-handler/utils/errors.js.map +1 -0
- package/dist/esm/modules/error-handler/utils/multer-error-handler.js +34 -0
- package/dist/esm/modules/error-handler/utils/multer-error-handler.js.map +1 -0
- package/dist/esm/modules/file-upload/file-upload.controller.js +2 -10
- package/dist/esm/modules/file-upload/file-upload.controller.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/openapi-schema-converter.js +1 -1
- package/dist/esm/modules/swagger/utils/helpers/openapi-schema-converter.js.map +1 -1
- package/dist/esm/types/arkos-prisma-input.js.map +1 -1
- package/dist/esm/types/new-arkos-config.js.map +1 -1
- package/dist/esm/types/router-config.js.map +1 -1
- package/dist/esm/utils/arkos-router/index.js +2 -1
- package/dist/esm/utils/arkos-router/index.js.map +1 -1
- package/dist/esm/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js +22 -24
- package/dist/esm/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js.map +1 -1
- package/dist/esm/utils/cli/build.js +1 -1
- package/dist/esm/utils/cli/build.js.map +1 -1
- package/dist/esm/utils/cli/dev.js +3 -1
- package/dist/esm/utils/cli/dev.js.map +1 -1
- package/dist/esm/utils/cli/generate.js +6 -8
- package/dist/esm/utils/cli/generate.js.map +1 -1
- package/dist/esm/utils/cli/index.js +22 -3
- package/dist/esm/utils/cli/index.js.map +1 -1
- package/dist/esm/utils/cli/utils/cli.helpers.js +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-controller-template.js +16 -7
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-controller-template.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-multiple-components.js +3 -5
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-multiple-components.js.map +1 -1
- package/dist/esm/utils/dotenv.helpers.js +0 -6
- package/dist/esm/utils/dotenv.helpers.js.map +1 -1
- package/dist/esm/utils/helpers/arkos-config.helpers.js +15 -0
- package/dist/esm/utils/helpers/arkos-config.helpers.js.map +1 -1
- package/dist/esm/utils/helpers/exit-error.js +1 -0
- package/dist/esm/utils/helpers/exit-error.js.map +1 -1
- package/dist/esm/utils/helpers/prisma.helpers.js +2 -5
- package/dist/esm/utils/helpers/prisma.helpers.js.map +1 -1
- package/dist/esm/utils/helpers/url-helpers.js +11 -0
- package/dist/esm/utils/helpers/url-helpers.js.map +1 -0
- package/dist/esm/utils/initialize-app.js +7 -5
- package/dist/esm/utils/initialize-app.js.map +1 -1
- package/dist/esm/utils/prisma/prisma-json-schema-generator.js +12 -6
- package/dist/esm/utils/prisma/prisma-json-schema-generator.js.map +1 -1
- package/dist/esm/utils/prisma/prisma-schema-parser.js +10 -3
- package/dist/esm/utils/prisma/prisma-schema-parser.js.map +1 -1
- package/dist/esm/utils/setup-app.js +8 -8
- package/dist/esm/utils/setup-app.js.map +1 -1
- package/dist/types/exports/error-handler/index.d.ts +1 -0
- package/dist/types/modules/error-handler/utils/app-error.d.ts +0 -2
- package/dist/types/modules/error-handler/utils/error-handler.helpers.d.ts +1 -1
- package/dist/types/modules/error-handler/utils/errors.d.ts +176 -0
- package/dist/types/modules/error-handler/utils/multer-error-handler.d.ts +7 -0
- package/dist/types/modules/file-upload/file-upload.controller.d.ts +0 -1
- package/dist/types/types/arkos-prisma-input.d.ts +3 -2
- package/dist/types/types/new-arkos-config.d.ts +23 -0
- package/dist/types/types/router-config.d.ts +1 -1
- package/dist/types/utils/arkos-router/index.d.ts +1 -1
- package/dist/types/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.d.ts +1 -1
- package/dist/types/utils/cli/generate.d.ts +0 -1
- package/dist/types/utils/helpers/arkos-config.helpers.d.ts +2 -0
- package/dist/types/utils/helpers/url-helpers.d.ts +1 -0
- package/dist/types/utils/prisma/prisma-schema-parser.d.ts +1 -0
- package/package.json +1 -1
package/dist/cjs/app.js
CHANGED
|
@@ -48,6 +48,7 @@ const http_1 = require("http");
|
|
|
48
48
|
const exit_error_1 = __importDefault(require("./utils/helpers/exit-error.js"));
|
|
49
49
|
const arkos_loadable_registry_1 = __importDefault(require("./components/arkos-loadable-registry/index.js"));
|
|
50
50
|
const apply_arkos_router_proxy_1 = require("./utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js");
|
|
51
|
+
const arkos_config_helpers_1 = require("./utils/helpers/arkos-config.helpers.js");
|
|
51
52
|
let appServer;
|
|
52
53
|
const docsLink = "https://www.arkosjs.com/docs/core-concepts/routing/setup#setting-up-your-app";
|
|
53
54
|
let instanciated = false;
|
|
@@ -98,6 +99,7 @@ function arkos() {
|
|
|
98
99
|
state = "listening";
|
|
99
100
|
loadApp();
|
|
100
101
|
}
|
|
102
|
+
(0, arkos_config_helpers_1.validateArkosConfig)();
|
|
101
103
|
const port = Number(process.env.__PORT || process.env.PORT || "8000");
|
|
102
104
|
const host = process.env.__HOST || process.env.HOST || "0.0.0.0";
|
|
103
105
|
if (args?.length === 0 || typeof args[0] === "function")
|
package/dist/cjs/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/app.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/app.ts"],"names":[],"mappings":"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","sourcesContent":["import \"./utils/helpers/arkos-config.helpers\";\nimport express, { Express } from \"express\";\nimport setupApp from \"./utils/setup-app\";\nimport { Arkos, ArkosLoadable } from \"./types/arkos\";\nimport initializeApp, { addGlobalErrorHandler } from \"./utils/initialize-app\";\nimport { logAppStartup } from \"./server\";\nimport runtimeCliCommander from \"./utils/cli/utils/runtime-cli-commander\";\nimport { IncomingMessage, Server, ServerResponse } from \"http\";\nimport ExitError from \"./utils/helpers/exit-error\";\nimport loadableRegistry from \"./components/arkos-loadable-registry\";\nimport { applyArkosRouterProxy } from \"./utils/arkos-router/utils/helpers/apply-arkos-router-proxy\";\nimport { validateArkosConfig } from \"./utils/helpers/arkos-config.helpers\";\n\nlet appServer: Server<typeof IncomingMessage, typeof ServerResponse>;\nconst docsLink =\n \"https://www.arkosjs.com/docs/core-concepts/routing/setup#setting-up-your-app\";\nlet instanciated = false;\n\n/**\n * Creates and configures an Arkos application instance.\n *\n * Arkos extends Express with a small set of methods for registering routers,\n * loading route/service hooks, and booting the application. All Arkos-specific\n * setup (`app.build()`) must happen before the app starts\n * accepting requests.\n *\n * @example\n * ```ts\n * // Simple setup\n * import arkos from \"arkos\";\n *\n * const app = arkos();\n *\n * app.use(reportsRouter);\n *\n * app.listen();\n * ```\n *\n * @example\n * ```ts\n * // Custom HTTP server (e.g. for WebSockets)\n * import arkos from \"arkos\";\n * import http from \"http\";\n *\n * const app = arkos();\n *\n * app.use(reportsRouter);\n *\n * async function start() {\n * await app.build();\n *\n * const server = http.createServer(app);\n * app.listen(server)\n * }\n * main()\n * ```\n *\n * @see {@link https://www.arkosjs.com/docs/core-concepts/routing/setup}\n */\nexport function arkos(): Arkos {\n if (instanciated)\n throw ExitError(`arkos() must be called only once, see ${docsLink}`);\n\n const app = applyArkosRouterProxy(express(), {}, \"app\") as any as Arkos;\n setupApp(app);\n instanciated = true;\n\n type AppState = \"idle\" | \"building\" | \"built\" | \"listening\";\n let state: AppState = \"idle\";\n\n app.load = (...items: ArkosLoadable[]) => {\n if (state !== \"idle\")\n throw ExitError(\n `app.load() must be called before app.${state === \"listening\" ? \"listen\" : \"build\"}(), see ${docsLink}`\n );\n\n if (Array.isArray(items[0])) items = items[0];\n items = Array.isArray(items) ? items : [items];\n\n items.forEach((item) => loadableRegistry.register(item));\n return app;\n };\n\n function loadApp() {\n let _app = initializeApp(app);\n _app = addGlobalErrorHandler(_app);\n if (process.env.CLI_COMMAND) runtimeCliCommander.handle();\n return _app;\n }\n\n app.build = function () {\n if (state === \"built\" || state === \"building\")\n throw ExitError(`app.build() must only be called once, see ${docsLink}`);\n if (state === \"listening\")\n throw ExitError(\n `app.build() must be called before app.listen(), see ${docsLink}`\n );\n\n state = \"building\";\n const _app = loadApp();\n state = \"built\";\n return _app;\n };\n\n const originalListen = app.listen.bind(app) as any as Express[\"listen\"];\n type UserCallback = (err?: Error) => void;\n\n const defaultCb = (\n port: number | string,\n host: string,\n cb?: UserCallback\n ) => {\n logAppStartup(port, host);\n return cb || function () {};\n };\n\n app.listen = async function (...args): Promise<Server> {\n if (state === \"listening\")\n throw ExitError(`app.listen() must only be called once, see ${docsLink}`);\n if (state === \"building\")\n throw ExitError(\n `app.build() must be awaited before calling app.listen(), see ${docsLink}`\n );\n\n if (state === \"idle\") {\n state = \"listening\";\n loadApp();\n }\n\n validateArkosConfig();\n\n const port = Number(process.env.__PORT || process.env.PORT || \"8000\");\n const host = process.env.__HOST! || process.env.HOST || \"0.0.0.0\";\n\n if ((args as any)?.length === 0 || typeof args[0] === \"function\")\n appServer = originalListen(\n port,\n host,\n defaultCb(port, host, args[0] as UserCallback)\n );\n else if (args[0] instanceof Server || typeof args[0] === \"object\")\n appServer = args[0].listen(\n port,\n host,\n defaultCb(port, host, args[1] as UserCallback)\n );\n\n return appServer;\n };\n\n return app;\n}\n\nexport function getAppServer() {\n return appServer;\n}\n"]}
|
|
@@ -1,4 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
2
16
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
17
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
18
|
};
|
|
@@ -8,4 +22,5 @@ const catch_async_1 = __importDefault(require("../../modules/error-handler/utils
|
|
|
8
22
|
exports.catchAsync = catch_async_1.default;
|
|
9
23
|
const app_error_1 = __importDefault(require("../../modules/error-handler/utils/app-error.js"));
|
|
10
24
|
exports.AppError = app_error_1.default;
|
|
25
|
+
__exportStar(require("../../modules/error-handler/utils/errors.js"), exports);
|
|
11
26
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/exports/error-handler/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/exports/error-handler/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,gGAAuE;AAI9D,qBAJF,qBAAU,CAIE;AAHnB,4FAAmE;AAG9C,mBAHd,mBAAQ,CAGc;AAD7B,2EAAyD","sourcesContent":["import catchAsync from \"../../modules/error-handler/utils/catch-async\";\nimport AppError from \"../../modules/error-handler/utils/app-error\";\n\nexport * from \"../../modules/error-handler/utils/errors\";\nexport { catchAsync, AppError };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.router.js","sourceRoot":"","sources":["../../../../src/modules/auth/auth.router.ts"],"names":[],"mappings":"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","sourcesContent":["import { Options as RateLimitOptions } from \"express-rate-limit\";\nimport {\n addPrismaQueryOptionsToRequest,\n sendResponse,\n} from \"../base/base.middlewares\";\nimport { AuthPrismaQueryOptions } from \"../../types\";\nimport { processMiddleware } from \"../../utils/helpers/routers.helpers\";\nimport ArkosRouter from \"../../utils/arkos-router\";\nimport loadableRegistry from \"../../components/arkos-loadable-registry\";\nimport { routeHookReader } from \"../../components/arkos-route-hook/reader\";\nimport { ArkosAuthRouteHookInstance } from \"../../components/arkos-route-hook/types\";\nimport authController from \"./auth.controller\";\nimport authOpenAPIGenerator from \"./utils/auth-openapi-generator\";\n\nexport function getAuthRouter() {\n const router = ArkosRouter();\n const routeHook = loadableRegistry.getItem(\"ArkosRouteHook\", \"auth\");\n\n const op = (\n operation: keyof Omit<ArkosAuthRouteHookInstance, \"__type\" | \"moduleName\">\n ) => {\n const components = routeHook\n ? routeHookReader.forOperation(\"auth\", operation)\n : {\n before: [],\n after: [],\n onError: [],\n prismaArgs: {},\n routeConfig: {},\n };\n\n let endpointConfig = components.routeConfig || {};\n\n if (endpointConfig?.experimental?.openapi !== false)\n endpointConfig = {\n ...(endpointConfig || {}),\n experimental: {\n ...(endpointConfig?.experimental || {}),\n openapi: authOpenAPIGenerator.getOpenApiConfig(\n endpointConfig,\n operation\n ),\n },\n };\n\n components.routeConfig = endpointConfig;\n return components;\n };\n\n // GET /users/me - Get current user\n {\n const { before, after, onError, prismaArgs, routeConfig } = op(\"getMe\");\n\n router.get(\n {\n ...routeConfig,\n path: \"/users/me\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { getMe: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"getMe\"\n ),\n ...processMiddleware(before),\n authController.getMe,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // PATCH /users/me - Update current user\n {\n const { before, after, onError, prismaArgs, routeConfig } = op(\"updateMe\");\n\n router.patch(\n {\n ...routeConfig,\n path: \"/users/me\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { updateMe: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"updateMe\"\n ),\n ...processMiddleware(before),\n authController.updateMe,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // DELETE /users/me - Delete current user\n {\n const { before, after, onError, prismaArgs, routeConfig } = op(\"deleteMe\");\n\n router.delete(\n {\n ...routeConfig,\n path: \"/users/me\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { deleteMe: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"deleteMe\"\n ),\n ...processMiddleware(before),\n authController.deleteMe,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n const rateLimitConfig: Partial<RateLimitOptions> = {\n windowMs: 5000,\n limit: 10,\n standardHeaders: \"draft-7\",\n legacyHeaders: false,\n handler: (_, res) => {\n res.status(429).json({\n message: \"Too many requests, please try again later\",\n });\n },\n };\n\n // POST /auth/login - Login\n {\n const { before, after, onError, prismaArgs, routeConfig } = op(\"login\");\n\n router.post(\n {\n authentication: false,\n rateLimit: rateLimitConfig,\n ...routeConfig,\n path: \"/auth/login\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { login: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"login\"\n ),\n ...processMiddleware(before),\n authController.login,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // DELETE /auth/logout - Logout\n {\n const { before, after, onError, routeConfig } = op(\"logout\");\n\n router.delete(\n {\n rateLimit: rateLimitConfig,\n ...routeConfig,\n path: \"/auth/logout\",\n },\n ...processMiddleware(before),\n authController.logout,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // POST /auth/signup - Signup\n {\n const { before, after, onError, prismaArgs, routeConfig } = op(\"signup\");\n\n router.post(\n {\n authentication: false,\n rateLimit: rateLimitConfig,\n ...routeConfig,\n path: \"/auth/signup\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { signup: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"signup\"\n ),\n ...processMiddleware(before),\n authController.signup,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // POST /auth/update-password - Update password\n {\n const { before, after, onError, prismaArgs, routeConfig } =\n op(\"updatePassword\");\n\n router.post(\n {\n rateLimit: rateLimitConfig,\n ...routeConfig,\n path: \"/auth/update-password\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { updatePassword: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"updatePassword\"\n ),\n ...processMiddleware(before),\n authController.updatePassword,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, {\n type: \"error\",\n })\n );\n }\n\n // GET /auth-actions - Find many auth actions\n {\n const { before, after, onError, routeConfig } = op(\"findManyAuthAction\");\n\n router.get(\n {\n ...routeConfig,\n path: \"/auth-actions\",\n },\n ...processMiddleware(before),\n authController.findManyAuthAction,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, {\n type: \"error\",\n })\n );\n }\n\n // GET /auth-actions/:resourceName - Find one auth action\n {\n const { before, after, onError, routeConfig } = op(\"findOneAuthAction\");\n\n router.get(\n {\n ...routeConfig,\n path: \"/auth-actions/:resourceName\",\n },\n ...processMiddleware(before),\n authController.findOneAuthAction,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, {\n type: \"error\",\n })\n );\n }\n\n return router;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"auth.router.js","sourceRoot":"","sources":["../../../../src/modules/auth/auth.router.ts"],"names":[],"mappings":"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","sourcesContent":["import { Options as RateLimitOptions } from \"express-rate-limit\";\nimport {\n addPrismaQueryOptionsToRequest,\n sendResponse,\n} from \"../base/base.middlewares\";\nimport { AuthPrismaQueryOptions } from \"../../types\";\nimport { processMiddleware } from \"../../utils/helpers/routers.helpers\";\nimport ArkosRouter from \"../../utils/arkos-router\";\nimport loadableRegistry from \"../../components/arkos-loadable-registry\";\nimport { routeHookReader } from \"../../components/arkos-route-hook/reader\";\nimport { ArkosAuthRouteHookInstance } from \"../../components/arkos-route-hook/types\";\nimport authController from \"./auth.controller\";\nimport authOpenAPIGenerator from \"./utils/auth-openapi-generator\";\n\nexport function getAuthRouter() {\n const router = ArkosRouter();\n const routeHook = loadableRegistry.getItem(\"ArkosRouteHook\", \"auth\");\n\n const op = (\n operation: keyof Omit<ArkosAuthRouteHookInstance, \"__type\" | \"moduleName\">\n ) => {\n const components = routeHook\n ? routeHookReader.forOperation(\"auth\", operation)\n : {\n before: [],\n after: [],\n onError: [],\n prismaArgs: {},\n routeConfig: {},\n };\n\n let endpointConfig = components.routeConfig || {};\n\n if (endpointConfig?.experimental?.openapi !== false)\n endpointConfig = {\n ...(endpointConfig || {}),\n experimental: {\n ...(endpointConfig?.experimental || {}),\n openapi: authOpenAPIGenerator.getOpenApiConfig(\n endpointConfig,\n operation\n ),\n },\n };\n\n components.routeConfig = endpointConfig;\n return components;\n };\n\n // GET /users/me - Get current user\n {\n const { before, after, onError, prismaArgs, routeConfig } = op(\"getMe\");\n\n router.get(\n {\n ...routeConfig,\n path: \"/users/me\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { getMe: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"getMe\"\n ),\n ...processMiddleware(before),\n authController.getMe,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // PATCH /users/me - Update current user\n {\n const { before, after, onError, prismaArgs, routeConfig } = op(\"updateMe\");\n\n router.patch(\n {\n ...routeConfig,\n path: \"/users/me\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { updateMe: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"updateMe\"\n ),\n ...processMiddleware(before),\n authController.updateMe,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // DELETE /users/me - Delete current user\n {\n const { before, after, onError, prismaArgs, routeConfig } = op(\"deleteMe\");\n\n router.delete(\n {\n ...routeConfig,\n path: \"/users/me\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { deleteMe: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"deleteMe\"\n ),\n ...processMiddleware(before),\n authController.deleteMe,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n const rateLimitConfig: Partial<RateLimitOptions> = {\n windowMs: 5000,\n limit: 10,\n standardHeaders: \"draft-7\",\n legacyHeaders: false,\n handler: (_, res) => {\n res.status(429).json({\n message: \"Too many requests, please try again later\",\n });\n },\n };\n // POST /auth/login - Login\n {\n const { before, after, onError, prismaArgs, routeConfig } = op(\"login\");\n\n router.post(\n {\n authentication: false,\n rateLimit: rateLimitConfig,\n ...routeConfig,\n path: \"/auth/login\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { login: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"login\"\n ),\n ...processMiddleware(before),\n authController.login,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // DELETE /auth/logout - Logout\n {\n const { before, after, onError, routeConfig } = op(\"logout\");\n\n router.delete(\n {\n rateLimit: rateLimitConfig,\n ...routeConfig,\n path: \"/auth/logout\",\n },\n ...processMiddleware(before),\n authController.logout,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // POST /auth/signup - Signup\n {\n const { before, after, onError, prismaArgs, routeConfig } = op(\"signup\");\n\n router.post(\n {\n authentication: false,\n rateLimit: rateLimitConfig,\n ...routeConfig,\n path: \"/auth/signup\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { signup: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"signup\"\n ),\n ...processMiddleware(before),\n authController.signup,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // POST /auth/update-password - Update password\n {\n const { before, after, onError, prismaArgs, routeConfig } =\n op(\"updatePassword\");\n\n router.post(\n {\n rateLimit: rateLimitConfig,\n ...routeConfig,\n path: \"/auth/update-password\",\n },\n addPrismaQueryOptionsToRequest<any>(\n { updatePassword: prismaArgs } as AuthPrismaQueryOptions<any>,\n \"updatePassword\"\n ),\n ...processMiddleware(before),\n authController.updatePassword,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, {\n type: \"error\",\n })\n );\n }\n\n // GET /auth-actions - Find many auth actions\n {\n const { before, after, onError, routeConfig } = op(\"findManyAuthAction\");\n\n router.get(\n {\n ...routeConfig,\n path: \"/auth-actions\",\n },\n ...processMiddleware(before),\n authController.findManyAuthAction,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, {\n type: \"error\",\n })\n );\n }\n\n // GET /auth-actions/:resourceName - Find one auth action\n {\n const { before, after, onError, routeConfig } = op(\"findOneAuthAction\");\n\n router.get(\n {\n ...routeConfig,\n path: \"/auth-actions/:resourceName\",\n },\n ...processMiddleware(before),\n authController.findOneAuthAction,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, {\n type: \"error\",\n })\n );\n }\n\n return router;\n}\n"]}
|
|
@@ -18,6 +18,8 @@ const base_middlewares_helpers_1 = require("./utils/helpers/base.middlewares.hel
|
|
|
18
18
|
const text_helpers_1 = require("../../utils/helpers/text.helpers.js");
|
|
19
19
|
const dynamic_loader_1 = require("../../utils/dynamic-loader.js");
|
|
20
20
|
const error_prettifier_1 = __importDefault(require("./utils/error-prettifier.js"));
|
|
21
|
+
const url_helpers_1 = require("../../utils/helpers/url-helpers.js");
|
|
22
|
+
const utils_1 = require("../../exports/utils/index.js");
|
|
21
23
|
function callNext(_, _1, next) {
|
|
22
24
|
next();
|
|
23
25
|
}
|
|
@@ -133,7 +135,7 @@ function handleRequestLogs(req, res, next) {
|
|
|
133
135
|
const time = now.toTimeString().split(" ")[0];
|
|
134
136
|
const methodColor = methodColors[req.method] || "\x1b[0m";
|
|
135
137
|
const statusColor = getStatusColor(res.statusCode);
|
|
136
|
-
console.info(`[\x1b[36mInfo\x1b[0m] \x1b[90m${time}\x1b[0m ${methodColor}${req.method}\x1b[0m ${
|
|
138
|
+
console.info(`[\x1b[36mInfo\x1b[0m] \x1b[90m${time}\x1b[0m ${methodColor}${req.method}\x1b[0m ${(0, url_helpers_1.lenientDecode)(req.originalUrl)} ${statusColor}${res.statusCode}\x1b[0m \x1b[35m${duration}ms\x1b[0m`);
|
|
137
139
|
});
|
|
138
140
|
next();
|
|
139
141
|
}
|
|
@@ -222,7 +224,7 @@ function validateRequestInputs(routeConfig) {
|
|
|
222
224
|
const isZod = validationConfig?.resolver === "zod";
|
|
223
225
|
const prettifiedError = error_prettifier_1.default.prettify(resolver, err);
|
|
224
226
|
const error = prettifiedError[0];
|
|
225
|
-
throw new error_handler_1.AppError(error.message, 400,
|
|
227
|
+
throw new error_handler_1.AppError(error.message, 400, `InvalidRequest${(0, utils_1.pascalCase)(key)}`, isZod ? err.format() : err);
|
|
226
228
|
}
|
|
227
229
|
}
|
|
228
230
|
next();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.middlewares.js","sourceRoot":"","sources":["../../../../src/modules/base/base.middlewares.ts"],"names":[],"mappings":"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","sourcesContent":["import { NextFunction, Request, Response } from \"express\";\nimport {\n PrismaQueryOptions,\n ArkosNextFunction,\n ArkosRequest,\n ArkosRequestHandler,\n ArkosResponse,\n AuthPrismaQueryOptions,\n} from \"../../types\";\nimport { getArkosConfig } from \"../../server\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport { AppError, catchAsync } from \"../../exports/error-handler\";\nimport validateDto from \"../../utils/validate-dto\";\nimport validateSchema from \"../../utils/validate-schema\";\nimport { ZodSchema } from \"zod\";\nimport { ClassConstructor } from \"class-transformer\";\nimport { ValidatorOptions } from \"class-validator\";\nimport { resolvePrismaQueryOptions } from \"./utils/helpers/base.middlewares.helpers\";\nimport { ArkosRouteConfig } from \"../../utils/arkos-router/types\";\nimport { capitalize } from \"../../utils/helpers/text.helpers\";\nimport { isClass, isZodSchema } from \"../../utils/dynamic-loader\";\nimport errorPrettifier from \"./utils/error-prettifier\";\n\nexport function callNext(_: Request, _1: Response, next: NextFunction) {\n next();\n}\n\n/**\n * Deep comparison helper for objects\n */\nfunction deepEqual(a: any, b: any): boolean {\n if (a === b) return true;\n if (a == null || b == null) return false;\n if (typeof a !== \"object\" || typeof b !== \"object\") return a === b;\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (!keysB.includes(key)) return false;\n if (!deepEqual(a[key], b[key])) return false;\n }\n\n return true;\n}\n\n/**\n * Sends response with backward compatibility support\n * Compares current values against original values to detect middleware changes\n * If values were modified by subsequent middleware, use the modified version\n */\nexport function sendResponse(req: ArkosRequest, res: ArkosResponse) {\n let responseData;\n let responseStatus;\n\n const originalData = (res as any).originalData;\n const originalStatus = (res as any).originalStatus;\n\n const currentReqData = req.responseData;\n const currentReqStatus = req.responseStatus;\n const currentLocalsData = res.locals?.data;\n const currentLocalsStatus = res.locals?.status;\n\n if (\n currentReqData !== undefined &&\n !deepEqual(currentReqData, originalData)\n ) {\n responseData = currentReqData;\n } else if (\n currentLocalsData !== undefined &&\n !deepEqual(currentLocalsData, originalData)\n ) {\n responseData = currentLocalsData;\n } else if (originalData !== undefined) {\n responseData = originalData;\n } else {\n responseData = currentReqData ?? currentLocalsData;\n }\n\n if (currentReqStatus !== undefined && currentReqStatus !== originalStatus) {\n responseStatus = currentReqStatus;\n } else if (\n currentLocalsStatus !== undefined &&\n currentLocalsStatus !== originalStatus\n ) {\n responseStatus = currentLocalsStatus;\n } else if (originalStatus !== undefined) {\n responseStatus = originalStatus;\n } else {\n responseStatus = currentReqStatus ?? currentLocalsStatus;\n }\n\n // Send response\n\n if (Number(responseStatus) === 204) {\n res.status(Number(responseStatus)).send();\n } else if (\n (responseData !== undefined || responseData !== null) &&\n responseStatus\n ) {\n res.status(Number(responseStatus)).json(responseData);\n } else if (\n Number(responseStatus) &&\n (responseData === undefined || responseData === null)\n ) {\n res.status(Number(responseStatus)).send();\n } else {\n res.status(500).json({\n message: \"No status or data attached to the response\",\n });\n }\n}\n\n/**\n * Type representing all possible actions that can be performed on a controller\n * Combines both standard CRUD operations and auth-specific operations\n */\nexport type ControllerActions =\n | keyof PrismaQueryOptions<any>\n | keyof Omit<AuthPrismaQueryOptions<any>, keyof PrismaQueryOptions<any>>;\n\n/**\n * Middleware to add Prisma query options to the request's query parameters.\n *\n * @template T - The type of the Prisma model.\n * @param {PrismaQueryOptions<T> | AuthPrismaQueryOptions<T>} prismaQueryOptions - The Prisma query options to attach.\n * @param {ControllerActions} action - The controller action to apply.\n * @returns A middleware function that attaches the query options to the request.\n */\nexport function addPrismaQueryOptionsToRequest<T extends Record<string, any>>(\n prismaQueryOptions: PrismaQueryOptions<T> | AuthPrismaQueryOptions<T>,\n action: ControllerActions\n) {\n return (req: ArkosRequest, _: ArkosResponse, next: NextFunction) => {\n const configs = getArkosConfig();\n\n const resolvedOptions = resolvePrismaQueryOptions(\n prismaQueryOptions,\n action\n );\n\n const requestQueryOptions = configs?.request?.parameters\n ?.allowDangerousPrismaQueryOptions\n ? JSON.parse((req.query?.prismaQueryOptions as string) || \"{}\")\n : {};\n\n req.prismaQueryOptions = deepmerge(resolvedOptions, requestQueryOptions);\n\n next();\n };\n}\n\n/**\n * Logs request events with colored text such as errors, requests responses.\n *\n */\nexport function handleRequestLogs(\n req: Request,\n res: Response,\n next: NextFunction\n) {\n const startTime = Date.now();\n\n const methodColors = {\n GET: \"\\x1b[36m\", // Cyan\n POST: \"\\x1b[32m\", // Green\n PUT: \"\\x1b[33m\", // Orange/Yellow\n PATCH: \"\\x1b[33m\", // Orange/Yellow\n DELETE: \"\\x1b[31m\", // Red\n HEAD: \"\\x1b[34m\", // Blue\n OPTIONS: \"\\x1b[34m\", // Blue\n };\n\n const getStatusColor = (statusCode: number) => {\n if (statusCode >= 200 && statusCode < 300) return \"\\x1b[32m\";\n if (statusCode >= 300 && statusCode < 400) return \"\\x1b[33m\";\n if (statusCode >= 400 && statusCode < 500) return \"\\x1b[33m\";\n if (statusCode >= 500) return \"\\x1b[31m\";\n return \"\\x1b[0m\";\n };\n\n res.on(\"finish\", () => {\n const duration = Date.now() - startTime;\n\n const now = new Date();\n const time = now.toTimeString().split(\" \")[0];\n\n const methodColor =\n methodColors[req.method as keyof typeof methodColors] || \"\\x1b[0m\";\n const statusColor = getStatusColor(res.statusCode);\n\n console.info(\n `[\\x1b[36mInfo\\x1b[0m] \\x1b[90m${time}\\x1b[0m ${methodColor}${\n req.method\n }\\x1b[0m ${decodeURIComponent(req.originalUrl)} ${statusColor}${\n res.statusCode\n }\\x1b[0m \\x1b[35m${duration}ms\\x1b[0m`\n );\n });\n\n next();\n}\n\n/**\n * @deprecated Will be removed in v2.0, please ArkosRouter instead.\n */\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ClassConstructor<T>,\n classValidatorValidationOptions?: ValidatorOptions\n): ArkosRequestHandler;\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ZodSchema<T>\n): ArkosRequestHandler;\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ZodSchema<T> | ClassConstructor<T>,\n classValidatorValidationOptions?: ValidatorOptions\n) {\n return catchAsync(\n async (req: ArkosRequest, _: ArkosResponse, next: ArkosNextFunction) => {\n const validationConfigs = getArkosConfig()?.validation;\n let body = req.body;\n\n if (validationConfigs?.resolver === \"class-validator\" && schemaOrDtoClass)\n req.body = await validateDto(\n schemaOrDtoClass as ClassConstructor<T>,\n body,\n deepmerge(\n {\n whitelist: true,\n forbidNonWhitelisted: true,\n ...classValidatorValidationOptions,\n },\n validationConfigs?.validationOptions || {}\n )\n );\n else if (validationConfigs?.resolver === \"zod\" && schemaOrDtoClass)\n req.body = await validateSchema(schemaOrDtoClass as any, body);\n\n next();\n }\n );\n}\n\nexport function validateRequestInputs(routeConfig: ArkosRouteConfig) {\n const arkosConfig = getArkosConfig();\n const validationConfig = arkosConfig.validation;\n const strictValidation = validationConfig?.strict;\n const validators = routeConfig?.validation;\n const openapi = routeConfig?.experimental?.openapi;\n\n const validationToParameterMapping = {\n query: \"query\",\n params: \"path\",\n headers: \"header\",\n cookies: \"cookie\",\n };\n\n if (\n !validationConfig?.resolver &&\n Object.keys(routeConfig.validation || {}).length > 0\n )\n throw Error(\n `Trying to pass validators into route \\\"${routeConfig.path}\\\" config validation option without choosing a validation resolver under arkos config { validation: {} }.`\n );\n\n if ((validators as any) === true)\n throw Error(\n `Invalid value ${validators} passed to validation option, it can only receive false or object of { query, body, params }.`\n );\n\n const validatorFn: (validator: any, data: any, options: any) => Promise<any> =\n validationConfig?.resolver == \"zod\" ? validateSchema : validateDto;\n const validatorsKey: (\"body\" | \"query\" | \"params\")[] = [\n \"body\",\n \"query\",\n \"params\",\n ];\n\n const isValidValidator =\n validationConfig?.resolver == \"zod\" ? isZodSchema : isClass;\n const validatorName =\n validationConfig?.resolver == \"zod\" ? \"zod schema\" : \"class-validator dto\";\n const validatorNameType =\n validationConfig?.resolver == \"zod\" ? \"Schema\" : \"Dto\";\n\n if (typeof validators === \"object\")\n validatorsKey.forEach((key) => {\n if (\n openapi &&\n typeof openapi === \"object\" &&\n key != \"body\" &&\n openapi.parameters?.some(\n (parameter: any) => parameter.in === validationToParameterMapping[key]\n ) &&\n validators[key]\n ) {\n throw Error(\n `Error in ${routeConfig.path}: when usign validation.${key} you must not define parameters under openapi.parameters as documentation of req.${key} because the ${validatorName} you passed under validation.${key} will be added as jsonSchema into the api documenation, if you wish to define documenation by yourself do not define validation.${key}.`\n );\n }\n\n if (\n openapi &&\n typeof openapi === \"object\" &&\n openapi.requestBody &&\n validators[key] &&\n key === \"body\"\n ) {\n throw Error(\n `When usign validation.${key} you must not define json-schema under openapi.requestBody as documentation for req.${key}, because the ${validatorName} you passed under validation.${key} will be added as json-schema into the api documenation, if you wish to define documenation by yourself do not define validation.${key}.`\n );\n }\n\n if (strictValidation && !(key in validators))\n throw Error(\n `No { validation: { ${key}: ${validatorNameType} } } was found, while using strict validation you will need to pass undefined into ${key} in order to deny any request ${key} input.`\n );\n\n if (\n key in validators &&\n validators?.[key] !== undefined &&\n validators?.[key] !== false &&\n !isValidValidator(validators[key])\n )\n throw Error(\n `Your validation resolver is set to ${arkosConfig.validation!.resolver}, please provide a valid ${validatorName} in order to use in { validation: { ${key}: ${validatorNameType} } } under route ${routeConfig.path}`\n );\n });\n\n return catchAsync(\n async (req: ArkosRequest, _: ArkosResponse, next: ArkosNextFunction) => {\n for (const key of validatorsKey) {\n const reqInput = Object.keys(req[key] || {}).length > 0;\n const validator = (validators as any)?.[key];\n const notAllowedInputError = new AppError(\n `Request ${key} is not allowed on this route`,\n 400,\n `Request${capitalize(key)}NotAllowed`,\n { [key]: req[key] }\n );\n\n if (\n ((typeof validators === \"boolean\" && validators === false) ||\n validator === false) &&\n reqInput\n )\n throw notAllowedInputError;\n\n if (strictValidation && !validator && reqInput)\n throw notAllowedInputError;\n if (validator)\n try {\n req[key] = await validatorFn(\n validator,\n req[key],\n arkosConfig.validation?.validationOptions\n );\n } catch (err: any) {\n const resolver = validationConfig?.resolver;\n const isZod = validationConfig?.resolver === \"zod\";\n\n const prettifiedError = errorPrettifier.prettify(\n resolver as any,\n err\n );\n const error = prettifiedError[0];\n throw new AppError(\n error.message,\n 400,\n error.code,\n isZod ? err.format() : err\n );\n }\n }\n\n next();\n }\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"base.middlewares.js","sourceRoot":"","sources":["../../../../src/modules/base/base.middlewares.ts"],"names":[],"mappings":"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","sourcesContent":["import { NextFunction, Request, Response } from \"express\";\nimport {\n PrismaQueryOptions,\n ArkosNextFunction,\n ArkosRequest,\n ArkosRequestHandler,\n ArkosResponse,\n AuthPrismaQueryOptions,\n} from \"../../types\";\nimport { getArkosConfig } from \"../../server\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport { AppError, catchAsync } from \"../../exports/error-handler\";\nimport validateDto from \"../../utils/validate-dto\";\nimport validateSchema from \"../../utils/validate-schema\";\nimport { ZodSchema } from \"zod\";\nimport { ClassConstructor } from \"class-transformer\";\nimport { ValidatorOptions } from \"class-validator\";\nimport { resolvePrismaQueryOptions } from \"./utils/helpers/base.middlewares.helpers\";\nimport { ArkosRouteConfig } from \"../../utils/arkos-router/types\";\nimport { capitalize } from \"../../utils/helpers/text.helpers\";\nimport { isClass, isZodSchema } from \"../../utils/dynamic-loader\";\nimport errorPrettifier from \"./utils/error-prettifier\";\nimport { lenientDecode } from \"../../utils/helpers/url-helpers\";\nimport { pascalCase } from \"../../exports/utils\";\n\nexport function callNext(_: Request, _1: Response, next: NextFunction) {\n next();\n}\n\n/**\n * Deep comparison helper for objects\n */\nfunction deepEqual(a: any, b: any): boolean {\n if (a === b) return true;\n if (a == null || b == null) return false;\n if (typeof a !== \"object\" || typeof b !== \"object\") return a === b;\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (!keysB.includes(key)) return false;\n if (!deepEqual(a[key], b[key])) return false;\n }\n\n return true;\n}\n\n/**\n * Sends response with backward compatibility support\n * Compares current values against original values to detect middleware changes\n * If values were modified by subsequent middleware, use the modified version\n */\nexport function sendResponse(req: ArkosRequest, res: ArkosResponse) {\n let responseData;\n let responseStatus;\n\n const originalData = (res as any).originalData;\n const originalStatus = (res as any).originalStatus;\n\n const currentReqData = req.responseData;\n const currentReqStatus = req.responseStatus;\n const currentLocalsData = res.locals?.data;\n const currentLocalsStatus = res.locals?.status;\n\n if (\n currentReqData !== undefined &&\n !deepEqual(currentReqData, originalData)\n ) {\n responseData = currentReqData;\n } else if (\n currentLocalsData !== undefined &&\n !deepEqual(currentLocalsData, originalData)\n ) {\n responseData = currentLocalsData;\n } else if (originalData !== undefined) {\n responseData = originalData;\n } else {\n responseData = currentReqData ?? currentLocalsData;\n }\n\n if (currentReqStatus !== undefined && currentReqStatus !== originalStatus) {\n responseStatus = currentReqStatus;\n } else if (\n currentLocalsStatus !== undefined &&\n currentLocalsStatus !== originalStatus\n ) {\n responseStatus = currentLocalsStatus;\n } else if (originalStatus !== undefined) {\n responseStatus = originalStatus;\n } else {\n responseStatus = currentReqStatus ?? currentLocalsStatus;\n }\n\n // Send response\n\n if (Number(responseStatus) === 204) {\n res.status(Number(responseStatus)).send();\n } else if (\n (responseData !== undefined || responseData !== null) &&\n responseStatus\n ) {\n res.status(Number(responseStatus)).json(responseData);\n } else if (\n Number(responseStatus) &&\n (responseData === undefined || responseData === null)\n ) {\n res.status(Number(responseStatus)).send();\n } else {\n res.status(500).json({\n message: \"No status or data attached to the response\",\n });\n }\n}\n\n/**\n * Type representing all possible actions that can be performed on a controller\n * Combines both standard CRUD operations and auth-specific operations\n */\nexport type ControllerActions =\n | keyof PrismaQueryOptions<any>\n | keyof Omit<AuthPrismaQueryOptions<any>, keyof PrismaQueryOptions<any>>;\n\n/**\n * Middleware to add Prisma query options to the request's query parameters.\n *\n * @template T - The type of the Prisma model.\n * @param {PrismaQueryOptions<T> | AuthPrismaQueryOptions<T>} prismaQueryOptions - The Prisma query options to attach.\n * @param {ControllerActions} action - The controller action to apply.\n * @returns A middleware function that attaches the query options to the request.\n */\nexport function addPrismaQueryOptionsToRequest<T extends Record<string, any>>(\n prismaQueryOptions: PrismaQueryOptions<T> | AuthPrismaQueryOptions<T>,\n action: ControllerActions\n) {\n return (req: ArkosRequest, _: ArkosResponse, next: NextFunction) => {\n const configs = getArkosConfig();\n\n const resolvedOptions = resolvePrismaQueryOptions(\n prismaQueryOptions,\n action\n );\n\n const requestQueryOptions = configs?.request?.parameters\n ?.allowDangerousPrismaQueryOptions\n ? JSON.parse((req.query?.prismaQueryOptions as string) || \"{}\")\n : {};\n\n req.prismaQueryOptions = deepmerge(resolvedOptions, requestQueryOptions);\n\n next();\n };\n}\n\n/**\n * Logs request events with colored text such as errors, requests responses.\n *\n */\nexport function handleRequestLogs(\n req: Request,\n res: Response,\n next: NextFunction\n) {\n const startTime = Date.now();\n\n const methodColors = {\n GET: \"\\x1b[36m\", // Cyan\n POST: \"\\x1b[32m\", // Green\n PUT: \"\\x1b[33m\", // Orange/Yellow\n PATCH: \"\\x1b[33m\", // Orange/Yellow\n DELETE: \"\\x1b[31m\", // Red\n HEAD: \"\\x1b[34m\", // Blue\n OPTIONS: \"\\x1b[34m\", // Blue\n };\n\n const getStatusColor = (statusCode: number) => {\n if (statusCode >= 200 && statusCode < 300) return \"\\x1b[32m\";\n if (statusCode >= 300 && statusCode < 400) return \"\\x1b[33m\";\n if (statusCode >= 400 && statusCode < 500) return \"\\x1b[33m\";\n if (statusCode >= 500) return \"\\x1b[31m\";\n return \"\\x1b[0m\";\n };\n\n res.on(\"finish\", () => {\n const duration = Date.now() - startTime;\n\n const now = new Date();\n const time = now.toTimeString().split(\" \")[0];\n\n const methodColor =\n methodColors[req.method as keyof typeof methodColors] || \"\\x1b[0m\";\n const statusColor = getStatusColor(res.statusCode);\n\n console.info(\n `[\\x1b[36mInfo\\x1b[0m] \\x1b[90m${time}\\x1b[0m ${methodColor}${\n req.method\n }\\x1b[0m ${lenientDecode(req.originalUrl)} ${statusColor}${\n res.statusCode\n }\\x1b[0m \\x1b[35m${duration}ms\\x1b[0m`\n );\n });\n\n next();\n}\n\n/**\n * @deprecated Will be removed in v2.0, please ArkosRouter instead.\n */\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ClassConstructor<T>,\n classValidatorValidationOptions?: ValidatorOptions\n): ArkosRequestHandler;\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ZodSchema<T>\n): ArkosRequestHandler;\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ZodSchema<T> | ClassConstructor<T>,\n classValidatorValidationOptions?: ValidatorOptions\n) {\n return catchAsync(\n async (req: ArkosRequest, _: ArkosResponse, next: ArkosNextFunction) => {\n const validationConfigs = getArkosConfig()?.validation;\n let body = req.body;\n\n if (validationConfigs?.resolver === \"class-validator\" && schemaOrDtoClass)\n req.body = await validateDto(\n schemaOrDtoClass as ClassConstructor<T>,\n body,\n deepmerge(\n {\n whitelist: true,\n forbidNonWhitelisted: true,\n ...classValidatorValidationOptions,\n },\n validationConfigs?.validationOptions || {}\n )\n );\n else if (validationConfigs?.resolver === \"zod\" && schemaOrDtoClass)\n req.body = await validateSchema(schemaOrDtoClass as any, body);\n\n next();\n }\n );\n}\n\nexport function validateRequestInputs(routeConfig: ArkosRouteConfig) {\n const arkosConfig = getArkosConfig();\n const validationConfig = arkosConfig.validation;\n const strictValidation = validationConfig?.strict;\n const validators = routeConfig?.validation;\n const openapi = routeConfig?.experimental?.openapi;\n\n const validationToParameterMapping = {\n query: \"query\",\n params: \"path\",\n headers: \"header\",\n cookies: \"cookie\",\n };\n\n if (\n !validationConfig?.resolver &&\n Object.keys(routeConfig.validation || {}).length > 0\n )\n throw Error(\n `Trying to pass validators into route \\\"${routeConfig.path}\\\" config validation option without choosing a validation resolver under arkos config { validation: {} }.`\n );\n\n if ((validators as any) === true)\n throw Error(\n `Invalid value ${validators} passed to validation option, it can only receive false or object of { query, body, params }.`\n );\n\n const validatorFn: (validator: any, data: any, options: any) => Promise<any> =\n validationConfig?.resolver == \"zod\" ? validateSchema : validateDto;\n const validatorsKey: (\"body\" | \"query\" | \"params\")[] = [\n \"body\",\n \"query\",\n \"params\",\n ];\n\n const isValidValidator =\n validationConfig?.resolver == \"zod\" ? isZodSchema : isClass;\n const validatorName =\n validationConfig?.resolver == \"zod\" ? \"zod schema\" : \"class-validator dto\";\n const validatorNameType =\n validationConfig?.resolver == \"zod\" ? \"Schema\" : \"Dto\";\n\n if (typeof validators === \"object\")\n validatorsKey.forEach((key) => {\n if (\n openapi &&\n typeof openapi === \"object\" &&\n key != \"body\" &&\n openapi.parameters?.some(\n (parameter: any) => parameter.in === validationToParameterMapping[key]\n ) &&\n validators[key]\n ) {\n throw Error(\n `Error in ${routeConfig.path}: when usign validation.${key} you must not define parameters under openapi.parameters as documentation of req.${key} because the ${validatorName} you passed under validation.${key} will be added as jsonSchema into the api documenation, if you wish to define documenation by yourself do not define validation.${key}.`\n );\n }\n\n if (\n openapi &&\n typeof openapi === \"object\" &&\n openapi.requestBody &&\n validators[key] &&\n key === \"body\"\n ) {\n throw Error(\n `When usign validation.${key} you must not define json-schema under openapi.requestBody as documentation for req.${key}, because the ${validatorName} you passed under validation.${key} will be added as json-schema into the api documenation, if you wish to define documenation by yourself do not define validation.${key}.`\n );\n }\n\n if (strictValidation && !(key in validators))\n throw Error(\n `No { validation: { ${key}: ${validatorNameType} } } was found, while using strict validation you will need to pass undefined into ${key} in order to deny any request ${key} input.`\n );\n\n if (\n key in validators &&\n validators?.[key] !== undefined &&\n validators?.[key] !== false &&\n !isValidValidator(validators[key])\n )\n throw Error(\n `Your validation resolver is set to ${arkosConfig.validation!.resolver}, please provide a valid ${validatorName} in order to use in { validation: { ${key}: ${validatorNameType} } } under route ${routeConfig.path}`\n );\n });\n\n return catchAsync(\n async (req: ArkosRequest, _: ArkosResponse, next: ArkosNextFunction) => {\n for (const key of validatorsKey) {\n const reqInput = Object.keys(req[key] || {}).length > 0;\n const validator = (validators as any)?.[key];\n const notAllowedInputError = new AppError(\n `Request ${key} is not allowed on this route`,\n 400,\n `Request${capitalize(key)}NotAllowed`,\n { [key]: req[key] }\n );\n\n if (\n ((typeof validators === \"boolean\" && validators === false) ||\n validator === false) &&\n reqInput\n )\n throw notAllowedInputError;\n\n if (strictValidation && !validator && reqInput)\n throw notAllowedInputError;\n if (validator)\n try {\n req[key] = await validatorFn(\n validator,\n req[key],\n arkosConfig.validation?.validationOptions\n );\n } catch (err: any) {\n const resolver = validationConfig?.resolver;\n const isZod = validationConfig?.resolver === \"zod\";\n\n const prettifiedError = errorPrettifier.prettify(\n resolver as any,\n err\n );\n const error = prettifiedError[0];\n throw new AppError(\n error.message,\n 400,\n `InvalidRequest${pascalCase(key)}`,\n isZod ? err.format() : err\n );\n }\n }\n\n next();\n }\n );\n}\n"]}
|
|
@@ -32,10 +32,14 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
32
32
|
return result;
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
35
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
39
|
exports.default = errorHandler;
|
|
37
40
|
const errorControllerHelper = __importStar(require("./utils/error-handler.helpers.js"));
|
|
38
41
|
const app_1 = require("../../app.js");
|
|
42
|
+
const multer_error_handler_1 = __importDefault(require("./utils/multer-error-handler.js"));
|
|
39
43
|
function errorHandler(err, req, res, _) {
|
|
40
44
|
console.error("[\x1b[31mError\x1b[0m]:", err);
|
|
41
45
|
err.statusCode = err.statusCode || 500;
|
|
@@ -60,6 +64,9 @@ function errorHandler(err, req, res, _) {
|
|
|
60
64
|
case "PrismaClientInitializationError":
|
|
61
65
|
error = errorControllerHelper.handlePrismaClientInitializationError(err);
|
|
62
66
|
break;
|
|
67
|
+
case "MulterError":
|
|
68
|
+
error = multer_error_handler_1.default.handle(err);
|
|
69
|
+
break;
|
|
63
70
|
}
|
|
64
71
|
switch (err.code) {
|
|
65
72
|
case "P1000":
|
|
@@ -115,52 +122,28 @@ function errorHandler(err, req, res, _) {
|
|
|
115
122
|
}, req, res);
|
|
116
123
|
sendProductionError({ message, ...rest }, req, res);
|
|
117
124
|
}
|
|
118
|
-
function sendDevelopmentError(err,
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
...rest,
|
|
125
|
-
stack: err?.originalError?.stack?.split?.("\n"),
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
else
|
|
129
|
-
res.status(err.statusCode).json({
|
|
130
|
-
title: "Internal server error",
|
|
131
|
-
message: err.message,
|
|
132
|
-
});
|
|
125
|
+
function sendDevelopmentError(err, _, res) {
|
|
126
|
+
res.status(err.statusCode).json({
|
|
127
|
+
...err,
|
|
128
|
+
message: err.message?.split?.("\n")[err.message?.split?.("\n").length - 1],
|
|
129
|
+
stack: err?.originalError?.stack?.split?.("\n"),
|
|
130
|
+
});
|
|
133
131
|
}
|
|
134
|
-
function sendProductionError(err,
|
|
135
|
-
if (
|
|
136
|
-
if (err.isOperational)
|
|
137
|
-
res.status(err.statusCode).json({
|
|
138
|
-
status: err.status,
|
|
139
|
-
message: err.message,
|
|
140
|
-
meta: err.meta || {},
|
|
141
|
-
code: err.code || "Unknown",
|
|
142
|
-
});
|
|
143
|
-
else
|
|
144
|
-
res.status(500).json({
|
|
145
|
-
status: "error",
|
|
146
|
-
message: "Internal server error, please try again later.",
|
|
147
|
-
code: "Unknown",
|
|
148
|
-
meta: {},
|
|
149
|
-
});
|
|
150
|
-
return;
|
|
151
|
-
}
|
|
152
|
-
if (err.isOperational) {
|
|
132
|
+
function sendProductionError(err, _, res) {
|
|
133
|
+
if (err.isOperational)
|
|
153
134
|
res.status(err.statusCode).json({
|
|
154
|
-
|
|
135
|
+
status: err.status,
|
|
155
136
|
message: err.message,
|
|
156
|
-
|
|
137
|
+
meta: err.meta || {},
|
|
138
|
+
code: err.code || "Unknown",
|
|
139
|
+
});
|
|
140
|
+
else
|
|
141
|
+
res.status(500).json({
|
|
142
|
+
status: "error",
|
|
143
|
+
message: "Internal server error, please try again later.",
|
|
144
|
+
code: "InternalServerError",
|
|
145
|
+
meta: {},
|
|
157
146
|
});
|
|
158
|
-
return;
|
|
159
|
-
}
|
|
160
|
-
res.status(err.statusCode).json({
|
|
161
|
-
title: "Internal server error",
|
|
162
|
-
message: "Internal server error, please try again later.",
|
|
163
|
-
});
|
|
164
147
|
}
|
|
165
148
|
process.on("SIGTERM", () => {
|
|
166
149
|
if (process.env.ARKOS_BUILD !== "true") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-handler.controller.js","sourceRoot":"","sources":["../../../../src/modules/error-handler/error-handler.controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { NextFunction, Request, Response } from \"express\";\nimport AppError from \"./utils/app-error\";\nimport * as errorControllerHelper from \"./utils/error-handler.helpers\";\nimport { getAppServer } from \"../../app\";\n\n/**\n * Error handling middleware for Express.\n *\n * This middleware function handles all errors in the Express application.\n * It checks for the environment (development or production) and sends appropriate error responses\n * based on whether the environment is production or not. It also maps specific errors such as\n * JWT errors, Prisma client errors, and database-related errors to specific helper functions for handling.\n *\n * @param {AppError} err - The error object thrown by the application.\n * @param {Request} req - The Express request object.\n * @param {Response} res - The Express response object.\n * @param {NextFunction} _ - The next middleware function in the chain.\n *\n * @returns {void} - Sends the response with the error details to the client.\n */\nexport default function errorHandler(\n err: AppError,\n req: Request,\n res: Response,\n _: NextFunction\n): void {\n console.error(\"[\\x1b[31mError\\x1b[0m]:\", err);\n\n err.statusCode = err.statusCode || 500;\n err.status = err.status || \"error\";\n\n let error: any = {\n ...err,\n message: err.message,\n stack: err?.stack || undefined,\n };\n\n if (process.env.ARKOS_BUILD === \"true\") delete error?.stack;\n\n switch (err.name) {\n case \"JsonWebTokenError\":\n error = errorControllerHelper.handleJWTError();\n break;\n case \"TokenExpiredError\":\n error = errorControllerHelper.handleJWTExpired();\n break;\n case \"PrismaClientValidationError\":\n error = errorControllerHelper.handlePrismaClientValidationError(err);\n break;\n case \"PrismaClientInitializationError\":\n error = errorControllerHelper.handlePrismaClientInitializationError(err);\n break;\n }\n\n switch (err.code) {\n case \"P1000\":\n error = errorControllerHelper.handleAuthenticationError(err);\n break;\n case \"P1001\":\n error = errorControllerHelper.handleServerNotReachableError(err);\n break;\n case \"P1002\":\n error = errorControllerHelper.handleConnectionTimeoutError(err);\n break;\n case \"P1003\":\n error = errorControllerHelper.handleDatabaseNotFoundError(err);\n break;\n case \"P2000\":\n error = errorControllerHelper.handleFieldValueTooLargeError(err);\n break;\n case \"P2001\":\n error = errorControllerHelper.handleRecordNotFoundError(err);\n break;\n case \"P2002\":\n error = errorControllerHelper.handleUniqueConstraintError(err);\n break;\n case \"P2003\":\n error = errorControllerHelper.handleForeignKeyConstraintError(err);\n break;\n case \"P2004\":\n error = errorControllerHelper.handleConstraintFailedError(err);\n break;\n case \"P2025\":\n error = errorControllerHelper.handleNonExistingRecord(err);\n break;\n case \"P3000\":\n error = errorControllerHelper.handleSchemaCreationFailedError(err);\n break;\n case \"P3001\":\n error = errorControllerHelper.handleMigrationAlreadyAppliedError(err);\n break;\n case \"P3002\":\n error = errorControllerHelper.handleMigrationScriptFailedError(err);\n break;\n case \"P3003\":\n error = errorControllerHelper.handleVersionMismatchError(err);\n break;\n }\n\n const { message, ...rest } = error;\n if (process.env.ARKOS_BUILD !== \"true\")\n return sendDevelopmentError(\n {\n message: error.message,\n ...rest,\n stack: err.stack,\n originalError: err,\n },\n req,\n res\n );\n\n sendProductionError({ message, ...rest }, req, res);\n}\n\n/**\n * Sends a detailed error response in development mode.\n *\n * In development, the error response includes full error details, including\n * the stack trace and the complete error message.\n *\n * @param {AppError} err - The error object.\n * @param {Request} req - The Express request object.\n * @param {Response} res - The Express response object.\n *\n * @returns {void} - Sends the response with the error details to the client.\n */\nfunction sendDevelopmentError(err: any, req: Request, res: Response): void {\n if (req.originalUrl.startsWith(\"/api\")) {\n const { message, code, ...rest } = err;\n\n res.status(err.statusCode).json({\n message:\n err.message?.split?.(\"\\n\")[err.message?.split?.(\"\\n\").length - 1],\n code: code || \"Unknown\",\n ...rest,\n stack: err?.originalError?.stack?.split?.(\"\\n\"),\n });\n } else\n res.status(err.statusCode).json({\n title: \"Internal server error\",\n message: err.message,\n });\n}\n\n/**\n * Sends a generic error response in production mode.\n *\n * In production, sensitive error details (such as stack traces) are not exposed\n * to the client. Only operational errors are shown with a generic message.\n *\n * @param {AppError} err - The error object.\n * @param {Request} req - The Express request object.\n * @param {Response} res - The Express response object.\n *\n * @returns {void} - Sends the response with the error details to the client.\n */\nfunction sendProductionError(err: AppError, req: Request, res: Response): void {\n if (req.originalUrl.startsWith(\"/api\")) {\n if (err.isOperational)\n res.status(err.statusCode).json({\n status: err.status,\n message: err.message,\n meta: err.meta || {},\n code: err.code || \"Unknown\",\n });\n else\n res.status(500).json({\n status: \"error\",\n message: \"Internal server error, please try again later.\",\n code: \"Unknown\",\n meta: {},\n });\n\n return;\n }\n\n if (err.isOperational) {\n res.status(err.statusCode).json({\n title: \"Internal server error\",\n message: err.message,\n code: \"Unknown\",\n });\n return;\n }\n\n res.status(err.statusCode).json({\n title: \"Internal server error\",\n message: \"Internal server error, please try again later.\",\n });\n}\n\n/**\n * Gracefully handles process termination by listening for SIGTERM signal.\n *\n * - In production and staging environments, it will log a shutdown message\n * and attempt to close the server gracefully.\n * - In development or non-production environments, it will immediately exit the process.\n *\n * @returns {void}\n */\nprocess.on(\"SIGTERM\", () => {\n if (process.env.ARKOS_BUILD !== \"true\") {\n process.exit();\n } else {\n console.error(\"SIGTERM RECEIVED in Production. Shutting down gracefully!\");\n const server = getAppServer();\n\n if (server?.close)\n server.close(() => {\n console.error(\"Process terminated!!!\");\n process.exit();\n });\n else\n setTimeout(() => {\n process.exit(1);\n }, 0);\n }\n});\n"]}
|
|
1
|
+
{"version":3,"file":"error-handler.controller.js","sourceRoot":"","sources":["../../../../src/modules/error-handler/error-handler.controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { NextFunction, Request, Response } from \"express\";\nimport AppError from \"./utils/app-error\";\nimport * as errorControllerHelper from \"./utils/error-handler.helpers\";\nimport { getAppServer } from \"../../app\";\nimport multerErrorHandler from \"./utils/multer-error-handler\";\nimport { MulterError } from \"multer\";\n\n/**\n * Error handling middleware for Express.\n *\n * This middleware function handles all errors in the Express application.\n * It checks for the environment (development or production) and sends appropriate error responses\n * based on whether the environment is production or not. It also maps specific errors such as\n * JWT errors, Prisma client errors, and database-related errors to specific helper functions for handling.\n *\n * @param {AppError} err - The error object thrown by the application.\n * @param {Request} req - The Express request object.\n * @param {Response} res - The Express response object.\n * @param {NextFunction} _ - The next middleware function in the chain.\n *\n * @returns {void} - Sends the response with the error details to the client.\n */\nexport default function errorHandler(\n err: AppError,\n req: Request,\n res: Response,\n _: NextFunction\n): void {\n console.error(\"[\\x1b[31mError\\x1b[0m]:\", err);\n\n err.statusCode = err.statusCode || 500;\n err.status = err.status || \"error\";\n\n let error: any = {\n ...err,\n message: err.message,\n stack: err?.stack || undefined,\n };\n\n if (process.env.ARKOS_BUILD === \"true\") delete error?.stack;\n\n switch (err.name) {\n case \"JsonWebTokenError\":\n error = errorControllerHelper.handleJWTError();\n break;\n case \"TokenExpiredError\":\n error = errorControllerHelper.handleJWTExpired();\n break;\n case \"PrismaClientValidationError\":\n error = errorControllerHelper.handlePrismaClientValidationError(err);\n break;\n case \"PrismaClientInitializationError\":\n error = errorControllerHelper.handlePrismaClientInitializationError(err);\n break;\n case \"MulterError\":\n error = multerErrorHandler.handle(err as unknown as MulterError);\n break;\n }\n\n switch (err.code) {\n case \"P1000\":\n error = errorControllerHelper.handleAuthenticationError(err);\n break;\n case \"P1001\":\n error = errorControllerHelper.handleServerNotReachableError(err);\n break;\n case \"P1002\":\n error = errorControllerHelper.handleConnectionTimeoutError(err);\n break;\n case \"P1003\":\n error = errorControllerHelper.handleDatabaseNotFoundError(err);\n break;\n case \"P2000\":\n error = errorControllerHelper.handleFieldValueTooLargeError(err);\n break;\n case \"P2001\":\n error = errorControllerHelper.handleRecordNotFoundError(err);\n break;\n case \"P2002\":\n error = errorControllerHelper.handleUniqueConstraintError(err);\n break;\n case \"P2003\":\n error = errorControllerHelper.handleForeignKeyConstraintError(err);\n break;\n case \"P2004\":\n error = errorControllerHelper.handleConstraintFailedError(err);\n break;\n case \"P2025\":\n error = errorControllerHelper.handleNonExistingRecord(err);\n break;\n case \"P3000\":\n error = errorControllerHelper.handleSchemaCreationFailedError(err);\n break;\n case \"P3001\":\n error = errorControllerHelper.handleMigrationAlreadyAppliedError(err);\n break;\n case \"P3002\":\n error = errorControllerHelper.handleMigrationScriptFailedError(err);\n break;\n case \"P3003\":\n error = errorControllerHelper.handleVersionMismatchError(err);\n break;\n }\n\n const { message, ...rest } = error;\n if (process.env.ARKOS_BUILD !== \"true\")\n return sendDevelopmentError(\n {\n message: error.message,\n ...rest,\n stack: err.stack,\n originalError: err,\n },\n req,\n res\n );\n\n sendProductionError({ message, ...rest }, req, res);\n}\n\n/**\n * Sends a detailed error response in development mode.\n *\n * In development, the error response includes full error details, including\n * the stack trace and the complete error message.\n *\n * @param {AppError} err - The error object.\n * @param {Request} _ - The Express request object.\n * @param {Response} res - The Express response object.\n *\n * @returns {void} - Sends the response with the error details to the client.\n */\nfunction sendDevelopmentError(err: any, _: Request, res: Response): void {\n res.status(err.statusCode).json({\n ...err,\n message: err.message?.split?.(\"\\n\")[err.message?.split?.(\"\\n\").length - 1],\n stack: err?.originalError?.stack?.split?.(\"\\n\"),\n });\n}\n\n/**\n * Sends a generic error response in production mode.\n *\n * In production, sensitive error details (such as stack traces) are not exposed\n * to the client. Only operational errors are shown with a generic message.\n *\n * @param {AppError} err - The error object.\n * @param {Request} _ - The Express request object.\n * @param {Response} res - The Express response object.\n *\n * @returns {void} - Sends the response with the error details to the client.\n */\nfunction sendProductionError(err: AppError, _: Request, res: Response): void {\n if (err.isOperational)\n res.status(err.statusCode).json({\n status: err.status,\n message: err.message,\n meta: err.meta || {},\n code: err.code || \"Unknown\",\n });\n else\n res.status(500).json({\n status: \"error\",\n message: \"Internal server error, please try again later.\",\n code: \"InternalServerError\",\n meta: {},\n });\n}\n\n/**\n * Gracefully handles process termination by listening for SIGTERM signal.\n *\n * - In production and staging environments, it will log a shutdown message\n * and attempt to close the server gracefully.\n * - In development or non-production environments, it will immediately exit the process.\n *\n * @returns {void}\n */\nprocess.on(\"SIGTERM\", () => {\n if (process.env.ARKOS_BUILD !== \"true\") {\n process.exit();\n } else {\n console.error(\"SIGTERM RECEIVED in Production. Shutting down gracefully!\");\n const server = getAppServer();\n\n if (server?.close)\n server.close(() => {\n console.error(\"Process terminated!!!\");\n process.exit();\n });\n else\n setTimeout(() => {\n process.exit(1);\n }, 0);\n }\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-error.js","sourceRoot":"","sources":["../../../../../src/modules/error-handler/utils/app-error.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"app-error.js","sourceRoot":"","sources":["../../../../../src/modules/error-handler/utils/app-error.ts"],"names":[],"mappings":";;AA+BA,MAAM,QAAS,SAAQ,KAAK;IAe1B,YACE,OAAe,EACf,UAAkB,EAClB,IAAmC,EACnC,IAAmC;QAEnC,KAAK,CAAC,OAAO,CAAC,CAAC;QAjBjB,SAAI,GAAY,SAAS,CAAC;QAmBxB,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,+BAA+B,CAAC;QAC1D,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;QACjE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAE1B,IAAI,IAAI,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,OAAO,IAAI;YAC7C,MAAM,IAAI,QAAQ,CAChB,kCAAkC,OAAO,IAAI,+DAA+D,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,EAC5I,GAAG,EACH,gBAAgB,EAChB,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;QAEJ,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,SAAS,CAAC;QAC5D,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAC/C,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,SAAS,CAAC;QAC5D,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAC/C,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;QAEjC,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC;CACF;AAED,kBAAe,QAAQ,CAAC","sourcesContent":["/**\n * Custom error class for handling application errors.\n *\n * @extends {Error}\n *\n * @property {number} statusCode - HTTP status code of the error.\n * @property {string} status - Status message derived from the status code (`fail` for 4xx, `error` for 5xx).\n * @property {boolean} isOperational - Indicates if the error is operational (intended for client visibility).\n * @property {string} [code] - Optional error code for categorization.\n * @property {Record<string, any>} [meta] - Additional metadata related to the error.\n *\n * @example\n * ```typescript\n *\n * function getUser(id: string) {\n * if (!id) {\n * throw new AppError('User ID is required', 400, 'UserIDMissing', { field: 'id' });\n * }\n * // Simulate a user not found scenario\n * throw new AppError('User not found', 404, 'UserNotFound', { userId: id });\n * }\n *\n * try {\n * getUser('');\n * } catch (error) {\n * if (error instanceof AppError) {\n * console.error(`Error: ${error.message}, Code: ${error.code}, Status: ${error.status}`);\n * }\n * }\n * ```\n */\nclass AppError extends Error {\n statusCode: number;\n status: string;\n public isOperational: boolean;\n code?: string = \"Unknown\";\n meta?: Record<string, any>;\n\n /**\n * Creates an instance of AppError.\n *\n * @param {string} message - The error message.\n * @param {number} statusCode - The HTTP status code.\n * @param {Record<string, any>} [meta] - Additional metadata for debugging or client feedback.\n * @param {string} [code] - A custom error code for categorization.\n */\n constructor(\n message: string,\n statusCode: number,\n code?: string | Record<string, any>,\n meta?: Record<string, any> | string\n ) {\n super(message);\n\n this.message = message || \"An error occurred, try again!\";\n this.statusCode = statusCode;\n this.status = `${statusCode}`.startsWith(\"4\") ? \"fail\" : \"error\";\n this.isOperational = true;\n\n if (code && meta && typeof code === typeof meta)\n throw new AppError(\n `meta and code must not both be ${typeof code}, one must be of type object and other string. but received ${JSON.stringify({ meta, code })}`,\n 500,\n \"AppErrorMisuse\",\n { meta, code }\n );\n\n if (typeof code === \"string\") this.code = code || \"Unknown\";\n if (typeof code === \"object\") this.meta = code;\n if (typeof meta === \"string\") this.code = meta || \"Unknown\";\n if (typeof meta === \"object\") this.meta = meta;\n if (!code) this.code = \"Unknown\";\n\n Error.captureStackTrace(this, this.constructor);\n }\n}\n\nexport default AppError;\n"]}
|
|
@@ -30,8 +30,9 @@ function handleJWTExpired() {
|
|
|
30
30
|
return new app_error_1.default("Your token has expired, Please log again!", 401);
|
|
31
31
|
}
|
|
32
32
|
function handlePrismaClientValidationError(err) {
|
|
33
|
-
const message = err?.message?.split("\n")[err?.message?.split("\n").length - 1]
|
|
34
|
-
|
|
33
|
+
const message = err?.message?.split("\n")[err?.message?.split("\n").length - 1] ||
|
|
34
|
+
"Invalid query arguments";
|
|
35
|
+
return new app_error_1.default(message.split(". Did you")[0], 400, "InvalidQueryArgument");
|
|
35
36
|
}
|
|
36
37
|
function handleAuthenticationError(_) {
|
|
37
38
|
const message = "Authentication failed against the database server. Please check your credentials.";
|
|
@@ -58,15 +59,13 @@ function handleRecordNotFoundError(_) {
|
|
|
58
59
|
return new app_error_1.default(message, 404);
|
|
59
60
|
}
|
|
60
61
|
function handleUniqueConstraintError(err) {
|
|
61
|
-
const field = err?.meta?.target || "unknown
|
|
62
|
-
const message = `Duplicate
|
|
63
|
-
return new app_error_1.default(message, 409,
|
|
64
|
-
`${(0, change_case_helpers_1.pascalCase)(err.meta?.modelName)}${(0, change_case_helpers_1.pascalCase)(err.meta?.target?.[0])}UniqueConstraint`) ||
|
|
65
|
-
"Unknown");
|
|
62
|
+
const field = err?.meta?.target || "unknown";
|
|
63
|
+
const message = `Duplicate unique field(s) ${Array.isArray(field) ? field.map((f) => `'${f}'`).join(", ") : `'${field}'`}`;
|
|
64
|
+
return new app_error_1.default(message, 409, "DuplicateRecords");
|
|
66
65
|
}
|
|
67
66
|
function handleForeignKeyConstraintError(_) {
|
|
68
67
|
const message = "Foreign key constraint violation. Ensure that the referenced record exists.";
|
|
69
|
-
return new app_error_1.default(message, 400);
|
|
68
|
+
return new app_error_1.default(message, 400, "ForeignKeyViolation");
|
|
70
69
|
}
|
|
71
70
|
function handleConstraintFailedError(err) {
|
|
72
71
|
const constraint = err?.meta?.constraint || "unknown constraint";
|
|
@@ -100,6 +99,6 @@ function handleNonExistingRecord(err) {
|
|
|
100
99
|
return new app_error_1.default(message, model ? 400 : 404, `${model ? "Inline" : ""}${(0, change_case_helpers_1.pascalCase)(model || "")}RecordNotFound`);
|
|
101
100
|
}
|
|
102
101
|
function handlePrismaClientInitializationError(_) {
|
|
103
|
-
return new app_error_1.default("Service temporarily unavailable", 503, "ServiceUnavailable");
|
|
102
|
+
return new app_error_1.default("Service temporarily unavailable", 503, "ServiceUnavailable", {});
|
|
104
103
|
}
|
|
105
104
|
//# sourceMappingURL=error-handler.helpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-handler.helpers.js","sourceRoot":"","sources":["../../../../../src/modules/error-handler/utils/error-handler.helpers.ts"],"names":[],"mappings":";;;;;AAGA,wCAEC;AAED,4CAEC;AAED,
|
|
1
|
+
{"version":3,"file":"error-handler.helpers.js","sourceRoot":"","sources":["../../../../../src/modules/error-handler/utils/error-handler.helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import { pascalCase } from \"../../../utils/helpers/change-case.helpers\";\nimport AppError from \"./app-error\";\n\nexport function handleJWTError() {\n return new AppError(\"Invalid token. Please log in again!\", 401);\n}\n\nexport function handleJWTExpired() {\n return new AppError(\"Your token has expired, Please log again!\", 401);\n}\n\nexport function handlePrismaClientValidationError(err: AppError) {\n const message =\n err?.message?.split(\"\\n\")[err?.message?.split(\"\\n\").length - 1] ||\n \"Invalid query arguments\";\n return new AppError(\n message.split(\". Did you\")[0],\n 400,\n \"InvalidQueryArgument\"\n );\n}\n\nexport function handleAuthenticationError(_: AppError) {\n const message =\n \"Authentication failed against the database server. Please check your credentials.\";\n return new AppError(message, 401);\n}\n\nexport function handleServerNotReachableError(_: AppError) {\n const message =\n \"The database server is not reachable. Verify your connection string or ensure the server is online.\";\n return new AppError(message, 503);\n}\n\nexport function handleConnectionTimeoutError(_: AppError) {\n const message =\n \"Connection to the database timed out. Please check server performance or network connectivity.\";\n return new AppError(message, 504);\n}\n\nexport function handleDatabaseNotFoundError(_: AppError) {\n const message = \"The specified database does not exist on the server.\";\n return new AppError(message, 404);\n}\n\nexport function handleFieldValueTooLargeError(err: AppError) {\n const message = `The value for the field \"${err?.meta?.field_name}\" is too large. Please provide a smaller value.`;\n return new AppError(message, 400);\n}\n\nexport function handleRecordNotFoundError(_: AppError) {\n const message =\n \"No record found for the given query. Ensure the query parameters are correct.\";\n return new AppError(message, 404);\n}\n\nexport function handleUniqueConstraintError(err: any) {\n const field = err?.meta?.target || \"unknown\";\n const message = `Duplicate unique field(s) ${Array.isArray(field) ? field.map((f) => `'${f}'`).join(\", \") : `'${field}'`}`;\n return new AppError(message, 409, \"DuplicateRecords\");\n}\n\nexport function handleForeignKeyConstraintError(_: AppError) {\n const message =\n \"Foreign key constraint violation. Ensure that the referenced record exists.\";\n return new AppError(message, 400, \"ForeignKeyViolation\");\n}\n\nexport function handleConstraintFailedError(err: AppError) {\n const constraint = err?.meta?.constraint || \"unknown constraint\";\n const message = `A database constraint \"${constraint}\" failed. Please review your input data.`;\n return new AppError(message, 400);\n}\n\nexport function handleSchemaCreationFailedError(_: AppError) {\n const message =\n \"Failed to create the database schema. Verify the schema definition and try again.\";\n return new AppError(message, 500);\n}\n\nexport function handleMigrationAlreadyAppliedError(err: AppError) {\n const migrationName = err?.meta?.migration || \"unknown migration\";\n const message = `The migration \"${migrationName}\" has already been applied to the database.`;\n return new AppError(message, 409);\n}\n\nexport function handleMigrationScriptFailedError(err: AppError) {\n const migrationName = err?.meta?.migration || \"unknown migration\";\n const message = `The migration script \"${migrationName}\" failed. Review the script and resolve any issues.`;\n return new AppError(message, 500);\n}\n\nexport function handleVersionMismatchError(_: AppError) {\n const message = `Version mismatch: The database schema and migration versions are inconsistent. Please check and resolve this issue.`;\n return new AppError(message, 400);\n}\n\nexport function handleNonExistingRecord(err: {\n meta?: Record<string, any>;\n [x: string]: any;\n}) {\n const message =\n err?.meta?.cause ||\n `Operation could not be completed as some required record was not found`;\n\n const model = err?.meta?.cause\n ? err?.meta?.cause?.split(\"No '\")?.[1]?.split?.(\"'\")?.[0]\n : \"\";\n\n return new AppError(\n message,\n model ? 400 : 404,\n `${model ? \"Inline\" : \"\"}${pascalCase(model || \"\")}RecordNotFound`\n );\n}\n\nexport function handlePrismaClientInitializationError(_: any) {\n return new AppError(\n \"Service temporarily unavailable\",\n 503,\n \"ServiceUnavailable\",\n {}\n );\n}\n"]}
|