arkos 1.2.16-test → 1.2.19-test

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.
Files changed (88) hide show
  1. package/dist/cjs/app.js +1 -1
  2. package/dist/cjs/modules/auth/auth.service.js +0 -7
  3. package/dist/cjs/modules/auth/auth.service.js.map +1 -1
  4. package/dist/cjs/paths.js +1 -1
  5. package/dist/cjs/server.js +2 -2
  6. package/dist/cjs/server.js.map +1 -1
  7. package/dist/cjs/utils/cli/build.js +2 -2
  8. package/dist/cjs/utils/cli/build.js.map +1 -1
  9. package/dist/cjs/utils/cli/dev.js +4 -2
  10. package/dist/cjs/utils/cli/dev.js.map +1 -1
  11. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-middlewares.js +33 -66
  12. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-middlewares.js.map +1 -1
  13. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js +16 -10
  14. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js.map +1 -1
  15. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-router-template.js +5 -0
  16. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-router-template.js.map +1 -1
  17. package/dist/cjs/utils/helpers/global.helpers.js +21 -0
  18. package/dist/cjs/utils/helpers/global.helpers.js.map +1 -1
  19. package/dist/cjs/utils/helpers/models.helpers.js +0 -1
  20. package/dist/cjs/utils/helpers/models.helpers.js.map +1 -1
  21. package/dist/esm/app.js +1 -1
  22. package/dist/esm/exports/auth/index.js +1 -1
  23. package/dist/esm/exports/controllers/index.js +2 -2
  24. package/dist/esm/exports/error-handler/index.js +2 -2
  25. package/dist/esm/exports/index.js +2 -2
  26. package/dist/esm/exports/middlewares/index.js +1 -1
  27. package/dist/esm/exports/prisma/index.js +1 -1
  28. package/dist/esm/exports/services/index.js +4 -4
  29. package/dist/esm/exports/utils/index.js +2 -2
  30. package/dist/esm/exports/validation/index.js +2 -2
  31. package/dist/esm/modules/auth/auth.controller.js +7 -7
  32. package/dist/esm/modules/auth/auth.router.js +6 -6
  33. package/dist/esm/modules/auth/auth.service.js +6 -13
  34. package/dist/esm/modules/auth/auth.service.js.map +1 -1
  35. package/dist/esm/modules/auth/utils/helpers/auth.controller.helpers.js +2 -2
  36. package/dist/esm/modules/base/base.controller.js +7 -7
  37. package/dist/esm/modules/base/base.middlewares.js +6 -6
  38. package/dist/esm/modules/base/base.router.js +4 -4
  39. package/dist/esm/modules/base/base.service.js +6 -6
  40. package/dist/esm/modules/base/utils/helpers/base.controller.helpers.js +1 -1
  41. package/dist/esm/modules/base/utils/helpers/base.middlewares.helpers.js +1 -1
  42. package/dist/esm/modules/base/utils/helpers/base.router.helpers.js +6 -6
  43. package/dist/esm/modules/base/utils/helpers/base.service.helpers.js +1 -1
  44. package/dist/esm/modules/email/email.service.js +2 -2
  45. package/dist/esm/modules/error-handler/error-handler.controller.js +3 -3
  46. package/dist/esm/modules/error-handler/utils/error-handler.helpers.js +1 -1
  47. package/dist/esm/modules/file-upload/file-upload.controller.js +7 -7
  48. package/dist/esm/modules/file-upload/file-upload.router.js +5 -5
  49. package/dist/esm/modules/file-upload/file-upload.service.js +5 -5
  50. package/dist/esm/modules/file-upload/utils/helpers/file-upload.helpers.js +2 -2
  51. package/dist/esm/modules/swagger/swagger.router.js +2 -2
  52. package/dist/esm/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +2 -2
  53. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js +3 -3
  54. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js +2 -2
  55. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schema.js +2 -2
  56. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes.js +2 -2
  57. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes.js +3 -3
  58. package/dist/esm/modules/swagger/utils/helpers/swagger.router.helpers.js +9 -9
  59. package/dist/esm/server.js +2 -2
  60. package/dist/esm/server.js.map +1 -1
  61. package/dist/esm/utils/cli/build.js +4 -4
  62. package/dist/esm/utils/cli/build.js.map +1 -1
  63. package/dist/esm/utils/cli/dev.js +9 -7
  64. package/dist/esm/utils/cli/dev.js.map +1 -1
  65. package/dist/esm/utils/cli/generate.js +4 -4
  66. package/dist/esm/utils/cli/index.js +5 -5
  67. package/dist/esm/utils/cli/start.js +4 -4
  68. package/dist/esm/utils/cli/utils/cli.helpers.js +2 -2
  69. package/dist/esm/utils/cli/utils/template-generator/templates/generate-auth-configs-template.js +1 -1
  70. package/dist/esm/utils/cli/utils/template-generator/templates/generate-middlewares.js +34 -67
  71. package/dist/esm/utils/cli/utils/template-generator/templates/generate-middlewares.js.map +1 -1
  72. package/dist/esm/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js +18 -12
  73. package/dist/esm/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js.map +1 -1
  74. package/dist/esm/utils/cli/utils/template-generator/templates/generate-router-template.js +6 -1
  75. package/dist/esm/utils/cli/utils/template-generator/templates/generate-router-template.js.map +1 -1
  76. package/dist/esm/utils/cli/utils/template-generator/templates/generate-service-template.js +2 -2
  77. package/dist/esm/utils/cli/utils/template-generators.js +6 -6
  78. package/dist/esm/utils/features/api.features.js +4 -4
  79. package/dist/esm/utils/features/change-case.features.js +1 -1
  80. package/dist/esm/utils/helpers/global.helpers.js +20 -0
  81. package/dist/esm/utils/helpers/global.helpers.js.map +1 -1
  82. package/dist/esm/utils/helpers/models.helpers.js +4 -5
  83. package/dist/esm/utils/helpers/models.helpers.js.map +1 -1
  84. package/dist/esm/utils/helpers/prisma.helpers.js +4 -4
  85. package/dist/esm/utils/validate-dto.js +1 -1
  86. package/dist/esm/utils/validate-schema.js +1 -1
  87. package/dist/types/utils/helpers/global.helpers.d.ts +1 -0
  88. package/package.json +2 -4
@@ -1,4 +1,4 @@
1
- import { BaseController } from "./../../modules/base/base.controller.js";
2
- import fileUploadController from "../../modules/file-upload/file-upload.controller.js";
1
+ import { BaseController } from "./../../modules/base/base.controller";
2
+ import fileUploadController from "../../modules/file-upload/file-upload.controller";
3
3
  export { fileUploadController, BaseController };
4
4
  //# sourceMappingURL=index.js.map
@@ -1,4 +1,4 @@
1
- import catchAsync from "../../modules/error-handler/utils/catch-async.js";
2
- import AppError from "../../modules/error-handler/utils/app-error.js";
1
+ import catchAsync from "../../modules/error-handler/utils/catch-async";
2
+ import AppError from "../../modules/error-handler/utils/app-error";
3
3
  export { catchAsync, AppError };
4
4
  //# sourceMappingURL=index.js.map
@@ -1,5 +1,5 @@
1
- import { BaseController } from "./../modules/base/base.controller.js";
2
- import { initApp, getArkosConfig } from "../server.js";
1
+ import { BaseController } from "./../modules/base/base.controller";
2
+ import { initApp, getArkosConfig } from "../server";
3
3
  const arkos = {
4
4
  init: initApp,
5
5
  };
@@ -1,2 +1,2 @@
1
- export { addPrismaQueryOptionsToRequest, handleRequestBodyValidationAndTransformation, } from "../../modules/base/base.middlewares.js";
1
+ export { addPrismaQueryOptionsToRequest, handleRequestBodyValidationAndTransformation, } from "../../modules/base/base.middlewares";
2
2
  //# sourceMappingURL=index.js.map
@@ -1,3 +1,3 @@
1
- import { getModels } from "../../utils/helpers/models.helpers.js";
1
+ import { getModels } from "../../utils/helpers/models.helpers";
2
2
  export { getModels as getPrismaModels, };
3
3
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
- import { getFileUploadServices, FileUploadService, } from "../../modules/file-upload/file-upload.service.js";
2
- import authService, { AuthService } from "../../modules/auth/auth.service.js";
3
- import emailService, { EmailService } from "../../modules/email/email.service.js";
4
- import { BaseService, getBaseServices } from "../../modules/base/base.service.js";
1
+ import { getFileUploadServices, FileUploadService, } from "../../modules/file-upload/file-upload.service";
2
+ import authService, { AuthService } from "../../modules/auth/auth.service";
3
+ import emailService, { EmailService } from "../../modules/email/email.service";
4
+ import { BaseService, getBaseServices } from "../../modules/base/base.service";
5
5
  export { authService, AuthService };
6
6
  export { BaseService, getBaseServices };
7
7
  export { emailService, EmailService };
@@ -1,4 +1,4 @@
1
- export * from "../../utils/helpers/change-case.helpers.js";
2
- import APIFeatures, { apiFeatures } from "../../utils/features/api.features.js";
1
+ export * from "../../utils/helpers/change-case.helpers";
2
+ import APIFeatures, { apiFeatures } from "../../utils/features/api.features";
3
3
  export { APIFeatures, apiFeatures };
4
4
  //# sourceMappingURL=index.js.map
@@ -1,4 +1,4 @@
1
- import validateDto from "../../utils/validate-dto.js";
2
- import validateSchema from "../../utils/validate-schema.js";
1
+ import validateDto from "../../utils/validate-dto";
2
+ import validateSchema from "../../utils/validate-schema";
3
3
  export { validateDto, validateSchema };
4
4
  //# sourceMappingURL=index.js.map
@@ -1,10 +1,10 @@
1
- import catchAsync from "../error-handler/utils/catch-async.js";
2
- import AppError from "../error-handler/utils/app-error.js";
3
- import authService from "./auth.service.js";
4
- import { getBaseServices } from "../base/base.service.js";
5
- import arkosEnv from "../../utils/arkos-env.js";
6
- import { getArkosConfig } from "../../server.js";
7
- import { createPrismaWhereClause, determineUsernameField, getNestedValue, toMs, } from "./utils/helpers/auth.controller.helpers.js";
1
+ import catchAsync from "../error-handler/utils/catch-async";
2
+ import AppError from "../error-handler/utils/app-error";
3
+ import authService from "./auth.service";
4
+ import { getBaseServices } from "../base/base.service";
5
+ import arkosEnv from "../../utils/arkos-env";
6
+ import { getArkosConfig } from "../../server";
7
+ import { createPrismaWhereClause, determineUsernameField, getNestedValue, toMs, } from "./utils/helpers/auth.controller.helpers";
8
8
  export const defaultExcludedUserFields = {
9
9
  password: false,
10
10
  };
@@ -1,11 +1,11 @@
1
1
  import { Router } from "express";
2
- import { authControllerFactory } from "./auth.controller.js";
3
- import authService from "./auth.service.js";
2
+ import { authControllerFactory } from "./auth.controller";
3
+ import authService from "./auth.service";
4
4
  import rateLimit from "express-rate-limit";
5
- import { importPrismaModelModules } from "../../utils/helpers/models.helpers.js";
6
- import { addPrismaQueryOptionsToRequest, handleRequestBodyValidationAndTransformation, sendResponse, } from "../base/base.middlewares.js";
7
- import deepmerge from "../../utils/helpers/deepmerge.helper.js";
8
- import catchAsync from "../error-handler/utils/catch-async.js";
5
+ import { importPrismaModelModules } from "../../utils/helpers/models.helpers";
6
+ import { addPrismaQueryOptionsToRequest, handleRequestBodyValidationAndTransformation, sendResponse, } from "../base/base.middlewares";
7
+ import deepmerge from "../../utils/helpers/deepmerge.helper";
8
+ import catchAsync from "../error-handler/utils/catch-async";
9
9
  const router = Router();
10
10
  export async function getAuthRouter(arkosConfigs) {
11
11
  const { middlewares, dtos, schemas, prismaQueryOptions } = await importPrismaModelModules("auth");
@@ -1,11 +1,11 @@
1
1
  import jwt from "jsonwebtoken";
2
2
  import bcrypt from "bcryptjs";
3
- import catchAsync from "../error-handler/utils/catch-async.js";
4
- import AppError from "../error-handler/utils/app-error.js";
5
- import { callNext } from "../base/base.middlewares.js";
6
- import { getArkosConfig } from "../../server.js";
7
- import arkosEnv from "../../utils/arkos-env.js";
8
- import { getPrismaInstance } from "../../utils/helpers/prisma.helpers.js";
3
+ import catchAsync from "../error-handler/utils/catch-async";
4
+ import AppError from "../error-handler/utils/app-error";
5
+ import { callNext } from "../base/base.middlewares";
6
+ import { getArkosConfig } from "../../server";
7
+ import arkosEnv from "../../utils/arkos-env";
8
+ import { getPrismaInstance } from "../../utils/helpers/prisma.helpers";
9
9
  export class AuthService {
10
10
  constructor() {
11
11
  this.authenticate = catchAsync(async (req, res, next) => {
@@ -153,13 +153,6 @@ export class AuthService {
153
153
  throw new AppError("Your auth token is invalid, please login again.", 401, {}, "InvalidAuthToken");
154
154
  const user = await prisma.user.findUnique({
155
155
  where: { id: String(decoded.id) },
156
- select: {
157
- id: true,
158
- passwordChangedAt: true,
159
- isActive: true,
160
- deletedSelfAccountAt: true,
161
- isSuperUser: true,
162
- },
163
156
  });
164
157
  if (!user)
165
158
  throw new AppError("The user belonging to this token does no longer exists", 401);
@@ -1 +1 @@
1
- {"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../../../../src/modules/auth/auth.service.ts"],"names":[],"mappings":"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","sourcesContent":["import jwt, { SignOptions } from \"jsonwebtoken\";\nimport bcrypt from \"bcryptjs\";\nimport { User } from \"../../types\";\nimport catchAsync from \"../error-handler/utils/catch-async\";\nimport AppError from \"../error-handler/utils/app-error\";\nimport { callNext } from \"../base/base.middlewares\";\nimport { getArkosConfig } from \"../../server\";\nimport arkosEnv from \"../../utils/arkos-env\";\nimport { getPrismaInstance } from \"../../utils/helpers/prisma.helpers\";\nimport {\n ArkosRequest,\n ArkosResponse,\n ArkosNextFunction,\n ArkosRequestHandler,\n} from \"../../types\";\nimport {\n AuthJwtPayload,\n AccessAction,\n AccessControlConfig,\n AuthenticationControlConfig,\n} from \"../../types/auth\";\nimport { MsDuration } from \"./utils/helpers/auth.controller.helpers\";\n\n/**\n * Handles various authentication-related tasks such as JWT signing, password hashing, and verifying user credentials.\n */\nexport class AuthService {\n /**\n * Signs a JWT token for the user.\n *\n * @param {number | string} id - The unique identifier of the user to generate the token for.\n * @param {string | number} [expiresIn] - The expiration time for the token. Defaults to environment variable `JWT_EXPIRES_IN`.\n * @param {string} [secret] - The secret key used to sign the token. Defaults to environment variable `JWT_SECRET`.\n * @returns {string} The signed JWT token.\n */\n signJwtToken(\n id: number | string,\n expiresIn?: MsDuration | number,\n secret?: string\n ): string {\n const { authentication: configs } = getArkosConfig();\n\n if (\n process.env.NODE_ENV === \"production\" &&\n !process.env.JWT_SECRET &&\n !configs?.jwt?.secret\n )\n throw new AppError(\n \"Missing JWT secret on production!\",\n 500,\n {},\n \"MissingJWTOnProduction\"\n );\n\n secret =\n secret ||\n configs?.jwt?.secret ||\n process.env.JWT_SECRET ||\n arkosEnv.JWT_SECRET;\n\n expiresIn = (expiresIn ||\n configs?.jwt?.expiresIn ||\n process.env.JWT_EXPIRES_IN ||\n arkosEnv.JWT_EXPIRES_IN) as keyof SignOptions[\"expiresIn\"];\n\n return jwt.sign({ id }, secret, {\n expiresIn: expiresIn as MsDuration,\n });\n }\n\n /**\n * Is used by default internally by Arkos under `BaseService` class to check if the password is already hashed.\n *\n * This was just added to prevent unwanted errors when someone just forgets that the `BaseService` class will automatically hash the password field using `authService.hashPassword` by default.\n *\n * So now before `BaseService` hashes it will test it.\n *\n *\n * @param password The password to be tested if is hashed\n * @returns\n */\n isPasswordHashed(password: string) {\n return !Number.isNaN(bcrypt.getRounds(password) * 1);\n }\n\n /**\n * Compares a candidate password with the stored user password to check if they match.\n *\n * @param {string} candidatePassword - The password provided by the user during login.\n * @param {string} userPassword - The password stored in the database.\n * @returns {Promise<boolean>} Returns true if the passwords match, otherwise false.\n */\n async isCorrectPassword(\n candidatePassword: string,\n userPassword: string\n ): Promise<boolean> {\n return await bcrypt.compare(candidatePassword, userPassword);\n }\n\n /**\n * Hashes a plain text password using bcrypt.\n *\n * @param {string} password - The password to be hashed.\n * @returns {Promise<string>} Returns the hashed password.\n */\n async hashPassword(password: string): Promise<string> {\n return await bcrypt.hash(password, 12);\n }\n\n /**\n * Checks if a password is strong, requiring uppercase, lowercase, and numeric characters as the default.\n *\n * **NB**: You must pay attention when using custom validation with zod or class-validator, try to use the same regex always.\n *\n * **Note**: You can define it when calling arkos.init()\n * ```ts\n * arkos.init({\n * authentication: {\n * passwordValidation:{ regex: /your-desired-regex/, message: 'password must contain...'}\n * }\n * })\n * ```\n *\n * @param {string} password - The password to check.\n * @returns {boolean} Returns true if the password meets the strength criteria, otherwise false.\n */\n public isPasswordStrong(password: string): boolean {\n const initAuthConfigs = getArkosConfig()?.authentication;\n\n const strongPasswordRegex =\n initAuthConfigs?.passwordValidation?.regex ||\n /^(?=.*[A-Z])(?=.*[a-z])(?=.*\\d).+$/;\n return strongPasswordRegex.test(password);\n }\n\n /**\n * Checks if a user has changed their password after the JWT was issued.\n *\n * @param {User} user - The user object containing the passwordChangedAt field.\n * @param {number} JWTTimestamp - The timestamp when the JWT was issued.\n * @returns {boolean} Returns true if the user changed their password after the JWT was issued, otherwise false.\n */\n userChangedPasswordAfter(user: User, JWTTimestamp: number): boolean {\n if (user.passwordChangedAt) {\n const convertedTimestamp = parseInt(\n String(user.passwordChangedAt.getTime() / 1000),\n 10\n );\n\n return JWTTimestamp < convertedTimestamp;\n }\n return false;\n }\n\n /**\n * Verifies the authenticity of a JWT token.\n *\n * @param {string} token - The JWT token to verify.\n * @param {string} [secret] - The secret key used to verify the token. Defaults to environment variable `JWT_SECRET`.\n * @returns {Promise<AuthJwtPayload>} Returns the decoded JWT payload if the token is valid.\n * @throws {Error} Throws an error if the token is invalid or expired.\n */\n async verifyJwtToken(\n token: string,\n secret?: string\n ): Promise<AuthJwtPayload> {\n const { authentication: configs } = getArkosConfig();\n\n if (\n process.env.NODE_ENV === \"production\" &&\n !process.env.JWT_SECRET &&\n !configs?.jwt?.secret\n )\n throw new AppError(\"Missing JWT secret!\", 500);\n\n secret =\n secret ||\n configs?.jwt?.secret ||\n process.env.JWT_SECRET ||\n arkosEnv.JWT_SECRET;\n\n return new Promise((resolve, reject) => {\n jwt.verify(token, secret, (err, decoded) => {\n if (err) reject(err);\n else resolve(decoded as AuthJwtPayload);\n });\n });\n }\n\n /**\n * Middleware function to handle access control based on user roles and permissions.\n *\n * @param {AccessAction} action - The action being performed (e.g., create, update, delete, view).\n * @param {string} resourceName - The resource name that the action is being performed on (e.g., \"User\", \"Post\").\n * @param {AccessControlConfig} accessControl - The access control configuration.\n * @returns {ArkosRequestHandler} The middleware function that checks if the user has permission to perform the action.\n */\n handleAccessControl(\n action: AccessAction,\n resourceName: string,\n accessControl?: AccessControlConfig\n ): ArkosRequestHandler {\n return catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n if (req.user) {\n const user = req.user as any;\n const prisma = getPrismaInstance();\n const configs = getArkosConfig();\n\n if (user.isSuperUser) {\n next();\n return;\n }\n\n if (configs?.authentication?.mode === \"dynamic\") {\n const matchingRole = await prisma.userRole.findFirst({\n where: {\n userId: req.user.id,\n role: {\n permissions: {\n some: {\n resource: resourceName,\n action: action,\n },\n },\n },\n },\n select: { id: true },\n });\n\n if (!matchingRole)\n return next(\n new AppError(\n \"You do not have permission to perfom this action\",\n 403\n )\n );\n } else if (configs?.authentication?.mode === \"static\") {\n let authorizedRoles: string[] = [];\n\n if (!accessControl)\n return next(\n new AppError(\n \"You do not have permission to perform this action\",\n 403\n )\n );\n\n if (Array.isArray(accessControl)) authorizedRoles = accessControl;\n else if (accessControl[action])\n authorizedRoles = accessControl[action] || [];\n\n const userRoles = Array.isArray(user?.roles)\n ? user.roles\n : [user.role];\n const hasPermission = userRoles.some((role: string) =>\n authorizedRoles.includes(role)\n );\n\n if (!hasPermission) {\n return next(\n new AppError(\n \"You do not have permission to perform this action\",\n 403\n )\n );\n }\n }\n }\n\n next();\n }\n );\n }\n\n /**\n * Processes the cookies or authoriation token and returns the user.\n * @param req\n * @returns {Promise<User | null>} - if authentication is turned off in arkosConfig it returns null\n * @throws {AppError} Throws an error if the token is invalid or the user is not logged in.\n */\n async getAuthenticatedUser(req: ArkosRequest): Promise<User | null> {\n const arkosConfig = getArkosConfig();\n if (!arkosConfig?.authentication) return null;\n\n const prisma = getPrismaInstance();\n\n let token: string | undefined;\n\n if (\n req?.headers?.authorization &&\n req?.headers?.authorization.startsWith(\"Bearer\")\n ) {\n token = req?.headers?.authorization.split(\" \")[1];\n } else if (req?.cookies?.arkos_access_token !== \"no-token\" && req.cookies) {\n token = req?.cookies?.arkos_access_token;\n }\n\n if (!token)\n throw new AppError(\n \"You are not logged in! please log in to get access\",\n 401,\n {},\n \"LoginRequired\"\n );\n\n let decoded: AuthJwtPayload | undefined;\n try {\n decoded = await this.verifyJwtToken(token);\n } catch (err) {\n throw new AppError(\n \"Your auth token is invalid, please login again.\",\n 401,\n {},\n \"InvalidAuthToken\"\n );\n }\n\n if (!decoded?.id)\n throw new AppError(\n \"Your auth token is invalid, please login again.\",\n 401,\n {},\n \"InvalidAuthToken\"\n );\n\n const user: any | null = await (prisma as any).user.findUnique({\n where: { id: String(decoded.id) },\n select: {\n id: true,\n passwordChangedAt: true,\n isActive: true,\n deletedSelfAccountAt: true,\n isSuperUser: true,\n },\n });\n\n if (!user)\n throw new AppError(\n \"The user belonging to this token does no longer exists\",\n 401\n );\n\n if (\n this.userChangedPasswordAfter(user, decoded.iat!) &&\n !req.path?.includes?.(\"logout\")\n )\n throw new AppError(\n \"User recently changed password! Please log in again.\",\n 401,\n {},\n \"PasswordChanged\"\n );\n\n return user;\n }\n\n /**\n * Middleware function to authenticate the user based on the JWT token.\n *\n * @param {ArkosRequest} req - The request object.\n * @param {ArkosResponse} res - The response object.\n * @param {ArkosNextFunction} next - The next middleware function to be called.\n * @returns {void}\n */\n authenticate = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const arkosConfig = getArkosConfig();\n if (!arkosConfig?.authentication) {\n next();\n return;\n }\n\n req.user = (await this.getAuthenticatedUser(req)) as User;\n next();\n }\n );\n\n /**\n * Handles authentication control by checking the `authenticationControl` configuration in the `authConfigs`.\n *\n * @param {ControllerActions} action - The action being performed (e.g., create, update, delete, view).\n * @param {AuthenticationControlConfig} authenticationControl - The authentication configuration object.\n * @returns {ArkosRequestHandler} The middleware function that checks if authentication is required.\n */\n handleAuthenticationControl(\n action: AccessAction,\n authenticationControl?: AuthenticationControlConfig | undefined\n ): ArkosRequestHandler {\n if (authenticationControl && typeof authenticationControl === \"object\") {\n if (authenticationControl[action] === false) return callNext;\n else if (authenticationControl[action] === true) return this.authenticate;\n } else return this.authenticate;\n\n return this.authenticate;\n }\n}\n\n/**\n * Handles various authentication-related tasks such as JWT signing, password hashing, and verifying user credentials.\n */\nconst authService = new AuthService();\n\nexport default authService;\n"]}
1
+ {"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../../../../src/modules/auth/auth.service.ts"],"names":[],"mappings":"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","sourcesContent":["import jwt, { SignOptions } from \"jsonwebtoken\";\nimport bcrypt from \"bcryptjs\";\nimport { User } from \"../../types\";\nimport catchAsync from \"../error-handler/utils/catch-async\";\nimport AppError from \"../error-handler/utils/app-error\";\nimport { callNext } from \"../base/base.middlewares\";\nimport { getArkosConfig } from \"../../server\";\nimport arkosEnv from \"../../utils/arkos-env\";\nimport { getPrismaInstance } from \"../../utils/helpers/prisma.helpers\";\nimport {\n ArkosRequest,\n ArkosResponse,\n ArkosNextFunction,\n ArkosRequestHandler,\n} from \"../../types\";\nimport {\n AuthJwtPayload,\n AccessAction,\n AccessControlConfig,\n AuthenticationControlConfig,\n} from \"../../types/auth\";\nimport { MsDuration } from \"./utils/helpers/auth.controller.helpers\";\n\n/**\n * Handles various authentication-related tasks such as JWT signing, password hashing, and verifying user credentials.\n */\nexport class AuthService {\n /**\n * Signs a JWT token for the user.\n *\n * @param {number | string} id - The unique identifier of the user to generate the token for.\n * @param {string | number} [expiresIn] - The expiration time for the token. Defaults to environment variable `JWT_EXPIRES_IN`.\n * @param {string} [secret] - The secret key used to sign the token. Defaults to environment variable `JWT_SECRET`.\n * @returns {string} The signed JWT token.\n */\n signJwtToken(\n id: number | string,\n expiresIn?: MsDuration | number,\n secret?: string\n ): string {\n const { authentication: configs } = getArkosConfig();\n\n if (\n process.env.NODE_ENV === \"production\" &&\n !process.env.JWT_SECRET &&\n !configs?.jwt?.secret\n )\n throw new AppError(\n \"Missing JWT secret on production!\",\n 500,\n {},\n \"MissingJWTOnProduction\"\n );\n\n secret =\n secret ||\n configs?.jwt?.secret ||\n process.env.JWT_SECRET ||\n arkosEnv.JWT_SECRET;\n\n expiresIn = (expiresIn ||\n configs?.jwt?.expiresIn ||\n process.env.JWT_EXPIRES_IN ||\n arkosEnv.JWT_EXPIRES_IN) as keyof SignOptions[\"expiresIn\"];\n\n return jwt.sign({ id }, secret, {\n expiresIn: expiresIn as MsDuration,\n });\n }\n\n /**\n * Is used by default internally by Arkos under `BaseService` class to check if the password is already hashed.\n *\n * This was just added to prevent unwanted errors when someone just forgets that the `BaseService` class will automatically hash the password field using `authService.hashPassword` by default.\n *\n * So now before `BaseService` hashes it will test it.\n *\n *\n * @param password The password to be tested if is hashed\n * @returns\n */\n isPasswordHashed(password: string) {\n return !Number.isNaN(bcrypt.getRounds(password) * 1);\n }\n\n /**\n * Compares a candidate password with the stored user password to check if they match.\n *\n * @param {string} candidatePassword - The password provided by the user during login.\n * @param {string} userPassword - The password stored in the database.\n * @returns {Promise<boolean>} Returns true if the passwords match, otherwise false.\n */\n async isCorrectPassword(\n candidatePassword: string,\n userPassword: string\n ): Promise<boolean> {\n return await bcrypt.compare(candidatePassword, userPassword);\n }\n\n /**\n * Hashes a plain text password using bcrypt.\n *\n * @param {string} password - The password to be hashed.\n * @returns {Promise<string>} Returns the hashed password.\n */\n async hashPassword(password: string): Promise<string> {\n return await bcrypt.hash(password, 12);\n }\n\n /**\n * Checks if a password is strong, requiring uppercase, lowercase, and numeric characters as the default.\n *\n * **NB**: You must pay attention when using custom validation with zod or class-validator, try to use the same regex always.\n *\n * **Note**: You can define it when calling arkos.init()\n * ```ts\n * arkos.init({\n * authentication: {\n * passwordValidation:{ regex: /your-desired-regex/, message: 'password must contain...'}\n * }\n * })\n * ```\n *\n * @param {string} password - The password to check.\n * @returns {boolean} Returns true if the password meets the strength criteria, otherwise false.\n */\n public isPasswordStrong(password: string): boolean {\n const initAuthConfigs = getArkosConfig()?.authentication;\n\n const strongPasswordRegex =\n initAuthConfigs?.passwordValidation?.regex ||\n /^(?=.*[A-Z])(?=.*[a-z])(?=.*\\d).+$/;\n return strongPasswordRegex.test(password);\n }\n\n /**\n * Checks if a user has changed their password after the JWT was issued.\n *\n * @param {User} user - The user object containing the passwordChangedAt field.\n * @param {number} JWTTimestamp - The timestamp when the JWT was issued.\n * @returns {boolean} Returns true if the user changed their password after the JWT was issued, otherwise false.\n */\n userChangedPasswordAfter(user: User, JWTTimestamp: number): boolean {\n if (user.passwordChangedAt) {\n const convertedTimestamp = parseInt(\n String(user.passwordChangedAt.getTime() / 1000),\n 10\n );\n\n return JWTTimestamp < convertedTimestamp;\n }\n return false;\n }\n\n /**\n * Verifies the authenticity of a JWT token.\n *\n * @param {string} token - The JWT token to verify.\n * @param {string} [secret] - The secret key used to verify the token. Defaults to environment variable `JWT_SECRET`.\n * @returns {Promise<AuthJwtPayload>} Returns the decoded JWT payload if the token is valid.\n * @throws {Error} Throws an error if the token is invalid or expired.\n */\n async verifyJwtToken(\n token: string,\n secret?: string\n ): Promise<AuthJwtPayload> {\n const { authentication: configs } = getArkosConfig();\n\n if (\n process.env.NODE_ENV === \"production\" &&\n !process.env.JWT_SECRET &&\n !configs?.jwt?.secret\n )\n throw new AppError(\"Missing JWT secret!\", 500);\n\n secret =\n secret ||\n configs?.jwt?.secret ||\n process.env.JWT_SECRET ||\n arkosEnv.JWT_SECRET;\n\n return new Promise((resolve, reject) => {\n jwt.verify(token, secret, (err, decoded) => {\n if (err) reject(err);\n else resolve(decoded as AuthJwtPayload);\n });\n });\n }\n\n /**\n * Middleware function to handle access control based on user roles and permissions.\n *\n * @param {AccessAction} action - The action being performed (e.g., create, update, delete, view).\n * @param {string} resourceName - The resource name that the action is being performed on (e.g., \"User\", \"Post\").\n * @param {AccessControlConfig} accessControl - The access control configuration.\n * @returns {ArkosRequestHandler} The middleware function that checks if the user has permission to perform the action.\n */\n handleAccessControl(\n action: AccessAction,\n resourceName: string,\n accessControl?: AccessControlConfig\n ): ArkosRequestHandler {\n return catchAsync(\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n if (req.user) {\n const user = req.user as any;\n const prisma = getPrismaInstance();\n const configs = getArkosConfig();\n\n if (user.isSuperUser) {\n next();\n return;\n }\n\n if (configs?.authentication?.mode === \"dynamic\") {\n const matchingRole = await prisma.userRole.findFirst({\n where: {\n userId: req.user.id,\n role: {\n permissions: {\n some: {\n resource: resourceName,\n action: action,\n },\n },\n },\n },\n select: { id: true },\n });\n\n if (!matchingRole)\n return next(\n new AppError(\n \"You do not have permission to perfom this action\",\n 403\n )\n );\n } else if (configs?.authentication?.mode === \"static\") {\n let authorizedRoles: string[] = [];\n\n if (!accessControl)\n return next(\n new AppError(\n \"You do not have permission to perform this action\",\n 403\n )\n );\n\n if (Array.isArray(accessControl)) authorizedRoles = accessControl;\n else if (accessControl[action])\n authorizedRoles = accessControl[action] || [];\n\n const userRoles = Array.isArray(user?.roles)\n ? user.roles\n : [user.role];\n const hasPermission = userRoles.some((role: string) =>\n authorizedRoles.includes(role)\n );\n\n if (!hasPermission) {\n return next(\n new AppError(\n \"You do not have permission to perform this action\",\n 403\n )\n );\n }\n }\n }\n\n next();\n }\n );\n }\n\n /**\n * Processes the cookies or authoriation token and returns the user.\n * @param req\n * @returns {Promise<User | null>} - if authentication is turned off in arkosConfig it returns null\n * @throws {AppError} Throws an error if the token is invalid or the user is not logged in.\n */\n async getAuthenticatedUser(req: ArkosRequest): Promise<User | null> {\n const arkosConfig = getArkosConfig();\n if (!arkosConfig?.authentication) return null;\n\n const prisma = getPrismaInstance();\n\n let token: string | undefined;\n\n if (\n req?.headers?.authorization &&\n req?.headers?.authorization.startsWith(\"Bearer\")\n ) {\n token = req?.headers?.authorization.split(\" \")[1];\n } else if (req?.cookies?.arkos_access_token !== \"no-token\" && req.cookies) {\n token = req?.cookies?.arkos_access_token;\n }\n\n if (!token)\n throw new AppError(\n \"You are not logged in! please log in to get access\",\n 401,\n {},\n \"LoginRequired\"\n );\n\n let decoded: AuthJwtPayload | undefined;\n try {\n decoded = await this.verifyJwtToken(token);\n } catch (err) {\n throw new AppError(\n \"Your auth token is invalid, please login again.\",\n 401,\n {},\n \"InvalidAuthToken\"\n );\n }\n\n if (!decoded?.id)\n throw new AppError(\n \"Your auth token is invalid, please login again.\",\n 401,\n {},\n \"InvalidAuthToken\"\n );\n\n const user: any | null = await (prisma as any).user.findUnique({\n where: { id: String(decoded.id) },\n });\n\n if (!user)\n throw new AppError(\n \"The user belonging to this token does no longer exists\",\n 401\n );\n\n if (\n this.userChangedPasswordAfter(user, decoded.iat!) &&\n !req.path?.includes?.(\"logout\")\n )\n throw new AppError(\n \"User recently changed password! Please log in again.\",\n 401,\n {},\n \"PasswordChanged\"\n );\n\n return user;\n }\n\n /**\n * Middleware function to authenticate the user based on the JWT token.\n *\n * @param {ArkosRequest} req - The request object.\n * @param {ArkosResponse} res - The response object.\n * @param {ArkosNextFunction} next - The next middleware function to be called.\n * @returns {void}\n */\n authenticate = catchAsync(\n async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const arkosConfig = getArkosConfig();\n if (!arkosConfig?.authentication) {\n next();\n return;\n }\n\n req.user = (await this.getAuthenticatedUser(req)) as User;\n next();\n }\n );\n\n /**\n * Handles authentication control by checking the `authenticationControl` configuration in the `authConfigs`.\n *\n * @param {ControllerActions} action - The action being performed (e.g., create, update, delete, view).\n * @param {AuthenticationControlConfig} authenticationControl - The authentication configuration object.\n * @returns {ArkosRequestHandler} The middleware function that checks if authentication is required.\n */\n handleAuthenticationControl(\n action: AccessAction,\n authenticationControl?: AuthenticationControlConfig | undefined\n ): ArkosRequestHandler {\n if (authenticationControl && typeof authenticationControl === \"object\") {\n if (authenticationControl[action] === false) return callNext;\n else if (authenticationControl[action] === true) return this.authenticate;\n } else return this.authenticate;\n\n return this.authenticate;\n }\n}\n\n/**\n * Handles various authentication-related tasks such as JWT signing, password hashing, and verifying user credentials.\n */\nconst authService = new AuthService();\n\nexport default authService;\n"]}
@@ -1,5 +1,5 @@
1
- import { getArkosConfig } from "../../../../server.js";
2
- import AppError from "../../../error-handler/utils/app-error.js";
1
+ import { getArkosConfig } from "../../../../server";
2
+ import AppError from "../../../error-handler/utils/app-error";
3
3
  export const determineUsernameField = (req) => {
4
4
  const authConfigs = getArkosConfig()?.authentication;
5
5
  if (req.query?.usernameField &&
@@ -1,10 +1,10 @@
1
- import catchAsync from "../error-handler/utils/catch-async.js";
2
- import APIFeatures from "../../utils/features/api.features.js";
3
- import { BaseService } from "./base.service.js";
4
- import AppError from "../error-handler/utils/app-error.js";
5
- import { kebabCase, pascalCase } from "../../utils/helpers/change-case.helpers.js";
6
- import { getModelModules, getModels } from "../../utils/helpers/models.helpers.js";
7
- import { getAppRoutes } from "./utils/helpers/base.controller.helpers.js";
1
+ import catchAsync from "../error-handler/utils/catch-async";
2
+ import APIFeatures from "../../utils/features/api.features";
3
+ import { BaseService } from "./base.service";
4
+ import AppError from "../error-handler/utils/app-error";
5
+ import { kebabCase, pascalCase } from "../../utils/helpers/change-case.helpers";
6
+ import { getModelModules, getModels } from "../../utils/helpers/models.helpers";
7
+ import { getAppRoutes } from "./utils/helpers/base.controller.helpers";
8
8
  import pluralize from "pluralize";
9
9
  export class BaseController {
10
10
  constructor(modelName) {
@@ -1,9 +1,9 @@
1
- import { getArkosConfig } from "../../server.js";
2
- import deepmerge from "../../utils/helpers/deepmerge.helper.js";
3
- import { catchAsync } from "../../exports/error-handler/index.js";
4
- import validateDto from "../../utils/validate-dto.js";
5
- import validateSchema from "../../utils/validate-schema.js";
6
- import { resolvePrismaQueryOptions } from "./utils/helpers/base.middlewares.helpers.js";
1
+ import { getArkosConfig } from "../../server";
2
+ import deepmerge from "../../utils/helpers/deepmerge.helper";
3
+ import { catchAsync } from "../../exports/error-handler";
4
+ import validateDto from "../../utils/validate-dto";
5
+ import validateSchema from "../../utils/validate-schema";
6
+ import { resolvePrismaQueryOptions } from "./utils/helpers/base.middlewares.helpers";
7
7
  export function callNext(req, res, next) {
8
8
  next();
9
9
  }
@@ -1,8 +1,8 @@
1
1
  import { Router } from "express";
2
- import { getAvalibleRoutes, getAvailableResources } from "./base.controller.js";
3
- import { getModels } from "../../utils/helpers/models.helpers.js";
4
- import authService from "../auth/auth.service.js";
5
- import { setupRouters } from "./utils/helpers/base.router.helpers.js";
2
+ import { getAvalibleRoutes, getAvailableResources } from "./base.controller";
3
+ import { getModels } from "../../utils/helpers/models.helpers";
4
+ import authService from "../auth/auth.service";
5
+ import { setupRouters } from "./utils/helpers/base.router.helpers";
6
6
  export async function getPrismaModelsRouter(arkosConfigs) {
7
7
  const router = Router();
8
8
  await Promise.all(setupRouters(getModels(), router, arkosConfigs));
@@ -1,9 +1,9 @@
1
- import { camelCase, kebabCase, pascalCase, } from "../../utils/helpers/change-case.helpers.js";
2
- import { getModels, getPrismaModelRelations, } from "../../utils/helpers/models.helpers.js";
3
- import deepmerge from "../../utils/helpers/deepmerge.helper.js";
4
- import { handleRelationFieldsInBody } from "./utils/helpers/base.service.helpers.js";
5
- import { getPrismaInstance } from "../../utils/helpers/prisma.helpers.js";
6
- import authService from "../auth/auth.service.js";
1
+ import { camelCase, kebabCase, pascalCase, } from "../../utils/helpers/change-case.helpers";
2
+ import { getModels, getPrismaModelRelations, } from "../../utils/helpers/models.helpers";
3
+ import deepmerge from "../../utils/helpers/deepmerge.helper";
4
+ import { handleRelationFieldsInBody } from "./utils/helpers/base.service.helpers";
5
+ import { getPrismaInstance } from "../../utils/helpers/prisma.helpers";
6
+ import authService from "../auth/auth.service";
7
7
  export class BaseService {
8
8
  constructor(modelName) {
9
9
  this.modelName = camelCase(modelName);
@@ -1,4 +1,4 @@
1
- import { getExpressApp } from "../../../../server.js";
1
+ import { getExpressApp } from "../../../../server";
2
2
  export const getAppRoutes = () => {
3
3
  const app = getExpressApp();
4
4
  const routes = [];
@@ -1,4 +1,4 @@
1
- import deepmerge from "../../../../utils/helpers/deepmerge.helper.js";
1
+ import deepmerge from "../../../../utils/helpers/deepmerge.helper";
2
2
  export function resolvePrismaQueryOptions(prismaQueryOptions, action) {
3
3
  if (!prismaQueryOptions) {
4
4
  return {};
@@ -1,10 +1,10 @@
1
1
  import pluralize from "pluralize";
2
- import { kebabCase } from "../../../../exports/utils/index.js";
3
- import { importPrismaModelModules } from "../../../../utils/helpers/models.helpers.js";
4
- import authService from "../../../auth/auth.service.js";
5
- import { BaseController } from "../../base.controller.js";
6
- import { addPrismaQueryOptionsToRequest, handleRequestBodyValidationAndTransformation, sendResponse, } from "../../base.middlewares.js";
7
- import catchAsync from "../../../error-handler/utils/catch-async.js";
2
+ import { kebabCase } from "../../../../exports/utils";
3
+ import { importPrismaModelModules } from "../../../../utils/helpers/models.helpers";
4
+ import authService from "../../../auth/auth.service";
5
+ import { BaseController } from "../../base.controller";
6
+ import { addPrismaQueryOptionsToRequest, handleRequestBodyValidationAndTransformation, sendResponse, } from "../../base.middlewares";
7
+ import catchAsync from "../../../error-handler/utils/catch-async";
8
8
  export function setupRouters(models, router, arkosConfigs) {
9
9
  return models.map(async (model) => {
10
10
  const modelNameInKebab = kebabCase(model);
@@ -1,4 +1,4 @@
1
- import { getPrismaModelRelations, getModelUniqueFields, } from "../../../../utils/helpers/models.helpers.js";
1
+ import { getPrismaModelRelations, getModelUniqueFields, } from "../../../../utils/helpers/models.helpers";
2
2
  export function removeApiAction(obj) {
3
3
  if (!obj || typeof obj !== "object")
4
4
  return obj;
@@ -1,7 +1,7 @@
1
1
  import nodemailer from "nodemailer";
2
2
  import { convert } from "html-to-text";
3
- import { getArkosConfig } from "../../server.js";
4
- import AppError from "../error-handler/utils/app-error.js";
3
+ import { getArkosConfig } from "../../server";
4
+ import AppError from "../error-handler/utils/app-error";
5
5
  export class EmailService {
6
6
  constructor(config) {
7
7
  this.transporter = null;
@@ -1,6 +1,6 @@
1
- import AppError from "./utils/app-error.js";
2
- import * as errorControllerHelper from "./utils/error-handler.helpers.js";
3
- import { server } from "../../server.js";
1
+ import AppError from "./utils/app-error";
2
+ import * as errorControllerHelper from "./utils/error-handler.helpers";
3
+ import { server } from "../../server";
4
4
  export default function errorHandler(err, req, res, next) {
5
5
  console.error("[\x1b[31mERROR\x1b[0m]:", err);
6
6
  err.statusCode = err.statusCode || 500;
@@ -1,4 +1,4 @@
1
- import AppError from "./app-error.js";
1
+ import AppError from "./app-error";
2
2
  export function handleJWTError() {
3
3
  return new AppError("Invalid token. Please log in again!", 401);
4
4
  }
@@ -1,12 +1,12 @@
1
- import AppError from "../error-handler/utils/app-error.js";
2
- import { getFileUploadServices, } from "./file-upload.service.js";
1
+ import AppError from "../error-handler/utils/app-error";
2
+ import { getFileUploadServices, } from "./file-upload.service";
3
3
  import path from "path";
4
4
  import fs from "fs";
5
- import catchAsync from "../error-handler/utils/catch-async.js";
6
- import { getArkosConfig } from "../../server.js";
7
- import { processFile, processImage } from "./utils/helpers/file-upload.helpers.js";
8
- import { accessAsync, mkdirAsync, statAsync, } from "../../utils/helpers/fs.helpers.js";
9
- import { getModelModules } from "../../utils/helpers/models.helpers.js";
5
+ import catchAsync from "../error-handler/utils/catch-async";
6
+ import { getArkosConfig } from "../../server";
7
+ import { processFile, processImage } from "./utils/helpers/file-upload.helpers";
8
+ import { accessAsync, mkdirAsync, statAsync, } from "../../utils/helpers/fs.helpers";
9
+ import { getModelModules } from "../../utils/helpers/models.helpers";
10
10
  class FileUploadController {
11
11
  constructor() {
12
12
  this.uploadFile = catchAsync(async (req, res, next) => {
@@ -1,11 +1,11 @@
1
1
  import { Router } from "express";
2
- import { importPrismaModelModules } from "../../utils/helpers/models.helpers.js";
3
- import authService from "../auth/auth.service.js";
4
- import fileUploadController from "./file-upload.controller.js";
2
+ import { importPrismaModelModules } from "../../utils/helpers/models.helpers";
3
+ import authService from "../auth/auth.service";
4
+ import fileUploadController from "./file-upload.controller";
5
5
  import path from "path";
6
6
  import express from "express";
7
- import deepmerge from "../../utils/helpers/deepmerge.helper.js";
8
- import { sendResponse } from "../base/base.middlewares.js";
7
+ import deepmerge from "../../utils/helpers/deepmerge.helper";
8
+ import { sendResponse } from "../base/base.middlewares";
9
9
  const router = Router();
10
10
  export async function getFileUploadRouter({ fileUpload }) {
11
11
  const modelModules = await importPrismaModelModules("file-upload");
@@ -1,12 +1,12 @@
1
1
  import multer from "multer";
2
2
  import path from "path";
3
3
  import fs from "fs";
4
- import AppError from "../error-handler/utils/app-error.js";
4
+ import AppError from "../error-handler/utils/app-error";
5
5
  import { promisify } from "util";
6
- import { getArkosConfig } from "../../server.js";
7
- import deepmerge from "../../utils/helpers/deepmerge.helper.js";
8
- import { processFile, processImage } from "./utils/helpers/file-upload.helpers.js";
9
- import { removeBothSlashes } from "../../utils/helpers/text.helpers.js";
6
+ import { getArkosConfig } from "../../server";
7
+ import deepmerge from "../../utils/helpers/deepmerge.helper";
8
+ import { processFile, processImage } from "./utils/helpers/file-upload.helpers";
9
+ import { removeBothSlashes } from "../../utils/helpers/text.helpers";
10
10
  export class FileUploadService {
11
11
  constructor(uploadDir, fileSizeLimit = 1024 * 1024 * 5, allowedFileTypes = /.*/, maxCount = 30) {
12
12
  this.fileFilter = (req, file, cb) => {
@@ -2,9 +2,9 @@ import fs from "fs";
2
2
  import path from "path";
3
3
  import sharp from "sharp";
4
4
  import { promisify } from "util";
5
- import { getArkosConfig } from "../../../../server.js";
5
+ import { getArkosConfig } from "../../../../server";
6
6
  import mimetype from "mimetype";
7
- import { fullCleanCwd } from "../../../../utils/helpers/fs.helpers.js";
7
+ import { fullCleanCwd } from "../../../../utils/helpers/fs.helpers";
8
8
  export function extractRequestInfo(req) {
9
9
  const { fileUpload } = getArkosConfig();
10
10
  const protocol = req.headers["x-forwarded-proto"] === "https" ? "https" : "http";
@@ -1,8 +1,8 @@
1
1
  import { Router } from "express";
2
2
  import swaggerUi from "swagger-ui-express";
3
3
  import swaggerJsdoc from "swagger-jsdoc";
4
- import deepmerge from "../../utils/helpers/deepmerge.helper.js";
5
- import { generatePathsForModels, getOpenAPIJsonSchemasByConfigMode, } from "./utils/helpers/swagger.router.helpers.js";
4
+ import deepmerge from "../../utils/helpers/deepmerge.helper";
5
+ import { generatePathsForModels, getOpenAPIJsonSchemasByConfigMode, } from "./utils/helpers/swagger.router.helpers";
6
6
  const swaggerRouter = Router();
7
7
  export async function getSwaggerRouter(arkosConfig) {
8
8
  const defaultJsonSchemas = await getOpenAPIJsonSchemasByConfigMode(arkosConfig.swagger);
@@ -1,5 +1,5 @@
1
- import { getSchemaRef } from "./swagger.router.helpers.js";
2
- import { getArkosConfig } from "../../../../server.js";
1
+ import { getSchemaRef } from "./swagger.router.helpers";
2
+ import { getArkosConfig } from "../../../../server";
3
3
  export function getAuthenticationJsonSchemaPaths() {
4
4
  const mode = getArkosConfig().swagger?.mode;
5
5
  const paths = {};
@@ -1,8 +1,8 @@
1
1
  import { validationMetadatasToSchemas } from "class-validator-jsonschema";
2
- import { importModule } from "../../../../../utils/helpers/global.helpers.js";
2
+ import { importModule } from "../../../../../utils/helpers/global.helpers";
3
3
  import { getMetadataStorage } from "class-validator";
4
- import { getModelModules, getModels, } from "../../../../../utils/helpers/models.helpers.js";
5
- import { getCorrectJsonSchemaName } from "../swagger.router.helpers.js";
4
+ import { getModelModules, getModels, } from "../../../../../utils/helpers/models.helpers";
5
+ import { getCorrectJsonSchemaName } from "../swagger.router.helpers";
6
6
  export async function generateClassValidatorJsonSchemas() {
7
7
  const models = getModels();
8
8
  const schemas = {};
@@ -1,5 +1,5 @@
1
- import { pascalCase } from "../../../../../exports/utils/index.js";
2
- import { getModels, getPrismaSchemasContent, } from "../../../../../utils/helpers/models.helpers.js";
1
+ import { pascalCase } from "../../../../../exports/utils";
2
+ import { getModels, getPrismaSchemasContent, } from "../../../../../utils/helpers/models.helpers";
3
3
  export async function generatePrismaJsonSchemas() {
4
4
  const schemas = {};
5
5
  const prismaContent = getPrismaSchemasContent();
@@ -1,6 +1,6 @@
1
- import { getModelModules, getModels, } from "../../../../../utils/helpers/models.helpers.js";
1
+ import { getModelModules, getModels, } from "../../../../../utils/helpers/models.helpers";
2
2
  import zodToJsonSchema from "zod-to-json-schema";
3
- import { getCorrectJsonSchemaName } from "../swagger.router.helpers.js";
3
+ import { getCorrectJsonSchemaName } from "../swagger.router.helpers";
4
4
  export async function generateZodJsonSchemas() {
5
5
  const models = [...getModels(), "file-upload", "auth"];
6
6
  const schemas = {};
@@ -1,6 +1,6 @@
1
- import { getSchemaRef } from "../../swagger.router.helpers.js";
1
+ import { getSchemaRef } from "../../swagger.router.helpers";
2
2
  import pluralize from "pluralize";
3
- import { isEndpointDisabled } from "../../../../../base/utils/helpers/base.router.helpers.js";
3
+ import { isEndpointDisabled } from "../../../../../base/utils/helpers/base.router.helpers";
4
4
  export async function generatePrismaModelMainRoutesPaths(paths, routeName, pascalModelName, humanReadableName, humanReadableNamePlural, routerConfig, mode) {
5
5
  if (!isEndpointDisabled(routerConfig, "createOne")) {
6
6
  if (!paths[`/api/${routeName}`])
@@ -1,7 +1,7 @@
1
1
  import pluralize from "pluralize";
2
- import { kebabCase, pascalCase } from "../../../../../../exports/utils/index.js";
3
- import { getSchemaRef, kebabToHuman } from "../../swagger.router.helpers.js";
4
- import { isParentEndpointAllowed } from "../../../../../base/utils/helpers/base.router.helpers.js";
2
+ import { kebabCase, pascalCase } from "../../../../../../exports/utils";
3
+ import { getSchemaRef, kebabToHuman } from "../../swagger.router.helpers";
4
+ import { isParentEndpointAllowed } from "../../../../../base/utils/helpers/base.router.helpers";
5
5
  export async function generatePrismaModelParentRoutePaths(paths, routeName, pascalModelName, humanReadableName, humanReadableNamePlural, routerConfig, mode) {
6
6
  const parentModel = routerConfig.parent.model;
7
7
  const parentRouteName = pluralize.plural(kebabCase(parentModel));
@@ -1,13 +1,13 @@
1
- import { getModels, importPrismaModelModules, } from "../../../../utils/helpers/models.helpers.js";
2
- import { kebabCase, pascalCase } from "../../../../exports/utils/index.js";
1
+ import { getModels, importPrismaModelModules, } from "../../../../utils/helpers/models.helpers";
2
+ import { kebabCase, pascalCase } from "../../../../exports/utils";
3
3
  import pluralize from "pluralize";
4
- import { getSystemJsonSchemaPaths } from "./get-system-json-schema-paths.js";
5
- import { getAuthenticationJsonSchemaPaths } from "./get-authentication-json-schema-paths.js";
6
- import { generateZodJsonSchemas } from "./json-schema-generators/generate-zod-json-schema.js";
7
- import { generateClassValidatorJsonSchemas } from "./json-schema-generators/generate-class-validator-json-schemas.js";
8
- import { generatePrismaJsonSchemas } from "./json-schema-generators/generate-prisma-json-schemas.js";
9
- import { generatePrismaModelMainRoutesPaths } from "./json-schema-generators/prisma-models/generate-prisma-model-main-routes.js";
10
- import { generatePrismaModelParentRoutePaths } from "./json-schema-generators/prisma-models/generate-prisma-model-parent-routes.js";
4
+ import { getSystemJsonSchemaPaths } from "./get-system-json-schema-paths";
5
+ import { getAuthenticationJsonSchemaPaths } from "./get-authentication-json-schema-paths";
6
+ import { generateZodJsonSchemas } from "./json-schema-generators/generate-zod-json-schema";
7
+ import { generateClassValidatorJsonSchemas } from "./json-schema-generators/generate-class-validator-json-schemas";
8
+ import { generatePrismaJsonSchemas } from "./json-schema-generators/generate-prisma-json-schemas";
9
+ import { generatePrismaModelMainRoutesPaths } from "./json-schema-generators/prisma-models/generate-prisma-model-main-routes";
10
+ import { generatePrismaModelParentRoutePaths } from "./json-schema-generators/prisma-models/generate-prisma-model-parent-routes";
11
11
  export async function getOpenAPIJsonSchemasByConfigMode(swaggerConfig) {
12
12
  switch (swaggerConfig.mode) {
13
13
  case "prisma":
@@ -1,3 +1,3 @@
1
- "use strict";import{bootstrap as p}from"./app.js";import i from"./utils/helpers/deepmerge.helper.js";import c from"http";import s from"./utils/sheu.js";process.on("uncaughtException",o=>{o.message.includes("EPIPE")||(console.error(`
1
+ "use strict";import{bootstrap as a}from"./app";import p from"./utils/helpers/deepmerge.helper";import c from"http";import s from"./utils/sheu";import{initializePrismaModels as l}from"./utils/helpers/models.helpers";process.on("uncaughtException",o=>{o.message.includes("EPIPE")||(console.error(`
2
2
  UNCAUGHT EXCEPTION! SHUTTING DOWN...
3
- `),console.error(o.name,o.message),console.error(o),process.exit(1))});let r,t,e={welcomeMessage:"Welcome to our RESTful API generated by Arkos, find out more about Arkos at www.arkosjs.com",port:Number(process.env.CLI_PORT)||Number(process.env.PORT)||8e3,host:process.env.CLI_HOST||process.env.HOST||"localhost",fileUpload:{baseUploadDir:"uploads",baseRoute:"/api/uploads"},available:!1};async function l(o={}){e.available=!0,e=i(e,o);const n=process.env.CLI_PORT||e.port||process.env.PORT||"port"in e?e.port:8e3;t=await p(e);const a=new Date().toTimeString().split(" ")[0];return n?(r=c.createServer(t),e?.configureServer&&await e.configureServer(r),r.listen(Number(n),e.host,()=>{s.ready(`${s.gray(a)} server waiting on http://${e.host||"localhost"}:${n}`)})):s.warn(`${s.gray(a)} port set to undefined, hence no internal http server was setup.`),t}process.on("unhandledRejection",o=>{console.error("UNHANDLED REJECTION! SHUTTING DOWN..."),console.error(o.name,o.message),console.error(o),r?.close(()=>{process.exit(1)})});export function terminateApplicationRunningProcessAndServer(){r?.close(()=>{process.exit(1)})}export function getArkosConfig(){return e}export function getExpressApp(){return t}export{r as server,l as initApp};
3
+ `),console.error(o.name,o.message),console.error(o),process.exit(1))});let r,t,e={welcomeMessage:"Welcome to our RESTful API generated by Arkos, find out more about Arkos at www.arkosjs.com",port:Number(process.env.CLI_PORT)||Number(process.env.PORT)||8e3,host:process.env.CLI_HOST||process.env.HOST||"localhost",fileUpload:{baseUploadDir:"uploads",baseRoute:"/api/uploads"},available:!1};async function u(o={}){l(),e.available=!0,e=p(e,o);const n=process.env.CLI_PORT||e.port||process.env.PORT||"port"in e?e.port:8e3;t=await a(e);const i=new Date().toTimeString().split(" ")[0];return n?(r=c.createServer(t),e?.configureServer&&await e.configureServer(r),r.listen(Number(n),e.host,()=>{s.ready(`${s.gray(i)} server waiting on http://${e.host||"localhost"}:${n}`)})):s.warn(`${s.gray(i)} port set to undefined, hence no internal http server was setup.`),t}process.on("unhandledRejection",o=>{console.error("UNHANDLED REJECTION! SHUTTING DOWN..."),console.error(o.name,o.message),console.error(o),r?.close(()=>{process.exit(1)})});export function terminateApplicationRunningProcessAndServer(){r?.close(()=>{process.exit(1)})}export function getArkosConfig(){return e}export function getExpressApp(){return t}export{r as server,u as initApp};