arkos 0.0.1 → 0.0.3

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 (116) hide show
  1. package/dist/app.d.ts +10 -0
  2. package/dist/app.d.ts.map +1 -0
  3. package/dist/app.js +114 -0
  4. package/dist/app.js.map +1 -0
  5. package/dist/index.d.ts +21 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +51 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/modules/auth/auth.controller.d.ts +23 -0
  10. package/dist/modules/auth/auth.controller.d.ts.map +1 -0
  11. package/dist/modules/auth/auth.controller.js +317 -0
  12. package/dist/modules/auth/auth.controller.js.map +1 -0
  13. package/dist/modules/auth/auth.router.d.ts +4 -0
  14. package/dist/modules/auth/auth.router.d.ts.map +1 -0
  15. package/dist/modules/auth/auth.router.js +64 -0
  16. package/dist/modules/auth/auth.router.js.map +1 -0
  17. package/dist/modules/auth/auth.service.d.ts +16 -0
  18. package/dist/modules/auth/auth.service.d.ts.map +1 -0
  19. package/dist/modules/auth/auth.service.js +122 -0
  20. package/dist/modules/auth/auth.service.js.map +1 -0
  21. package/dist/modules/base/base.controller.d.ts +17 -0
  22. package/dist/modules/base/base.controller.d.ts.map +1 -0
  23. package/dist/modules/base/base.controller.js +296 -0
  24. package/dist/modules/base/base.controller.js.map +1 -0
  25. package/dist/modules/base/base.middlewares.d.ts +20 -0
  26. package/dist/modules/base/base.middlewares.d.ts.map +1 -0
  27. package/dist/modules/base/base.middlewares.js +86 -0
  28. package/dist/modules/base/base.middlewares.js.map +1 -0
  29. package/dist/modules/base/base.router.d.ts +4 -0
  30. package/dist/modules/base/base.router.d.ts.map +1 -0
  31. package/dist/modules/base/base.router.js +74 -0
  32. package/dist/modules/base/base.router.js.map +1 -0
  33. package/dist/modules/base/base.service.d.ts +32 -0
  34. package/dist/modules/base/base.service.d.ts.map +1 -0
  35. package/dist/modules/base/base.service.js +149 -0
  36. package/dist/modules/base/base.service.js.map +1 -0
  37. package/dist/modules/base/utils/base.helpers.d.ts +29 -0
  38. package/dist/modules/base/utils/base.helpers.d.ts.map +1 -0
  39. package/dist/modules/base/utils/base.helpers.js +106 -0
  40. package/dist/modules/base/utils/base.helpers.js.map +1 -0
  41. package/dist/modules/email/email.service.d.ts +22 -0
  42. package/dist/modules/email/email.service.d.ts.map +1 -0
  43. package/dist/modules/email/email.service.js +45 -0
  44. package/dist/modules/email/email.service.js.map +1 -0
  45. package/dist/modules/email/utils/email.helpers.d.ts +9 -0
  46. package/dist/modules/email/utils/email.helpers.d.ts.map +1 -0
  47. package/dist/modules/email/utils/email.helpers.js +25 -0
  48. package/dist/modules/email/utils/email.helpers.js.map +1 -0
  49. package/dist/modules/error-handler/error-handler.controller.d.ts +4 -0
  50. package/dist/modules/error-handler/error-handler.controller.d.ts.map +1 -0
  51. package/dist/modules/error-handler/error-handler.controller.js +182 -0
  52. package/dist/modules/error-handler/error-handler.controller.js.map +1 -0
  53. package/dist/modules/error-handler/utils/app-error.d.ts +11 -0
  54. package/dist/modules/error-handler/utils/app-error.d.ts.map +1 -0
  55. package/dist/modules/error-handler/utils/app-error.js +23 -0
  56. package/dist/modules/error-handler/utils/app-error.js.map +1 -0
  57. package/dist/modules/error-handler/utils/catch-async.d.ts +4 -0
  58. package/dist/modules/error-handler/utils/catch-async.d.ts.map +1 -0
  59. package/dist/modules/error-handler/utils/catch-async.js +9 -0
  60. package/dist/modules/error-handler/utils/catch-async.js.map +1 -0
  61. package/dist/modules/error-handler/utils/error-handler.helpers.d.ts +43 -0
  62. package/dist/modules/error-handler/utils/error-handler.helpers.d.ts.map +1 -0
  63. package/dist/modules/error-handler/utils/error-handler.helpers.js +209 -0
  64. package/dist/modules/error-handler/utils/error-handler.helpers.js.map +1 -0
  65. package/dist/modules/file-uploader/file-uploader.service.d.ts +20 -0
  66. package/dist/modules/file-uploader/file-uploader.service.d.ts.map +1 -0
  67. package/dist/modules/file-uploader/file-uploader.service.js +114 -0
  68. package/dist/modules/file-uploader/file-uploader.service.js.map +1 -0
  69. package/dist/paths.d.ts +2 -0
  70. package/dist/paths.d.ts.map +1 -0
  71. package/dist/paths.js +9 -0
  72. package/dist/paths.js.map +1 -0
  73. package/dist/src/index.d.ts +2 -2
  74. package/dist/src/index.d.ts.map +1 -1
  75. package/dist/src/index.js.map +1 -1
  76. package/dist/utils/features/api.features.d.ts +20 -0
  77. package/dist/utils/features/api.features.d.ts.map +1 -0
  78. package/dist/utils/features/api.features.js +177 -0
  79. package/dist/utils/features/api.features.js.map +1 -0
  80. package/dist/utils/features/prisma.helpers.d.ts +3 -0
  81. package/dist/utils/features/prisma.helpers.d.ts.map +1 -0
  82. package/dist/utils/features/prisma.helpers.js +20 -0
  83. package/dist/utils/features/prisma.helpers.js.map +1 -0
  84. package/dist/utils/helpers/api.features.helpers.d.ts +41 -0
  85. package/dist/utils/helpers/api.features.helpers.d.ts.map +1 -0
  86. package/dist/utils/helpers/api.features.helpers.js +161 -0
  87. package/dist/utils/helpers/api.features.helpers.js.map +1 -0
  88. package/dist/utils/helpers/models.helpers.d.ts +21 -0
  89. package/dist/utils/helpers/models.helpers.d.ts.map +1 -0
  90. package/dist/utils/helpers/models.helpers.js +195 -0
  91. package/dist/utils/helpers/models.helpers.js.map +1 -0
  92. package/dist/utils/helpers/text.helpers.d.ts +2 -0
  93. package/dist/utils/helpers/text.helpers.d.ts.map +1 -0
  94. package/dist/utils/helpers/text.helpers.js +12 -0
  95. package/dist/utils/helpers/text.helpers.js.map +1 -0
  96. package/dist/utils/permissions/index.d.ts +3 -0
  97. package/dist/utils/permissions/index.d.ts.map +1 -0
  98. package/dist/utils/permissions/index.js +17 -0
  99. package/dist/utils/permissions/index.js.map +1 -0
  100. package/dist/utils/scripts/export-prisma-types.d.ts +2 -0
  101. package/dist/utils/scripts/export-prisma-types.d.ts.map +1 -0
  102. package/dist/utils/scripts/export-prisma-types.js +152 -0
  103. package/dist/utils/scripts/export-prisma-types.js.map +1 -0
  104. package/dist/utils/scripts/generate-zod-schemas.d.ts +2 -0
  105. package/dist/utils/scripts/generate-zod-schemas.d.ts.map +1 -0
  106. package/dist/utils/scripts/generate-zod-schemas.js +121 -0
  107. package/dist/utils/scripts/generate-zod-schemas.js.map +1 -0
  108. package/dist/utils/scripts/prisma-db-push.d.ts +2 -0
  109. package/dist/utils/scripts/prisma-db-push.d.ts.map +1 -0
  110. package/dist/utils/scripts/prisma-db-push.js +24 -0
  111. package/dist/utils/scripts/prisma-db-push.js.map +1 -0
  112. package/dist/utils/validate-dto.d.ts +3 -0
  113. package/dist/utils/validate-dto.d.ts.map +1 -0
  114. package/dist/utils/validate-dto.js +17 -0
  115. package/dist/utils/validate-dto.js.map +1 -0
  116. package/package.json +1 -1
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.callNext = callNext;
4
+ exports.sendResponse = sendResponse;
5
+ exports.addRouteMiddlwaresAndConfigs = addRouteMiddlwaresAndConfigs;
6
+ exports.addPrismaQueryOptionsToRequestQuery = addPrismaQueryOptionsToRequestQuery;
7
+ exports.handleRequestLogs = handleRequestLogs;
8
+ function callNext(req, res, next) {
9
+ next();
10
+ }
11
+ function sendResponse(req, res, next) {
12
+ if (req.responseData && req.responseStatus)
13
+ res.status(req.responseStatus).json(req.responseData);
14
+ else if (req.responseStatus && !req.responseData)
15
+ res.status(req.responseStatus).send();
16
+ else
17
+ res
18
+ .status(500)
19
+ .json({ message: 'No status or data attached to the response' });
20
+ }
21
+ function addRouteMiddlwaresAndConfigs() { }
22
+ /**
23
+ * Middleware to add Prisma query options to the request's query parameters.
24
+ *
25
+ * @template T - The type of the Prisma model.
26
+ * @param {PrismaQueryOptions<T>} prismaQueryOptions - The Prisma query options to attach.
27
+ * @param {ControllerActions} action - The controller action to apply.
28
+ * @returns A middleware function that attaches the query options to the request.
29
+ */
30
+ function addPrismaQueryOptionsToRequestQuery(prismaQueryOptions, action) {
31
+ return (req, res, next) => {
32
+ req.query.prismaQueryOptions = JSON.stringify({
33
+ ...prismaQueryOptions?.queryOptions,
34
+ ...(prismaQueryOptions ? prismaQueryOptions[action] : {}),
35
+ });
36
+ next();
37
+ };
38
+ }
39
+ /**
40
+ * Logs request events with colored text such as errors, requests responses.
41
+ *
42
+ */
43
+ function handleRequestLogs(req, res, next) {
44
+ // if (process.env.NODE_ENV === 'production') return next()
45
+ const startTime = Date.now(); // Capture the start time
46
+ // Define colors for each HTTP method
47
+ const methodColors = {
48
+ GET: '\x1b[36m', // Cyan
49
+ POST: '\x1b[32m', // Green
50
+ PUT: '\x1b[33m', // Orange/Yellow
51
+ PATCH: '\x1b[33m', // Orange/Yellow
52
+ DELETE: '\x1b[31m', // Red
53
+ HEAD: '\x1b[34m', // Blue
54
+ OPTIONS: '\x1b[34m', // Blue
55
+ };
56
+ // Function to determine status code color
57
+ const getStatusColor = (statusCode) => {
58
+ if (statusCode >= 200 && statusCode < 300)
59
+ return '\x1b[32m'; // Green
60
+ if (statusCode >= 300 && statusCode < 400)
61
+ return '\x1b[33m'; // Orange/Yellow
62
+ if (statusCode >= 400 && statusCode < 500)
63
+ return '\x1b[33m'; // Red
64
+ if (statusCode >= 500)
65
+ return '\x1b[31m'; // White on Red background
66
+ return '\x1b[0m'; // Default (no color)
67
+ };
68
+ res.on('finish', () => {
69
+ const duration = Date.now() - startTime; // Calculate the time taken to process the request
70
+ // Get the current date and time
71
+ const now = new Date();
72
+ const dayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
73
+ const dayName = dayNames[now.getDay()];
74
+ const dayOfMonth = now.getDate();
75
+ const time = now.toTimeString().split(' ')[0]; // Format as HH:MM:SS
76
+ const methodColor = methodColors[req.method] || '\x1b[0m'; // Default to no color
77
+ const statusColor = getStatusColor(res.statusCode); // Get the color for the status code
78
+ console.info(`[\x1b[36mINFO\x1b[0m] \x1b[90m${time}\x1b[0m ${methodColor}${req.method}\x1b[0m ${decodeURIComponent(req.originalUrl)} ${statusColor}${res.statusCode}\x1b[0m \x1b[35m${duration}ms\x1b[0m`);
79
+ // Keep the commented-out example as it is
80
+ // console.log(
81
+ // `[\x1b[36mINFO\x1b[0m] ${dayName} ${dayOfMonth} ${time} ${methodColor}${req.method}\x1b[0m ${req.originalUrl} \x1b[32m${res.statusCode}\x1b[0m \x1b[35m${duration}ms\x1b[0m`
82
+ // );
83
+ });
84
+ next(); // Pass control to the next middleware or route handler
85
+ }
86
+ //# sourceMappingURL=base.middlewares.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.middlewares.js","sourceRoot":"","sources":["../../../src/modules/base/base.middlewares.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Router } from "express";
2
+ declare const router: Router;
3
+ export default router;
4
+ //# sourceMappingURL=base.router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.router.d.ts","sourceRoot":"","sources":["../../../src/modules/base/base.router.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAqBjC,QAAA,MAAM,MAAM,EAAE,MAAiB,CAAC;AAgQhC,eAAe,MAAM,CAAC"}
@@ -0,0 +1,74 @@
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
+ const change_case_all_1 = require("change-case-all");
7
+ const express_1 = require("express");
8
+ const pluralize_1 = __importDefault(require("pluralize"));
9
+ const base_controller_1 = require("./base.controller");
10
+ const models_helpers_1 = require("../../utils/helpers/models.helpers");
11
+ const base_middlewares_1 = require("./base.middlewares");
12
+ const permissions_1 = require("../../utils/permissions");
13
+ const auth_service_1 = __importDefault(require("../auth/auth.service"));
14
+ const router = (0, express_1.Router)();
15
+ models_helpers_1.models.forEach(async (model) => {
16
+ const modelNameInKebab = (0, change_case_all_1.kebabCase)(model);
17
+ const { middlewares, authConfigs, prismaQueryOptions } = await (0, models_helpers_1.importPrismaModelModules)(modelNameInKebab);
18
+ const routeName = pluralize_1.default.plural(modelNameInKebab);
19
+ const { createOne, findMany, findOne, updateOne, deleteOne, createMany, updateMany, deleteMany, } = await (0, base_controller_1.handlerFactory)(model, middlewares);
20
+ // const ModelType =
21
+ // typeof PrismaClient[pascalCase(model) as keyof typeof PrismaClient]
22
+ router
23
+ .route(`/${routeName}`)
24
+ .post(auth_service_1.default.handleAuthenticationControl(authConfigs, "create", modelNameInKebab), auth_service_1.default.handleActionAccessControl(authConfigs, "create", modelNameInKebab), (0, base_middlewares_1.addPrismaQueryOptionsToRequestQuery)(prismaQueryOptions, "createOne"), middlewares?.beforeCreateOne ?? createOne, middlewares?.beforeCreateOne
25
+ ? createOne
26
+ : middlewares?.afterCreateOne ?? base_middlewares_1.sendResponse, middlewares?.beforeCreateOne && middlewares?.afterCreateOne
27
+ ? middlewares?.afterCreateOne
28
+ : base_middlewares_1.sendResponse, base_middlewares_1.sendResponse)
29
+ .get(auth_service_1.default.handleAuthenticationControl(authConfigs, "view", modelNameInKebab), auth_service_1.default.handleActionAccessControl(authConfigs, "view", modelNameInKebab), (0, base_middlewares_1.addPrismaQueryOptionsToRequestQuery)(prismaQueryOptions, "findMany"), middlewares?.beforeFindMany ?? findMany, middlewares?.beforeFindMany
30
+ ? findMany
31
+ : middlewares?.afterFindMany ?? base_middlewares_1.sendResponse, middlewares?.beforeFindMany && middlewares?.afterFindMany
32
+ ? middlewares?.afterFindMany
33
+ : base_middlewares_1.sendResponse, base_middlewares_1.sendResponse);
34
+ router
35
+ .route(`/${routeName}/many`)
36
+ .post(auth_service_1.default.handleAuthenticationControl(authConfigs, "create", modelNameInKebab), auth_service_1.default.handleActionAccessControl(authConfigs, "create", modelNameInKebab), (0, base_middlewares_1.addPrismaQueryOptionsToRequestQuery)(prismaQueryOptions, "createMany"), middlewares?.beforeCreateMany ?? createMany, middlewares?.beforeCreateMany
37
+ ? createMany
38
+ : middlewares?.afterCreateMany ?? base_middlewares_1.sendResponse, middlewares?.beforeCreateMany && middlewares?.afterCreateMany
39
+ ? middlewares?.afterCreateMany
40
+ : base_middlewares_1.sendResponse, base_middlewares_1.sendResponse)
41
+ .patch(auth_service_1.default.handleAuthenticationControl(authConfigs, "update", modelNameInKebab), auth_service_1.default.handleActionAccessControl(authConfigs, "update", modelNameInKebab), (0, base_middlewares_1.addPrismaQueryOptionsToRequestQuery)(prismaQueryOptions, "updateMany"), middlewares?.beforeUpdateMany ?? updateMany, middlewares?.beforeUpdateMany
42
+ ? updateMany
43
+ : middlewares?.afterUpdateMany ?? base_middlewares_1.sendResponse, middlewares?.beforeUpdateMany && middlewares?.afterUpdateMany
44
+ ? middlewares?.afterUpdateMany
45
+ : base_middlewares_1.sendResponse, base_middlewares_1.sendResponse)
46
+ .delete(auth_service_1.default.handleAuthenticationControl(authConfigs, "delete", modelNameInKebab), auth_service_1.default.handleActionAccessControl(authConfigs, "delete", modelNameInKebab), (0, base_middlewares_1.addPrismaQueryOptionsToRequestQuery)(prismaQueryOptions, "deleteMany"), middlewares?.beforeDeleteMany ?? deleteMany, middlewares?.beforeDeleteMany
47
+ ? deleteMany
48
+ : middlewares?.afterDeleteMany ?? base_middlewares_1.sendResponse, middlewares?.beforeDeleteMany && middlewares?.afterDeleteMany
49
+ ? middlewares?.afterDeleteMany
50
+ : base_middlewares_1.sendResponse, base_middlewares_1.sendResponse);
51
+ router
52
+ .route(`/${routeName}/:id`)
53
+ .get(auth_service_1.default.handleAuthenticationControl(authConfigs, "view", modelNameInKebab), auth_service_1.default.handleActionAccessControl(authConfigs, "view", modelNameInKebab), (0, base_middlewares_1.addPrismaQueryOptionsToRequestQuery)(prismaQueryOptions, "findOne"), middlewares?.beforeFindOne ?? findOne, middlewares?.beforeFindOne
54
+ ? findOne
55
+ : middlewares?.afterFindOne ?? base_middlewares_1.sendResponse, middlewares?.beforeFindOne && middlewares?.afterFindOne
56
+ ? middlewares?.afterFindOne
57
+ : base_middlewares_1.sendResponse, base_middlewares_1.sendResponse)
58
+ .patch(auth_service_1.default.handleAuthenticationControl(authConfigs, "update", modelNameInKebab), auth_service_1.default.handleActionAccessControl(authConfigs, "update", modelNameInKebab), (0, base_middlewares_1.addPrismaQueryOptionsToRequestQuery)(prismaQueryOptions, "updateOne"), middlewares?.beforeUpdateOne ?? updateOne, middlewares?.beforeUpdateOne
59
+ ? updateOne
60
+ : middlewares?.afterUpdateOne ?? base_middlewares_1.sendResponse, middlewares?.beforeUpdateOne && middlewares?.afterUpdateOne
61
+ ? middlewares?.afterUpdateOne
62
+ : base_middlewares_1.sendResponse, base_middlewares_1.sendResponse)
63
+ .delete(auth_service_1.default.handleAuthenticationControl(authConfigs, "delete", modelNameInKebab), auth_service_1.default.handleActionAccessControl(authConfigs, "delete", modelNameInKebab), (0, base_middlewares_1.addPrismaQueryOptionsToRequestQuery)(prismaQueryOptions, "deleteOne"), middlewares?.beforeDeleteOne ?? deleteOne, middlewares?.beforeDeleteOne
64
+ ? deleteOne
65
+ : middlewares?.afterDeleteOne ?? base_middlewares_1.sendResponse, middlewares?.beforeDeleteOne && middlewares?.afterDeleteOne
66
+ ? middlewares?.afterDeleteOne
67
+ : base_middlewares_1.sendResponse, base_middlewares_1.sendResponse);
68
+ });
69
+ router.get("/available-routes", base_controller_1.getAvalibleRoutes);
70
+ router.get("/database-models", auth_service_1.default.authenticate, base_controller_1.getDatabaseModels);
71
+ router.post("/uploads/:fileType", auth_service_1.default.handleAuthenticationControl(permissions_1.permissions.uploads, "create", "file-upload"), auth_service_1.default.handleActionAccessControl(permissions_1.permissions.uploads, "create", "file-upload"), base_controller_1.uploadFile);
72
+ router.delete("/uploads/:fileType/:fileName", auth_service_1.default.handleAuthenticationControl(permissions_1.permissions.uploads, "create", "file-upload"), auth_service_1.default.handleActionAccessControl(permissions_1.permissions.uploads, "create", "file-upload"), base_controller_1.deleteFile);
73
+ exports.default = router;
74
+ //# sourceMappingURL=base.router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.router.js","sourceRoot":"","sources":["../../../src/modules/base/base.router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { RelationFields } from "../../utils/helpers/models.helpers";
2
+ declare const baseServices: Record<string, BaseService>;
3
+ export declare class BaseService {
4
+ modelName: string;
5
+ relationFields: RelationFields;
6
+ singularRelationFieldToInclude: Record<string, boolean>;
7
+ listRelationFieldToInclude: Record<string, boolean>;
8
+ prisma: any;
9
+ constructor(modelName: string);
10
+ createOne(body: Record<string, any>, queryOptions?: string): Promise<any>;
11
+ createMany(body: Record<string, any>[]): Promise<{
12
+ total: number;
13
+ data: any;
14
+ }>;
15
+ findMany(filters: Record<string, any>): Promise<{
16
+ total: number;
17
+ data: any;
18
+ }>;
19
+ findOne(params: Record<string, any>, queryOptions?: string): Promise<any>;
20
+ updateOne(params: Record<string, any>, body: Record<string, any>, queryOptions?: string): Promise<any>;
21
+ updateMany(filter: Record<string, any>, body: Record<string, any>): Promise<{
22
+ total: number;
23
+ data: any;
24
+ }>;
25
+ deleteOne(params: Record<string, any>): Promise<any>;
26
+ deleteMany(filter: Record<string, any>): Promise<{
27
+ total: number;
28
+ data: any;
29
+ }>;
30
+ }
31
+ export default baseServices;
32
+ //# sourceMappingURL=base.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.service.d.ts","sourceRoot":"","sources":["../../../src/modules/base/base.service.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,cAAc,EACf,MAAM,oCAAoC,CAAC;AAQ5C,QAAA,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAM,CAAC;AAErD,qBAAa,WAAW;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,cAAc,CAAC;IAC/B,8BAA8B,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxD,0BAA0B,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEpD,MAAM,EAAE,GAAG,CAAC;gBAEA,SAAS,EAAE,MAAM;IAoBvB,SAAS,CACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,GAAG,CAAC;IAsBT,UAAU,CACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAC1B,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,GAAG,CAAA;KAAE,CAAC;IAelC,QAAQ,CACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC3B,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,GAAG,CAAA;KAAE,CAAC;IAwBlC,OAAO,CACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3B,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,GAAG,CAAC;IAiCT,SAAS,CACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,GAAG,CAAC;IA6BT,UAAU,CACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACxB,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,GAAG,CAAA;KAAE,CAAC;IAqBlC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;IASpD,UAAU,CACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC1B,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,GAAG,CAAA;KAAE,CAAC;CAczC;AAMD,eAAe,YAAY,CAAC"}
@@ -0,0 +1,149 @@
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.BaseService = void 0;
7
+ const change_case_all_1 = require("change-case-all");
8
+ const models_helpers_1 = require("../../utils/helpers/models.helpers");
9
+ const deepmerge_1 = __importDefault(require("deepmerge"));
10
+ // import { prisma } from "../../../../../src/utils/prisma";
11
+ const app_error_1 = __importDefault(require("../error-handler/utils/app-error"));
12
+ const pluralize_1 = __importDefault(require("pluralize"));
13
+ const base_helpers_1 = require("./utils/base.helpers");
14
+ const app_1 = require("../../app");
15
+ const baseServices = {};
16
+ class BaseService {
17
+ modelName;
18
+ relationFields;
19
+ singularRelationFieldToInclude;
20
+ listRelationFieldToInclude;
21
+ // private static instance: Singleton
22
+ prisma;
23
+ constructor(modelName) {
24
+ this.modelName = (0, change_case_all_1.camelCase)(modelName);
25
+ this.relationFields = (0, models_helpers_1.getPrismaModelRelations)((0, change_case_all_1.pascalCase)(modelName));
26
+ this.singularRelationFieldToInclude = this.relationFields?.singular?.reduce((acc, curr) => {
27
+ acc[curr.name] = true;
28
+ return acc;
29
+ }, {});
30
+ this.listRelationFieldToInclude = this.relationFields?.list?.reduce((acc, curr) => {
31
+ acc[curr.name] = true;
32
+ return acc;
33
+ }, {});
34
+ this.prisma = app_1.initConfigs.prisma;
35
+ }
36
+ async createOne(body, queryOptions) {
37
+ const bodyWithRelationFieldsHandled = (0, base_helpers_1.handleRelationFieldsInBody)(body, {
38
+ ...this.relationFields,
39
+ }, ["delete", "disconnect", "update"]);
40
+ return await this.prisma[this.modelName].create((0, deepmerge_1.default)({
41
+ data: bodyWithRelationFieldsHandled,
42
+ include: {
43
+ ...this.singularRelationFieldToInclude,
44
+ ...this.singularRelationFieldToInclude,
45
+ },
46
+ }, JSON.parse(queryOptions || "{}")));
47
+ }
48
+ async createMany(body) {
49
+ if (!Array.isArray(body) || body.length === 0) {
50
+ throw new app_error_1.default("Invalid or empty data array provided for creation.", 400);
51
+ }
52
+ const data = await this.prisma[this.modelName].createMany({
53
+ data: body,
54
+ });
55
+ const total = await this.prisma[this.modelName].count();
56
+ return { total, data };
57
+ }
58
+ async findMany(filters) {
59
+ const data = await this.prisma[this.modelName].findMany("select" in filters
60
+ ? (0, deepmerge_1.default)({ ...filters }, {
61
+ select: this.singularRelationFieldToInclude,
62
+ })
63
+ : (0, deepmerge_1.default)({ ...filters }, {
64
+ include: this.singularRelationFieldToInclude,
65
+ }));
66
+ const total = await this.prisma[this.modelName].count({
67
+ where: filters.where,
68
+ });
69
+ return { total, data };
70
+ }
71
+ async findOne(params, queryOptions) {
72
+ const data = await this.prisma[this.modelName].findUnique((0, deepmerge_1.default)({
73
+ where: { ...params, id: String(params.id) },
74
+ ...(JSON.parse(queryOptions || "{}").hasOwnProperty("select")
75
+ ? {
76
+ select: {
77
+ ...this.singularRelationFieldToInclude,
78
+ ...this.singularRelationFieldToInclude,
79
+ },
80
+ }
81
+ : {
82
+ include: {
83
+ ...this.singularRelationFieldToInclude,
84
+ ...this.singularRelationFieldToInclude,
85
+ },
86
+ }),
87
+ }, JSON.parse(queryOptions || "{}")));
88
+ if (!data) {
89
+ throw new app_error_1.default(`${(0, change_case_all_1.pascalCase)(String(this.modelName))} with ID ${params.id} not found`, 404);
90
+ }
91
+ return data;
92
+ }
93
+ async updateOne(params, body, queryOptions) {
94
+ const bodyWithRelationFieldsHandled = (0, base_helpers_1.handleRelationFieldsInBody)(body, {
95
+ ...this.relationFields,
96
+ });
97
+ const data = await this.prisma[this.modelName].update((0, deepmerge_1.default)({
98
+ where: { ...params, id: String(params.id) },
99
+ data: bodyWithRelationFieldsHandled,
100
+ include: {
101
+ ...this.singularRelationFieldToInclude,
102
+ ...this.singularRelationFieldToInclude,
103
+ },
104
+ }, JSON.parse(queryOptions || "{}")));
105
+ if (!data) {
106
+ throw new app_error_1.default(`${(0, change_case_all_1.pascalCase)(String(this.modelName))} with ID ${params.id} not found`, 404);
107
+ }
108
+ return data;
109
+ }
110
+ async updateMany(filter, body) {
111
+ if (!filter || typeof filter !== "object") {
112
+ throw new app_error_1.default("Invalid filter provided for udpate many.", 400);
113
+ }
114
+ const data = await this.prisma[this.modelName].updateMany({
115
+ ...filter,
116
+ data: body,
117
+ });
118
+ if (!data || data.count === 0) {
119
+ throw new app_error_1.default(`${(0, pluralize_1.default)((0, change_case_all_1.pascalCase)(String(this.modelName)))} not found`, 404);
120
+ }
121
+ const total = await this.prisma[this.modelName].count();
122
+ return { total, data };
123
+ }
124
+ async deleteOne(params) {
125
+ return await this.prisma[this.modelName].delete({
126
+ where: {
127
+ ...params,
128
+ id: String(params.id),
129
+ },
130
+ });
131
+ }
132
+ async deleteMany(filter) {
133
+ if (!filter || typeof filter !== "object") {
134
+ throw new app_error_1.default("Invalid filter provided for deletion.", 400);
135
+ }
136
+ const data = await this.prisma[this.modelName].deleteMany(filter);
137
+ if (!data || data.count === 0) {
138
+ throw new app_error_1.default(`No records found to delete`, 404);
139
+ }
140
+ const total = await this.prisma[this.modelName].count();
141
+ return { total, data };
142
+ }
143
+ }
144
+ exports.BaseService = BaseService;
145
+ models_helpers_1.models.forEach((model) => {
146
+ baseServices[`${(0, change_case_all_1.camelCase)(model)}`] = new BaseService(model);
147
+ });
148
+ exports.default = baseServices;
149
+ //# sourceMappingURL=base.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.service.js","sourceRoot":"","sources":["../../../src/modules/base/base.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { RelationFields } from "../../../utils/helpers/models.helpers";
2
+ /**
3
+ * Determines the appropriate Prisma operation (`create`, `connect`, `update`, `delete`, or `disconnect`)
4
+ * for each relation field in the provided body based on its nested data and recursively does the same for each relation field.
5
+ *
6
+ * This function handles the following types of relations:
7
+ * - **One-to-one**
8
+ * - **One-to-many**
9
+ *
10
+ *
11
+ * ### Operation Rules:
12
+ *
13
+ *
14
+ * - **Create**: Used when the nested relation data is provided **without an `id`**.
15
+ * - **Connect**: Used when the nested relation data contains **only an `id`**.
16
+ * - **Update**: Used when the nested relation data contains **both an `id` and additional fields**.
17
+ * - **Delete**: Used when the nested relation data includes **`apiAction: "delete"`**.
18
+ * - **Disconnect**: Used when the nested relation data includes **`apiAction: "disconnect"`**.
19
+ *
20
+ * @param {Record<string, any>} body - The object containing relation fields to be processed.
21
+ * @param {Object} relationFields - Defines relation field types.
22
+ * @param {RelationFields[]} relationFields.singular - List of one-side relation field names (one-to-one).
23
+ * @param {RelationFields[]} relationFields.list - List of many-side relation field names (one-to-many).
24
+ * @returns {T} The transformed data with appropriate Prisma operations applied.
25
+ */
26
+ export declare function handleRelationFieldsInBody(body: Record<string, any>, relationFields: RelationFields, ignoreActions?: string[]): {
27
+ [x: string]: any;
28
+ };
29
+ //# sourceMappingURL=base.helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.helpers.d.ts","sourceRoot":"","sources":["../../../../src/modules/base/utils/base.helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EACf,MAAM,uCAAuC,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,cAAc,EAAE,cAAc,EAC9B,aAAa,GAAE,MAAM,EAAO;;EA0F7B"}
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleRelationFieldsInBody = handleRelationFieldsInBody;
4
+ const models_helpers_1 = require("../../../utils/helpers/models.helpers");
5
+ /**
6
+ * Determines the appropriate Prisma operation (`create`, `connect`, `update`, `delete`, or `disconnect`)
7
+ * for each relation field in the provided body based on its nested data and recursively does the same for each relation field.
8
+ *
9
+ * This function handles the following types of relations:
10
+ * - **One-to-one**
11
+ * - **One-to-many**
12
+ *
13
+ *
14
+ * ### Operation Rules:
15
+ *
16
+ *
17
+ * - **Create**: Used when the nested relation data is provided **without an `id`**.
18
+ * - **Connect**: Used when the nested relation data contains **only an `id`**.
19
+ * - **Update**: Used when the nested relation data contains **both an `id` and additional fields**.
20
+ * - **Delete**: Used when the nested relation data includes **`apiAction: "delete"`**.
21
+ * - **Disconnect**: Used when the nested relation data includes **`apiAction: "disconnect"`**.
22
+ *
23
+ * @param {Record<string, any>} body - The object containing relation fields to be processed.
24
+ * @param {Object} relationFields - Defines relation field types.
25
+ * @param {RelationFields[]} relationFields.singular - List of one-side relation field names (one-to-one).
26
+ * @param {RelationFields[]} relationFields.list - List of many-side relation field names (one-to-many).
27
+ * @returns {T} The transformed data with appropriate Prisma operations applied.
28
+ */
29
+ function handleRelationFieldsInBody(body, relationFields, ignoreActions = []) {
30
+ let mutableBody = { ...body };
31
+ relationFields.list.forEach((field) => {
32
+ if (!body[field.name])
33
+ return;
34
+ const createData = [];
35
+ const connectData = [];
36
+ const updateData = [];
37
+ const disconnectData = [];
38
+ const deleteManyIds = [];
39
+ body[field.name].forEach((bodyField) => {
40
+ if (ignoreActions.includes(bodyField?.apiAction))
41
+ return;
42
+ if (bodyField?.apiAction === "delete") {
43
+ deleteManyIds.push(bodyField.id);
44
+ }
45
+ else if (bodyField?.apiAction === "disconnect") {
46
+ disconnectData.push({ id: bodyField.id });
47
+ }
48
+ else if (!bodyField?.id) {
49
+ let nestedRelations = (0, models_helpers_1.getPrismaModelRelations)(field.type);
50
+ const dataToPush = nestedRelations
51
+ ? handleRelationFieldsInBody(bodyField, nestedRelations, ignoreActions)
52
+ : bodyField;
53
+ createData.push(dataToPush);
54
+ }
55
+ else if (Object.keys(bodyField).length === 1) {
56
+ connectData.push(bodyField);
57
+ }
58
+ else {
59
+ const { id, ...data } = bodyField;
60
+ let nestedRelations = (0, models_helpers_1.getPrismaModelRelations)(field.type);
61
+ const dataToPush = nestedRelations
62
+ ? handleRelationFieldsInBody(data, nestedRelations, ignoreActions)
63
+ : bodyField;
64
+ updateData.push({
65
+ where: { id },
66
+ data: dataToPush,
67
+ });
68
+ }
69
+ });
70
+ mutableBody[field.name] = {
71
+ ...(createData.length ? { create: createData } : {}),
72
+ ...(connectData.length ? { connect: connectData } : {}),
73
+ ...(updateData.length ? { update: updateData } : {}),
74
+ ...(disconnectData.length ? { disconnect: disconnectData } : {}),
75
+ ...(deleteManyIds.length
76
+ ? { deleteMany: { id: { in: deleteManyIds } } }
77
+ : {}),
78
+ };
79
+ });
80
+ relationFields.singular.forEach((field) => {
81
+ if (!body[field.name])
82
+ return;
83
+ if (ignoreActions.includes(body[field.name]?.apiAction))
84
+ return;
85
+ let nestedRelations = (0, models_helpers_1.getPrismaModelRelations)(field.type);
86
+ if (!body[field.name]?.id) {
87
+ mutableBody[field.name] = {
88
+ create: handleRelationFieldsInBody(body[field.name], nestedRelations, ignoreActions),
89
+ };
90
+ }
91
+ else if (Object.keys(body[field.name]).length === 1) {
92
+ mutableBody[field.name] = { connect: body[field.name] };
93
+ }
94
+ else {
95
+ const { id, ...data } = body[field.name];
96
+ mutableBody[field.name] = {
97
+ update: {
98
+ where: { id },
99
+ data: handleRelationFieldsInBody(data, nestedRelations, ignoreActions),
100
+ },
101
+ };
102
+ }
103
+ });
104
+ return mutableBody;
105
+ }
106
+ //# sourceMappingURL=base.helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.helpers.js","sourceRoot":"","sources":["../../../../src/modules/base/utils/base.helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { BaseService } from '../base/base.service';
2
+ export type EmailOptions = {
3
+ from?: string;
4
+ to: string | string[];
5
+ subject: string;
6
+ text?: string;
7
+ html?: string;
8
+ };
9
+ export declare class EmailService extends BaseService {
10
+ private transporter;
11
+ constructor(host?: string, auth?: {
12
+ user: string | undefined;
13
+ pass: string | undefined;
14
+ }, port?: number);
15
+ private verifyConnection;
16
+ send(options: EmailOptions): Promise<{
17
+ success: boolean;
18
+ messageId?: string;
19
+ error?: any;
20
+ }>;
21
+ }
22
+ //# sourceMappingURL=email.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email.service.d.ts","sourceRoot":"","sources":["../../../src/modules/email/email.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAElD,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED,qBAAa,YAAa,SAAQ,WAAW;IAC3C,OAAO,CAAC,WAAW,CAAa;gBAG9B,IAAI,GAAE,MAAgC,EACtC,IAAI;;;KAAqE,EACzE,IAAI,SAA4C;IAWlD,OAAO,CAAC,gBAAgB;IAUX,IAAI,CACf,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;CAclE"}
@@ -0,0 +1,45 @@
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.EmailService = void 0;
7
+ const nodemailer_1 = __importDefault(require("nodemailer"));
8
+ const base_service_1 = require("../base/base.service");
9
+ class EmailService extends base_service_1.BaseService {
10
+ transporter;
11
+ constructor(host = process.env.EMAIL_HOST, auth = { user: process.env.EMAIL_FROM, pass: process.env.EMAIL_PASSWORD }, port = parseInt(process.env.EMAIL_PORT || '465')) {
12
+ super('email');
13
+ this.transporter = nodemailer_1.default.createTransport({
14
+ host,
15
+ port,
16
+ secure: true,
17
+ auth,
18
+ });
19
+ }
20
+ verifyConnection() {
21
+ this.transporter.verify((error) => {
22
+ if (error) {
23
+ console.error('Email server connection error:', error);
24
+ }
25
+ else {
26
+ console.info('Email server connection successful');
27
+ }
28
+ });
29
+ }
30
+ async send(options) {
31
+ try {
32
+ this.verifyConnection();
33
+ const info = await this.transporter.sendMail({
34
+ ...options,
35
+ from: options?.from || process.env.EMAIL_FROM,
36
+ });
37
+ return { success: true, messageId: info.messageId };
38
+ }
39
+ catch (error) {
40
+ throw error;
41
+ }
42
+ }
43
+ }
44
+ exports.EmailService = EmailService;
45
+ //# sourceMappingURL=email.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email.service.js","sourceRoot":"","sources":["../../../src/modules/email/email.service.ts"],"names":[],"mappings":";;;;;;AAAA,4DAAoD;AACpD,uDAAkD;AAUlD,MAAa,YAAa,SAAQ,0BAAW;IACnC,WAAW,CAAa;IAEhC,YACE,OAAe,OAAO,CAAC,GAAG,CAAC,UAAW,EACtC,IAAI,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,EACzE,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,KAAK,CAAC;QAEhD,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,WAAW,GAAG,oBAAU,CAAC,eAAe,CAAC;YAC5C,IAAI;YACJ,IAAI;YACJ,MAAM,EAAE,IAAI;YACZ,IAAI;SACL,CAAC,CAAA;IACJ,CAAC;IAEO,gBAAgB;QACtB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YAChC,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAA;YACxD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAA;YACpD,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAEM,KAAK,CAAC,IAAI,CACf,OAAqB;QAErB,IAAI,CAAC;YACH,IAAI,CAAC,gBAAgB,EAAE,CAAA;YAEvB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;gBAC3C,GAAG,OAAO;gBACV,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU;aAC9C,CAAC,CAAA;YAEF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAA;QACrD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;CACF;AA3CD,oCA2CC"}
@@ -0,0 +1,9 @@
1
+ interface TokenPayload {
2
+ email: string;
3
+ action: "verify" | "reset" | string;
4
+ [key: string]: any;
5
+ }
6
+ export declare const generateToken: (payload: TokenPayload) => string;
7
+ export declare const verifyToken: (token: string) => TokenPayload | null;
8
+ export {};
9
+ //# sourceMappingURL=email.helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email.helpers.d.ts","sourceRoot":"","sources":["../../../../src/modules/email/utils/email.helpers.ts"],"names":[],"mappings":"AAEA,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;IACpC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,eAAO,MAAM,aAAa,GAAI,SAAS,YAAY,KAAG,MAKrD,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,KAAG,YAAY,GAAG,IAQ1D,CAAC"}