arkos 1.0.13 → 1.0.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.
Files changed (85) hide show
  1. package/dist/cjs/app.js +1 -1
  2. package/dist/cjs/app.js.map +1 -1
  3. package/dist/cjs/exports/index.js.map +1 -1
  4. package/dist/cjs/modules/auth/auth.controller.js +37 -24
  5. package/dist/cjs/modules/auth/auth.controller.js.map +1 -1
  6. package/dist/cjs/modules/auth/auth.router.js +5 -4
  7. package/dist/cjs/modules/auth/auth.router.js.map +1 -1
  8. package/dist/cjs/modules/auth/auth.service.js +2 -2
  9. package/dist/cjs/modules/auth/auth.service.js.map +1 -1
  10. package/dist/cjs/modules/auth/utils/helpers/auth.controller.helpers.js +88 -0
  11. package/dist/cjs/modules/auth/utils/helpers/auth.controller.helpers.js.map +1 -0
  12. package/dist/cjs/modules/base/base.router.js +5 -65
  13. package/dist/cjs/modules/base/base.router.js.map +1 -1
  14. package/dist/cjs/modules/base/base.service.js +3 -3
  15. package/dist/cjs/modules/base/base.service.js.map +1 -1
  16. package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js +112 -0
  17. package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js.map +1 -0
  18. package/dist/cjs/modules/base/utils/helpers/{base.helpers.js → base.service.helpers.js} +1 -1
  19. package/dist/cjs/modules/base/utils/helpers/base.service.helpers.js.map +1 -0
  20. package/dist/cjs/modules/file-uploader/file-uploader.router.js +3 -3
  21. package/dist/cjs/modules/file-uploader/file-uploader.router.js.map +1 -1
  22. package/dist/cjs/types/arkos-config.js.map +1 -1
  23. package/dist/cjs/types/auth.js.map +1 -1
  24. package/dist/cjs/types/{prisma-model-router-config.js → router-config.js} +1 -1
  25. package/dist/cjs/types/router-config.js.map +1 -0
  26. package/dist/cjs/utils/arkos-env.js +0 -1
  27. package/dist/cjs/utils/arkos-env.js.map +1 -1
  28. package/dist/cjs/utils/helpers/base.controller.helpers.js.map +1 -1
  29. package/dist/cjs/utils/helpers/models.helpers.js +82 -127
  30. package/dist/cjs/utils/helpers/models.helpers.js.map +1 -1
  31. package/dist/cjs/utils/helpers/prisma.helpers.js.map +1 -1
  32. package/dist/es2020/app.js +1 -1
  33. package/dist/es2020/app.js.map +1 -1
  34. package/dist/es2020/exports/index.js.map +1 -1
  35. package/dist/es2020/modules/auth/auth.controller.js +36 -23
  36. package/dist/es2020/modules/auth/auth.controller.js.map +1 -1
  37. package/dist/es2020/modules/auth/auth.router.js +5 -4
  38. package/dist/es2020/modules/auth/auth.router.js.map +1 -1
  39. package/dist/es2020/modules/auth/auth.service.js +2 -2
  40. package/dist/es2020/modules/auth/auth.service.js.map +1 -1
  41. package/dist/es2020/modules/auth/utils/helpers/auth.controller.helpers.js +78 -0
  42. package/dist/es2020/modules/auth/utils/helpers/auth.controller.helpers.js.map +1 -0
  43. package/dist/es2020/modules/base/base.router.js +7 -67
  44. package/dist/es2020/modules/base/base.router.js.map +1 -1
  45. package/dist/es2020/modules/base/base.service.js +1 -1
  46. package/dist/es2020/modules/base/base.service.js.map +1 -1
  47. package/dist/es2020/modules/base/utils/helpers/base.router.helpers.js +106 -0
  48. package/dist/es2020/modules/base/utils/helpers/base.router.helpers.js.map +1 -0
  49. package/dist/es2020/modules/base/utils/helpers/{base.helpers.js → base.service.helpers.js} +1 -1
  50. package/dist/es2020/modules/base/utils/helpers/base.service.helpers.js.map +1 -0
  51. package/dist/es2020/modules/file-uploader/file-uploader.router.js +3 -3
  52. package/dist/es2020/modules/file-uploader/file-uploader.router.js.map +1 -1
  53. package/dist/es2020/types/arkos-config.js.map +1 -1
  54. package/dist/es2020/types/auth.js.map +1 -1
  55. package/dist/es2020/types/router-config.js +2 -0
  56. package/dist/es2020/types/router-config.js.map +1 -0
  57. package/dist/es2020/utils/arkos-env.js +0 -1
  58. package/dist/es2020/utils/arkos-env.js.map +1 -1
  59. package/dist/es2020/utils/helpers/base.controller.helpers.js.map +1 -1
  60. package/dist/es2020/utils/helpers/models.helpers.js +82 -127
  61. package/dist/es2020/utils/helpers/models.helpers.js.map +1 -1
  62. package/dist/es2020/utils/helpers/prisma.helpers.js.map +1 -1
  63. package/dist/types/exports/index.d.ts +2 -2
  64. package/dist/types/modules/auth/auth.service.d.ts +3 -3
  65. package/dist/types/modules/auth/utils/helpers/auth.controller.helpers.d.ts +6 -0
  66. package/dist/types/modules/base/base.router.d.ts +2 -1
  67. package/dist/types/modules/base/utils/helpers/base.router.helpers.d.ts +2 -0
  68. package/dist/types/types/arkos-config.d.ts +10 -6
  69. package/dist/types/types/auth.d.ts +1 -1
  70. package/dist/types/types/{prisma-model-router-config.d.ts → router-config.d.ts} +4 -4
  71. package/dist/types/utils/arkos-env.d.ts +0 -1
  72. package/dist/types/utils/helpers/base.controller.helpers.d.ts +6 -2
  73. package/dist/types/utils/helpers/models.helpers.d.ts +10 -24
  74. package/package.json +1 -1
  75. package/dist/cjs/modules/auth/utils/helpers/auth.helpers.js +0 -19
  76. package/dist/cjs/modules/auth/utils/helpers/auth.helpers.js.map +0 -1
  77. package/dist/cjs/modules/base/utils/helpers/base.helpers.js.map +0 -1
  78. package/dist/cjs/types/prisma-model-router-config.js.map +0 -1
  79. package/dist/es2020/modules/auth/utils/helpers/auth.helpers.js +0 -12
  80. package/dist/es2020/modules/auth/utils/helpers/auth.helpers.js.map +0 -1
  81. package/dist/es2020/modules/base/utils/helpers/base.helpers.js.map +0 -1
  82. package/dist/es2020/types/prisma-model-router-config.js +0 -2
  83. package/dist/es2020/types/prisma-model-router-config.js.map +0 -1
  84. package/dist/types/modules/auth/utils/helpers/auth.helpers.d.ts +0 -2
  85. /package/dist/types/modules/base/utils/helpers/{base.helpers.d.ts → base.service.helpers.d.ts} +0 -0
@@ -0,0 +1,2 @@
1
+ import { Router } from "express";
2
+ export declare function setupRouters(models: string[], router: Router): Promise<void>[];
@@ -5,7 +5,7 @@ import cookieParser from "cookie-parser";
5
5
  import compression from "compression";
6
6
  import { Options as QueryParserOptions } from "../utils/helpers/query-parser.helpers";
7
7
  import { ValidatorOptions } from "class-validator";
8
- import { SignOptions } from "jsonwebtoken";
8
+ import { MsDuration } from "../modules/auth/utils/helpers/auth.controller.helpers";
9
9
  export type ArkosConfig = {
10
10
  welcomeMessage?: string;
11
11
  port?: number | undefined;
@@ -13,6 +13,7 @@ export type ArkosConfig = {
13
13
  authentication?: {
14
14
  mode: "static" | "dynamic";
15
15
  login?: {
16
+ allowedUsernames?: string[];
16
17
  sendAccessTokenThrough?: "cookie-only" | "response-only" | "both";
17
18
  };
18
19
  usernameField?: string;
@@ -23,9 +24,12 @@ export type ArkosConfig = {
23
24
  requestRateLimitOptions?: RateLimitOptions;
24
25
  jwt?: {
25
26
  secret?: string;
26
- expiresIn?: SignOptions["expiresIn"];
27
- cookieExpiresIn?: number;
28
- secure?: boolean;
27
+ expiresIn?: MsDuration | number;
28
+ cookie?: {
29
+ secure?: boolean;
30
+ httpOnly?: boolean;
31
+ sameSite?: "lax" | "strict" | "none";
32
+ };
29
33
  };
30
34
  };
31
35
  validation?: {
@@ -73,7 +77,7 @@ export type ArkosConfig = {
73
77
  customHandler?: cors.CorsOptionsDelegate;
74
78
  };
75
79
  middlewares?: {
76
- additionals?: express.RequestHandler[];
80
+ additional?: express.RequestHandler[];
77
81
  disable?: ("compression" | "global-rate-limit" | "auth-rate-limit" | "cors" | "express-json" | "cookie-parser" | "query-parser" | "database-connection" | "request-logger" | "global-error-handler")[];
78
82
  replace?: {
79
83
  compression?: express.RequestHandler;
@@ -89,7 +93,7 @@ export type ArkosConfig = {
89
93
  };
90
94
  };
91
95
  routers?: {
92
- additionals?: express.Router[];
96
+ additional?: express.Router[];
93
97
  disable?: ("auth-router" | "prisma-models-router" | "file-uploader" | "welcome-endpoint")[];
94
98
  replace?: {
95
99
  authRouter?: (config: ArkosConfig) => express.Router | Promise<express.Router>;
@@ -12,5 +12,5 @@ export type AuthConfigs = {
12
12
  };
13
13
  export interface AuthJwtPayload extends JwtPayload {
14
14
  id?: number | string;
15
- username?: string;
15
+ [x: string]: any;
16
16
  }
@@ -1,9 +1,9 @@
1
- export type AvailableEndpoints = "createOne" | "findOne" | "updateOne" | "deleteOne" | "findMany" | "createMany" | "udpateMany" | "deleteMany";
2
- export type PrismaModelRouterConfig = {
1
+ export type RouterEndpoint = "createOne" | "findOne" | "updateOne" | "deleteOne" | "findMany" | "createMany" | "updateMany" | "deleteMany";
2
+ export type RouterConfig = {
3
3
  parent?: {
4
4
  model?: string;
5
- referenceField?: string;
6
- endpoints?: "*" | AvailableEndpoints | AvailableEndpoints[];
5
+ foreignKey?: string;
6
+ endpoints?: "*" | RouterEndpoint | RouterEndpoint[];
7
7
  };
8
8
  disable?: boolean | {
9
9
  createOne?: boolean;
@@ -1,6 +1,5 @@
1
1
  declare const arkosEnv: {
2
2
  JWT_SECRET: string;
3
- JWT_COOKIE_EXPIRES_IN: number;
4
3
  JWT_EXPIRES_IN: string;
5
4
  PRISMA_SCHEMA_PATH: string;
6
5
  };
@@ -1,2 +1,6 @@
1
- import { ArkosNextFunction, ArkosRequest, ArkosResponse } from "../../types";
2
- export declare function handleRequestBodyValidationAndTransformation(modelName: string, action: "create" | "update"): (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => Promise<void>;
1
+ import { ArkosRequestHandler } from "../../types";
2
+ type AuthActions = "signup" | "login" | "updateMe" | "updatePassword";
3
+ type DefaultActions = "create" | "update";
4
+ export declare function handleRequestBodyValidationAndTransformation(modelName: "auth", action: AuthActions): ArkosRequestHandler;
5
+ export declare function handleRequestBodyValidationAndTransformation(modelName: Exclude<string, "auth">, action: DefaultActions): ArkosRequestHandler;
6
+ export {};
@@ -1,37 +1,23 @@
1
1
  export declare let prismaModelsModules: Record<string, Awaited<ReturnType<typeof importPrismaModelModules>>>;
2
2
  export declare function getModelModules(modelName: string): {
3
+ service?: any;
4
+ controller?: any;
3
5
  middlewares?: any;
4
6
  authConfigs?: any;
5
7
  prismaQueryOptions?: any;
6
- dtos: {
7
- create?: any;
8
- update?: any;
9
- query?: any;
10
- model?: any;
11
- };
12
- schemas: {
13
- create?: any;
14
- update?: any;
15
- query?: any;
16
- model?: any;
17
- };
8
+ router?: any;
9
+ dtos: Record<string, any>;
10
+ schemas: Record<string, any>;
18
11
  };
19
12
  export declare function importPrismaModelModules(modelName: string): Promise<{
13
+ service?: any;
14
+ controller?: any;
20
15
  middlewares?: any;
21
16
  authConfigs?: any;
22
17
  prismaQueryOptions?: any;
23
- dtos: {
24
- create?: any;
25
- update?: any;
26
- query?: any;
27
- model?: any;
28
- };
29
- schemas: {
30
- create?: any;
31
- update?: any;
32
- query?: any;
33
- model?: any;
34
- };
18
+ router?: any;
19
+ dtos: Record<string, any>;
20
+ schemas: Record<string, any>;
35
21
  }>;
36
22
  export type ModelFieldDefition = {
37
23
  name: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "arkos",
3
- "version": "1.0.13",
3
+ "version": "1.0.15",
4
4
  "description": "The Express & Prisma Framework For RESTful API",
5
5
  "main": "dist/cjs/exports/index.js",
6
6
  "module": "dist/es2020/exports/index.js",
@@ -1,19 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.determineUsernameField = void 0;
7
- const server_1 = require("../../../../server");
8
- const app_error_1 = __importDefault(require("../../../error-handler/utils/app-error"));
9
- const determineUsernameField = (req) => {
10
- var _a, _b, _c, _d;
11
- if (((_a = req.query) === null || _a === void 0 ? void 0 : _a.usernameField) && typeof ((_b = req.query) === null || _b === void 0 ? void 0 : _b.usernameField) === "string")
12
- return req.query.usernameField;
13
- else if ((_c = req.query) === null || _c === void 0 ? void 0 : _c.usernameField)
14
- throw new app_error_1.default("Invalid usernameField parameter, it must be a string", 400);
15
- const initAuthConfigs = (_d = (0, server_1.getArkosConfig)()) === null || _d === void 0 ? void 0 : _d.authentication;
16
- return (initAuthConfigs === null || initAuthConfigs === void 0 ? void 0 : initAuthConfigs.usernameField) || "username";
17
- };
18
- exports.determineUsernameField = determineUsernameField;
19
- //# sourceMappingURL=auth.helpers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth.helpers.js","sourceRoot":"","sources":["../../../../../../src/modules/auth/utils/helpers/auth.helpers.ts"],"names":[],"mappings":";;;;;;AAAA,+CAAoD;AAEpD,uFAA8D;AAYvD,MAAM,sBAAsB,GAAG,CAAC,GAAiB,EAAU,EAAE;;IAClE,IAAI,CAAA,MAAA,GAAG,CAAC,KAAK,0CAAE,aAAa,KAAI,OAAO,CAAA,MAAA,GAAG,CAAC,KAAK,0CAAE,aAAa,CAAA,KAAK,QAAQ;QAC1E,OAAO,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC;SAC5B,IAAI,MAAA,GAAG,CAAC,KAAK,0CAAE,aAAa;QAC/B,MAAM,IAAI,mBAAQ,CAChB,sDAAsD,EACtD,GAAG,CACJ,CAAC;IAEJ,MAAM,eAAe,GAAG,MAAA,IAAA,uBAAc,GAAE,0CAAE,cAAc,CAAC;IACzD,OAAO,CAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,aAAa,KAAI,UAAU,CAAC;AACtD,CAAC,CAAC;AAXW,QAAA,sBAAsB,0BAWjC","sourcesContent":["import { getArkosConfig } from \"../../../../server\";\nimport { ArkosRequest } from \"../../../../types\";\nimport AppError from \"../../../error-handler/utils/app-error\";\n\n/**\n * Determines the username field to use for authentication\n * Priority:\n * 1. req.query.usernameField\n * 2. config setting\n * 3. default \"username\"\n *\n * @param req - The request object\n * @returns The field name to use for username identification\n */\nexport const determineUsernameField = (req: ArkosRequest): string => {\n if (req.query?.usernameField && typeof req.query?.usernameField === \"string\")\n return req.query.usernameField;\n else if (req.query?.usernameField)\n throw new AppError(\n \"Invalid usernameField parameter, it must be a string\",\n 400\n );\n\n const initAuthConfigs = getArkosConfig()?.authentication;\n return initAuthConfigs?.usernameField || \"username\";\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"base.helpers.js","sourceRoot":"","sources":["../../../../../../src/modules/base/utils/helpers/base.helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getPrismaModelRelations,\n RelationFields,\n getModelUniqueFields,\n} from \"../../../../utils/helpers/models.helpers\";\n\n/**\n * Removes apiAction field from an object and all nested objects\n *\n * @param {Record<string, any>} obj - The object to clean\n * @returns {Record<string, any>} - The cleaned object\n */\nfunction removeApiAction(obj: Record<string, any>): Record<string, any> {\n if (!obj || typeof obj !== \"object\") return obj;\n\n const result: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n if (key === \"apiAction\") continue;\n\n if (Array.isArray(value)) {\n result[key] = value.map((item) =>\n typeof item === \"object\" && item !== null ? removeApiAction(item) : item\n );\n } else if (typeof value === \"object\" && value !== null) {\n result[key] = removeApiAction(value);\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\n/**\n * Checks if an object is already formatted as a Prisma relation operation\n *\n * @param {Record<string, any>} obj - The object to check\n * @returns {boolean} - True if the object contains Prisma relation operations\n */\nexport function isPrismaRelationFormat(obj: Record<string, any>): boolean {\n if (!obj || typeof obj !== \"object\") return false;\n\n // Common Prisma relation operations\n const prismaOperations = [\n \"create\",\n \"connect\",\n \"update\",\n \"delete\",\n \"disconnect\",\n \"deleteMany\",\n \"connectOrCreate\",\n \"upsert\",\n \"set\",\n ];\n\n // Check if any key is a Prisma operation\n return prismaOperations.some((op) => op in obj);\n}\n\n/**\n * Determines the appropriate Prisma operation (`create`, `connect`, `update`, `delete`, or `disconnect`)\n * for each relation field in the provided body based on its nested data and recursively does the same for each relation field.\n *\n * This function handles the following types of relations:\n * - **One-to-one**\n * - **One-to-many**\n *\n *\n * ### Operation Rules:\n *\n *\n * - **Create**: Used when the nested relation data is provided **without an `id` or unique field**.\n * - **Connect**: Used when the nested relation data contains **only an `id` or a unique field** (e.g., email).\n * - **Update**: Used when the nested relation data contains **both an `id` and additional fields**.\n * - **Delete**: Used when the nested relation data includes **`apiAction: \"delete\"`**.\n * - **Disconnect**: Used when the nested relation data includes **`apiAction: \"disconnect\"`**.\n *\n * The function will preserve existing Prisma operation formats if detected,\n * allowing developers to manually structure relation operations when needed.\n *\n * @param {Record<string, any>} body - The object containing relation fields to be processed.\n * @param {Object} relationFields - Defines relation field types.\n * @param {RelationFields[]} relationFields.singular - List of one-side relation field names (one-to-one).\n * @param {RelationFields[]} relationFields.list - List of many-side relation field names (one-to-many).\n * @param {string[]} ignoreActions - Optional list of apiAction values to ignore.\n * @returns {Record<string, any>} The transformed data with appropriate Prisma operations applied.\n */\nexport function handleRelationFieldsInBody(\n body: Record<string, any>,\n relationFields: RelationFields,\n ignoreActions: string[] = []\n) {\n let mutableBody = { ...body };\n\n relationFields?.list?.forEach((field) => {\n if (!body[field.name]) return;\n\n // Skip if the field is already in Prisma relation format\n if (isPrismaRelationFormat(body[field.name])) {\n return;\n }\n\n // Skip if the field is not an array (likely already handled manually)\n if (!isListFieldAnArray(body[field.name])) {\n return;\n }\n\n const createData: any[] = [];\n const connectData: any[] = [];\n const updateData: any[] = [];\n const disconnectData: any[] = [];\n const deleteManyIds: any[] = [];\n\n body[field.name]?.forEach((bodyField: any) => {\n if (ignoreActions.includes(bodyField?.apiAction)) return;\n\n const apiAction = bodyField?.apiAction;\n\n if (apiAction === \"delete\") {\n deleteManyIds.push(bodyField.id);\n } else if (apiAction === \"disconnect\") {\n disconnectData.push({ id: bodyField.id });\n } else if (canBeUsedToConnect(field.type, bodyField)) {\n // Handle connection with unique fields or ID\n const { apiAction: _, ...cleanedData } = bodyField;\n connectData.push(cleanedData);\n } else if (!bodyField?.id) {\n // If no ID, assume create operation\n let nestedRelations = getPrismaModelRelations(field.type);\n\n let dataToPush = { ...bodyField };\n\n if (nestedRelations) {\n dataToPush = handleRelationFieldsInBody(\n dataToPush,\n nestedRelations,\n ignoreActions\n );\n }\n\n // Ensure apiAction is removed\n if (\"apiAction\" in dataToPush) {\n const { apiAction: _, ...rest } = dataToPush;\n dataToPush = rest;\n }\n\n createData.push(dataToPush);\n } else {\n // If ID and other fields, assume update operation\n const { id, apiAction: _, ...data } = bodyField;\n\n let nestedRelations = getPrismaModelRelations(field.type);\n\n let dataToPush = data;\n if (nestedRelations) {\n dataToPush = handleRelationFieldsInBody(\n data,\n nestedRelations,\n ignoreActions\n );\n }\n\n updateData.push({\n where: { id },\n data: dataToPush,\n });\n }\n });\n\n mutableBody[field.name] = {\n ...(createData.length ? { create: createData } : {}),\n ...(connectData.length ? { connect: connectData } : {}),\n ...(updateData.length ? { update: updateData } : {}),\n ...(disconnectData.length ? { disconnect: disconnectData } : {}),\n ...(deleteManyIds.length\n ? { deleteMany: { id: { in: deleteManyIds } } }\n : {}),\n };\n });\n\n relationFields?.singular?.forEach((field) => {\n if (!body[field.name]) return;\n if (ignoreActions.includes(body[field.name]?.apiAction)) return;\n\n // Skip if the field is already in Prisma relation format\n if (isPrismaRelationFormat(body[field.name])) {\n return;\n }\n\n const relationData = body[field.name];\n let nestedRelations = getPrismaModelRelations(field.type);\n\n if (canBeUsedToConnect(field.type, relationData)) {\n // Handle connection with unique fields or ID\n const { apiAction: _, ...cleanedData } = relationData;\n mutableBody[field.name] = { connect: cleanedData };\n } else if (!relationData?.id) {\n // If no ID, assume create operation\n let dataToCreate = { ...relationData };\n\n if (\"apiAction\" in dataToCreate) {\n const { apiAction: _, ...rest } = dataToCreate;\n dataToCreate = rest;\n }\n\n if (nestedRelations) {\n dataToCreate = handleRelationFieldsInBody(\n dataToCreate,\n nestedRelations,\n ignoreActions\n );\n }\n\n mutableBody[field.name] = { create: dataToCreate };\n } else {\n // If ID and other fields, assume update operation\n const { id, apiAction: _, ...data } = relationData;\n\n let dataToUpdate = data;\n if (nestedRelations) {\n dataToUpdate = handleRelationFieldsInBody(\n data,\n nestedRelations,\n ignoreActions\n );\n }\n\n mutableBody[field.name] = {\n update: {\n data: dataToUpdate,\n },\n };\n }\n });\n\n // Remove any remaining apiAction fields from the top level\n if (\"apiAction\" in mutableBody) {\n const { apiAction, ...rest } = mutableBody;\n mutableBody = rest;\n }\n\n // As a final step, recursively remove any remaining apiAction fields\n return removeApiAction(mutableBody);\n}\n\n/**\n * Checks if a field value can be used to connect to a model\n * This happens when the field contains only an ID or a single unique field\n *\n * @param {string} modelName - The model name to get unique fields for\n * @param {Record<string, any>} bodyField - The field value from the body\n * @returns {boolean} True if the field can be used for a connect operation\n */\nexport function canBeUsedToConnect(\n modelName: string,\n bodyField: Record<string, any> | undefined | null\n): boolean {\n // If the field is null or undefined, it can't be used to connect\n if (!bodyField) return false;\n\n // If the field has an apiAction that's not for connecting, return false\n if (bodyField.apiAction && ![\"connect\"].includes(bodyField.apiAction)) {\n return false;\n }\n\n // If explicitly marked for connect, allow it\n if (bodyField.apiAction === \"connect\") {\n return true;\n }\n\n // If only ID is present, it can be used to connect\n if (Object.keys(bodyField)?.length === 1 && bodyField?.id) {\n return true;\n }\n\n // Get unique fields for the model\n const uniqueFields = getModelUniqueFields(modelName);\n\n // If the field has exactly one property and it's a unique field, it can be used to connect\n if (Object.keys(bodyField).length === 1) {\n const fieldName = Object.keys(bodyField)[0];\n return uniqueFields?.some((field) => field.name === fieldName);\n }\n\n return false;\n}\n\n/**\n * Checks if a list field is actually an array\n *\n * @param {any} field - The field to check\n * @returns {boolean} - True if the field is an array\n */\nexport function isListFieldAnArray(field: any): boolean {\n return Array.isArray(field);\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"prisma-model-router-config.js","sourceRoot":"","sources":["../../../src/types/prisma-model-router-config.ts"],"names":[],"mappings":"","sourcesContent":["export type AvailableEndpoints =\n | \"createOne\"\n | \"findOne\"\n | \"updateOne\"\n | \"deleteOne\"\n | \"findMany\"\n | \"createMany\"\n | \"udpateMany\"\n | \"deleteMany\";\n\n/**\n * Allows to customize the generated routers\n *\n * See docs [www.arkosjs.com/docs/advanced-guide/customizing-generated-routers#generated-routers-configuration](https://www.arkosjs.com/docs/advanced-guide/customizing-generated-routers#generated-routers-configuration)\n */\nexport type PrismaModelRouterConfig = {\n /**\n * Allows to configure nested routes.\n *\n * **Example**\n *\n * ```curl\n * GET /api/authors/:id/posts\n * ```\n *\n * Returning only the fields belonging to the passed author id.\n *\n * See more at [www.arkosjs.com/docs/advanced-guide/customizing-generated-routers](https://www.arkosjs.com/docs/advanced-guide/customizing-generated-routers)\n */\n parent?: {\n /**\n * Your prisma model name in kebab-case and singular.\n */\n model?: string;\n /**\n * Defines the parentId field stores the Id relation. e.g authorId, categoryId, productId.\n *\n *\n *\n * **Note**: By default **Arkos** will look for modelNameId, modelName being the model specified in `parent.model`.\n *\n * **Example**\n * ```prisma\n * model Post {\n * // other fields\n * authorId String\n * author Author @relation(fields: [authorId], references: [id])\n * }\n * ```\n *\n * When passed `parent.model` to `author` **Arkos** will create an endpoint:\n * ```curl\n * GET /api/authors/:id/posts\n * GET /api/authors/:id/posts/:id\n * POST /api/authors/:id/posts\n * UPDATE /api/authors/:id/posts/:id\n * DELETE /api/authors/:id/posts/:id\n * POST /api/authors/:id/posts/many\n * UPDATE /api/authors/:id/posts/many\n * DELETE /api/authors/:id/posts/many\n * ```\n *\n * If you want to point to a different field pass it here.\n */\n referenceField?: string;\n /**\n * Customizes what endpoints to be created.\n *\n * Default is \"*\" to generate all endpoints\n */\n endpoints?: \"*\" | AvailableEndpoints | AvailableEndpoints[];\n };\n /**\n * Use to disable endpoints or the whole router\n *\n * If `true`, will disable:\n *\n * ```curl\n * POST /api/[mode-name]\n * GET /api/[mode-name]/:id\n * PATCH /api/[mode-name]:id\n * DELETE /api/[mode-name]:id\n * POST /api/[mode-name]/many\n * GET /api/[mode-name]\n * UPDATE /api/[mode-name]/many\n * DELETE /api/[mode-name]/many\n * ```\n */\n disable?:\n | boolean\n | {\n /**\n * If `true`, will disable:\n *\n * ```curl\n * POST /api/[mode-name]\n * ```\n */\n createOne?: boolean;\n /**\n * If `true`, will disable:\n *\n * ```curl\n * GET /api/[mode-name]/:id\n * ```\n */\n findOne?: boolean;\n /**\n * If `true`, will disable:\n *\n * ```curl\n * PATCH /api/[mode-name]:id\n * ```\n */\n updateOne?: boolean;\n /**\n * If `true`, will disable:\n *\n * ```curl\n * DELETE /api/[mode-name]:id\n * ```\n */\n deleteOne?: boolean;\n /**\n * If `true`, will disable:\n *\n * ```curl\n * POST /api/[mode-name]/many\n * ```\n */\n createMany?: boolean;\n /**\n * If `true`, will disable:\n *\n * ```curl\n * GET /api/[mode-name]\n * ```\n */\n findMany?: boolean;\n /**\n * If `true`, will disable:\n *\n * ```curl\n * UPDATE /api/[mode-name]/many\n * ```\n */\n updateMany?: boolean;\n /**\n * If `true`, will disable:\n *\n * ```curl\n * DELETE /api/[mode-name]/many\n * ```\n */\n deleteMany?: boolean;\n };\n};\n"]}
@@ -1,12 +0,0 @@
1
- import { getArkosConfig } from "../../../../server";
2
- import AppError from "../../../error-handler/utils/app-error";
3
- export const determineUsernameField = (req) => {
4
- var _a, _b, _c, _d;
5
- if (((_a = req.query) === null || _a === void 0 ? void 0 : _a.usernameField) && typeof ((_b = req.query) === null || _b === void 0 ? void 0 : _b.usernameField) === "string")
6
- return req.query.usernameField;
7
- else if ((_c = req.query) === null || _c === void 0 ? void 0 : _c.usernameField)
8
- throw new AppError("Invalid usernameField parameter, it must be a string", 400);
9
- const initAuthConfigs = (_d = getArkosConfig()) === null || _d === void 0 ? void 0 : _d.authentication;
10
- return (initAuthConfigs === null || initAuthConfigs === void 0 ? void 0 : initAuthConfigs.usernameField) || "username";
11
- };
12
- //# sourceMappingURL=auth.helpers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth.helpers.js","sourceRoot":"","sources":["../../../../../../src/modules/auth/utils/helpers/auth.helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,QAAQ,MAAM,wCAAwC,CAAC;AAY9D,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,GAAiB,EAAU,EAAE;;IAClE,IAAI,CAAA,MAAA,GAAG,CAAC,KAAK,0CAAE,aAAa,KAAI,OAAO,CAAA,MAAA,GAAG,CAAC,KAAK,0CAAE,aAAa,CAAA,KAAK,QAAQ;QAC1E,OAAO,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC;SAC5B,IAAI,MAAA,GAAG,CAAC,KAAK,0CAAE,aAAa;QAC/B,MAAM,IAAI,QAAQ,CAChB,sDAAsD,EACtD,GAAG,CACJ,CAAC;IAEJ,MAAM,eAAe,GAAG,MAAA,cAAc,EAAE,0CAAE,cAAc,CAAC;IACzD,OAAO,CAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,aAAa,KAAI,UAAU,CAAC;AACtD,CAAC,CAAC","sourcesContent":["import { getArkosConfig } from \"../../../../server\";\nimport { ArkosRequest } from \"../../../../types\";\nimport AppError from \"../../../error-handler/utils/app-error\";\n\n/**\n * Determines the username field to use for authentication\n * Priority:\n * 1. req.query.usernameField\n * 2. config setting\n * 3. default \"username\"\n *\n * @param req - The request object\n * @returns The field name to use for username identification\n */\nexport const determineUsernameField = (req: ArkosRequest): string => {\n if (req.query?.usernameField && typeof req.query?.usernameField === \"string\")\n return req.query.usernameField;\n else if (req.query?.usernameField)\n throw new AppError(\n \"Invalid usernameField parameter, it must be a string\",\n 400\n );\n\n const initAuthConfigs = getArkosConfig()?.authentication;\n return initAuthConfigs?.usernameField || \"username\";\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"base.helpers.js","sourceRoot":"","sources":["../../../../../../src/modules/base/utils/helpers/base.helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getPrismaModelRelations,\n RelationFields,\n getModelUniqueFields,\n} from \"../../../../utils/helpers/models.helpers\";\n\n/**\n * Removes apiAction field from an object and all nested objects\n *\n * @param {Record<string, any>} obj - The object to clean\n * @returns {Record<string, any>} - The cleaned object\n */\nfunction removeApiAction(obj: Record<string, any>): Record<string, any> {\n if (!obj || typeof obj !== \"object\") return obj;\n\n const result: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n if (key === \"apiAction\") continue;\n\n if (Array.isArray(value)) {\n result[key] = value.map((item) =>\n typeof item === \"object\" && item !== null ? removeApiAction(item) : item\n );\n } else if (typeof value === \"object\" && value !== null) {\n result[key] = removeApiAction(value);\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\n/**\n * Checks if an object is already formatted as a Prisma relation operation\n *\n * @param {Record<string, any>} obj - The object to check\n * @returns {boolean} - True if the object contains Prisma relation operations\n */\nexport function isPrismaRelationFormat(obj: Record<string, any>): boolean {\n if (!obj || typeof obj !== \"object\") return false;\n\n // Common Prisma relation operations\n const prismaOperations = [\n \"create\",\n \"connect\",\n \"update\",\n \"delete\",\n \"disconnect\",\n \"deleteMany\",\n \"connectOrCreate\",\n \"upsert\",\n \"set\",\n ];\n\n // Check if any key is a Prisma operation\n return prismaOperations.some((op) => op in obj);\n}\n\n/**\n * Determines the appropriate Prisma operation (`create`, `connect`, `update`, `delete`, or `disconnect`)\n * for each relation field in the provided body based on its nested data and recursively does the same for each relation field.\n *\n * This function handles the following types of relations:\n * - **One-to-one**\n * - **One-to-many**\n *\n *\n * ### Operation Rules:\n *\n *\n * - **Create**: Used when the nested relation data is provided **without an `id` or unique field**.\n * - **Connect**: Used when the nested relation data contains **only an `id` or a unique field** (e.g., email).\n * - **Update**: Used when the nested relation data contains **both an `id` and additional fields**.\n * - **Delete**: Used when the nested relation data includes **`apiAction: \"delete\"`**.\n * - **Disconnect**: Used when the nested relation data includes **`apiAction: \"disconnect\"`**.\n *\n * The function will preserve existing Prisma operation formats if detected,\n * allowing developers to manually structure relation operations when needed.\n *\n * @param {Record<string, any>} body - The object containing relation fields to be processed.\n * @param {Object} relationFields - Defines relation field types.\n * @param {RelationFields[]} relationFields.singular - List of one-side relation field names (one-to-one).\n * @param {RelationFields[]} relationFields.list - List of many-side relation field names (one-to-many).\n * @param {string[]} ignoreActions - Optional list of apiAction values to ignore.\n * @returns {Record<string, any>} The transformed data with appropriate Prisma operations applied.\n */\nexport function handleRelationFieldsInBody(\n body: Record<string, any>,\n relationFields: RelationFields,\n ignoreActions: string[] = []\n) {\n let mutableBody = { ...body };\n\n relationFields?.list?.forEach((field) => {\n if (!body[field.name]) return;\n\n // Skip if the field is already in Prisma relation format\n if (isPrismaRelationFormat(body[field.name])) {\n return;\n }\n\n // Skip if the field is not an array (likely already handled manually)\n if (!isListFieldAnArray(body[field.name])) {\n return;\n }\n\n const createData: any[] = [];\n const connectData: any[] = [];\n const updateData: any[] = [];\n const disconnectData: any[] = [];\n const deleteManyIds: any[] = [];\n\n body[field.name]?.forEach((bodyField: any) => {\n if (ignoreActions.includes(bodyField?.apiAction)) return;\n\n const apiAction = bodyField?.apiAction;\n\n if (apiAction === \"delete\") {\n deleteManyIds.push(bodyField.id);\n } else if (apiAction === \"disconnect\") {\n disconnectData.push({ id: bodyField.id });\n } else if (canBeUsedToConnect(field.type, bodyField)) {\n // Handle connection with unique fields or ID\n const { apiAction: _, ...cleanedData } = bodyField;\n connectData.push(cleanedData);\n } else if (!bodyField?.id) {\n // If no ID, assume create operation\n let nestedRelations = getPrismaModelRelations(field.type);\n\n let dataToPush = { ...bodyField };\n\n if (nestedRelations) {\n dataToPush = handleRelationFieldsInBody(\n dataToPush,\n nestedRelations,\n ignoreActions\n );\n }\n\n // Ensure apiAction is removed\n if (\"apiAction\" in dataToPush) {\n const { apiAction: _, ...rest } = dataToPush;\n dataToPush = rest;\n }\n\n createData.push(dataToPush);\n } else {\n // If ID and other fields, assume update operation\n const { id, apiAction: _, ...data } = bodyField;\n\n let nestedRelations = getPrismaModelRelations(field.type);\n\n let dataToPush = data;\n if (nestedRelations) {\n dataToPush = handleRelationFieldsInBody(\n data,\n nestedRelations,\n ignoreActions\n );\n }\n\n updateData.push({\n where: { id },\n data: dataToPush,\n });\n }\n });\n\n mutableBody[field.name] = {\n ...(createData.length ? { create: createData } : {}),\n ...(connectData.length ? { connect: connectData } : {}),\n ...(updateData.length ? { update: updateData } : {}),\n ...(disconnectData.length ? { disconnect: disconnectData } : {}),\n ...(deleteManyIds.length\n ? { deleteMany: { id: { in: deleteManyIds } } }\n : {}),\n };\n });\n\n relationFields?.singular?.forEach((field) => {\n if (!body[field.name]) return;\n if (ignoreActions.includes(body[field.name]?.apiAction)) return;\n\n // Skip if the field is already in Prisma relation format\n if (isPrismaRelationFormat(body[field.name])) {\n return;\n }\n\n const relationData = body[field.name];\n let nestedRelations = getPrismaModelRelations(field.type);\n\n if (canBeUsedToConnect(field.type, relationData)) {\n // Handle connection with unique fields or ID\n const { apiAction: _, ...cleanedData } = relationData;\n mutableBody[field.name] = { connect: cleanedData };\n } else if (!relationData?.id) {\n // If no ID, assume create operation\n let dataToCreate = { ...relationData };\n\n if (\"apiAction\" in dataToCreate) {\n const { apiAction: _, ...rest } = dataToCreate;\n dataToCreate = rest;\n }\n\n if (nestedRelations) {\n dataToCreate = handleRelationFieldsInBody(\n dataToCreate,\n nestedRelations,\n ignoreActions\n );\n }\n\n mutableBody[field.name] = { create: dataToCreate };\n } else {\n // If ID and other fields, assume update operation\n const { id, apiAction: _, ...data } = relationData;\n\n let dataToUpdate = data;\n if (nestedRelations) {\n dataToUpdate = handleRelationFieldsInBody(\n data,\n nestedRelations,\n ignoreActions\n );\n }\n\n mutableBody[field.name] = {\n update: {\n data: dataToUpdate,\n },\n };\n }\n });\n\n // Remove any remaining apiAction fields from the top level\n if (\"apiAction\" in mutableBody) {\n const { apiAction, ...rest } = mutableBody;\n mutableBody = rest;\n }\n\n // As a final step, recursively remove any remaining apiAction fields\n return removeApiAction(mutableBody);\n}\n\n/**\n * Checks if a field value can be used to connect to a model\n * This happens when the field contains only an ID or a single unique field\n *\n * @param {string} modelName - The model name to get unique fields for\n * @param {Record<string, any>} bodyField - The field value from the body\n * @returns {boolean} True if the field can be used for a connect operation\n */\nexport function canBeUsedToConnect(\n modelName: string,\n bodyField: Record<string, any> | undefined | null\n): boolean {\n // If the field is null or undefined, it can't be used to connect\n if (!bodyField) return false;\n\n // If the field has an apiAction that's not for connecting, return false\n if (bodyField.apiAction && ![\"connect\"].includes(bodyField.apiAction)) {\n return false;\n }\n\n // If explicitly marked for connect, allow it\n if (bodyField.apiAction === \"connect\") {\n return true;\n }\n\n // If only ID is present, it can be used to connect\n if (Object.keys(bodyField)?.length === 1 && bodyField?.id) {\n return true;\n }\n\n // Get unique fields for the model\n const uniqueFields = getModelUniqueFields(modelName);\n\n // If the field has exactly one property and it's a unique field, it can be used to connect\n if (Object.keys(bodyField).length === 1) {\n const fieldName = Object.keys(bodyField)[0];\n return uniqueFields?.some((field) => field.name === fieldName);\n }\n\n return false;\n}\n\n/**\n * Checks if a list field is actually an array\n *\n * @param {any} field - The field to check\n * @returns {boolean} - True if the field is an array\n */\nexport function isListFieldAnArray(field: any): boolean {\n return Array.isArray(field);\n}\n"]}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=prisma-model-router-config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prisma-model-router-config.js","sourceRoot":"","sources":["../../../src/types/prisma-model-router-config.ts"],"names":[],"mappings":"","sourcesContent":["export type AvailableEndpoints =\n | \"createOne\"\n | \"findOne\"\n | \"updateOne\"\n | \"deleteOne\"\n | \"findMany\"\n | \"createMany\"\n | \"udpateMany\"\n | \"deleteMany\";\n\n/**\n * Allows to customize the generated routers\n *\n * See docs [www.arkosjs.com/docs/advanced-guide/customizing-generated-routers#generated-routers-configuration](https://www.arkosjs.com/docs/advanced-guide/customizing-generated-routers#generated-routers-configuration)\n */\nexport type PrismaModelRouterConfig = {\n /**\n * Allows to configure nested routes.\n *\n * **Example**\n *\n * ```curl\n * GET /api/authors/:id/posts\n * ```\n *\n * Returning only the fields belonging to the passed author id.\n *\n * See more at [www.arkosjs.com/docs/advanced-guide/customizing-generated-routers](https://www.arkosjs.com/docs/advanced-guide/customizing-generated-routers)\n */\n parent?: {\n /**\n * Your prisma model name in kebab-case and singular.\n */\n model?: string;\n /**\n * Defines the parentId field stores the Id relation. e.g authorId, categoryId, productId.\n *\n *\n *\n * **Note**: By default **Arkos** will look for modelNameId, modelName being the model specified in `parent.model`.\n *\n * **Example**\n * ```prisma\n * model Post {\n * // other fields\n * authorId String\n * author Author @relation(fields: [authorId], references: [id])\n * }\n * ```\n *\n * When passed `parent.model` to `author` **Arkos** will create an endpoint:\n * ```curl\n * GET /api/authors/:id/posts\n * GET /api/authors/:id/posts/:id\n * POST /api/authors/:id/posts\n * UPDATE /api/authors/:id/posts/:id\n * DELETE /api/authors/:id/posts/:id\n * POST /api/authors/:id/posts/many\n * UPDATE /api/authors/:id/posts/many\n * DELETE /api/authors/:id/posts/many\n * ```\n *\n * If you want to point to a different field pass it here.\n */\n referenceField?: string;\n /**\n * Customizes what endpoints to be created.\n *\n * Default is \"*\" to generate all endpoints\n */\n endpoints?: \"*\" | AvailableEndpoints | AvailableEndpoints[];\n };\n /**\n * Use to disable endpoints or the whole router\n *\n * If `true`, will disable:\n *\n * ```curl\n * POST /api/[mode-name]\n * GET /api/[mode-name]/:id\n * PATCH /api/[mode-name]:id\n * DELETE /api/[mode-name]:id\n * POST /api/[mode-name]/many\n * GET /api/[mode-name]\n * UPDATE /api/[mode-name]/many\n * DELETE /api/[mode-name]/many\n * ```\n */\n disable?:\n | boolean\n | {\n /**\n * If `true`, will disable:\n *\n * ```curl\n * POST /api/[mode-name]\n * ```\n */\n createOne?: boolean;\n /**\n * If `true`, will disable:\n *\n * ```curl\n * GET /api/[mode-name]/:id\n * ```\n */\n findOne?: boolean;\n /**\n * If `true`, will disable:\n *\n * ```curl\n * PATCH /api/[mode-name]:id\n * ```\n */\n updateOne?: boolean;\n /**\n * If `true`, will disable:\n *\n * ```curl\n * DELETE /api/[mode-name]:id\n * ```\n */\n deleteOne?: boolean;\n /**\n * If `true`, will disable:\n *\n * ```curl\n * POST /api/[mode-name]/many\n * ```\n */\n createMany?: boolean;\n /**\n * If `true`, will disable:\n *\n * ```curl\n * GET /api/[mode-name]\n * ```\n */\n findMany?: boolean;\n /**\n * If `true`, will disable:\n *\n * ```curl\n * UPDATE /api/[mode-name]/many\n * ```\n */\n updateMany?: boolean;\n /**\n * If `true`, will disable:\n *\n * ```curl\n * DELETE /api/[mode-name]/many\n * ```\n */\n deleteMany?: boolean;\n };\n};\n"]}
@@ -1,2 +0,0 @@
1
- import { ArkosRequest } from "../../../../types";
2
- export declare const determineUsernameField: (req: ArkosRequest) => string;