arkos 1.1.12-test → 1.1.13-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 (133) hide show
  1. package/dist/cjs/app.js +1 -1
  2. package/dist/cjs/app.js.map +1 -1
  3. package/dist/cjs/modules/auth/auth.controller.js +53 -64
  4. package/dist/cjs/modules/auth/auth.controller.js.map +1 -1
  5. package/dist/cjs/modules/auth/auth.router.js +46 -58
  6. package/dist/cjs/modules/auth/auth.router.js.map +1 -1
  7. package/dist/cjs/modules/auth/auth.service.js +75 -97
  8. package/dist/cjs/modules/auth/auth.service.js.map +1 -1
  9. package/dist/cjs/modules/auth/utils/helpers/auth.controller.helpers.js +6 -7
  10. package/dist/cjs/modules/auth/utils/helpers/auth.controller.helpers.js.map +1 -1
  11. package/dist/cjs/modules/base/base.controller.js +30 -46
  12. package/dist/cjs/modules/base/base.controller.js.map +1 -1
  13. package/dist/cjs/modules/base/base.middlewares.js +17 -21
  14. package/dist/cjs/modules/base/base.middlewares.js.map +1 -1
  15. package/dist/cjs/modules/base/base.router.js +6 -17
  16. package/dist/cjs/modules/base/base.router.js.map +1 -1
  17. package/dist/cjs/modules/base/base.service.js +128 -116
  18. package/dist/cjs/modules/base/base.service.js.map +1 -1
  19. package/dist/cjs/modules/base/utils/helpers/base.controller.helpers.js +3 -5
  20. package/dist/cjs/modules/base/utils/helpers/base.controller.helpers.js.map +1 -1
  21. package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js +36 -47
  22. package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js.map +1 -1
  23. package/dist/cjs/modules/base/utils/helpers/base.service.helpers.js +30 -40
  24. package/dist/cjs/modules/base/utils/helpers/base.service.helpers.js.map +1 -1
  25. package/dist/cjs/modules/email/email.service.js +28 -39
  26. package/dist/cjs/modules/email/email.service.js.map +1 -1
  27. package/dist/cjs/modules/error-handler/error-handler.controller.js +6 -3
  28. package/dist/cjs/modules/error-handler/error-handler.controller.js.map +1 -1
  29. package/dist/cjs/modules/error-handler/utils/catch-async.js +3 -12
  30. package/dist/cjs/modules/error-handler/utils/catch-async.js.map +1 -1
  31. package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js +17 -31
  32. package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js.map +1 -1
  33. package/dist/cjs/modules/file-uploader/file-uploader.controller.js +18 -27
  34. package/dist/cjs/modules/file-uploader/file-uploader.controller.js.map +1 -1
  35. package/dist/cjs/modules/file-uploader/file-uploader.router.js +23 -34
  36. package/dist/cjs/modules/file-uploader/file-uploader.router.js.map +1 -1
  37. package/dist/cjs/modules/file-uploader/file-uploader.service.js +117 -131
  38. package/dist/cjs/modules/file-uploader/file-uploader.service.js.map +1 -1
  39. package/dist/cjs/modules/file-uploader/utils/helpers/file-uploader.helpers.js +15 -26
  40. package/dist/cjs/modules/file-uploader/utils/helpers/file-uploader.helpers.js.map +1 -1
  41. package/dist/cjs/server.js +1 -1
  42. package/dist/cjs/server.js.map +1 -1
  43. package/dist/cjs/utils/cli/build.js +9 -2
  44. package/dist/cjs/utils/cli/build.js.map +1 -1
  45. package/dist/cjs/utils/cli/dev.js +43 -48
  46. package/dist/cjs/utils/cli/dev.js.map +1 -1
  47. package/dist/cjs/utils/cli/start.js +35 -38
  48. package/dist/cjs/utils/cli/start.js.map +1 -1
  49. package/dist/cjs/utils/features/api.features.js +26 -33
  50. package/dist/cjs/utils/features/api.features.js.map +1 -1
  51. package/dist/cjs/utils/helpers/api.features.helpers.js +4 -6
  52. package/dist/cjs/utils/helpers/api.features.helpers.js.map +1 -1
  53. package/dist/cjs/utils/helpers/change-case.helpers.js +28 -36
  54. package/dist/cjs/utils/helpers/change-case.helpers.js.map +1 -1
  55. package/dist/cjs/utils/helpers/deepmerge.helper.js +4 -8
  56. package/dist/cjs/utils/helpers/deepmerge.helper.js.map +1 -1
  57. package/dist/cjs/utils/helpers/global.helpers.js +2 -13
  58. package/dist/cjs/utils/helpers/global.helpers.js.map +1 -1
  59. package/dist/cjs/utils/helpers/models.helpers.js +65 -80
  60. package/dist/cjs/utils/helpers/models.helpers.js.map +1 -1
  61. package/dist/cjs/utils/helpers/prisma.helpers.js +23 -34
  62. package/dist/cjs/utils/helpers/prisma.helpers.js.map +1 -1
  63. package/dist/cjs/utils/validate-dto.js +6 -17
  64. package/dist/cjs/utils/validate-dto.js.map +1 -1
  65. package/dist/cjs/utils/validate-schema.js +6 -17
  66. package/dist/cjs/utils/validate-schema.js.map +1 -1
  67. package/dist/es2020/app.js +1 -1
  68. package/dist/es2020/app.js.map +1 -1
  69. package/dist/es2020/modules/auth/auth.controller.js +53 -64
  70. package/dist/es2020/modules/auth/auth.controller.js.map +1 -1
  71. package/dist/es2020/modules/auth/auth.router.js +46 -58
  72. package/dist/es2020/modules/auth/auth.router.js.map +1 -1
  73. package/dist/es2020/modules/auth/auth.service.js +75 -97
  74. package/dist/es2020/modules/auth/auth.service.js.map +1 -1
  75. package/dist/es2020/modules/auth/utils/helpers/auth.controller.helpers.js +6 -7
  76. package/dist/es2020/modules/auth/utils/helpers/auth.controller.helpers.js.map +1 -1
  77. package/dist/es2020/modules/base/base.controller.js +30 -46
  78. package/dist/es2020/modules/base/base.controller.js.map +1 -1
  79. package/dist/es2020/modules/base/base.middlewares.js +17 -21
  80. package/dist/es2020/modules/base/base.middlewares.js.map +1 -1
  81. package/dist/es2020/modules/base/base.router.js +6 -17
  82. package/dist/es2020/modules/base/base.router.js.map +1 -1
  83. package/dist/es2020/modules/base/base.service.js +128 -116
  84. package/dist/es2020/modules/base/base.service.js.map +1 -1
  85. package/dist/es2020/modules/base/utils/helpers/base.controller.helpers.js +3 -5
  86. package/dist/es2020/modules/base/utils/helpers/base.controller.helpers.js.map +1 -1
  87. package/dist/es2020/modules/base/utils/helpers/base.router.helpers.js +36 -47
  88. package/dist/es2020/modules/base/utils/helpers/base.router.helpers.js.map +1 -1
  89. package/dist/es2020/modules/base/utils/helpers/base.service.helpers.js +30 -40
  90. package/dist/es2020/modules/base/utils/helpers/base.service.helpers.js.map +1 -1
  91. package/dist/es2020/modules/email/email.service.js +28 -39
  92. package/dist/es2020/modules/email/email.service.js.map +1 -1
  93. package/dist/es2020/modules/error-handler/error-handler.controller.js +6 -3
  94. package/dist/es2020/modules/error-handler/error-handler.controller.js.map +1 -1
  95. package/dist/es2020/modules/error-handler/utils/catch-async.js +3 -12
  96. package/dist/es2020/modules/error-handler/utils/catch-async.js.map +1 -1
  97. package/dist/es2020/modules/error-handler/utils/error-handler.helpers.js +17 -31
  98. package/dist/es2020/modules/error-handler/utils/error-handler.helpers.js.map +1 -1
  99. package/dist/es2020/modules/file-uploader/file-uploader.controller.js +18 -27
  100. package/dist/es2020/modules/file-uploader/file-uploader.controller.js.map +1 -1
  101. package/dist/es2020/modules/file-uploader/file-uploader.router.js +23 -34
  102. package/dist/es2020/modules/file-uploader/file-uploader.router.js.map +1 -1
  103. package/dist/es2020/modules/file-uploader/file-uploader.service.js +117 -131
  104. package/dist/es2020/modules/file-uploader/file-uploader.service.js.map +1 -1
  105. package/dist/es2020/modules/file-uploader/utils/helpers/file-uploader.helpers.js +15 -26
  106. package/dist/es2020/modules/file-uploader/utils/helpers/file-uploader.helpers.js.map +1 -1
  107. package/dist/es2020/server.js +1 -1
  108. package/dist/es2020/server.js.map +1 -1
  109. package/dist/es2020/utils/cli/build.js +9 -2
  110. package/dist/es2020/utils/cli/build.js.map +1 -1
  111. package/dist/es2020/utils/cli/dev.js +43 -48
  112. package/dist/es2020/utils/cli/dev.js.map +1 -1
  113. package/dist/es2020/utils/cli/start.js +35 -38
  114. package/dist/es2020/utils/cli/start.js.map +1 -1
  115. package/dist/es2020/utils/features/api.features.js +26 -33
  116. package/dist/es2020/utils/features/api.features.js.map +1 -1
  117. package/dist/es2020/utils/helpers/api.features.helpers.js +4 -6
  118. package/dist/es2020/utils/helpers/api.features.helpers.js.map +1 -1
  119. package/dist/es2020/utils/helpers/change-case.helpers.js +28 -36
  120. package/dist/es2020/utils/helpers/change-case.helpers.js.map +1 -1
  121. package/dist/es2020/utils/helpers/deepmerge.helper.js +4 -8
  122. package/dist/es2020/utils/helpers/deepmerge.helper.js.map +1 -1
  123. package/dist/es2020/utils/helpers/global.helpers.js +2 -13
  124. package/dist/es2020/utils/helpers/global.helpers.js.map +1 -1
  125. package/dist/es2020/utils/helpers/models.helpers.js +65 -80
  126. package/dist/es2020/utils/helpers/models.helpers.js.map +1 -1
  127. package/dist/es2020/utils/helpers/prisma.helpers.js +23 -34
  128. package/dist/es2020/utils/helpers/prisma.helpers.js.map +1 -1
  129. package/dist/es2020/utils/validate-dto.js +6 -17
  130. package/dist/es2020/utils/validate-dto.js.map +1 -1
  131. package/dist/es2020/utils/validate-schema.js +6 -17
  132. package/dist/es2020/utils/validate-schema.js.map +1 -1
  133. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAwEA,wCAEC;AAED,sCAEC;AAEgB,0BAAO;AA7ExB,+BAAkC;AAElC,wFAAyD;AAEzD,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE;IACtC,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;IACtD,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACrC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,IAAI,MAA6D,CAAC;AAClE,IAAI,IAAa,CAAC;AAElB,IAAI,YAAY,GAAgB;IAC9B,cAAc,EACZ,6FAA6F;IAC/F,IAAI,EAAE,IAAI;IACV,UAAU,EAAE;QACV,aAAa,EAAE,SAAS;QACxB,SAAS,EAAE,cAAc;KAC1B;CACF,CAAC;AAeF,SAAe,OAAO;yDAAC,cAA2B,EAAE;QAClD,YAAY,GAAG,IAAA,0BAAS,EAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QAEpD,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC;QAC/B,IAAI,GAAG,MAAM,IAAA,eAAS,EAAC,YAAY,CAAC,CAAC;QAErC,IAAI,IAAI;YACN,iBAAA,MAAM,GAAG,IAAI,CAAC,MAAM,CAClB,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,IAAI,EAAC,CAAC,CAAC,CAAC,IAAI,EAAE,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,IAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EACrD,GAAG,EAAE;gBACH,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAOvD,CAAC,CACF,CAAC;QAEJ,OAAO,IAAI,CAAC;IACd,CAAC;CAAA;AAED,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,GAAa,EAAE,EAAE;IACjD,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;IACvD,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACrC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,KAAK,CAAC,GAAG,EAAE;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,SAAgB,cAAc;IAC5B,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAgB,aAAa;IAC3B,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import { IncomingMessage, Server, ServerResponse } from \"http\";\nimport AppError from \"./modules/error-handler/utils/app-error\";\nimport { Express } from \"express\";\nimport { bootstrap } from \"./app\";\nimport { ArkosConfig } from \"./types/arkos-config\";\nimport deepmerge from \"./utils/helpers/deepmerge.helper\";\n\nprocess.on(\"uncaughtException\", (err) => {\n console.error(\"UNCAUGHT EXCEPTION! SHUTTING DOWN...\");\n console.error(err.name, err.message);\n console.error(err);\n process.exit(1);\n});\n\nlet server: Server<typeof IncomingMessage, typeof ServerResponse>;\nlet _app: Express;\n\nlet _arkosConfig: ArkosConfig = {\n welcomeMessage:\n \"Welcome to our RESTful API generated by Arkos, find out more about Arkos at www.arkosjs.com\",\n port: 8000,\n fileUpload: {\n baseUploadDir: \"uploads\",\n baseRoute: \"/api/uploads\",\n },\n};\n\n/**\n * Initializes the application server.\n *\n * This function starts the server by listening on a specified port.\n * The port is determined by the following order of precedence:\n * 1. The `port` argument passed to the function.\n * 2. Defaults to `8000` if neither is provided.\n *\n * @param {ArkosConfig} arkosConfig - initial configs for the api ( authentication, port).\n * @returns {Promise<Express>} This function returns the Express App after all middlewares configurations.\n * You can prevent it from listen py passing port as undefined\n *\n */\nasync function initApp(arkosConfig: ArkosConfig = {}): Promise<Express> {\n _arkosConfig = deepmerge(_arkosConfig, arkosConfig);\n\n const port = _arkosConfig.port;\n _app = await bootstrap(_arkosConfig);\n\n if (port)\n server = _app.listen(\n arkosConfig?.host ? [port, arkosConfig?.host!] : port,\n () => {\n const time = new Date().toTimeString().split(\" \")[0];\n // console.info(\n // `[\\x1b[32mREADY\\x1b[0m] \\x1b[90m${time}\\x1b[0m App running on port \\x1b[33m${port}\\x1b[0m, server waiting on http://localhost:${port}`\n // );\n\n // if (!!process.env.NODE_ENV)\n // console.info(`${`Environment: ${process.env.NODE_ENV}`}`);\n }\n );\n\n return _app;\n}\n\nprocess.on(\"unhandledRejection\", (err: AppError) => {\n console.error(\"UNHANDLED REJECTION! SHUTTING DOWN...\");\n console.error(err.name, err.message);\n console.error(err);\n server?.close(() => {\n process.exit(1);\n });\n});\n\nexport function getArkosConfig() {\n return _arkosConfig;\n}\n\nexport function getExpressApp() {\n return _app;\n}\n\nexport { server, initApp };\n"]}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":";;;;;;AAwEA,wCAEC;AAED,sCAEC;AAEgB,0BAAO;AA7ExB,+BAAkC;AAElC,wFAAyD;AAEzD,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE;IACtC,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;IACtD,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACrC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,IAAI,MAA6D,CAAC;AAClE,IAAI,IAAa,CAAC;AAElB,IAAI,YAAY,GAAgB;IAC9B,cAAc,EACZ,6FAA6F;IAC/F,IAAI,EAAE,IAAI;IACV,UAAU,EAAE;QACV,aAAa,EAAE,SAAS;QACxB,SAAS,EAAE,cAAc;KAC1B;CACF,CAAC;AAeF,KAAK,UAAU,OAAO,CAAC,cAA2B,EAAE;IAClD,YAAY,GAAG,IAAA,0BAAS,EAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IAEpD,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC;IAC/B,IAAI,GAAG,MAAM,IAAA,eAAS,EAAC,YAAY,CAAC,CAAC;IAErC,IAAI,IAAI;QACN,iBAAA,MAAM,GAAG,IAAI,CAAC,MAAM,CAClB,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,IAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EACrD,GAAG,EAAE;YACH,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAOvD,CAAC,CACF,CAAC;IAEJ,OAAO,IAAI,CAAC;AACd,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,GAAa,EAAE,EAAE;IACjD,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;IACvD,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACrC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,MAAM,EAAE,KAAK,CAAC,GAAG,EAAE;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,SAAgB,cAAc;IAC5B,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAgB,aAAa;IAC3B,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import { IncomingMessage, Server, ServerResponse } from \"http\";\nimport AppError from \"./modules/error-handler/utils/app-error\";\nimport { Express } from \"express\";\nimport { bootstrap } from \"./app\";\nimport { ArkosConfig } from \"./types/arkos-config\";\nimport deepmerge from \"./utils/helpers/deepmerge.helper\";\n\nprocess.on(\"uncaughtException\", (err) => {\n console.error(\"UNCAUGHT EXCEPTION! SHUTTING DOWN...\");\n console.error(err.name, err.message);\n console.error(err);\n process.exit(1);\n});\n\nlet server: Server<typeof IncomingMessage, typeof ServerResponse>;\nlet _app: Express;\n\nlet _arkosConfig: ArkosConfig = {\n welcomeMessage:\n \"Welcome to our RESTful API generated by Arkos, find out more about Arkos at www.arkosjs.com\",\n port: 8000,\n fileUpload: {\n baseUploadDir: \"uploads\",\n baseRoute: \"/api/uploads\",\n },\n};\n\n/**\n * Initializes the application server.\n *\n * This function starts the server by listening on a specified port.\n * The port is determined by the following order of precedence:\n * 1. The `port` argument passed to the function.\n * 2. Defaults to `8000` if neither is provided.\n *\n * @param {ArkosConfig} arkosConfig - initial configs for the api ( authentication, port).\n * @returns {Promise<Express>} This function returns the Express App after all middlewares configurations.\n * You can prevent it from listen py passing port as undefined\n *\n */\nasync function initApp(arkosConfig: ArkosConfig = {}): Promise<Express> {\n _arkosConfig = deepmerge(_arkosConfig, arkosConfig);\n\n const port = _arkosConfig.port;\n _app = await bootstrap(_arkosConfig);\n\n if (port)\n server = _app.listen(\n arkosConfig?.host ? [port, arkosConfig?.host!] : port,\n () => {\n const time = new Date().toTimeString().split(\" \")[0];\n // console.info(\n // `[\\x1b[32mREADY\\x1b[0m] \\x1b[90m${time}\\x1b[0m App running on port \\x1b[33m${port}\\x1b[0m, server waiting on http://localhost:${port}`\n // );\n\n // if (!!process.env.NODE_ENV)\n // console.info(`${`Environment: ${process.env.NODE_ENV}`}`);\n }\n );\n\n return _app;\n}\n\nprocess.on(\"unhandledRejection\", (err: AppError) => {\n console.error(\"UNHANDLED REJECTION! SHUTTING DOWN...\");\n console.error(err.name, err.message);\n console.error(err);\n server?.close(() => {\n process.exit(1);\n });\n});\n\nexport function getArkosConfig() {\n return _arkosConfig;\n}\n\nexport function getExpressApp() {\n return _app;\n}\n\nexport { server, initApp };\n"]}
@@ -15,7 +15,7 @@ function buildCommand(options = {}) {
15
15
  const envFiles = (0, dotenv_helpers_1.loadEnvironmentVariables)();
16
16
  const moduleType = validateModuleType(options.module);
17
17
  try {
18
- console.info(`🛠️ Using env variables from ${envFiles === null || envFiles === void 0 ? void 0 : envFiles.join(", ")}...`);
18
+ console.info(`🛠️ Using env variables from ${envFiles?.join(", ")}...`);
19
19
  console.info(`🚀 Building an optimized production ready project with ${moduleType} format...\n`);
20
20
  ensureBuildDir();
21
21
  const fileExt = (0, fs_helpers_1.getUserFileExtension)();
@@ -70,7 +70,14 @@ function buildTypeScriptProject(options, moduleType) {
70
70
  catch (error) {
71
71
  console.error("❌ Error reading tsconfig.json:", error);
72
72
  }
73
- const tempTsconfig = Object.assign(Object.assign({}, tsconfig), { compilerOptions: Object.assign(Object.assign({}, (tsconfig.compilerOptions || {})), { outDir: path_1.default.join(`./${BUILD_DIR}/${moduleType}`), module: moduleType === "esm" ? "ESNext" : "CommonJS" }) });
73
+ const tempTsconfig = {
74
+ ...tsconfig,
75
+ compilerOptions: {
76
+ ...(tsconfig.compilerOptions || {}),
77
+ outDir: path_1.default.join(`./${BUILD_DIR}/${moduleType}`),
78
+ module: moduleType === "esm" ? "ESNext" : "CommonJS",
79
+ },
80
+ };
74
81
  const tempTsconfigPath = path_1.default.join(process.cwd(), `tsconfig.arkos-build.json`);
75
82
  fs_1.default.writeFileSync(tempTsconfigPath, JSON.stringify(tempTsconfig, null, 2));
76
83
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"build.js","sourceRoot":"","sources":["../../../../src/utils/cli/build.ts"],"names":[],"mappings":";;;;;AAoBA,oCA4BC;AA/CD,gDAAwB;AACxB,4CAAoB;AACpB,iDAAyC;AACzC,sDAA6D;AAC7D,sDAA6D;AAG7D,MAAM,SAAS,GAAG,OAAO,CAAC;AAC1B,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,KAAK,CAAU,CAAC;AAW7C,SAAgB,YAAY,CAAC,UAAwB,EAAE;IACrD,MAAM,QAAQ,GAAG,IAAA,yCAAwB,GAAE,CAAC;IAC5C,MAAM,UAAU,GAAG,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAEtD,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,gCAAgC,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CACV,0DAA0D,UAAU,cAAc,CACnF,CAAC;QAEF,cAAc,EAAE,CAAC;QAGjB,MAAM,OAAO,GAAG,IAAA,iCAAoB,GAAE,CAAC;QAEvC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,sBAAsB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,sBAAsB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAKD,SAAS,kBAAkB,CAAC,UAAmB;IAC7C,IAAI,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IAE9B,MAAM,cAAc,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;IAGhD,IAAI,cAAc,KAAK,KAAK,IAAI,cAAc,KAAK,UAAU,EAAE,CAAC;QAC9D,OAAO,KAAK,CAAC;IACf,CAAC;SAAM,IACL,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,EACpE,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAGD,OAAO,CAAC,IAAI,CACV,gCAAgC,UAAU,wBAAwB,CACnE,CAAC;IACF,OAAO,KAAK,CAAC;AACf,CAAC;AAKD,SAAS,cAAc;IACrB,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,YAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAGD,KAAK,MAAM,UAAU,IAAI,YAAY,EAAE,CAAC;QACtC,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACnD,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,YAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;AACH,CAAC;AAKD,SAAS,sBAAsB,CAAC,OAAqB,EAAE,UAAsB;IAE3E,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAC5B,OAAO,CAAC,GAAG,EAAE,EACb,OAAO,CAAC,MAAM,IAAI,eAAe,CAClC,CAAC;IACF,IAAI,QAAQ,GAAQ,EAAE,CAAC;IAEvB,IAAI,CAAC;QACH,IAAI,YAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAChC,MAAM,eAAe,GAAG,YAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;YAC9D,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;IAEzD,CAAC;IAGD,MAAM,YAAY,mCACb,QAAQ,KACX,eAAe,kCACV,CAAC,QAAQ,CAAC,eAAe,IAAI,EAAE,CAAC,KACnC,MAAM,EAAE,cAAI,CAAC,IAAI,CAAC,KAAK,SAAS,IAAI,UAAU,EAAE,CAAC,EACjD,MAAM,EAAE,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,MAEvD,CAAC;IAEF,MAAM,gBAAgB,GAAG,cAAI,CAAC,IAAI,CAChC,OAAO,CAAC,GAAG,EAAE,EACb,2BAA2B,CAC5B,CAAC;IACF,YAAE,CAAC,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAE1E,IAAI,CAAC;QAEH,IAAA,wBAAQ,EAAC,cAAc,gBAAgB,EAAE,EAAE;YACzC,KAAK,EAAE,SAAS;YAChB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;SACnB,CAAC,CAAC;QAGH,qBAAqB,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;QAGnD,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;QACpC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAKD,SAAS,sBAAsB,CAAC,OAAqB,EAAE,UAAsB;IAE3E,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAEnD,IAAI,CAAC;QAEH,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;YAEzB,IAAA,wBAAQ,EACN,kEAAkE,SAAS,EAAE,EAC7E;gBACE,KAAK,EAAE,SAAS;gBAChB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;aACnB,CACF,CAAC;YAGF,OAAO,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YAEN,IAAA,wBAAQ,EACN,iFAAiF,SAAS,EAAE,EAC5F;gBACE,KAAK,EAAE,SAAS;gBAChB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;aACnB,CACF,CAAC;QACJ,CAAC;QAGD,qBAAqB,CAAC,UAAU,EAAE;YAChC,KAAK;YACL,MAAM;YACN,MAAM;YACN,MAAM;YACN,KAAK;YACL,MAAM;SACP,CAAC,CAAC;QAGH,uBAAuB,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;QAC7D,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAMD,SAAS,qBAAqB,CAC5B,UAAsB,EACtB,cAAwB;IAExB,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,KAAK,CAAC;IAExB,IAAI,CAAC;QAEH,SAAS,gBAAgB,CAAC,GAAW;YACnC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,OAAO;YAEhC,MAAM,KAAK,GAAG,YAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YAElC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBACxC,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAC1B,SAAS,EACT,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,EAC1B,IAAI,CACL,CAAC;gBAGF,MAAM,KAAK,GAAG,YAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;gBAEtC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;oBAExB,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;wBAC/B,YAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBAChD,CAAC;oBAED,gBAAgB,CAAC,UAAU,CAAC,CAAC;gBAC/B,CAAC;qBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;oBAE1B,MAAM,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;oBAC7C,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;wBAElC,MAAM,SAAS,GAAG,cAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;wBAC3C,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;4BAC9B,YAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;wBAC/C,CAAC;wBAED,YAAE,CAAC,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;oBAC1C,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAGD,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAG5B,MAAM,eAAe,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAEjD,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;YACnC,IAAI,YAAE,CAAC,UAAU,CAAC,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;gBAClD,YAAE,CAAC,YAAY,CACb,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,EAC9B,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAC3B,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,qCAAqC,SAAS,EAAE,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;QAC7D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAKD,SAAS,uBAAuB,CAAC,UAAsB;IACrD,MAAM,eAAe,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;IAEjE,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACpC,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;QACzE,MAAM,gBAAgB,GAAQ;YAC5B,IAAI,EAAE,WAAW,CAAC,IAAI;YACtB,OAAO,EAAE,WAAW,CAAC,OAAO;YAC5B,WAAW,EAAE,WAAW,CAAC,WAAW;YACpC,IAAI,EAAE,UAAU;YAChB,YAAY,EAAE,WAAW,CAAC,YAAY;SACvC,CAAC;QAGF,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;YACzB,gBAAgB,CAAC,IAAI,GAAG,QAAQ,CAAC;QACnC,CAAC;QAED,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACnD,YAAE,CAAC,aAAa,CACd,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EACpC,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,CAC1C,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CACV,wDAAwD,EACxD,KAAK,CACN,CAAC;IACJ,CAAC;AACH,CAAC;AAKD,SAAS,iBAAiB,CAAC,UAAkB;IAC3C,IAAI,CAAC;QACH,IAAI,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,8CAA8C,EAAE,KAAK,CAAC,CAAC;IACtE,CAAC;AACH,CAAC","sourcesContent":["// src/utils/cli/build.ts\nimport path from \"path\";\nimport fs from \"fs\";\nimport { execSync } from \"child_process\";\nimport { getUserFileExtension } from \"../helpers/fs.helpers\";\nimport { loadEnvironmentVariables } from \"../dotenv.helpers\";\n\n// Constants\nconst BUILD_DIR = \"build\";\nconst MODULE_TYPES = [\"cjs\", \"esm\"] as const;\ntype ModuleType = (typeof MODULE_TYPES)[number];\n\ninterface BuildOptions {\n config?: string;\n module?: string;\n}\n\n/**\n * Main build function for the arkos CLI\n */\nexport function buildCommand(options: BuildOptions = {}) {\n const envFiles = loadEnvironmentVariables();\n const moduleType = validateModuleType(options.module);\n\n try {\n console.info(`🛠️ Using env variables from ${envFiles?.join(\", \")}...`);\n console.info(\n `🚀 Building an optimized production ready project with ${moduleType} format...\\n`\n );\n\n ensureBuildDir();\n\n // Detect project type\n const fileExt = getUserFileExtension();\n\n if (fileExt === \"ts\") {\n buildTypeScriptProject(options, moduleType);\n } else {\n buildJavaScriptProject(options, moduleType);\n }\n\n console.info(`✅ Build complete! \\n`);\n console.info(`Next step:\\n`);\n console.info(`Run the generated build with the start command.\\n`);\n } catch (error) {\n console.error(\"❌ Build failed:\", error);\n process.exit(1);\n }\n}\n\n/**\n * Validates and normalizes module type option\n */\nfunction validateModuleType(moduleType?: string): ModuleType {\n if (!moduleType) return \"cjs\";\n\n const normalizedType = moduleType.toLowerCase();\n\n // Map common terms to our module types\n if (normalizedType === \"cjs\" || normalizedType === \"commonjs\") {\n return \"cjs\";\n } else if (\n [\"esm\", \"es\", \"es2020\", \"esnext\", \"module\"].includes(normalizedType)\n ) {\n return \"esm\";\n }\n\n // Default to CJS if unrecognized\n console.warn(\n `⚠️ Unrecognized module type \"${moduleType}\", defaulting to \"cjs\"`\n );\n return \"cjs\";\n}\n\n/**\n * Ensure the build directory exists\n */\nfunction ensureBuildDir() {\n if (!fs.existsSync(BUILD_DIR)) {\n fs.mkdirSync(BUILD_DIR, { recursive: true });\n }\n\n // Create module-specific subdirectories\n for (const moduleType of MODULE_TYPES) {\n const moduleDir = path.join(BUILD_DIR, moduleType);\n if (!fs.existsSync(moduleDir)) {\n fs.mkdirSync(moduleDir, { recursive: true });\n }\n }\n}\n\n/**\n * Build a TypeScript project\n */\nfunction buildTypeScriptProject(options: BuildOptions, moduleType: ModuleType) {\n // Read the user's tsconfig.json\n const tsconfigPath = path.join(\n process.cwd(),\n options.config || \"tsconfig.json\"\n );\n let tsconfig: any = {};\n\n try {\n if (fs.existsSync(tsconfigPath)) {\n const tsconfigContent = fs.readFileSync(tsconfigPath, \"utf8\");\n tsconfig = JSON.parse(tsconfigContent);\n }\n } catch (error) {\n console.error(\"❌ Error reading tsconfig.json:\", error);\n // Continue with default config\n }\n\n // Create a custom tsconfig that outputs to our build directory with the correct module type\n const tempTsconfig = {\n ...tsconfig,\n compilerOptions: {\n ...(tsconfig.compilerOptions || {}),\n outDir: path.join(`./${BUILD_DIR}/${moduleType}`),\n module: moduleType === \"esm\" ? \"ESNext\" : \"CommonJS\",\n },\n };\n\n const tempTsconfigPath = path.join(\n process.cwd(),\n `tsconfig.arkos-build.json`\n );\n fs.writeFileSync(tempTsconfigPath, JSON.stringify(tempTsconfig, null, 2));\n\n try {\n // Run TypeScript compiler\n execSync(`npx tsc -p ${tempTsconfigPath}`, {\n stdio: \"inherit\",\n cwd: process.cwd(),\n });\n\n // Copy non-TypeScript files\n copyAllNonSourceFiles(moduleType, [\".ts\", \".tsx\"]);\n\n // Clean up temp config\n cleanupTempConfig(tempTsconfigPath);\n } catch (error) {\n cleanupTempConfig(tempTsconfigPath);\n throw error;\n }\n}\n\n/**\n * Build a JavaScript project\n */\nfunction buildJavaScriptProject(options: BuildOptions, moduleType: ModuleType) {\n // Target directory\n const targetDir = path.join(BUILD_DIR, moduleType);\n\n try {\n // Copy JavaScript files based on module type\n if (moduleType === \"esm\") {\n // Copy JS files for ESM (skip .cjs files as they are CommonJS)\n execSync(\n `npx copyfiles -u 0 \"src/**/*.js\" \"src/**/*.jsx\" \"src/**/*.mjs\" ${targetDir}`,\n {\n stdio: \"inherit\",\n cwd: process.cwd(),\n }\n );\n\n // Note about CommonJS files\n console.info(\"Note: .cjs files are skipped in ESM build\");\n } else {\n // Copy all JS files for CommonJS\n execSync(\n `npx copyfiles -u 0 \"src/**/*.js\" \"src/**/*.jsx\" \"src/**/*.cjs\" \"src/**/*.mjs\" ${targetDir}`,\n {\n stdio: \"inherit\",\n cwd: process.cwd(),\n }\n );\n }\n\n // Copy all non-JS files\n copyAllNonSourceFiles(moduleType, [\n \".js\",\n \".jsx\",\n \".mjs\",\n \".cjs\",\n \".ts\",\n \".tsx\",\n ]);\n\n // Create appropriate package.json in the build directory\n createModulePackageJson(moduleType);\n } catch (error) {\n console.error(\"❌ Error building JavaScript project:\", error);\n throw error;\n }\n}\n\n/**\n * Copy all non-source code files to the build directory\n * This function will copy everything except the specified source file extensions\n */\nfunction copyAllNonSourceFiles(\n moduleType: ModuleType,\n skipExtensions: string[]\n) {\n const targetDir = path.join(BUILD_DIR, moduleType);\n const sourceDir = \"src\";\n\n try {\n // Recursive function to copy files\n function copyDirRecursive(dir: string) {\n if (!fs.existsSync(dir)) return;\n\n const items = fs.readdirSync(dir);\n\n for (const item of items) {\n const sourcePath = path.join(dir, item);\n const targetPath = path.join(\n targetDir,\n dir.replace(sourceDir, \"\"),\n item\n );\n\n // Get file stats\n const stats = fs.statSync(sourcePath);\n\n if (stats.isDirectory()) {\n // Ensure target directory exists\n if (!fs.existsSync(targetPath)) {\n fs.mkdirSync(targetPath, { recursive: true });\n }\n // Recurse into subdirectory\n copyDirRecursive(sourcePath);\n } else if (stats.isFile()) {\n // Check if this is a file we should skip\n const ext = path.extname(item).toLowerCase();\n if (!skipExtensions.includes(ext)) {\n // Ensure the target directory exists\n const targetDir = path.dirname(targetPath);\n if (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, { recursive: true });\n }\n // Copy the file\n fs.copyFileSync(sourcePath, targetPath);\n }\n }\n }\n }\n\n // Start copying from src directory\n copyDirRecursive(sourceDir);\n\n // Copy project root files if needed\n const rootFilesToCopy = [\"README.md\", \"LICENSE\"];\n\n for (const file of rootFilesToCopy) {\n if (fs.existsSync(path.join(process.cwd(), file))) {\n fs.copyFileSync(\n path.join(process.cwd(), file),\n path.join(targetDir, file)\n );\n }\n }\n\n console.info(`📦 Copied all non-source files to ${targetDir}`);\n } catch (error) {\n console.warn(\"Warning: Error copying project files:\", error);\n console.error(error);\n }\n}\n\n/**\n * Create appropriate package.json in the build directory\n */\nfunction createModulePackageJson(moduleType: ModuleType) {\n const packageJsonPath = path.join(process.cwd(), \"package.json\");\n\n if (!fs.existsSync(packageJsonPath)) {\n return;\n }\n\n try {\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, \"utf8\"));\n const buildPackageJson: any = {\n name: packageJson.name,\n version: packageJson.version,\n description: packageJson.description,\n main: \"index.js\",\n dependencies: packageJson.dependencies,\n };\n\n // Set appropriate type field for ESM\n if (moduleType === \"esm\") {\n buildPackageJson.type = \"module\";\n }\n\n const targetDir = path.join(BUILD_DIR, moduleType);\n fs.writeFileSync(\n path.join(targetDir, \"package.json\"),\n JSON.stringify(buildPackageJson, null, 2)\n );\n } catch (error) {\n console.warn(\n \"Warning: Failed to create module-specific package.json\",\n error\n );\n }\n}\n\n/**\n * Clean up temporary tsconfig\n */\nfunction cleanupTempConfig(configPath: string) {\n try {\n if (fs.existsSync(configPath)) {\n fs.unlinkSync(configPath);\n }\n } catch (error) {\n console.warn(\"Warning: Error cleaning up temporary config:\", error);\n }\n}\n"]}
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../../../src/utils/cli/build.ts"],"names":[],"mappings":"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","sourcesContent":["// src/utils/cli/build.ts\nimport path from \"path\";\nimport fs from \"fs\";\nimport { execSync } from \"child_process\";\nimport { getUserFileExtension } from \"../helpers/fs.helpers\";\nimport { loadEnvironmentVariables } from \"../dotenv.helpers\";\n\n// Constants\nconst BUILD_DIR = \"build\";\nconst MODULE_TYPES = [\"cjs\", \"esm\"] as const;\ntype ModuleType = (typeof MODULE_TYPES)[number];\n\ninterface BuildOptions {\n config?: string;\n module?: string;\n}\n\n/**\n * Main build function for the arkos CLI\n */\nexport function buildCommand(options: BuildOptions = {}) {\n const envFiles = loadEnvironmentVariables();\n const moduleType = validateModuleType(options.module);\n\n try {\n console.info(`🛠️ Using env variables from ${envFiles?.join(\", \")}...`);\n console.info(\n `🚀 Building an optimized production ready project with ${moduleType} format...\\n`\n );\n\n ensureBuildDir();\n\n // Detect project type\n const fileExt = getUserFileExtension();\n\n if (fileExt === \"ts\") {\n buildTypeScriptProject(options, moduleType);\n } else {\n buildJavaScriptProject(options, moduleType);\n }\n\n console.info(`✅ Build complete! \\n`);\n console.info(`Next step:\\n`);\n console.info(`Run the generated build with the start command.\\n`);\n } catch (error) {\n console.error(\"❌ Build failed:\", error);\n process.exit(1);\n }\n}\n\n/**\n * Validates and normalizes module type option\n */\nfunction validateModuleType(moduleType?: string): ModuleType {\n if (!moduleType) return \"cjs\";\n\n const normalizedType = moduleType.toLowerCase();\n\n // Map common terms to our module types\n if (normalizedType === \"cjs\" || normalizedType === \"commonjs\") {\n return \"cjs\";\n } else if (\n [\"esm\", \"es\", \"es2020\", \"esnext\", \"module\"].includes(normalizedType)\n ) {\n return \"esm\";\n }\n\n // Default to CJS if unrecognized\n console.warn(\n `⚠️ Unrecognized module type \"${moduleType}\", defaulting to \"cjs\"`\n );\n return \"cjs\";\n}\n\n/**\n * Ensure the build directory exists\n */\nfunction ensureBuildDir() {\n if (!fs.existsSync(BUILD_DIR)) {\n fs.mkdirSync(BUILD_DIR, { recursive: true });\n }\n\n // Create module-specific subdirectories\n for (const moduleType of MODULE_TYPES) {\n const moduleDir = path.join(BUILD_DIR, moduleType);\n if (!fs.existsSync(moduleDir)) {\n fs.mkdirSync(moduleDir, { recursive: true });\n }\n }\n}\n\n/**\n * Build a TypeScript project\n */\nfunction buildTypeScriptProject(options: BuildOptions, moduleType: ModuleType) {\n // Read the user's tsconfig.json\n const tsconfigPath = path.join(\n process.cwd(),\n options.config || \"tsconfig.json\"\n );\n let tsconfig: any = {};\n\n try {\n if (fs.existsSync(tsconfigPath)) {\n const tsconfigContent = fs.readFileSync(tsconfigPath, \"utf8\");\n tsconfig = JSON.parse(tsconfigContent);\n }\n } catch (error) {\n console.error(\"❌ Error reading tsconfig.json:\", error);\n // Continue with default config\n }\n\n // Create a custom tsconfig that outputs to our build directory with the correct module type\n const tempTsconfig = {\n ...tsconfig,\n compilerOptions: {\n ...(tsconfig.compilerOptions || {}),\n outDir: path.join(`./${BUILD_DIR}/${moduleType}`),\n module: moduleType === \"esm\" ? \"ESNext\" : \"CommonJS\",\n },\n };\n\n const tempTsconfigPath = path.join(\n process.cwd(),\n `tsconfig.arkos-build.json`\n );\n fs.writeFileSync(tempTsconfigPath, JSON.stringify(tempTsconfig, null, 2));\n\n try {\n // Run TypeScript compiler\n execSync(`npx tsc -p ${tempTsconfigPath}`, {\n stdio: \"inherit\",\n cwd: process.cwd(),\n });\n\n // Copy non-TypeScript files\n copyAllNonSourceFiles(moduleType, [\".ts\", \".tsx\"]);\n\n // Clean up temp config\n cleanupTempConfig(tempTsconfigPath);\n } catch (error) {\n cleanupTempConfig(tempTsconfigPath);\n throw error;\n }\n}\n\n/**\n * Build a JavaScript project\n */\nfunction buildJavaScriptProject(options: BuildOptions, moduleType: ModuleType) {\n // Target directory\n const targetDir = path.join(BUILD_DIR, moduleType);\n\n try {\n // Copy JavaScript files based on module type\n if (moduleType === \"esm\") {\n // Copy JS files for ESM (skip .cjs files as they are CommonJS)\n execSync(\n `npx copyfiles -u 0 \"src/**/*.js\" \"src/**/*.jsx\" \"src/**/*.mjs\" ${targetDir}`,\n {\n stdio: \"inherit\",\n cwd: process.cwd(),\n }\n );\n\n // Note about CommonJS files\n console.info(\"Note: .cjs files are skipped in ESM build\");\n } else {\n // Copy all JS files for CommonJS\n execSync(\n `npx copyfiles -u 0 \"src/**/*.js\" \"src/**/*.jsx\" \"src/**/*.cjs\" \"src/**/*.mjs\" ${targetDir}`,\n {\n stdio: \"inherit\",\n cwd: process.cwd(),\n }\n );\n }\n\n // Copy all non-JS files\n copyAllNonSourceFiles(moduleType, [\n \".js\",\n \".jsx\",\n \".mjs\",\n \".cjs\",\n \".ts\",\n \".tsx\",\n ]);\n\n // Create appropriate package.json in the build directory\n createModulePackageJson(moduleType);\n } catch (error) {\n console.error(\"❌ Error building JavaScript project:\", error);\n throw error;\n }\n}\n\n/**\n * Copy all non-source code files to the build directory\n * This function will copy everything except the specified source file extensions\n */\nfunction copyAllNonSourceFiles(\n moduleType: ModuleType,\n skipExtensions: string[]\n) {\n const targetDir = path.join(BUILD_DIR, moduleType);\n const sourceDir = \"src\";\n\n try {\n // Recursive function to copy files\n function copyDirRecursive(dir: string) {\n if (!fs.existsSync(dir)) return;\n\n const items = fs.readdirSync(dir);\n\n for (const item of items) {\n const sourcePath = path.join(dir, item);\n const targetPath = path.join(\n targetDir,\n dir.replace(sourceDir, \"\"),\n item\n );\n\n // Get file stats\n const stats = fs.statSync(sourcePath);\n\n if (stats.isDirectory()) {\n // Ensure target directory exists\n if (!fs.existsSync(targetPath)) {\n fs.mkdirSync(targetPath, { recursive: true });\n }\n // Recurse into subdirectory\n copyDirRecursive(sourcePath);\n } else if (stats.isFile()) {\n // Check if this is a file we should skip\n const ext = path.extname(item).toLowerCase();\n if (!skipExtensions.includes(ext)) {\n // Ensure the target directory exists\n const targetDir = path.dirname(targetPath);\n if (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, { recursive: true });\n }\n // Copy the file\n fs.copyFileSync(sourcePath, targetPath);\n }\n }\n }\n }\n\n // Start copying from src directory\n copyDirRecursive(sourceDir);\n\n // Copy project root files if needed\n const rootFilesToCopy = [\"README.md\", \"LICENSE\"];\n\n for (const file of rootFilesToCopy) {\n if (fs.existsSync(path.join(process.cwd(), file))) {\n fs.copyFileSync(\n path.join(process.cwd(), file),\n path.join(targetDir, file)\n );\n }\n }\n\n console.info(`📦 Copied all non-source files to ${targetDir}`);\n } catch (error) {\n console.warn(\"Warning: Error copying project files:\", error);\n console.error(error);\n }\n}\n\n/**\n * Create appropriate package.json in the build directory\n */\nfunction createModulePackageJson(moduleType: ModuleType) {\n const packageJsonPath = path.join(process.cwd(), \"package.json\");\n\n if (!fs.existsSync(packageJsonPath)) {\n return;\n }\n\n try {\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, \"utf8\"));\n const buildPackageJson: any = {\n name: packageJson.name,\n version: packageJson.version,\n description: packageJson.description,\n main: \"index.js\",\n dependencies: packageJson.dependencies,\n };\n\n // Set appropriate type field for ESM\n if (moduleType === \"esm\") {\n buildPackageJson.type = \"module\";\n }\n\n const targetDir = path.join(BUILD_DIR, moduleType);\n fs.writeFileSync(\n path.join(targetDir, \"package.json\"),\n JSON.stringify(buildPackageJson, null, 2)\n );\n } catch (error) {\n console.warn(\n \"Warning: Failed to create module-specific package.json\",\n error\n );\n }\n}\n\n/**\n * Clean up temporary tsconfig\n */\nfunction cleanupTempConfig(configPath: string) {\n try {\n if (fs.existsSync(configPath)) {\n fs.unlinkSync(configPath);\n }\n } catch (error) {\n console.warn(\"Warning: Error cleaning up temporary config:\", error);\n }\n}\n"]}
@@ -1,60 +1,55 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.devCommand = devCommand;
13
4
  const child_process_1 = require("child_process");
14
5
  const fs_helpers_1 = require("../helpers/fs.helpers");
15
6
  const _1 = require(".");
16
7
  const dotenv_helpers_1 = require("../dotenv.helpers");
17
- function devCommand() {
18
- return __awaiter(this, arguments, void 0, function* (options = {}) {
19
- const envFiles = (0, dotenv_helpers_1.loadEnvironmentVariables)();
20
- try {
21
- const { port, host } = options;
22
- const fileExt = (0, fs_helpers_1.getUserFileExtension)();
23
- const entryPoint = `src/app.${fileExt}`;
24
- if (!entryPoint) {
25
- console.error("❌ Could not find application entry point.");
26
- process.exit(1);
27
- }
28
- const env = Object.assign(Object.assign(Object.assign({}, process.env), (port && { PORT: port })), (host && { HOST: host }));
29
- let child;
30
- if (fileExt === "ts") {
31
- child = (0, child_process_1.spawn)("npx", ["ts-node-dev", "--respawn", entryPoint], {
32
- stdio: "inherit",
33
- env,
34
- shell: true,
35
- });
36
- }
37
- else {
38
- child = (0, child_process_1.spawn)("npx", ["nodemon", entryPoint], {
39
- stdio: "inherit",
40
- env,
41
- shell: true,
42
- });
43
- }
44
- console.info(` \x1b[1m\x1b[36m Arkos.js ${(0, _1.getVersion)()}\x1b[0m`);
45
- console.info(` - Local: http://${env.HOST || host}:${env.PORT || port}`);
46
- console.info(` - Environments: ${envFiles === null || envFiles === void 0 ? void 0 : envFiles.join(", ")}\n`);
47
- process.on("SIGINT", () => {
48
- if (child) {
49
- child.kill();
50
- }
51
- process.exit(0);
8
+ async function devCommand(options = {}) {
9
+ const envFiles = (0, dotenv_helpers_1.loadEnvironmentVariables)();
10
+ try {
11
+ const { port, host } = options;
12
+ const fileExt = (0, fs_helpers_1.getUserFileExtension)();
13
+ const entryPoint = `src/app.${fileExt}`;
14
+ if (!entryPoint) {
15
+ console.error("❌ Could not find application entry point.");
16
+ process.exit(1);
17
+ }
18
+ const env = {
19
+ ...process.env,
20
+ ...(port && { PORT: port }),
21
+ ...(host && { HOST: host }),
22
+ };
23
+ let child;
24
+ if (fileExt === "ts") {
25
+ child = (0, child_process_1.spawn)("npx", ["ts-node-dev", "--respawn", entryPoint], {
26
+ stdio: "inherit",
27
+ env,
28
+ shell: true,
52
29
  });
53
30
  }
54
- catch (error) {
55
- console.error(" Development server failed to start:", error);
56
- process.exit(1);
31
+ else {
32
+ child = (0, child_process_1.spawn)("npx", ["nodemon", entryPoint], {
33
+ stdio: "inherit",
34
+ env,
35
+ shell: true,
36
+ });
57
37
  }
58
- });
38
+ console.info(` \x1b[1m\x1b[36m Arkos.js ${(0, _1.getVersion)()}\x1b[0m`);
39
+ console.info(` - Local: http://${env.HOST || host}:${env.PORT || port}`);
40
+ console.info(` - Environments: ${envFiles
41
+ ?.join(", ")
42
+ .replaceAll(`${process.cwd()}/`, "")}\n`);
43
+ process.on("SIGINT", () => {
44
+ if (child) {
45
+ child.kill();
46
+ }
47
+ process.exit(0);
48
+ });
49
+ }
50
+ catch (error) {
51
+ console.error("❌ Development server failed to start:", error);
52
+ process.exit(1);
53
+ }
59
54
  }
60
55
  //# sourceMappingURL=dev.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../../../src/utils/cli/dev.ts"],"names":[],"mappings":";;;;;;;;;;;AAcA,gCA6DC;AA1ED,iDAAsC;AACtC,sDAA6D;AAC7D,wBAA+B;AAC/B,sDAA6D;AAU7D,SAAsB,UAAU;yDAAC,UAAsB,EAAE;QACvD,MAAM,QAAQ,GAAG,IAAA,yCAAwB,GAAE,CAAC;QAE5C,IAAI,CAAC;YACH,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;YAG/B,MAAM,OAAO,GAAG,IAAA,iCAAoB,GAAE,CAAC;YAGvC,MAAM,UAAU,GAAG,WAAW,OAAO,EAAE,CAAC;YAExC,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;gBAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAGD,MAAM,GAAG,iDACJ,OAAO,CAAC,GAAG,GACX,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,GACxB,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAC5B,CAAC;YAGF,IAAI,KAAK,CAAC;YAGV,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrB,KAAK,GAAG,IAAA,qBAAK,EAAC,KAAK,EAAE,CAAC,aAAa,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE;oBAC7D,KAAK,EAAE,SAAS;oBAChB,GAAG;oBACH,KAAK,EAAE,IAAI;iBACZ,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,KAAK,GAAG,IAAA,qBAAK,EAAC,KAAK,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE;oBAC5C,KAAK,EAAE,SAAS;oBAChB,GAAG;oBACH,KAAK,EAAE,IAAI;iBACZ,CAAC,CAAC;YACL,CAAC;YAID,OAAO,CAAC,IAAI,CAAC,+BAA+B,IAAA,aAAU,GAAE,SAAS,CAAC,CAAC;YACnE,OAAO,CAAC,IAAI,CACV,4BAA4B,GAAG,CAAC,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE,CACnE,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,qBAAqB,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAG5D,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;gBACxB,IAAI,KAAK,EAAE,CAAC;oBACV,KAAK,CAAC,IAAI,EAAE,CAAC;gBACf,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;YAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;CAAA","sourcesContent":["// src/utils/cli/dev.ts\nimport { spawn } from \"child_process\";\nimport { getUserFileExtension } from \"../helpers/fs.helpers\";\nimport { getVersion } from \".\";\nimport { loadEnvironmentVariables } from \"../dotenv.helpers\";\n\ninterface DevOptions {\n port?: string;\n host?: string;\n}\n\n/**\n * Dev server command for the arkos CLI\n */\nexport async function devCommand(options: DevOptions = {}) {\n const envFiles = loadEnvironmentVariables();\n\n try {\n const { port, host } = options;\n\n // Detect if project uses TypeScript or JavaScript\n const fileExt = getUserFileExtension();\n\n // Find the application entry point\n const entryPoint = `src/app.${fileExt}`;\n\n if (!entryPoint) {\n console.error(\"❌ Could not find application entry point.\");\n process.exit(1);\n }\n\n // Set environment variables\n const env = {\n ...process.env,\n ...(port && { PORT: port }),\n ...(host && { HOST: host }),\n };\n\n // Start the application with the appropriate runner\n let child;\n\n // Setup file watching if enabled\n if (fileExt === \"ts\") {\n child = spawn(\"npx\", [\"ts-node-dev\", \"--respawn\", entryPoint], {\n stdio: \"inherit\",\n env,\n shell: true,\n });\n } else {\n child = spawn(\"npx\", [\"nodemon\", entryPoint], {\n stdio: \"inherit\",\n env,\n shell: true,\n });\n }\n\n // console.log(getArkosConfig());\n\n console.info(` \\x1b[1m\\x1b[36m Arkos.js ${getVersion()}\\x1b[0m`);\n console.info(\n ` - Local: http://${env.HOST || host}:${env.PORT || port}`\n );\n console.info(` - Environments: ${envFiles?.join(\", \")}\\n`);\n\n // Handle process exit\n process.on(\"SIGINT\", () => {\n if (child) {\n child.kill();\n }\n process.exit(0);\n });\n } catch (error) {\n console.error(\"❌ Development server failed to start:\", error);\n process.exit(1);\n }\n}\n"]}
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../../../src/utils/cli/dev.ts"],"names":[],"mappings":";;AAcA,gCAiEC;AA9ED,iDAAsC;AACtC,sDAAkE;AAClE,wBAA+B;AAC/B,sDAA6D;AAUtD,KAAK,UAAU,UAAU,CAAC,UAAsB,EAAE;IACvD,MAAM,QAAQ,GAAG,IAAA,yCAAwB,GAAE,CAAC;IAE5C,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;QAG/B,MAAM,OAAO,GAAG,IAAA,iCAAoB,GAAE,CAAC;QAGvC,MAAM,UAAU,GAAG,WAAW,OAAO,EAAE,CAAC;QAExC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAGD,MAAM,GAAG,GAAG;YACV,GAAG,OAAO,CAAC,GAAG;YACd,GAAG,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YAC3B,GAAG,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;SAC5B,CAAC;QAGF,IAAI,KAAK,CAAC;QAGV,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,KAAK,GAAG,IAAA,qBAAK,EAAC,KAAK,EAAE,CAAC,aAAa,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE;gBAC7D,KAAK,EAAE,SAAS;gBAChB,GAAG;gBACH,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,IAAA,qBAAK,EAAC,KAAK,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE;gBAC5C,KAAK,EAAE,SAAS;gBAChB,GAAG;gBACH,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;QACL,CAAC;QAID,OAAO,CAAC,IAAI,CAAC,+BAA+B,IAAA,aAAU,GAAE,SAAS,CAAC,CAAC;QACnE,OAAO,CAAC,IAAI,CACV,4BAA4B,GAAG,CAAC,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE,CACnE,CAAC;QACF,OAAO,CAAC,IAAI,CACV,qBAAqB,QAAQ;YAC3B,EAAE,IAAI,CAAC,IAAI,CAAC;aACX,UAAU,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAC3C,CAAC;QAGF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACxB,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC","sourcesContent":["// src/utils/cli/dev.ts\nimport { spawn } from \"child_process\";\nimport { crd, getUserFileExtension } from \"../helpers/fs.helpers\";\nimport { getVersion } from \".\";\nimport { loadEnvironmentVariables } from \"../dotenv.helpers\";\n\ninterface DevOptions {\n port?: string;\n host?: string;\n}\n\n/**\n * Dev server command for the arkos CLI\n */\nexport async function devCommand(options: DevOptions = {}) {\n const envFiles = loadEnvironmentVariables();\n\n try {\n const { port, host } = options;\n\n // Detect if project uses TypeScript or JavaScript\n const fileExt = getUserFileExtension();\n\n // Find the application entry point\n const entryPoint = `src/app.${fileExt}`;\n\n if (!entryPoint) {\n console.error(\"❌ Could not find application entry point.\");\n process.exit(1);\n }\n\n // Set environment variables\n const env = {\n ...process.env,\n ...(port && { PORT: port }),\n ...(host && { HOST: host }),\n };\n\n // Start the application with the appropriate runner\n let child;\n\n // Setup file watching if enabled\n if (fileExt === \"ts\") {\n child = spawn(\"npx\", [\"ts-node-dev\", \"--respawn\", entryPoint], {\n stdio: \"inherit\",\n env,\n shell: true,\n });\n } else {\n child = spawn(\"npx\", [\"nodemon\", entryPoint], {\n stdio: \"inherit\",\n env,\n shell: true,\n });\n }\n\n // console.log(getArkosConfig());\n\n console.info(` \\x1b[1m\\x1b[36m Arkos.js ${getVersion()}\\x1b[0m`);\n console.info(\n ` - Local: http://${env.HOST || host}:${env.PORT || port}`\n );\n console.info(\n ` - Environments: ${envFiles\n ?.join(\", \")\n .replaceAll(`${process.cwd()}/`, \"\")}\\n`\n );\n\n // Handle process exit\n process.on(\"SIGINT\", () => {\n if (child) {\n child.kill();\n }\n process.exit(0);\n });\n } catch (error) {\n console.error(\"❌ Development server failed to start:\", error);\n process.exit(1);\n }\n}\n"]}
@@ -1,13 +1,4 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
12
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
4
  };
@@ -18,36 +9,42 @@ const fs_1 = __importDefault(require("fs"));
18
9
  const child_process_1 = require("child_process");
19
10
  const _1 = require(".");
20
11
  const dotenv_helpers_1 = require("../dotenv.helpers");
21
- function startCommand() {
22
- return __awaiter(this, arguments, void 0, function* (options = {}) {
23
- const envFiles = (0, dotenv_helpers_1.loadEnvironmentVariables)();
24
- try {
25
- const { port, host } = options;
26
- const entryPoint = path_1.default.join("build", "src", "app.js");
27
- if (!fs_1.default.existsSync(path_1.default.join(process.cwd(), entryPoint))) {
28
- console.error(`❌ Could not find built application entry point at ${entryPoint}`);
29
- process.exit(1);
30
- }
31
- const env = Object.assign(Object.assign(Object.assign(Object.assign({}, process.env), (port && { PORT: port })), (host && { HOST: host })), { NODE_ENV: "production", ARKOS_BUILD: "true" });
32
- const child = (0, child_process_1.spawn)("node", [entryPoint], {
33
- stdio: "inherit",
34
- env,
35
- shell: true,
36
- });
37
- process.on("SIGINT", () => {
38
- if (child) {
39
- child.kill();
40
- }
41
- process.exit(0);
42
- });
43
- console.info(` \x1b[1m\x1b[36m Arkos.js ${(0, _1.getVersion)()}\x1b[0m`);
44
- console.info(` - Local: http://${env.HOST || host}:${env.PORT || port}`);
45
- console.info(` - Environments: ${envFiles === null || envFiles === void 0 ? void 0 : envFiles.join(", ")}\n`);
46
- }
47
- catch (error) {
48
- console.error("❌ Production server failed to start:", error);
12
+ async function startCommand(options = {}) {
13
+ const envFiles = (0, dotenv_helpers_1.loadEnvironmentVariables)();
14
+ try {
15
+ const { port, host } = options;
16
+ const entryPoint = path_1.default.join("build", "src", "app.js");
17
+ if (!fs_1.default.existsSync(path_1.default.join(process.cwd(), entryPoint))) {
18
+ console.error(`❌ Could not find built application entry point at ${entryPoint}`);
49
19
  process.exit(1);
50
20
  }
51
- });
21
+ const env = {
22
+ ...process.env,
23
+ ...(port && { PORT: port }),
24
+ ...(host && { HOST: host }),
25
+ NODE_ENV: "production",
26
+ ARKOS_BUILD: "true",
27
+ };
28
+ const child = (0, child_process_1.spawn)("node", [entryPoint], {
29
+ stdio: "inherit",
30
+ env,
31
+ shell: true,
32
+ });
33
+ process.on("SIGINT", () => {
34
+ if (child) {
35
+ child.kill();
36
+ }
37
+ process.exit(0);
38
+ });
39
+ console.info(` \x1b[1m\x1b[36m Arkos.js ${(0, _1.getVersion)()}\x1b[0m`);
40
+ console.info(` - Local: http://${env.HOST || host}:${env.PORT || port}`);
41
+ console.info(` - Environments: ${envFiles
42
+ ?.join(", ")
43
+ .replaceAll(`${process.cwd()}/`, "")}\n`);
44
+ }
45
+ catch (error) {
46
+ console.error("❌ Production server failed to start:", error);
47
+ process.exit(1);
48
+ }
52
49
  }
53
50
  //# sourceMappingURL=start.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../../src/utils/cli/start.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAgBA,oCAmDC;AAlED,gDAAwB;AACxB,4CAAoB;AACpB,iDAAsC;AAEtC,wBAA+B;AAC/B,sDAA6D;AAU7D,SAAsB,YAAY;yDAAC,UAAwB,EAAE;QAC3D,MAAM,QAAQ,GAAG,IAAA,yCAAwB,GAAE,CAAC;QAE5C,IAAI,CAAC;YACH,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;YAG/B,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YAEvD,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC;gBACzD,OAAO,CAAC,KAAK,CACX,qDAAqD,UAAU,EAAE,CAClE,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAGD,MAAM,GAAG,+DACJ,OAAO,CAAC,GAAG,GACX,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,GACxB,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,KAC3B,QAAQ,EAAE,YAAY,EACtB,WAAW,EAAE,MAAM,GACpB,CAAC;YAGF,MAAM,KAAK,GAAG,IAAA,qBAAK,EAAC,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE;gBACxC,KAAK,EAAE,SAAS;gBAChB,GAAG;gBACH,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;YAGH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;gBACxB,IAAI,KAAK,EAAE,CAAC;oBACV,KAAK,CAAC,IAAI,EAAE,CAAC;gBACf,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;YAIH,OAAO,CAAC,IAAI,CAAC,+BAA+B,IAAA,aAAU,GAAE,SAAS,CAAC,CAAC;YACnE,OAAO,CAAC,IAAI,CACV,4BAA4B,GAAG,CAAC,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE,CACnE,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,qBAAqB,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;YAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;CAAA","sourcesContent":["// src/utils/cli/start.ts\nimport path from \"path\";\nimport fs from \"fs\";\nimport { spawn } from \"child_process\";\nimport { getArkosConfig } from \"../../server\";\nimport { getVersion } from \".\";\nimport { loadEnvironmentVariables } from \"../dotenv.helpers\";\n\ninterface StartOptions {\n port?: string;\n host?: string;\n}\n\n/**\n * Production start command for the arkos CLI\n */\nexport async function startCommand(options: StartOptions = {}) {\n const envFiles = loadEnvironmentVariables();\n\n try {\n const { port, host } = options;\n\n // Check for built app file\n const entryPoint = path.join(\"build\", \"src\", \"app.js\");\n\n if (!fs.existsSync(path.join(process.cwd(), entryPoint))) {\n console.error(\n `❌ Could not find built application entry point at ${entryPoint}`\n );\n process.exit(1);\n }\n\n // Set environment variables\n const env = {\n ...process.env,\n ...(port && { PORT: port }),\n ...(host && { HOST: host }),\n NODE_ENV: \"production\",\n ARKOS_BUILD: \"true\",\n };\n\n // Start the application\n const child = spawn(\"node\", [entryPoint], {\n stdio: \"inherit\",\n env,\n shell: true,\n });\n\n // Handle process exit\n process.on(\"SIGINT\", () => {\n if (child) {\n child.kill();\n }\n process.exit(0);\n });\n\n // console.log(getArkosConfig());\n\n console.info(` \\x1b[1m\\x1b[36m Arkos.js ${getVersion()}\\x1b[0m`);\n console.info(\n ` - Local: http://${env.HOST || host}:${env.PORT || port}`\n );\n console.info(` - Environments: ${envFiles?.join(\", \")}\\n`);\n } catch (error) {\n console.error(\"❌ Production server failed to start:\", error);\n process.exit(1);\n }\n}\n"]}
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../../src/utils/cli/start.ts"],"names":[],"mappings":";;;;;AAgBA,oCAuDC;AAtED,gDAAwB;AACxB,4CAAoB;AACpB,iDAAsC;AAEtC,wBAA+B;AAC/B,sDAA6D;AAUtD,KAAK,UAAU,YAAY,CAAC,UAAwB,EAAE;IAC3D,MAAM,QAAQ,GAAG,IAAA,yCAAwB,GAAE,CAAC;IAE5C,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;QAG/B,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QAEvD,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC;YACzD,OAAO,CAAC,KAAK,CACX,qDAAqD,UAAU,EAAE,CAClE,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAGD,MAAM,GAAG,GAAG;YACV,GAAG,OAAO,CAAC,GAAG;YACd,GAAG,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YAC3B,GAAG,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YAC3B,QAAQ,EAAE,YAAY;YACtB,WAAW,EAAE,MAAM;SACpB,CAAC;QAGF,MAAM,KAAK,GAAG,IAAA,qBAAK,EAAC,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE;YACxC,KAAK,EAAE,SAAS;YAChB,GAAG;YACH,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QAGH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACxB,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAIH,OAAO,CAAC,IAAI,CAAC,+BAA+B,IAAA,aAAU,GAAE,SAAS,CAAC,CAAC;QACnE,OAAO,CAAC,IAAI,CACV,4BAA4B,GAAG,CAAC,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE,CACnE,CAAC;QACF,OAAO,CAAC,IAAI,CACV,qBAAqB,QAAQ;YAC3B,EAAE,IAAI,CAAC,IAAI,CAAC;aACX,UAAU,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAC3C,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC","sourcesContent":["// src/utils/cli/start.ts\nimport path from \"path\";\nimport fs from \"fs\";\nimport { spawn } from \"child_process\";\nimport { getArkosConfig } from \"../../server\";\nimport { getVersion } from \".\";\nimport { loadEnvironmentVariables } from \"../dotenv.helpers\";\n\ninterface StartOptions {\n port?: string;\n host?: string;\n}\n\n/**\n * Production start command for the arkos CLI\n */\nexport async function startCommand(options: StartOptions = {}) {\n const envFiles = loadEnvironmentVariables();\n\n try {\n const { port, host } = options;\n\n // Check for built app file\n const entryPoint = path.join(\"build\", \"src\", \"app.js\");\n\n if (!fs.existsSync(path.join(process.cwd(), entryPoint))) {\n console.error(\n `❌ Could not find built application entry point at ${entryPoint}`\n );\n process.exit(1);\n }\n\n // Set environment variables\n const env = {\n ...process.env,\n ...(port && { PORT: port }),\n ...(host && { HOST: host }),\n NODE_ENV: \"production\",\n ARKOS_BUILD: \"true\",\n };\n\n // Start the application\n const child = spawn(\"node\", [entryPoint], {\n stdio: \"inherit\",\n env,\n shell: true,\n });\n\n // Handle process exit\n process.on(\"SIGINT\", () => {\n if (child) {\n child.kill();\n }\n process.exit(0);\n });\n\n // console.log(getArkosConfig());\n\n console.info(` \\x1b[1m\\x1b[36m Arkos.js ${getVersion()}\\x1b[0m`);\n console.info(\n ` - Local: http://${env.HOST || host}:${env.PORT || port}`\n );\n console.info(\n ` - Environments: ${envFiles\n ?.join(\", \")\n .replaceAll(`${process.cwd()}/`, \"\")}\\n`\n );\n } catch (error) {\n console.error(\"❌ Production server failed to start:\", error);\n process.exit(1);\n }\n}\n"]}
@@ -1,13 +1,4 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
12
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
4
  };
@@ -36,38 +27,36 @@ class APIFeatures {
36
27
  this.req = req;
37
28
  this.modelName = modelName;
38
29
  this.searchParams = (0, api_features_helpers_1.parseQueryParamsWithModifiers)(req.query);
39
- this.filters = Object.assign({}, this.filters);
30
+ this.filters = { ...this.filters };
40
31
  if (relationFields)
41
32
  this.filters.iclude = relationFields;
42
33
  this.relationFields = relationFields || {};
43
34
  }
44
35
  filter() {
45
- var _a, _b, _c, _d;
46
36
  const searchableFields = [];
47
- const queryObj = Object.assign({}, this.searchParams);
37
+ const queryObj = { ...this.searchParams };
48
38
  this.excludedFields.forEach((el) => delete queryObj[el]);
49
39
  let queryStr = JSON.stringify(queryObj);
50
40
  queryStr = queryStr.replace(/\b(gte|gt|lte|lt)\b/g, (match) => `${match}`);
51
- const whereObj = Object.assign(Object.assign({}, this.req.params), queryObj);
41
+ const whereObj = { ...this.req.params, ...queryObj };
52
42
  const whereLogicalOperatorFilters = Object.keys(whereObj).map((key) => ({
53
43
  [key]: whereObj[key],
54
44
  }));
55
45
  let whereOptions = whereLogicalOperatorFilters.length > 0
56
46
  ? {
57
- [(_b = (_a = this.req.query) === null || _a === void 0 ? void 0 : _a.filterMode) !== null && _b !== void 0 ? _b : "OR"]: whereLogicalOperatorFilters,
47
+ [this.req.query?.filterMode ?? "OR"]: whereLogicalOperatorFilters,
58
48
  }
59
49
  : {};
60
50
  if (!!this.searchParams.search) {
61
51
  const prisma = (0, prisma_helpers_1.getPrismaInstance)();
62
52
  Object.keys(prisma[this.modelName].fields).forEach((key) => {
63
- var _a, _b;
64
53
  const field = prisma[this.modelName].fields[key];
65
54
  if (field.typeName === "String" &&
66
55
  key !== "id" &&
67
56
  key !== "password" &&
68
57
  !field.isList &&
69
- !((_a = key === null || key === void 0 ? void 0 : key.includes) === null || _a === void 0 ? void 0 : _a.call(key, "Id")) &&
70
- !((_b = key === null || key === void 0 ? void 0 : key.includes) === null || _b === void 0 ? void 0 : _b.call(key, "ID"))) {
58
+ !key?.includes?.("Id") &&
59
+ !key?.includes?.("ID")) {
71
60
  searchableFields.push({
72
61
  [`${key}`]: {
73
62
  contains: this.searchParams.search,
@@ -80,8 +69,8 @@ class APIFeatures {
80
69
  OR: searchableFields,
81
70
  });
82
71
  }
83
- const parsedQueryOptions = typeof ((_c = this.req.query) === null || _c === void 0 ? void 0 : _c.prismaQueryOptions) === "string"
84
- ? JSON.parse((_d = this.req.query) === null || _d === void 0 ? void 0 : _d.prismaQueryOptions)
72
+ const parsedQueryOptions = typeof this.req.query?.prismaQueryOptions === "string"
73
+ ? JSON.parse(this.req.query?.prismaQueryOptions)
85
74
  : {};
86
75
  this.filters = (0, deepmerge_helper_1.default)({
87
76
  where: whereOptions,
@@ -89,8 +78,7 @@ class APIFeatures {
89
78
  return this;
90
79
  }
91
80
  search() {
92
- var _a;
93
- if ((_a = this.searchParams) === null || _a === void 0 ? void 0 : _a.search) {
81
+ if (this.searchParams?.search) {
94
82
  this.filters = (0, deepmerge_helper_1.default)(this.filters, {
95
83
  where: {
96
84
  OR: [],
@@ -99,9 +87,10 @@ class APIFeatures {
99
87
  }
100
88
  }
101
89
  sort() {
102
- var _a, _b, _c;
103
90
  if (this.searchParams.sort) {
104
- const sortBy = (_c = (_b = (_a = this.searchParams) === null || _a === void 0 ? void 0 : _a.sort) === null || _b === void 0 ? void 0 : _b.split(",")) === null || _c === void 0 ? void 0 : _c.map((field) => ({
91
+ const sortBy = this.searchParams?.sort
92
+ ?.split(",")
93
+ ?.map((field) => ({
105
94
  [field.startsWith("-") ? field.substring(1) : field]: field.startsWith("-") ? "desc" : "asc",
106
95
  }));
107
96
  this.filters = (0, deepmerge_helper_1.default)(this.filters, { orderBy: sortBy });
@@ -109,8 +98,7 @@ class APIFeatures {
109
98
  return this;
110
99
  }
111
100
  limitFields() {
112
- var _a, _b, _c;
113
- if ((_a = this.searchParams) === null || _a === void 0 ? void 0 : _a.fields) {
101
+ if (this.searchParams?.fields) {
114
102
  const fields = this.searchParams.fields.split(",");
115
103
  const regularFields = fields.filter((field) => !field.startsWith("+") && !field.startsWith("-"));
116
104
  const includeFields = fields
@@ -135,12 +123,15 @@ class APIFeatures {
135
123
  selection[field] = false;
136
124
  });
137
125
  }
138
- this.filters = Object.assign(Object.assign({}, this.filters), { select: selection });
126
+ this.filters = {
127
+ ...this.filters,
128
+ select: selection,
129
+ };
139
130
  if (this.filters.include) {
140
131
  delete this.filters.include;
141
132
  }
142
133
  }
143
- if (((_b = this.searchParams) === null || _b === void 0 ? void 0 : _b.addFields) || ((_c = this.searchParams) === null || _c === void 0 ? void 0 : _c.removeFields)) {
134
+ if (this.searchParams?.addFields || this.searchParams?.removeFields) {
144
135
  throw new app_error_1.default("The addFields and removeFields parameters are deprecated. Please use fields with + and - prefixes instead.", 400);
145
136
  }
146
137
  return this;
@@ -149,14 +140,16 @@ class APIFeatures {
149
140
  const page = parseInt(this.searchParams.page, 10) || 1;
150
141
  const limit = parseInt(this.searchParams.limit, 10) || 30;
151
142
  const skip = (page - 1) * limit;
152
- this.filters = Object.assign(Object.assign({}, this.filters), { skip, take: limit });
143
+ this.filters = {
144
+ ...this.filters,
145
+ skip,
146
+ take: limit,
147
+ };
153
148
  return this;
154
149
  }
155
- exec() {
156
- return __awaiter(this, void 0, void 0, function* () {
157
- const prisma = (0, prisma_helpers_1.getPrismaInstance)();
158
- return yield prisma[this.modelName].findMany(this.filters);
159
- });
150
+ async exec() {
151
+ const prisma = (0, prisma_helpers_1.getPrismaInstance)();
152
+ return await prisma[this.modelName].findMany(this.filters);
160
153
  }
161
154
  }
162
155
  exports.default = APIFeatures;
@@ -1 +1 @@
1
- {"version":3,"file":"api.features.js","sourceRoot":"","sources":["../../../../src/utils/features/api.features.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AACA,mFAAoD;AACpD,0EAAgF;AAChF,4FAAmE;AACnE,8DAA8D;AAI9D,MAAqB,WAAW;IAsB9B,YACE,GAAY,EACZ,SAAoB,EACpB,cAAwC;QArB1C,YAAO,GAAQ,EAAE,CAAC;QAGlB,mBAAc,GAAG;YACf,MAAM;YACN,MAAM;YACN,OAAO;YACP,QAAQ;YACR,WAAW;YACX,cAAc;YACd,QAAQ;YACR,SAAS;YACT,YAAY;YACZ,OAAO;YACP,oBAAoB;YACpB,eAAe;SAChB,CAAC;QAOA,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,YAAY,GAAG,IAAA,oDAA6B,EAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC7D,IAAI,CAAC,OAAO,qBAAQ,IAAI,CAAC,OAAO,CAAE,CAAC;QAEnC,IAAI,cAAc;YAAE,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,cAAc,CAAC;QACzD,IAAI,CAAC,cAAc,GAAG,cAAc,IAAI,EAAE,CAAC;IAC7C,CAAC;IAED,MAAM;;QACJ,MAAM,gBAAgB,GAA0B,EAAE,CAAC;QAEnD,MAAM,QAAQ,qBAAQ,IAAI,CAAC,YAAY,CAAE,CAAC;QAE1C,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;QAEzD,IAAI,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACxC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC;QAE3E,MAAM,QAAQ,mCAAQ,IAAI,CAAC,GAAG,CAAC,MAAM,GAAK,QAAQ,CAAE,CAAC;QACrD,MAAM,2BAA2B,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACtE,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC;SACrB,CAAC,CAAC,CAAC;QAEJ,IAAI,YAAY,GACd,2BAA2B,CAAC,MAAM,GAAG,CAAC;YACpC,CAAC,CAAC;gBACE,CAAC,MAAC,MAAA,IAAI,CAAC,GAAG,CAAC,KAAK,0CAAE,UAAqB,mCAAI,IAAI,CAAC,EAC9C,2BAA2B;aAC9B;YACH,CAAC,CAAC,EAAE,CAAC;QAET,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,IAAA,kCAAiB,GAAE,CAAC;YAEnC,MAAM,CAAC,IAAI,CAAE,MAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;;gBAClE,MAAM,KAAK,GAAK,MAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAc,CAAC,GAAG,CAAC,CAAC;gBACnE,IACE,KAAK,CAAC,QAAQ,KAAK,QAAQ;oBAC3B,GAAG,KAAK,IAAI;oBACZ,GAAG,KAAK,UAAU;oBAClB,CAAC,KAAK,CAAC,MAAM;oBACb,CAAC,CAAA,MAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,QAAQ,oDAAG,IAAI,CAAC,CAAA;oBACtB,CAAC,CAAA,MAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,QAAQ,oDAAG,IAAI,CAAC,CAAA,EACtB,CAAC;oBACD,gBAAgB,CAAC,IAAI,CAAC;wBACpB,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE;4BACV,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM;4BAClC,IAAI,EAAE,aAAa;yBACpB;qBACF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,YAAY,GAAG,IAAA,0BAAS,EAAC,YAAY,EAAE;gBACrC,EAAE,EAAE,gBAAgB;aACrB,CAAC,CAAC;QACL,CAAC;QAED,MAAM,kBAAkB,GACtB,OAAO,CAAA,MAAA,IAAI,CAAC,GAAG,CAAC,KAAK,0CAAE,kBAAkB,CAAA,KAAK,QAAQ;YACpD,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAA,IAAI,CAAC,GAAG,CAAC,KAAK,0CAAE,kBAAkB,CAAC;YAChD,CAAC,CAAC,EAAE,CAAC;QAET,IAAI,CAAC,OAAO,GAAG,IAAA,0BAAS,EACtB;YACE,KAAK,EAAE,YAAY;SACpB,EACD,kBAAkB,EAClB,IAAI,CAAC,OAAO,CACb,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM;;QACJ,IAAI,MAAA,IAAI,CAAC,YAAY,0CAAE,MAAM,EAAE,CAAC;YAC9B,IAAI,CAAC,OAAO,GAAG,IAAA,0BAAS,EAAC,IAAI,CAAC,OAAO,EAAE;gBACrC,KAAK,EAAE;oBACL,EAAE,EAAE,EAAE;iBACP;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI;;QACF,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,MAAA,MAAA,MAAA,IAAI,CAAC,YAAY,0CAAE,IAAI,0CAClC,KAAK,CAAC,GAAG,CAAC,0CACV,GAAG,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC;gBACxB,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAClD,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;aACzC,CAAC,CAAC,CAAC;YACN,IAAI,CAAC,OAAO,GAAG,IAAA,0BAAS,EAAC,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IA6ED,WAAW;;QACT,IAAI,MAAA,IAAI,CAAC,YAAY,0CAAE,MAAM,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAGnD,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CACjC,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CACpE,CAAC;YACF,MAAM,aAAa,GAAG,MAAM;iBACzB,MAAM,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;iBAChD,GAAG,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,MAAM,aAAa,GAAG,MAAM;iBACzB,MAAM,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;iBAChD,GAAG,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YAG9C,IAAI,SAAS,GAAwB,EAAE,CAAC;YAGxC,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,SAAS,GAAG,aAAa,CAAC,MAAM,CAC9B,CAAC,GAAwB,EAAE,KAAa,EAAE,EAAE;oBAC1C,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;oBAClB,OAAO,GAAG,CAAC;gBACb,CAAC,EACD,EAAyB,CAC1B,CAAC;YACJ,CAAC;iBAEI,CAAC;gBAEJ,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;gBAGvC,aAAa,CAAC,OAAO,CAAC,CAAC,KAAa,EAAE,EAAE;oBACtC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;gBAC1B,CAAC,CAAC,CAAC;gBAGH,aAAa,CAAC,OAAO,CAAC,CAAC,KAAa,EAAE,EAAE;oBACtC,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;gBAC3B,CAAC,CAAC,CAAC;YACL,CAAC;YAGD,IAAI,CAAC,OAAO,mCACP,IAAI,CAAC,OAAO,KACf,MAAM,EAAE,SAAS,GAClB,CAAC;YAGF,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBACzB,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YAC9B,CAAC;QACH,CAAC;QAGD,IAAI,CAAA,MAAA,IAAI,CAAC,YAAY,0CAAE,SAAS,MAAI,MAAA,IAAI,CAAC,YAAY,0CAAE,YAAY,CAAA,EAAE,CAAC;YACpE,MAAM,IAAI,mBAAQ,CAChB,4GAA4G,EAC5G,GAAG,CACJ,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ;QACN,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;QAC1D,MAAM,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;QAEhC,IAAI,CAAC,OAAO,mCACP,IAAI,CAAC,OAAO,KACf,IAAI,EACJ,IAAI,EAAE,KAAK,GACZ,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAEK,IAAI;;YACR,MAAM,MAAM,GAAG,IAAA,kCAAiB,GAAE,CAAC;YACnC,OAAO,MAAO,MAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtE,CAAC;KAAA;CACF;AA5RD,8BA4RC","sourcesContent":["import { Request } from \"express\";\nimport deepmerge from \"../helpers/deepmerge.helper\";\nimport { parseQueryParamsWithModifiers } from \"../helpers/api.features.helpers\";\nimport AppError from \"../../modules/error-handler/utils/app-error\";\nimport { getPrismaInstance } from \"../helpers/prisma.helpers\";\n\ntype ModelName = string;\n\nexport default class APIFeatures {\n req: Request;\n searchParams: any; // The query string parameters from the request\n searchParamsWithModifiers: any; // The query string parameters from the request\n filters: any = {};\n modelName: ModelName;\n relationFields: Record<string, boolean>;\n excludedFields = [\n \"page\",\n \"sort\",\n \"limit\",\n \"fields\",\n \"addFields\",\n \"removeFields\",\n \"search\",\n \"include\",\n \"filterMode\",\n \"where\",\n \"prismaQueryOptions\",\n \"ignoredFields\",\n ];\n\n constructor(\n req: Request,\n modelName: ModelName,\n relationFields?: Record<string, boolean>\n ) {\n this.req = req;\n this.modelName = modelName;\n this.searchParams = parseQueryParamsWithModifiers(req.query);\n this.filters = { ...this.filters };\n\n if (relationFields) this.filters.iclude = relationFields;\n this.relationFields = relationFields || {};\n }\n\n filter() {\n const searchableFields: Record<string, any>[] = [];\n\n const queryObj = { ...this.searchParams };\n\n this.excludedFields.forEach((el) => delete queryObj[el]);\n\n let queryStr = JSON.stringify(queryObj);\n queryStr = queryStr.replace(/\\b(gte|gt|lte|lt)\\b/g, (match) => `${match}`);\n\n const whereObj = { ...this.req.params, ...queryObj };\n const whereLogicalOperatorFilters = Object.keys(whereObj).map((key) => ({\n [key]: whereObj[key],\n }));\n\n let whereOptions =\n whereLogicalOperatorFilters.length > 0\n ? {\n [(this.req.query?.filterMode as string) ?? \"OR\"]:\n whereLogicalOperatorFilters,\n }\n : {};\n\n if (!!this.searchParams.search) {\n const prisma = getPrismaInstance();\n\n Object.keys((prisma as any)[this.modelName].fields).forEach((key) => {\n const field = ((prisma as any)[this.modelName].fields as any)[key];\n if (\n field.typeName === \"String\" &&\n key !== \"id\" &&\n key !== \"password\" &&\n !field.isList &&\n !key?.includes?.(\"Id\") &&\n !key?.includes?.(\"ID\")\n ) {\n searchableFields.push({\n [`${key}`]: {\n contains: this.searchParams.search,\n mode: \"insensitive\",\n },\n });\n }\n });\n\n whereOptions = deepmerge(whereOptions, {\n OR: searchableFields,\n });\n }\n\n const parsedQueryOptions =\n typeof this.req.query?.prismaQueryOptions === \"string\"\n ? JSON.parse(this.req.query?.prismaQueryOptions)\n : {};\n\n this.filters = deepmerge(\n {\n where: whereOptions,\n },\n parsedQueryOptions,\n this.filters\n );\n return this;\n }\n\n search() {\n if (this.searchParams?.search) {\n this.filters = deepmerge(this.filters, {\n where: {\n OR: [],\n },\n });\n }\n }\n\n sort() {\n if (this.searchParams.sort) {\n const sortBy = this.searchParams?.sort\n ?.split(\",\")\n ?.map((field: string) => ({\n [field.startsWith(\"-\") ? field.substring(1) : field]:\n field.startsWith(\"-\") ? \"desc\" : \"asc\",\n }));\n this.filters = deepmerge(this.filters, { orderBy: sortBy });\n }\n\n return this;\n }\n\n // limitFields() {\n // if (\n // this.searchParams?.fields &&\n // !this.searchParams?.addFields &&\n // !this.searchParams?.removeFields\n // ) {\n // const fieldsToSelect = this.searchParams.fields\n // .split(\",\")\n // .filter(\n // (field: string) => !field.startsWith(\"+\") && !field.startsWith(\"-\")\n // );\n\n // this.filters = {\n // ...this.filters,\n // select: fieldsToSelect.reduce((acc: any, field: string) => {\n // acc[field] = true;\n // return acc;\n // }, {}),\n // };\n // this.filters.select = { ...this.filters.select, ...this.filters.include };\n // delete this.filters.include;\n // } else if (\n // this.searchParams?.fields &&\n // (this.searchParams?.addFields || this.searchParams?.removeFields)\n // )\n // throw new AppError(\n // \"Cannot use fields in the same query with addFields or removeFields.\",\n // 400\n // );\n\n // if (this.searchParams?.addFields && !this.searchParams?.fields) {\n // const fieldsToAdd = this.searchParams.addFields\n // .split(\",\")\n // .filter((field: string) => field.startsWith(\"+\"));\n\n // this.filters = {\n // ...this.filters,\n // select: {\n // ...this.filters.include,\n // ...fieldsToAdd.reduce((acc: any, field: string) => {\n // acc[field.replace(\"+\", \"\")] = true;\n // return acc;\n // }, {}),\n // },\n // };\n // } else if (this.searchParams?.fields && this.searchParams?.addFields)\n // throw new AppError(\n // \"Cannot use addFields in the same query with fields.\",\n // 400\n // );\n\n // if (this.searchParams?.removeFields && !this.searchParams?.fields) {\n // const fieldsToRemove = this.searchParams.removeFields\n // .split(\",\")\n // .filter((field: string) => field.startsWith(\"-\"));\n\n // this.filters = {\n // ...this.filters,\n // select: {\n // ...this.filters.include,\n // ...fieldsToRemove.reduce((acc: any, field: string) => {\n // acc[field.replace(\"-\", \"\")] = false;\n // return acc;\n // }, {}),\n // },\n // };\n // } else if (this.searchParams?.removeFields && this.searchParams?.addFields)\n // throw new AppError(\n // \"Cannot use removeFields in the same query with fields.\",\n // 400\n // );\n\n // return this;\n // }\n\n limitFields() {\n if (this.searchParams?.fields) {\n const fields = this.searchParams.fields.split(\",\");\n\n // Separate fields into includes, excludes, and regular fields\n const regularFields = fields.filter(\n (field: string) => !field.startsWith(\"+\") && !field.startsWith(\"-\")\n );\n const includeFields = fields\n .filter((field: string) => field.startsWith(\"+\"))\n .map((field: string) => field.substring(1));\n const excludeFields = fields\n .filter((field: string) => field.startsWith(\"-\"))\n .map((field: string) => field.substring(1));\n\n // Create selection object based on field type\n let selection: Record<string, any> = {};\n\n // If regular fields exist, use them as the base selection\n if (regularFields.length > 0) {\n selection = regularFields.reduce(\n (acc: Record<string, any>, field: string) => {\n acc[field] = true;\n return acc;\n },\n {} as Record<string, any>\n );\n }\n // Otherwise, use include fields as additions to any existing included fields\n else {\n // Start with current include fields if they exist\n selection = this.filters.include || {};\n\n // Add any explicitly included fields\n includeFields.forEach((field: string) => {\n selection[field] = true;\n });\n\n // Add any explicitly excluded fields\n excludeFields.forEach((field: string) => {\n selection[field] = false;\n });\n }\n\n // Apply the selection to filters\n this.filters = {\n ...this.filters,\n select: selection,\n };\n\n // Remove the include filter as it's now part of select\n if (this.filters.include) {\n delete this.filters.include;\n }\n }\n\n // Remove any references to the now-unused parameters\n if (this.searchParams?.addFields || this.searchParams?.removeFields) {\n throw new AppError(\n \"The addFields and removeFields parameters are deprecated. Please use fields with + and - prefixes instead.\",\n 400\n );\n }\n\n return this;\n }\n\n paginate() {\n const page = parseInt(this.searchParams.page, 10) || 1;\n const limit = parseInt(this.searchParams.limit, 10) || 30;\n const skip = (page - 1) * limit;\n\n this.filters = {\n ...this.filters,\n skip,\n take: limit,\n };\n return this;\n }\n\n async exec() {\n const prisma = getPrismaInstance();\n return await (prisma as any)[this.modelName].findMany(this.filters);\n }\n}\n"]}
1
+ {"version":3,"file":"api.features.js","sourceRoot":"","sources":["../../../../src/utils/features/api.features.ts"],"names":[],"mappings":"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","sourcesContent":["import { Request } from \"express\";\nimport deepmerge from \"../helpers/deepmerge.helper\";\nimport { parseQueryParamsWithModifiers } from \"../helpers/api.features.helpers\";\nimport AppError from \"../../modules/error-handler/utils/app-error\";\nimport { getPrismaInstance } from \"../helpers/prisma.helpers\";\n\ntype ModelName = string;\n\nexport default class APIFeatures {\n req: Request;\n searchParams: any; // The query string parameters from the request\n searchParamsWithModifiers: any; // The query string parameters from the request\n filters: any = {};\n modelName: ModelName;\n relationFields: Record<string, boolean>;\n excludedFields = [\n \"page\",\n \"sort\",\n \"limit\",\n \"fields\",\n \"addFields\",\n \"removeFields\",\n \"search\",\n \"include\",\n \"filterMode\",\n \"where\",\n \"prismaQueryOptions\",\n \"ignoredFields\",\n ];\n\n constructor(\n req: Request,\n modelName: ModelName,\n relationFields?: Record<string, boolean>\n ) {\n this.req = req;\n this.modelName = modelName;\n this.searchParams = parseQueryParamsWithModifiers(req.query);\n this.filters = { ...this.filters };\n\n if (relationFields) this.filters.iclude = relationFields;\n this.relationFields = relationFields || {};\n }\n\n filter() {\n const searchableFields: Record<string, any>[] = [];\n\n const queryObj = { ...this.searchParams };\n\n this.excludedFields.forEach((el) => delete queryObj[el]);\n\n let queryStr = JSON.stringify(queryObj);\n queryStr = queryStr.replace(/\\b(gte|gt|lte|lt)\\b/g, (match) => `${match}`);\n\n const whereObj = { ...this.req.params, ...queryObj };\n const whereLogicalOperatorFilters = Object.keys(whereObj).map((key) => ({\n [key]: whereObj[key],\n }));\n\n let whereOptions =\n whereLogicalOperatorFilters.length > 0\n ? {\n [(this.req.query?.filterMode as string) ?? \"OR\"]:\n whereLogicalOperatorFilters,\n }\n : {};\n\n if (!!this.searchParams.search) {\n const prisma = getPrismaInstance();\n\n Object.keys((prisma as any)[this.modelName].fields).forEach((key) => {\n const field = ((prisma as any)[this.modelName].fields as any)[key];\n if (\n field.typeName === \"String\" &&\n key !== \"id\" &&\n key !== \"password\" &&\n !field.isList &&\n !key?.includes?.(\"Id\") &&\n !key?.includes?.(\"ID\")\n ) {\n searchableFields.push({\n [`${key}`]: {\n contains: this.searchParams.search,\n mode: \"insensitive\",\n },\n });\n }\n });\n\n whereOptions = deepmerge(whereOptions, {\n OR: searchableFields,\n });\n }\n\n const parsedQueryOptions =\n typeof this.req.query?.prismaQueryOptions === \"string\"\n ? JSON.parse(this.req.query?.prismaQueryOptions)\n : {};\n\n this.filters = deepmerge(\n {\n where: whereOptions,\n },\n parsedQueryOptions,\n this.filters\n );\n return this;\n }\n\n search() {\n if (this.searchParams?.search) {\n this.filters = deepmerge(this.filters, {\n where: {\n OR: [],\n },\n });\n }\n }\n\n sort() {\n if (this.searchParams.sort) {\n const sortBy = this.searchParams?.sort\n ?.split(\",\")\n ?.map((field: string) => ({\n [field.startsWith(\"-\") ? field.substring(1) : field]:\n field.startsWith(\"-\") ? \"desc\" : \"asc\",\n }));\n this.filters = deepmerge(this.filters, { orderBy: sortBy });\n }\n\n return this;\n }\n\n // limitFields() {\n // if (\n // this.searchParams?.fields &&\n // !this.searchParams?.addFields &&\n // !this.searchParams?.removeFields\n // ) {\n // const fieldsToSelect = this.searchParams.fields\n // .split(\",\")\n // .filter(\n // (field: string) => !field.startsWith(\"+\") && !field.startsWith(\"-\")\n // );\n\n // this.filters = {\n // ...this.filters,\n // select: fieldsToSelect.reduce((acc: any, field: string) => {\n // acc[field] = true;\n // return acc;\n // }, {}),\n // };\n // this.filters.select = { ...this.filters.select, ...this.filters.include };\n // delete this.filters.include;\n // } else if (\n // this.searchParams?.fields &&\n // (this.searchParams?.addFields || this.searchParams?.removeFields)\n // )\n // throw new AppError(\n // \"Cannot use fields in the same query with addFields or removeFields.\",\n // 400\n // );\n\n // if (this.searchParams?.addFields && !this.searchParams?.fields) {\n // const fieldsToAdd = this.searchParams.addFields\n // .split(\",\")\n // .filter((field: string) => field.startsWith(\"+\"));\n\n // this.filters = {\n // ...this.filters,\n // select: {\n // ...this.filters.include,\n // ...fieldsToAdd.reduce((acc: any, field: string) => {\n // acc[field.replace(\"+\", \"\")] = true;\n // return acc;\n // }, {}),\n // },\n // };\n // } else if (this.searchParams?.fields && this.searchParams?.addFields)\n // throw new AppError(\n // \"Cannot use addFields in the same query with fields.\",\n // 400\n // );\n\n // if (this.searchParams?.removeFields && !this.searchParams?.fields) {\n // const fieldsToRemove = this.searchParams.removeFields\n // .split(\",\")\n // .filter((field: string) => field.startsWith(\"-\"));\n\n // this.filters = {\n // ...this.filters,\n // select: {\n // ...this.filters.include,\n // ...fieldsToRemove.reduce((acc: any, field: string) => {\n // acc[field.replace(\"-\", \"\")] = false;\n // return acc;\n // }, {}),\n // },\n // };\n // } else if (this.searchParams?.removeFields && this.searchParams?.addFields)\n // throw new AppError(\n // \"Cannot use removeFields in the same query with fields.\",\n // 400\n // );\n\n // return this;\n // }\n\n limitFields() {\n if (this.searchParams?.fields) {\n const fields = this.searchParams.fields.split(\",\");\n\n // Separate fields into includes, excludes, and regular fields\n const regularFields = fields.filter(\n (field: string) => !field.startsWith(\"+\") && !field.startsWith(\"-\")\n );\n const includeFields = fields\n .filter((field: string) => field.startsWith(\"+\"))\n .map((field: string) => field.substring(1));\n const excludeFields = fields\n .filter((field: string) => field.startsWith(\"-\"))\n .map((field: string) => field.substring(1));\n\n // Create selection object based on field type\n let selection: Record<string, any> = {};\n\n // If regular fields exist, use them as the base selection\n if (regularFields.length > 0) {\n selection = regularFields.reduce(\n (acc: Record<string, any>, field: string) => {\n acc[field] = true;\n return acc;\n },\n {} as Record<string, any>\n );\n }\n // Otherwise, use include fields as additions to any existing included fields\n else {\n // Start with current include fields if they exist\n selection = this.filters.include || {};\n\n // Add any explicitly included fields\n includeFields.forEach((field: string) => {\n selection[field] = true;\n });\n\n // Add any explicitly excluded fields\n excludeFields.forEach((field: string) => {\n selection[field] = false;\n });\n }\n\n // Apply the selection to filters\n this.filters = {\n ...this.filters,\n select: selection,\n };\n\n // Remove the include filter as it's now part of select\n if (this.filters.include) {\n delete this.filters.include;\n }\n }\n\n // Remove any references to the now-unused parameters\n if (this.searchParams?.addFields || this.searchParams?.removeFields) {\n throw new AppError(\n \"The addFields and removeFields parameters are deprecated. Please use fields with + and - prefixes instead.\",\n 400\n );\n }\n\n return this;\n }\n\n paginate() {\n const page = parseInt(this.searchParams.page, 10) || 1;\n const limit = parseInt(this.searchParams.limit, 10) || 30;\n const skip = (page - 1) * limit;\n\n this.filters = {\n ...this.filters,\n skip,\n take: limit,\n };\n return this;\n }\n\n async exec() {\n const prisma = getPrismaInstance();\n return await (prisma as any)[this.modelName].findMany(this.filters);\n }\n}\n"]}
@@ -8,11 +8,10 @@ const DEFAULT_FIELD_CONFIG = {
8
8
  };
9
9
  function parseQueryParamsWithModifiers(query, fieldConfig = DEFAULT_FIELD_CONFIG) {
10
10
  return Object.entries(JSON.parse(JSON.stringify(query))).reduce((acc, [key, value]) => {
11
- var _a;
12
11
  const parts = key.split("__");
13
12
  if (!value && value !== false && value !== "false" && parts.length < 2)
14
13
  return acc;
15
- const stringValue = Array.isArray(value) ? (_a = value[0]) === null || _a === void 0 ? void 0 : _a.toString() : value;
14
+ const stringValue = Array.isArray(value) ? value[0]?.toString() : value;
16
15
  if (parts.length < 2) {
17
16
  acc[key] =
18
17
  typeof value === "string" && !Number.isNaN(value)
@@ -93,14 +92,13 @@ function parseQueryParamsWithModifiers(query, fieldConfig = DEFAULT_FIELD_CONFIG
93
92
  }, {});
94
93
  }
95
94
  function convertValue(value, fieldName, config) {
96
- var _a, _b, _c, _d, _e, _f;
97
- if (((_b = (_a = config.dateFields) === null || _a === void 0 ? void 0 : _a.includes) === null || _b === void 0 ? void 0 : _b.call(_a, fieldName)) && value) {
95
+ if (config.dateFields?.includes?.(fieldName) && value) {
98
96
  return new Date(value);
99
97
  }
100
- if (((_d = (_c = config.booleanFields) === null || _c === void 0 ? void 0 : _c.includes) === null || _d === void 0 ? void 0 : _d.call(_c, fieldName)) && value) {
98
+ if (config.booleanFields?.includes?.(fieldName) && value) {
101
99
  return value.toLowerCase() === "true";
102
100
  }
103
- if (((_f = (_e = config.numericFields) === null || _e === void 0 ? void 0 : _e.includes) === null || _f === void 0 ? void 0 : _f.call(_e, fieldName)) && value) {
101
+ if (config.numericFields?.includes?.(fieldName) && value) {
104
102
  return Number(value);
105
103
  }
106
104
  return value;