@devbro/pashmak 0.1.53 → 0.1.54

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 (225) hide show
  1. package/dist/{bin/DatabaseServiceProvider.cjs → cjs/DatabaseServiceProvider.js} +2 -2
  2. package/dist/{bin/app/console/DefaultCommand.cjs → cjs/app/console/DefaultCommand.js} +8 -8
  3. package/dist/{bin/app/console/KeyGenerateCommand.cjs → cjs/app/console/KeyGenerateCommand.js} +8 -8
  4. package/dist/{bin/app/console/StartCommand.cjs → cjs/app/console/StartCommand.js} +8 -8
  5. package/dist/{bin/app/console/generate/GenerateApiDocsCommand.cjs → cjs/app/console/generate/GenerateApiDocsCommand.js} +8 -8
  6. package/dist/{bin/app/console/generate/GenerateControllerCommand.cjs → cjs/app/console/generate/GenerateControllerCommand.js} +8 -8
  7. package/dist/{bin/app/console/generate/index.cjs → cjs/app/console/generate/index.js} +8 -8
  8. package/dist/{bin/app/console/index.cjs → cjs/app/console/index.js} +8 -8
  9. package/dist/{bin/app/console/migrate/GenerateMigrateCommand.cjs → cjs/app/console/migrate/GenerateMigrateCommand.js} +8 -8
  10. package/dist/{bin/app/console/migrate/MigrateCommand.cjs → cjs/app/console/migrate/MigrateCommand.js} +8 -8
  11. package/dist/{bin/app/console/migrate/MigrateRollbackCommand.cjs → cjs/app/console/migrate/MigrateRollbackCommand.js} +8 -8
  12. package/dist/{bin/app/console/migrate/index.cjs → cjs/app/console/migrate/index.js} +8 -8
  13. package/dist/{bin/app/console/queue/GenerateQueueMigrateCommand.cjs → cjs/app/console/queue/GenerateQueueMigrateCommand.js} +8 -8
  14. package/dist/{bin/cache.cjs → cjs/cache.js} +8 -8
  15. package/dist/{bin/facades.cjs → cjs/facades.js} +8 -8
  16. package/dist/{bin/factories.cjs → cjs/factories.js} +8 -8
  17. package/dist/{bin/http.cjs → cjs/http.js} +8 -8
  18. package/dist/{bin/index.cjs → cjs/index.js} +24 -24
  19. package/dist/{bin/middlewares.cjs → cjs/middlewares.js} +8 -8
  20. package/dist/{bin/queue.cjs → cjs/queue.js} +8 -8
  21. package/dist/{bin/router.cjs → cjs/router.js} +10 -10
  22. package/dist/esm/DatabaseServiceProvider.mjs.map +1 -0
  23. package/dist/esm/app/console/DefaultCommand.mjs.map +1 -0
  24. package/dist/esm/app/console/KeyGenerateCommand.mjs.map +1 -0
  25. package/dist/esm/app/console/StartCommand.mjs.map +1 -0
  26. package/dist/esm/app/console/generate/GenerateApiDocsCommand.mjs.map +1 -0
  27. package/dist/esm/app/console/generate/GenerateControllerCommand.mjs.map +1 -0
  28. package/dist/esm/app/console/generate/controller.tpl +41 -0
  29. package/dist/esm/app/console/generate/index.mjs.map +1 -0
  30. package/dist/esm/app/console/index.mjs.map +1 -0
  31. package/dist/esm/app/console/migrate/GenerateMigrateCommand.mjs.map +1 -0
  32. package/dist/esm/app/console/migrate/MigrateCommand.mjs.map +1 -0
  33. package/dist/esm/app/console/migrate/MigrateRollbackCommand.mjs.map +1 -0
  34. package/dist/esm/app/console/migrate/index.mjs.map +1 -0
  35. package/dist/esm/app/console/migrate/make_migration.tpl +15 -0
  36. package/dist/esm/app/console/project/CreateProjectCommand.mjs.map +1 -0
  37. package/dist/esm/app/console/project/base_project/README.md.tpl +1 -0
  38. package/dist/esm/app/console/project/base_project/package.json.tpl +74 -0
  39. package/dist/esm/app/console/project/base_project/src/app/console/YourFirstCommand.ts.tpl +23 -0
  40. package/dist/esm/app/console/project/base_project/src/app/console/index.ts.tpl +1 -0
  41. package/dist/esm/app/console/project/base_project/src/app/controllers/HelloController.ts.tpl +16 -0
  42. package/dist/esm/app/console/project/base_project/src/app/models/index.ts.tpl +1 -0
  43. package/dist/esm/app/console/project/base_project/src/app/queues/index.ts.tpl +9 -0
  44. package/dist/esm/app/console/project/base_project/src/boot.ts.tpl +0 -0
  45. package/dist/esm/app/console/project/base_project/src/config/caches.ts.tpl +5 -0
  46. package/dist/esm/app/console/project/base_project/src/config/databases.ts.tpl +10 -0
  47. package/dist/esm/app/console/project/base_project/src/config/default.mts.tpl +64 -0
  48. package/dist/esm/app/console/project/base_project/src/config/loggers.ts.tpl +13 -0
  49. package/dist/esm/app/console/project/base_project/src/config/mailer.ts.tpl +22 -0
  50. package/dist/esm/app/console/project/base_project/src/config/queues.ts.tpl +5 -0
  51. package/dist/esm/app/console/project/base_project/src/config/storages.ts.tpl +12 -0
  52. package/dist/esm/app/console/project/base_project/src/config/test.ts.tpl +1 -0
  53. package/dist/esm/app/console/project/base_project/src/database/migrations/2025_05_30_41329_create_sample.ts.tpl +13 -0
  54. package/dist/esm/app/console/project/base_project/src/helpers/QueryKit.ts.tpl +175 -0
  55. package/dist/esm/app/console/project/base_project/src/helpers/index.ts.tpl +96 -0
  56. package/dist/esm/app/console/project/base_project/src/helpers/validation.ts.tpl +26 -0
  57. package/dist/esm/app/console/project/base_project/src/index.ts.tpl +12 -0
  58. package/dist/esm/app/console/project/base_project/src/initialize.ts.tpl +69 -0
  59. package/dist/esm/app/console/project/base_project/src/middlewares.ts.tpl +16 -0
  60. package/dist/esm/app/console/project/base_project/src/routes.ts.tpl +18 -0
  61. package/dist/esm/app/console/project/base_project/src/schedules.ts.tpl +22 -0
  62. package/dist/esm/app/console/project/base_project/tests/basic_test.spec.ts.tpl +27 -0
  63. package/dist/esm/app/console/project/base_project/tsconfig.json.tpl +26 -0
  64. package/dist/esm/app/console/project/base_project/tsup.config.ts.tpl +25 -0
  65. package/dist/esm/app/console/project/base_project/vitest.config.ts.tpl +17 -0
  66. package/dist/esm/app/console/queue/GenerateQueueMigrateCommand.mjs.map +1 -0
  67. package/dist/esm/app/console/queue/queue_migration.tpl +21 -0
  68. package/dist/esm/bin/pashmak_cli.mjs.map +1 -0
  69. package/dist/esm/cache.mjs.map +1 -0
  70. package/dist/esm/config.mjs.map +1 -0
  71. package/dist/esm/context.mjs.map +1 -0
  72. package/dist/esm/facades.mjs.map +1 -0
  73. package/dist/esm/factories.mjs.map +1 -0
  74. package/dist/esm/global.mjs.map +1 -0
  75. package/dist/esm/helper.mjs.map +1 -0
  76. package/dist/esm/http.mjs.map +1 -0
  77. package/dist/esm/index.mjs.map +1 -0
  78. package/dist/esm/logger.mjs.map +1 -0
  79. package/dist/esm/mailer.mjs.map +1 -0
  80. package/dist/esm/middlewares.mjs.map +1 -0
  81. package/dist/esm/orm.mjs.map +1 -0
  82. package/dist/esm/queue.mjs.map +1 -0
  83. package/dist/esm/router.mjs.map +1 -0
  84. package/dist/esm/sql.mjs.map +1 -0
  85. package/dist/esm/storage.mjs.map +1 -0
  86. package/package.json +58 -58
  87. package/dist/DatabaseServiceProvider.mjs.map +0 -1
  88. package/dist/app/console/DefaultCommand.mjs.map +0 -1
  89. package/dist/app/console/KeyGenerateCommand.mjs.map +0 -1
  90. package/dist/app/console/StartCommand.mjs.map +0 -1
  91. package/dist/app/console/generate/GenerateApiDocsCommand.mjs.map +0 -1
  92. package/dist/app/console/generate/GenerateControllerCommand.mjs.map +0 -1
  93. package/dist/app/console/generate/index.mjs.map +0 -1
  94. package/dist/app/console/index.mjs.map +0 -1
  95. package/dist/app/console/migrate/GenerateMigrateCommand.mjs.map +0 -1
  96. package/dist/app/console/migrate/MigrateCommand.mjs.map +0 -1
  97. package/dist/app/console/migrate/MigrateRollbackCommand.mjs.map +0 -1
  98. package/dist/app/console/migrate/index.mjs.map +0 -1
  99. package/dist/app/console/project/CreateProjectCommand.mjs.map +0 -1
  100. package/dist/app/console/queue/GenerateQueueMigrateCommand.mjs.map +0 -1
  101. package/dist/bin/pashmak_cli.mjs.map +0 -1
  102. package/dist/cache.mjs.map +0 -1
  103. package/dist/config.mjs.map +0 -1
  104. package/dist/context.mjs.map +0 -1
  105. package/dist/facades.mjs.map +0 -1
  106. package/dist/factories.mjs.map +0 -1
  107. package/dist/global.mjs.map +0 -1
  108. package/dist/helper.mjs.map +0 -1
  109. package/dist/http.mjs.map +0 -1
  110. package/dist/index.mjs.map +0 -1
  111. package/dist/logger.mjs.map +0 -1
  112. package/dist/mailer.mjs.map +0 -1
  113. package/dist/middlewares.mjs.map +0 -1
  114. package/dist/orm.mjs.map +0 -1
  115. package/dist/queue.mjs.map +0 -1
  116. package/dist/router.mjs.map +0 -1
  117. package/dist/sql.mjs.map +0 -1
  118. package/dist/storage.mjs.map +0 -1
  119. /package/dist/{app → cjs/app}/console/generate/controller.tpl +0 -0
  120. /package/dist/{app → cjs/app}/console/migrate/make_migration.tpl +0 -0
  121. /package/dist/{bin/app/console/project/CreateProjectCommand.cjs → cjs/app/console/project/CreateProjectCommand.js} +0 -0
  122. /package/dist/{app → cjs/app}/console/project/base_project/README.md.tpl +0 -0
  123. /package/dist/{app → cjs/app}/console/project/base_project/package.json.tpl +0 -0
  124. /package/dist/{app → cjs/app}/console/project/base_project/src/app/console/YourFirstCommand.ts.tpl +0 -0
  125. /package/dist/{app → cjs/app}/console/project/base_project/src/app/console/index.ts.tpl +0 -0
  126. /package/dist/{app → cjs/app}/console/project/base_project/src/app/controllers/HelloController.ts.tpl +0 -0
  127. /package/dist/{app → cjs/app}/console/project/base_project/src/app/models/index.ts.tpl +0 -0
  128. /package/dist/{app → cjs/app}/console/project/base_project/src/app/queues/index.ts.tpl +0 -0
  129. /package/dist/{app → cjs/app}/console/project/base_project/src/boot.ts.tpl +0 -0
  130. /package/dist/{app → cjs/app}/console/project/base_project/src/config/caches.ts.tpl +0 -0
  131. /package/dist/{app → cjs/app}/console/project/base_project/src/config/databases.ts.tpl +0 -0
  132. /package/dist/{app → cjs/app}/console/project/base_project/src/config/default.mts.tpl +0 -0
  133. /package/dist/{app → cjs/app}/console/project/base_project/src/config/loggers.ts.tpl +0 -0
  134. /package/dist/{app → cjs/app}/console/project/base_project/src/config/mailer.ts.tpl +0 -0
  135. /package/dist/{app → cjs/app}/console/project/base_project/src/config/queues.ts.tpl +0 -0
  136. /package/dist/{app → cjs/app}/console/project/base_project/src/config/storages.ts.tpl +0 -0
  137. /package/dist/{app → cjs/app}/console/project/base_project/src/config/test.ts.tpl +0 -0
  138. /package/dist/{app → cjs/app}/console/project/base_project/src/database/migrations/2025_05_30_41329_create_sample.ts.tpl +0 -0
  139. /package/dist/{app → cjs/app}/console/project/base_project/src/helpers/QueryKit.ts.tpl +0 -0
  140. /package/dist/{app → cjs/app}/console/project/base_project/src/helpers/index.ts.tpl +0 -0
  141. /package/dist/{app → cjs/app}/console/project/base_project/src/helpers/validation.ts.tpl +0 -0
  142. /package/dist/{app → cjs/app}/console/project/base_project/src/index.ts.tpl +0 -0
  143. /package/dist/{app → cjs/app}/console/project/base_project/src/initialize.ts.tpl +0 -0
  144. /package/dist/{app → cjs/app}/console/project/base_project/src/middlewares.ts.tpl +0 -0
  145. /package/dist/{app → cjs/app}/console/project/base_project/src/routes.ts.tpl +0 -0
  146. /package/dist/{app → cjs/app}/console/project/base_project/src/schedules.ts.tpl +0 -0
  147. /package/dist/{app → cjs/app}/console/project/base_project/tests/basic_test.spec.ts.tpl +0 -0
  148. /package/dist/{app → cjs/app}/console/project/base_project/tsconfig.json.tpl +0 -0
  149. /package/dist/{app → cjs/app}/console/project/base_project/tsup.config.ts.tpl +0 -0
  150. /package/dist/{app → cjs/app}/console/project/base_project/vitest.config.ts.tpl +0 -0
  151. /package/dist/{app → cjs/app}/console/queue/queue_migration.tpl +0 -0
  152. /package/dist/{bin/bin/pashmak_cli.cjs → cjs/bin/pashmak_cli.js} +0 -0
  153. /package/dist/{bin/config.cjs → cjs/config.js} +0 -0
  154. /package/dist/{bin/context.cjs → cjs/context.js} +0 -0
  155. /package/dist/{bin/global.cjs → cjs/global.js} +0 -0
  156. /package/dist/{bin/helper.cjs → cjs/helper.js} +0 -0
  157. /package/dist/{bin/logger.cjs → cjs/logger.js} +0 -0
  158. /package/dist/{bin/mailer.cjs → cjs/mailer.js} +0 -0
  159. /package/dist/{bin/orm.cjs → cjs/orm.js} +0 -0
  160. /package/dist/{bin/sql.cjs → cjs/sql.js} +0 -0
  161. /package/dist/{bin/storage.cjs → cjs/storage.js} +0 -0
  162. /package/dist/{DatabaseServiceProvider.d.mts → esm/DatabaseServiceProvider.d.mts} +0 -0
  163. /package/dist/{DatabaseServiceProvider.mjs → esm/DatabaseServiceProvider.mjs} +0 -0
  164. /package/dist/{app → esm/app}/console/DefaultCommand.d.mts +0 -0
  165. /package/dist/{app → esm/app}/console/DefaultCommand.mjs +0 -0
  166. /package/dist/{app → esm/app}/console/KeyGenerateCommand.d.mts +0 -0
  167. /package/dist/{app → esm/app}/console/KeyGenerateCommand.mjs +0 -0
  168. /package/dist/{app → esm/app}/console/StartCommand.d.mts +0 -0
  169. /package/dist/{app → esm/app}/console/StartCommand.mjs +0 -0
  170. /package/dist/{app → esm/app}/console/generate/GenerateApiDocsCommand.d.mts +0 -0
  171. /package/dist/{app → esm/app}/console/generate/GenerateApiDocsCommand.mjs +0 -0
  172. /package/dist/{app → esm/app}/console/generate/GenerateControllerCommand.d.mts +0 -0
  173. /package/dist/{app → esm/app}/console/generate/GenerateControllerCommand.mjs +0 -0
  174. /package/dist/{app → esm/app}/console/generate/index.d.mts +0 -0
  175. /package/dist/{app → esm/app}/console/generate/index.mjs +0 -0
  176. /package/dist/{app → esm/app}/console/index.d.mts +0 -0
  177. /package/dist/{app → esm/app}/console/index.mjs +0 -0
  178. /package/dist/{app → esm/app}/console/migrate/GenerateMigrateCommand.d.mts +0 -0
  179. /package/dist/{app → esm/app}/console/migrate/GenerateMigrateCommand.mjs +0 -0
  180. /package/dist/{app → esm/app}/console/migrate/MigrateCommand.d.mts +0 -0
  181. /package/dist/{app → esm/app}/console/migrate/MigrateCommand.mjs +0 -0
  182. /package/dist/{app → esm/app}/console/migrate/MigrateRollbackCommand.d.mts +0 -0
  183. /package/dist/{app → esm/app}/console/migrate/MigrateRollbackCommand.mjs +0 -0
  184. /package/dist/{app → esm/app}/console/migrate/index.d.mts +0 -0
  185. /package/dist/{app → esm/app}/console/migrate/index.mjs +0 -0
  186. /package/dist/{app → esm/app}/console/project/CreateProjectCommand.d.mts +0 -0
  187. /package/dist/{app → esm/app}/console/project/CreateProjectCommand.mjs +0 -0
  188. /package/dist/{app → esm/app}/console/queue/GenerateQueueMigrateCommand.d.mts +0 -0
  189. /package/dist/{app → esm/app}/console/queue/GenerateQueueMigrateCommand.mjs +0 -0
  190. /package/dist/{bin → esm/bin}/pashmak_cli.d.mts +0 -0
  191. /package/dist/{bin → esm/bin}/pashmak_cli.mjs +0 -0
  192. /package/dist/{cache.d.mts → esm/cache.d.mts} +0 -0
  193. /package/dist/{cache.mjs → esm/cache.mjs} +0 -0
  194. /package/dist/{config.d.mts → esm/config.d.mts} +0 -0
  195. /package/dist/{config.mjs → esm/config.mjs} +0 -0
  196. /package/dist/{context.d.mts → esm/context.d.mts} +0 -0
  197. /package/dist/{context.mjs → esm/context.mjs} +0 -0
  198. /package/dist/{facades.d.mts → esm/facades.d.mts} +0 -0
  199. /package/dist/{facades.mjs → esm/facades.mjs} +0 -0
  200. /package/dist/{factories.d.mts → esm/factories.d.mts} +0 -0
  201. /package/dist/{factories.mjs → esm/factories.mjs} +0 -0
  202. /package/dist/{global.d.mts → esm/global.d.mts} +0 -0
  203. /package/dist/{global.mjs → esm/global.mjs} +0 -0
  204. /package/dist/{helper.d.mts → esm/helper.d.mts} +0 -0
  205. /package/dist/{helper.mjs → esm/helper.mjs} +0 -0
  206. /package/dist/{http.d.mts → esm/http.d.mts} +0 -0
  207. /package/dist/{http.mjs → esm/http.mjs} +0 -0
  208. /package/dist/{index.d.mts → esm/index.d.mts} +0 -0
  209. /package/dist/{index.mjs → esm/index.mjs} +0 -0
  210. /package/dist/{logger.d.mts → esm/logger.d.mts} +0 -0
  211. /package/dist/{logger.mjs → esm/logger.mjs} +0 -0
  212. /package/dist/{mailer.d.mts → esm/mailer.d.mts} +0 -0
  213. /package/dist/{mailer.mjs → esm/mailer.mjs} +0 -0
  214. /package/dist/{middlewares.d.mts → esm/middlewares.d.mts} +0 -0
  215. /package/dist/{middlewares.mjs → esm/middlewares.mjs} +0 -0
  216. /package/dist/{orm.d.mts → esm/orm.d.mts} +0 -0
  217. /package/dist/{orm.mjs → esm/orm.mjs} +0 -0
  218. /package/dist/{queue.d.mts → esm/queue.d.mts} +0 -0
  219. /package/dist/{queue.mjs → esm/queue.mjs} +0 -0
  220. /package/dist/{router.d.mts → esm/router.d.mts} +0 -0
  221. /package/dist/{router.mjs → esm/router.mjs} +0 -0
  222. /package/dist/{sql.d.mts → esm/sql.d.mts} +0 -0
  223. /package/dist/{sql.mjs → esm/sql.mjs} +0 -0
  224. /package/dist/{storage.d.mts → esm/storage.d.mts} +0 -0
  225. /package/dist/{storage.mjs → esm/storage.mjs} +0 -0
@@ -54,10 +54,10 @@ module.exports = __toCommonJS(router_exports);
54
54
  var import_neko_context = require("@devbro/neko-context");
55
55
  var import_errors = require("@devbro/neko-http/errors");
56
56
 
57
- // ../neko-router/dist/CompiledRoute.mjs
57
+ // ../neko-router/dist/esm/CompiledRoute.mjs
58
58
  var import_stream = require("stream");
59
59
 
60
- // ../neko-router/dist/Middleware.mjs
60
+ // ../neko-router/dist/esm/Middleware.mjs
61
61
  var Middleware = class {
62
62
  static {
63
63
  __name(this, "Middleware");
@@ -69,7 +69,7 @@ var Middleware = class {
69
69
  }
70
70
  };
71
71
 
72
- // ../neko-router/dist/MiddlewareFactory.mjs
72
+ // ../neko-router/dist/esm/MiddlewareFactory.mjs
73
73
  var MiddlewareFactory = class {
74
74
  static {
75
75
  __name(this, "MiddlewareFactory");
@@ -90,7 +90,7 @@ var MiddlewareFactory = class {
90
90
  }
91
91
  };
92
92
 
93
- // ../neko-router/dist/CompiledRoute.mjs
93
+ // ../neko-router/dist/esm/CompiledRoute.mjs
94
94
  var import_neko_helper = require("@devbro/neko-helper");
95
95
  var CompiledRoute = class {
96
96
  static {
@@ -222,7 +222,7 @@ var CompiledRoute = class {
222
222
  }
223
223
  };
224
224
 
225
- // ../neko-router/dist/Controller.mjs
225
+ // ../neko-router/dist/esm/Controller.mjs
226
226
  var BaseController = class {
227
227
  static {
228
228
  __name(this, "BaseController");
@@ -325,7 +325,7 @@ function createParamDecorator(func) {
325
325
  }
326
326
  __name(createParamDecorator, "createParamDecorator");
327
327
 
328
- // ../neko-router/dist/Route.mjs
328
+ // ../neko-router/dist/esm/Route.mjs
329
329
  var Route = class {
330
330
  static {
331
331
  __name(this, "Route");
@@ -396,7 +396,7 @@ var Route = class {
396
396
  return new RegExp(`^${regexParts.join("")}$`);
397
397
  }
398
398
  /**
399
- * to evaludate if request is a match for this route
399
+ * to evaluadate if request is a match for this route
400
400
  * @param request http request
401
401
  * @returns return true if route is a match for this request
402
402
  */
@@ -445,7 +445,7 @@ var Route = class {
445
445
  }
446
446
  };
447
447
 
448
- // ../neko-router/dist/Router.mjs
448
+ // ../neko-router/dist/esm/Router.mjs
449
449
  var import_path = __toESM(require("path"), 1);
450
450
 
451
451
  // ../node_modules/url-join/lib/url-join.js
@@ -502,7 +502,7 @@ function urlJoin() {
502
502
  }
503
503
  __name(urlJoin, "urlJoin");
504
504
 
505
- // ../neko-router/dist/Router.mjs
505
+ // ../neko-router/dist/esm/Router.mjs
506
506
  var Router = class {
507
507
  static {
508
508
  __name(this, "Router");
@@ -568,7 +568,7 @@ var Router = class {
568
568
  }
569
569
  };
570
570
 
571
- // ../neko-router/dist/helpers.mjs
571
+ // ../neko-router/dist/esm/helpers.mjs
572
572
  async function runNext(middlewares, req, res, final) {
573
573
  let index = 0;
574
574
  async function next() {
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/DatabaseServiceProvider.mts"],"sourcesContent":["import { Middleware } from \"@devbro/neko-router\";\nimport { Request, Response } from \"@devbro/neko-router\";\nimport { PostgresqlConnection, SqliteConnection, SqliteConfig } from \"@devbro/neko-sql\";\nimport { PoolConfig } from \"pg\";\nimport { Connection } from \"@devbro/neko-sql\";\nimport { BaseModel } from \"@devbro/neko-orm\";\nimport { ctx } from \"@devbro/neko-context\";\nimport { config } from \"@devbro/neko-config\";\nimport { Global } from \"./global.mjs\";\n\nexport class DatabaseServiceProvider extends Middleware {\n async call(\n req: Request,\n res: Response,\n next: () => Promise<void>,\n ): Promise<void> {\n const db_configs: Record<string, { provider: string; config: PoolConfig | SqliteConfig }> =\n config.get(\"databases\");\n\n const conns = [];\n try {\n for (const [name, db_config] of Object.entries(db_configs)) {\n const conn = await this.getConnection(db_config);\n ctx().set([\"database\", name], conn);\n conns.push(conn);\n }\n BaseModel.setConnection(() => {\n const key = [\"database\", \"default\"];\n let rc: Connection | undefined;\n\n if (ctx.isActive()) {\n rc = ctx().get<Connection>(key);\n } else if (Global.has(key)) {\n rc = Global.get<Connection>(key);\n } else {\n rc = this.getConnection(db_configs[\"default\"]);\n Global.set(key, rc);\n }\n\n return rc!;\n });\n await next();\n } finally {\n for (const conn of conns) {\n await conn.disconnect();\n }\n }\n }\n\n private static instance: DatabaseServiceProvider;\n\n async register(): Promise<void> {}\n\n static getInstance(): DatabaseServiceProvider {\n if (!DatabaseServiceProvider.instance) {\n DatabaseServiceProvider.instance = new DatabaseServiceProvider();\n }\n return DatabaseServiceProvider.instance;\n }\n\n getConnection(db_config: {\n provider: string;\n config: PoolConfig | SqliteConfig;\n }): Connection {\n if (db_config.provider === \"postgresql\") {\n const conn = new PostgresqlConnection(db_config.config as PoolConfig);\n return conn;\n }\n\n if (db_config.provider === \"sqlite\") {\n const conn = new SqliteConnection(db_config.config as SqliteConfig);\n return conn;\n }\n\n throw new Error(`Unsupported database provider: ${db_config.provider}`);\n }\n}\n"],"mappings":";;AAAA,SAAS,kBAAkB;AAE3B,SAAS,sBAAsB,wBAAsC;AAGrE,SAAS,iBAAiB;AAC1B,SAAS,WAAW;AACpB,SAAS,cAAc;AACvB,SAAS,cAAc;AAEhB,MAAM,gCAAgC,WAAW;AAAA,EAVxD,OAUwD;AAAA;AAAA;AAAA,EACtD,MAAM,KACJ,KACA,KACA,MACe;AACf,UAAM,aACJ,OAAO,IAAI,WAAW;AAExB,UAAM,QAAQ,CAAC;AACf,QAAI;AACF,iBAAW,CAAC,MAAM,SAAS,KAAK,OAAO,QAAQ,UAAU,GAAG;AAC1D,cAAM,OAAO,MAAM,KAAK,cAAc,SAAS;AAC/C,YAAI,EAAE,IAAI,CAAC,YAAY,IAAI,GAAG,IAAI;AAClC,cAAM,KAAK,IAAI;AAAA,MACjB;AACA,gBAAU,cAAc,MAAM;AAC5B,cAAM,MAAM,CAAC,YAAY,SAAS;AAClC,YAAI;AAEJ,YAAI,IAAI,SAAS,GAAG;AAClB,eAAK,IAAI,EAAE,IAAgB,GAAG;AAAA,QAChC,WAAW,OAAO,IAAI,GAAG,GAAG;AAC1B,eAAK,OAAO,IAAgB,GAAG;AAAA,QACjC,OAAO;AACL,eAAK,KAAK,cAAc,WAAW,SAAS,CAAC;AAC7C,iBAAO,IAAI,KAAK,EAAE;AAAA,QACpB;AAEA,eAAO;AAAA,MACT,CAAC;AACD,YAAM,KAAK;AAAA,IACb,UAAE;AACA,iBAAW,QAAQ,OAAO;AACxB,cAAM,KAAK,WAAW;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAe;AAAA,EAEf,MAAM,WAA0B;AAAA,EAAC;AAAA,EAEjC,OAAO,cAAuC;AAC5C,QAAI,CAAC,wBAAwB,UAAU;AACrC,8BAAwB,WAAW,IAAI,wBAAwB;AAAA,IACjE;AACA,WAAO,wBAAwB;AAAA,EACjC;AAAA,EAEA,cAAc,WAGC;AACb,QAAI,UAAU,aAAa,cAAc;AACvC,YAAM,OAAO,IAAI,qBAAqB,UAAU,MAAoB;AACpE,aAAO;AAAA,IACT;AAEA,QAAI,UAAU,aAAa,UAAU;AACnC,YAAM,OAAO,IAAI,iBAAiB,UAAU,MAAsB;AAClE,aAAO;AAAA,IACT;AAEA,UAAM,IAAI,MAAM,kCAAkC,UAAU,QAAQ,EAAE;AAAA,EACxE;AACF;","names":[]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/app/console/DefaultCommand.mts"],"sourcesContent":["import { Command, Option } from \"clipanion\";\nimport { cli } from \"../../facades.mjs\";\n\nexport class DefaultCommand extends Command {\n static usage = Command.Usage({\n category: `Main`,\n description: `server management command line.`,\n details: `\n The base command for running and managing your server.\n\n Make sure you understand how things work.\n `,\n examples: [],\n });\n\n async execute() {\n // @ts-ignore\n const commandList = cli().registrations; //.definitions().map((def:any) => def.paths.map((path:any) => path.join(' '))).flat();\n\n const paths: string[] = [];\n commandList.forEach((index, val) =>\n paths.push(index.builder.paths[0]?.join(\" \") || \"\"),\n );\n\n console.log(\"Available commands:\");\n for (const cmd of paths) {\n if (cmd) {\n console.log(cmd);\n }\n }\n }\n}\n\ncli().register(DefaultCommand);\n"],"mappings":";;AAAA,SAAS,eAAuB;AAChC,SAAS,WAAW;AAEb,MAAM,uBAAuB,QAAQ;AAAA,EAH5C,OAG4C;AAAA;AAAA;AAAA,EAC1C,OAAO,QAAQ,QAAQ,MAAM;AAAA,IAC3B,UAAU;AAAA,IACV,aAAa;AAAA,IACb,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,IAKT,UAAU,CAAC;AAAA,EACb,CAAC;AAAA,EAED,MAAM,UAAU;AAEd,UAAM,cAAc,IAAI,EAAE;AAE1B,UAAM,QAAkB,CAAC;AACzB,gBAAY;AAAA,MAAQ,CAAC,OAAO,QAC1B,MAAM,KAAK,MAAM,QAAQ,MAAM,CAAC,GAAG,KAAK,GAAG,KAAK,EAAE;AAAA,IACpD;AAEA,YAAQ,IAAI,qBAAqB;AACjC,eAAW,OAAO,OAAO;AACvB,UAAI,KAAK;AACP,gBAAQ,IAAI,GAAG;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAI,EAAE,SAAS,cAAc;","names":[]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/app/console/KeyGenerateCommand.mts"],"sourcesContent":["import { Command, Option } from \"clipanion\";\nimport { generateKeyPairSync } from \"crypto\";\nimport fs from \"fs/promises\";\nimport path from \"path\";\nimport { logger, cli } from \"../../facades.mjs\";\n\nexport class KeyGenerateCommand extends Command {\n static paths = [[`generate`, \"key\"]];\n\n static usage = Command.Usage({\n category: `Main`,\n description: `generate keys`,\n details: `\n This command generates RSA key pair for JWT signing.\n Use --rotate flag to preserve old public key.\n `,\n examples: [\n [`Generate new keys`, `generate key`],\n [`Rotate existing keys`, `generate key --rotate`],\n ],\n });\n\n rotate = Option.Boolean(`--rotate`, false, {\n description: `Rotate existing keys (backup old keys before replacement)`,\n });\n\n async execute() {\n logger().info(\"generating keys for jwt token and adding to .env file\");\n const { publicKey, privateKey } = generateKeyPairSync(\"rsa\", {\n modulusLength: 2048, // 2048-bit key is standard for RS256\n publicKeyEncoding: {\n type: \"spki\",\n format: \"pem\",\n },\n privateKeyEncoding: {\n type: \"pkcs8\",\n format: \"pem\",\n },\n });\n\n let envfile = \"\";\n try {\n envfile = await fs.readFile(path.join(process.cwd(), \".env\"), \"utf-8\");\n } catch {}\n let old_public_key = envfile.match(/^jwt_secret_public=(.*)/m);\n\n envfile = this.addEnvParam(\n envfile,\n \"jwt_secret_public\",\n this.stripPemHeaders(publicKey),\n );\n envfile = this.addEnvParam(\n envfile,\n \"jwt_secret_private\",\n this.stripPemHeaders(privateKey),\n );\n\n if (this.rotate && old_public_key && old_public_key[1]) {\n envfile = this.addEnvParam(\n envfile,\n \"jwt_secret_public_retired\",\n old_public_key[1],\n );\n }\n\n await fs.writeFile(path.join(process.cwd(), \".env\"), envfile, \"utf-8\");\n }\n\n addEnvParam(file: string, key: string, value: string) {\n let regex = new RegExp(`^${key}=.*`, \"gm\");\n file = file.replace(regex, `${key}=${value}`);\n const match = file.match(regex);\n\n if (!match) {\n file = file + `\\n${key}=${value}`;\n }\n return file;\n }\n\n stripPemHeaders(pem: string) {\n return pem\n .replace(/-----BEGIN [\\w\\s]+-----/g, \"\")\n .replace(/-----END [\\w\\s]+-----/g, \"\")\n .replace(/\\r?\\n|\\r/g, \"\");\n }\n}\n\ncli().register(KeyGenerateCommand);\n"],"mappings":";;AAAA,SAAS,SAAS,cAAc;AAChC,SAAS,2BAA2B;AACpC,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,QAAQ,WAAW;AAErB,MAAM,2BAA2B,QAAQ;AAAA,EANhD,OAMgD;AAAA;AAAA;AAAA,EAC9C,OAAO,QAAQ,CAAC,CAAC,YAAY,KAAK,CAAC;AAAA,EAEnC,OAAO,QAAQ,QAAQ,MAAM;AAAA,IAC3B,UAAU;AAAA,IACV,aAAa;AAAA,IACb,SAAS;AAAA;AAAA;AAAA;AAAA,IAIT,UAAU;AAAA,MACR,CAAC,qBAAqB,cAAc;AAAA,MACpC,CAAC,wBAAwB,uBAAuB;AAAA,IAClD;AAAA,EACF,CAAC;AAAA,EAED,SAAS,OAAO,QAAQ,YAAY,OAAO;AAAA,IACzC,aAAa;AAAA,EACf,CAAC;AAAA,EAED,MAAM,UAAU;AACd,WAAO,EAAE,KAAK,uDAAuD;AACrE,UAAM,EAAE,WAAW,WAAW,IAAI,oBAAoB,OAAO;AAAA,MAC3D,eAAe;AAAA;AAAA,MACf,mBAAmB;AAAA,QACjB,MAAM;AAAA,QACN,QAAQ;AAAA,MACV;AAAA,MACA,oBAAoB;AAAA,QAClB,MAAM;AAAA,QACN,QAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAED,QAAI,UAAU;AACd,QAAI;AACF,gBAAU,MAAM,GAAG,SAAS,KAAK,KAAK,QAAQ,IAAI,GAAG,MAAM,GAAG,OAAO;AAAA,IACvE,QAAQ;AAAA,IAAC;AACT,QAAI,iBAAiB,QAAQ,MAAM,0BAA0B;AAE7D,cAAU,KAAK;AAAA,MACb;AAAA,MACA;AAAA,MACA,KAAK,gBAAgB,SAAS;AAAA,IAChC;AACA,cAAU,KAAK;AAAA,MACb;AAAA,MACA;AAAA,MACA,KAAK,gBAAgB,UAAU;AAAA,IACjC;AAEA,QAAI,KAAK,UAAU,kBAAkB,eAAe,CAAC,GAAG;AACtD,gBAAU,KAAK;AAAA,QACb;AAAA,QACA;AAAA,QACA,eAAe,CAAC;AAAA,MAClB;AAAA,IACF;AAEA,UAAM,GAAG,UAAU,KAAK,KAAK,QAAQ,IAAI,GAAG,MAAM,GAAG,SAAS,OAAO;AAAA,EACvE;AAAA,EAEA,YAAY,MAAc,KAAa,OAAe;AACpD,QAAI,QAAQ,IAAI,OAAO,IAAI,GAAG,OAAO,IAAI;AACzC,WAAO,KAAK,QAAQ,OAAO,GAAG,GAAG,IAAI,KAAK,EAAE;AAC5C,UAAM,QAAQ,KAAK,MAAM,KAAK;AAE9B,QAAI,CAAC,OAAO;AACV,aAAO,OAAO;AAAA,EAAK,GAAG,IAAI,KAAK;AAAA,IACjC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgB,KAAa;AAC3B,WAAO,IACJ,QAAQ,4BAA4B,EAAE,EACtC,QAAQ,0BAA0B,EAAE,EACpC,QAAQ,aAAa,EAAE;AAAA,EAC5B;AACF;AAEA,IAAI,EAAE,SAAS,kBAAkB;","names":[]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/app/console/StartCommand.mts"],"sourcesContent":["import { Command, Option } from \"clipanion\";\nimport { config } from \"@devbro/neko-config\";\n\nimport { cli, httpServer, logger, scheduler, queue } from \"../../facades.mjs\";\nimport { PostgresqlConnection } from \"@devbro/neko-sql\";\n\nexport class StartCommand extends Command {\n scheduler = Option.Boolean(`--scheduler`, false);\n cron = Option.Boolean(`--cron`, false);\n http = Option.Boolean(`--http`, false);\n queue = Option.Boolean(`--queue`, false);\n all = Option.Boolean(\"--all\", false);\n static paths = [[`start`]];\n\n async execute() {\n if (\n [this.all, this.http, this.scheduler || this.cron, this.queue].filter(\n (x) => x,\n ).length == 0\n ) {\n this.context.stdout.write(\n `No service was selected. please check -h for details\\n`,\n );\n return;\n }\n\n logger().info(`Starting Server\\n`);\n\n PostgresqlConnection.defaults.idleTimeoutMillis = 10000;\n\n if (this.scheduler || this.cron || this.all) {\n logger().info(`starting scheduler\\n`);\n scheduler().start();\n }\n\n if (this.queue || this.all) {\n const config_queues = config.get(\"queues\");\n for (const [name, conf] of Object.entries(config_queues)) {\n queue(name).start();\n }\n }\n\n if (this.http || this.all) {\n const server = httpServer();\n await server.listen(config.get(\"port\"), () => {\n logger().info(\n \"Server is running on http://localhost:\" + config.get(\"port\"),\n );\n });\n }\n }\n}\n\ncli().register(StartCommand);\n"],"mappings":";;AAAA,SAAS,SAAS,cAAc;AAChC,SAAS,cAAc;AAEvB,SAAS,KAAK,YAAY,QAAQ,WAAW,aAAa;AAC1D,SAAS,4BAA4B;AAE9B,MAAM,qBAAqB,QAAQ;AAAA,EAN1C,OAM0C;AAAA;AAAA;AAAA,EACxC,YAAY,OAAO,QAAQ,eAAe,KAAK;AAAA,EAC/C,OAAO,OAAO,QAAQ,UAAU,KAAK;AAAA,EACrC,OAAO,OAAO,QAAQ,UAAU,KAAK;AAAA,EACrC,QAAQ,OAAO,QAAQ,WAAW,KAAK;AAAA,EACvC,MAAM,OAAO,QAAQ,SAAS,KAAK;AAAA,EACnC,OAAO,QAAQ,CAAC,CAAC,OAAO,CAAC;AAAA,EAEzB,MAAM,UAAU;AACd,QACE,CAAC,KAAK,KAAK,KAAK,MAAM,KAAK,aAAa,KAAK,MAAM,KAAK,KAAK,EAAE;AAAA,MAC7D,CAAC,MAAM;AAAA,IACT,EAAE,UAAU,GACZ;AACA,WAAK,QAAQ,OAAO;AAAA,QAClB;AAAA;AAAA,MACF;AACA;AAAA,IACF;AAEA,WAAO,EAAE,KAAK;AAAA,CAAmB;AAEjC,yBAAqB,SAAS,oBAAoB;AAElD,QAAI,KAAK,aAAa,KAAK,QAAQ,KAAK,KAAK;AAC3C,aAAO,EAAE,KAAK;AAAA,CAAsB;AACpC,gBAAU,EAAE,MAAM;AAAA,IACpB;AAEA,QAAI,KAAK,SAAS,KAAK,KAAK;AAC1B,YAAM,gBAAgB,OAAO,IAAI,QAAQ;AACzC,iBAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,aAAa,GAAG;AACxD,cAAM,IAAI,EAAE,MAAM;AAAA,MACpB;AAAA,IACF;AAEA,QAAI,KAAK,QAAQ,KAAK,KAAK;AACzB,YAAM,SAAS,WAAW;AAC1B,YAAM,OAAO,OAAO,OAAO,IAAI,MAAM,GAAG,MAAM;AAC5C,eAAO,EAAE;AAAA,UACP,2CAA2C,OAAO,IAAI,MAAM;AAAA,QAC9D;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,IAAI,EAAE,SAAS,YAAY;","names":[]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/app/console/generate/GenerateApiDocsCommand.mts"],"sourcesContent":["/*\nhow this command should work:\n<command> generate-from-routes --output path/to/output.json\n<command> generate-base --output path/to/output.json\n<command> merge-files # file lists/details are in config\n<command> # will show help\n*/\nimport { cli, router } from \"../../../facades.mjs\";\nimport { Command, Option } from \"clipanion\";\nimport path from \"path\";\nimport * as fs from \"fs/promises\";\nimport { config } from \"../../../config.mjs\";\nimport { Arr } from \"@devbro/neko-helper\";\n\nexport class GenerateApiDocsCommand extends Command {\n static paths = [[`generate`, `apidocs`]];\n\n static usage = Command.Usage({\n category: `Generate`,\n description: `Generate OpenAPI documentation from routes`,\n details: `\n This command utility generates OpenAPI 3.0 specification documentation by analyzing\n your application's routes and merging with example files.\n \n Subcommands:\n - generate-from-routes: Generate OpenAPI spec from registered routes\n - generate-base: Generate base OpenAPI specification structure\n - merge-files: Merge multiple OpenAPI files into final documentation\n\n \n This command depends on config data. make sure your default config contains the following:\n\n\\`\\`\\`\napi_docs: {\n\n merge_files: [\n\n path.join(__dirname, '../..', 'private', 'openapi_base.json'),\n\n path.join(__dirname, '../..', 'private', 'openapi_from_routes.json'),\n\n path.join(__dirname, '../..', 'private', 'openapi_from_tests.json'),\n\n path.join(__dirname, '../..', 'private', 'openapi_other_user_changes.json'),\n\n ],\n\n output: path.join(__dirname, '../..', 'public', 'openapi.json'),\n\n}\n\n\\`\\`\\`\n `,\n examples: [\n [\n `Generate from routes`,\n `$0 generate apidocs generate-from-routes --output path/to/output.json`,\n ],\n [\n `Generate base spec`,\n `$0 generate apidocs generate-base --output path/to/output.json`,\n ],\n [`Merge files`, `$0 generate apidocs merge-files`],\n [`Show help`, `$0 generate apidocs --help`],\n ],\n });\n\n subcommand = Option.String({ required: false });\n\n output = Option.String(`--output,-o`, {\n description: `Output file path for generated documentation`,\n });\n\n config = Option.String(`--config,-c`, {\n description: `Path in config to get details from (default: api_docs)`,\n required: false,\n });\n\n async execute() {\n if (!this.subcommand) {\n this.context.stdout.write(\n this.constructor.usage?.toString() || \"No help available\\n\",\n );\n return 0;\n }\n\n switch (this.subcommand) {\n case \"generate-from-routes\":\n return await this.executeGenerateFromRoutes();\n case \"generate-base\":\n return await this.executeGenerateBase();\n case \"merge-files\":\n return await this.executeMergeFiles();\n default:\n this.context.stderr.write(`Unknown subcommand: ${this.subcommand}\\n`);\n this.context.stdout.write(\n this.constructor.usage?.toString() || \"No help available\\n\",\n );\n return 1;\n }\n }\n\n private async executeGenerateFromRoutes() {\n this.context.stdout.write(\n `Generating OpenAPI documentation from routes...\\n`,\n );\n\n const openApiSpec = this.generateFromRoutes();\n const outputPath =\n this.output ||\n path.join(config.get(\"private_path\"), \"openapi_from_routes.json\");\n\n // Ensure directory exists\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n\n await fs.writeFile(\n outputPath,\n JSON.stringify(openApiSpec, null, 2),\n \"utf-8\",\n );\n\n this.context.stdout.write(\n `OpenAPI routes documentation generated at: ${outputPath}\\n`,\n );\n this.context.stdout.write(\n `Total routes documented: ${Object.keys(openApiSpec.paths).length}\\n`,\n );\n return 0;\n }\n\n private async executeGenerateBase() {\n this.context.stdout.write(`Generating base OpenAPI specification...\\n`);\n\n const baseSpec = this.getBaseOpenApiSpec();\n const outputPath =\n this.output || path.join(config.get(\"private_path\"), \"openapi_base.json\");\n\n // Ensure directory exists\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n\n await fs.writeFile(outputPath, JSON.stringify(baseSpec, null, 2), \"utf-8\");\n\n this.context.stdout.write(\n `Base OpenAPI specification generated at: ${outputPath}\\n`,\n );\n return 0;\n }\n\n private async executeMergeFiles() {\n this.context.stdout.write(`Merging OpenAPI files...\\n`);\n let configPath = this.config || \"api_docs\";\n\n const files_to_merge: string[] = config.get(`${configPath}.merge_files`);\n let final_api_docs = {};\n\n for (const file_path of files_to_merge) {\n try {\n const file_json = JSON.parse(await fs.readFile(file_path, \"utf8\"));\n final_api_docs = Arr.deepMerge(final_api_docs, file_json);\n this.context.stdout.write(` Merged: ${file_path}\\n`);\n } catch (error) {\n this.context.stderr.write(\n ` Warning: Could not read ${file_path}: ${(error as Error).message}\\n`,\n );\n }\n }\n\n const outputPath = this.output || config.get(`${configPath}.output`);\n\n // Ensure directory exists\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n\n await fs.writeFile(outputPath, JSON.stringify(final_api_docs, null, 2));\n\n this.context.stdout.write(\n `Final OpenAPI document written to: ${outputPath}\\n`,\n );\n return 0;\n }\n\n private extractParameters(routePath: string): any[] {\n const paramRegex = /:([a-zA-Z0-9_]+)/g;\n const parameters: any[] = [];\n let match;\n\n while ((match = paramRegex.exec(routePath)) !== null) {\n parameters.push({\n name: match[1],\n in: \"path\",\n required: true,\n schema: {\n type: \"string\",\n },\n description: `Path parameter ${match[1]}`,\n });\n }\n\n return parameters;\n }\n\n private generateFromRoutes() {\n const openApiSpec = {\n paths: {} as any,\n };\n const routes = router().routes;\n\n // Process each route\n for (const route of routes) {\n const routePath = route.path;\n // Convert route path to OpenAPI format (e.g., /api/:id -> /api/{id})\n const openApiPath = routePath.replace(/\\/$/g, \"\"); //.replace(/:([a-zA-Z0-9_]+)/g, \"{$1}\");\n\n if (!openApiSpec.paths[openApiPath]) {\n openApiSpec.paths[openApiPath] = {};\n }\n\n // Add each HTTP method for this route\n for (const method of route.methods) {\n const lowerMethod = method.toLowerCase();\n\n // Skip HEAD as it's usually auto-generated\n if (lowerMethod === \"head\") {\n continue;\n }\n\n openApiSpec.paths[openApiPath][lowerMethod] = {\n summary: `${routePath}`,\n description: `Endpoint for ${method} ${routePath}`,\n security: [],\n parameters: this.extractParameters(routePath),\n responses: {},\n };\n\n // Add request body for POST, PUT, PATCH\n if ([\"post\", \"put\", \"patch\"].includes(lowerMethod)) {\n openApiSpec.paths[openApiPath][lowerMethod].requestBody = {\n required: true,\n content: {\n \"application/json\": {\n schema: {\n type: \"object\",\n },\n },\n },\n };\n }\n }\n }\n\n return openApiSpec;\n }\n\n getBaseOpenApiSpec() {\n // Generate OpenAPI 3.0 specification\n const openApiSpec = {\n openapi: \"3.0.0\",\n info: {\n title: \"API Documentation\",\n version: \"1.0.0\",\n description: \"Auto-generated API documentation\",\n },\n servers: [\n {\n url: \"/\",\n description: \"Local server\",\n },\n ],\n components: {\n securitySchemes: {\n bearerAuth: {\n type: \"http\",\n scheme: \"bearer\",\n bearerFormat: \"JWT\",\n description: \"JWT token authentication\",\n },\n },\n },\n security: [\n {\n bearerAuth: [],\n },\n ],\n paths: {} as Record<string, any>,\n };\n\n return openApiSpec;\n }\n}\n\ncli().register(GenerateApiDocsCommand);\n"],"mappings":"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","names":[]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/app/console/generate/GenerateControllerCommand.mts"],"sourcesContent":["import { cli } from \"../../../facades.mjs\";\nimport { Command, Option } from \"clipanion\";\nimport { Case } from \"change-case-all\";\nimport path from \"path\";\nimport * as fs from \"fs/promises\";\nimport { config } from \"@devbro/neko-config\";\nimport handlebars from \"handlebars\";\nimport { fileURLToPath } from \"url\";\nimport pluralize from \"pluralize\";\n\nexport class GenerateControllerCommand extends Command {\n static paths = [\n [`make`, `controller`],\n [`generate`, `controller`],\n ];\n\n name = Option.String({ required: true });\n\n async execute() {\n const rootDir = process.cwd();\n\n const date = new Date();\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n const secondsOfDay = String(\n date.getHours() * 3600 + date.getMinutes() * 60 + date.getSeconds(),\n ).padStart(5, \"0\");\n\n const fixed_name = Case.snake(this.name);\n const filename = `${Case.capital(this.name)}Controller.ts`;\n this.context.stdout.write(`creating migration file ${filename}\\n`);\n\n await fs.mkdir(config.get(\"migration.path\"), { recursive: true });\n\n let dirname = typeof __dirname === \"string\" ? __dirname : undefined;\n if (!dirname) {\n dirname = path.dirname(fileURLToPath(import.meta.url));\n }\n\n const compiledTemplate = handlebars.compile(\n (await fs.readFile(path.join(dirname, \"./controller.tpl\"))).toString(),\n );\n const template = await compiledTemplate({\n className: Case.pascal(this.name),\n classNameLower: Case.snake(this.name),\n routeName: Case.kebab(pluralize(this.name)),\n });\n\n await fs.writeFile(\n path.join(rootDir, \"src/app/controllers\", filename),\n template,\n );\n }\n}\n\ncli().register(GenerateControllerCommand);\n"],"mappings":";;AAAA,SAAS,WAAW;AACpB,SAAS,SAAS,cAAc;AAChC,SAAS,YAAY;AACrB,OAAO,UAAU;AACjB,YAAY,QAAQ;AACpB,SAAS,cAAc;AACvB,OAAO,gBAAgB;AACvB,SAAS,qBAAqB;AAC9B,OAAO,eAAe;AAEf,MAAM,kCAAkC,QAAQ;AAAA,EAVvD,OAUuD;AAAA;AAAA;AAAA,EACrD,OAAO,QAAQ;AAAA,IACb,CAAC,QAAQ,YAAY;AAAA,IACrB,CAAC,YAAY,YAAY;AAAA,EAC3B;AAAA,EAEA,OAAO,OAAO,OAAO,EAAE,UAAU,KAAK,CAAC;AAAA,EAEvC,MAAM,UAAU;AACd,UAAM,UAAU,QAAQ,IAAI;AAE5B,UAAM,OAAO,oBAAI,KAAK;AACtB,UAAM,OAAO,KAAK,YAAY;AAC9B,UAAM,QAAQ,OAAO,KAAK,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AACzD,UAAM,MAAM,OAAO,KAAK,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AAClD,UAAM,eAAe;AAAA,MACnB,KAAK,SAAS,IAAI,OAAO,KAAK,WAAW,IAAI,KAAK,KAAK,WAAW;AAAA,IACpE,EAAE,SAAS,GAAG,GAAG;AAEjB,UAAM,aAAa,KAAK,MAAM,KAAK,IAAI;AACvC,UAAM,WAAW,GAAG,KAAK,QAAQ,KAAK,IAAI,CAAC;AAC3C,SAAK,QAAQ,OAAO,MAAM,2BAA2B,QAAQ;AAAA,CAAI;AAEjE,UAAM,GAAG,MAAM,OAAO,IAAI,gBAAgB,GAAG,EAAE,WAAW,KAAK,CAAC;AAEhE,QAAI,UAAU,OAAO,cAAc,WAAW,YAAY;AAC1D,QAAI,CAAC,SAAS;AACZ,gBAAU,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAAA,IACvD;AAEA,UAAM,mBAAmB,WAAW;AAAA,OACjC,MAAM,GAAG,SAAS,KAAK,KAAK,SAAS,kBAAkB,CAAC,GAAG,SAAS;AAAA,IACvE;AACA,UAAM,WAAW,MAAM,iBAAiB;AAAA,MACtC,WAAW,KAAK,OAAO,KAAK,IAAI;AAAA,MAChC,gBAAgB,KAAK,MAAM,KAAK,IAAI;AAAA,MACpC,WAAW,KAAK,MAAM,UAAU,KAAK,IAAI,CAAC;AAAA,IAC5C,CAAC;AAED,UAAM,GAAG;AAAA,MACP,KAAK,KAAK,SAAS,uBAAuB,QAAQ;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAI,EAAE,SAAS,yBAAyB;","names":[]}
@@ -0,0 +1,41 @@
1
+ import { db, storage, logger } from "@devbro/pashmak/facades";
2
+ import { ctx } from "@devbro/pashmak/context";
3
+ import { Request, Response, Model, Param, ValidatedRequest, BaseController, Controller, Get, Post, Put, Delete } from "@devbro/pashmak/router";
4
+
5
+
6
+ const {{classNameLower}}Validation = yup.object({
7
+ name: yup.string().required().min(2).max(255),
8
+ active: yup.boolean().required().default(true),
9
+ });
10
+ type {{className}}ValidationType = yup.InferType<typeof {{classNameLower}}Validation>;
11
+
12
+ @Controller("/api/v1/{{routeName}}")
13
+ export class {{className}}Controller extends BaseController {
14
+ @Get()
15
+ async list() {
16
+
17
+ }
18
+
19
+ @Post()
20
+ async create(@ValidatedRequest({{classNameLower}}Validation) body: {{className}}ValidationType) {
21
+
22
+ }
23
+
24
+ @Get({ path: "/:id" })
25
+ async get(@Param("id") id: string, @Model({{className}}, 'id') {{classNameLower}}: {{className}}) {
26
+
27
+ return {{classNameLower}};
28
+ }
29
+
30
+ @Put({ path: "/:id" })
31
+ async update(
32
+ @Model({{className}}, 'id') dealer: Dealer,
33
+ @ValidatedRequest({{classNameLower}}Validation) body: {{className}}ValidationType
34
+ ) {
35
+
36
+ }
37
+
38
+ @Delete({ path: "/:id" })
39
+ delete(@Param("id") id: string) {
40
+ }
41
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/app/console/generate/index.mts"],"sourcesContent":["export * from \"./GenerateControllerCommand.mjs\";\nexport * from \"./GenerateApiDocsCommand.mjs\";\n"],"mappings":"AAAA,cAAc;AACd,cAAc;","names":[]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/app/console/index.mts"],"sourcesContent":["export * from \"./migrate/index.mjs\";\nexport * from \"./StartCommand.mjs\";\nexport * from \"./DefaultCommand.mjs\";\nexport * from \"./KeyGenerateCommand.mjs\";\nexport * from \"./generate/index.mjs\";\nexport * from \"./project/CreateProjectCommand.mjs\";\nexport * from \"./queue/GenerateQueueMigrateCommand.mjs\";\n\nimport { cli } from \"../../facades.mjs\";\nimport { CreateProjectCommand } from \"./project/CreateProjectCommand.mjs\";\n\ncli().register(CreateProjectCommand);\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,SAAS,WAAW;AACpB,SAAS,4BAA4B;AAErC,IAAI,EAAE,SAAS,oBAAoB;","names":[]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/app/console/migrate/GenerateMigrateCommand.mts"],"sourcesContent":["import { cli } from \"../../../facades.mjs\";\nimport { Command, Option } from \"clipanion\";\nimport { Case } from \"change-case-all\";\nimport path from \"path\";\nimport * as fs from \"fs/promises\";\nimport { config } from \"@devbro/neko-config\";\nimport handlebars from \"handlebars\";\nimport { fileURLToPath } from \"url\";\nimport { table } from \"console\";\n\nexport class GenerateMigrateCommand extends Command {\n static paths = [\n [`generate`, `migrate`],\n [\"generate\", \"migration\"],\n ];\n\n name = Option.String({ required: true });\n\n async execute() {\n const date = new Date();\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n const secondsOfDay = String(\n date.getHours() * 3600 + date.getMinutes() * 60 + date.getSeconds(),\n ).padStart(5, \"0\");\n\n const fixed_name = Case.snake(this.name);\n const filename = `${year}_${month}_${day}_${secondsOfDay}_${fixed_name}.ts`;\n this.context.stdout.write(`creating migration file ${filename}\\n`);\n\n await fs.mkdir(config.get(\"migration.path\"), { recursive: true });\n\n let dirname = typeof __dirname === \"string\" ? __dirname : undefined;\n if (!dirname) {\n dirname = path.dirname(fileURLToPath(import.meta.url));\n }\n\n const compiledTemplate = handlebars.compile(\n (\n await fs.readFile(path.join(dirname, \"./make_migration.tpl\"))\n ).toString(),\n );\n const template = await compiledTemplate({\n className: Case.pascal(this.name) + \"Migration\",\n tableName: Case.snake(this.name),\n });\n\n await fs.writeFile(\n path.join(config.get(\"migration.path\"), filename),\n template,\n );\n }\n}\n\ncli().register(GenerateMigrateCommand);\n"],"mappings":";;AAAA,SAAS,WAAW;AACpB,SAAS,SAAS,cAAc;AAChC,SAAS,YAAY;AACrB,OAAO,UAAU;AACjB,YAAY,QAAQ;AACpB,SAAS,cAAc;AACvB,OAAO,gBAAgB;AACvB,SAAS,qBAAqB;AAGvB,MAAM,+BAA+B,QAAQ;AAAA,EAVpD,OAUoD;AAAA;AAAA;AAAA,EAClD,OAAO,QAAQ;AAAA,IACb,CAAC,YAAY,SAAS;AAAA,IACtB,CAAC,YAAY,WAAW;AAAA,EAC1B;AAAA,EAEA,OAAO,OAAO,OAAO,EAAE,UAAU,KAAK,CAAC;AAAA,EAEvC,MAAM,UAAU;AACd,UAAM,OAAO,oBAAI,KAAK;AACtB,UAAM,OAAO,KAAK,YAAY;AAC9B,UAAM,QAAQ,OAAO,KAAK,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AACzD,UAAM,MAAM,OAAO,KAAK,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AAClD,UAAM,eAAe;AAAA,MACnB,KAAK,SAAS,IAAI,OAAO,KAAK,WAAW,IAAI,KAAK,KAAK,WAAW;AAAA,IACpE,EAAE,SAAS,GAAG,GAAG;AAEjB,UAAM,aAAa,KAAK,MAAM,KAAK,IAAI;AACvC,UAAM,WAAW,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI,YAAY,IAAI,UAAU;AACtE,SAAK,QAAQ,OAAO,MAAM,2BAA2B,QAAQ;AAAA,CAAI;AAEjE,UAAM,GAAG,MAAM,OAAO,IAAI,gBAAgB,GAAG,EAAE,WAAW,KAAK,CAAC;AAEhE,QAAI,UAAU,OAAO,cAAc,WAAW,YAAY;AAC1D,QAAI,CAAC,SAAS;AACZ,gBAAU,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAAA,IACvD;AAEA,UAAM,mBAAmB,WAAW;AAAA,OAEhC,MAAM,GAAG,SAAS,KAAK,KAAK,SAAS,sBAAsB,CAAC,GAC5D,SAAS;AAAA,IACb;AACA,UAAM,WAAW,MAAM,iBAAiB;AAAA,MACtC,WAAW,KAAK,OAAO,KAAK,IAAI,IAAI;AAAA,MACpC,WAAW,KAAK,MAAM,KAAK,IAAI;AAAA,IACjC,CAAC;AAED,UAAM,GAAG;AAAA,MACP,KAAK,KAAK,OAAO,IAAI,gBAAgB,GAAG,QAAQ;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAI,EAAE,SAAS,sBAAsB;","names":[]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/app/console/migrate/MigrateCommand.mts"],"sourcesContent":["import { cli, db as database, logger } from \"../../../facades.mjs\";\nimport { Command, Option } from \"clipanion\";\nimport { Blueprint } from \"@devbro/neko-sql\";\nimport { context_provider } from \"@devbro/neko-context\";\nimport path from \"path\";\nimport fs from \"fs/promises\";\nimport { config } from \"@devbro/neko-config\";\nimport { Migration } from \"@devbro/neko-sql\";\n\nexport class MigrateCommand extends Command {\n static paths = [[`migrate`]];\n\n fresh = Option.Boolean(`--fresh`, false, {\n description: `whether to delete and recreate database`,\n });\n\n refresh = Option.Boolean(`--refresh`, false, {\n description: `whether to drop all tables before running migrations by using rollback function`,\n });\n\n async execute() {\n await context_provider.run(async () => {\n // this.context.stdout.write(`Hello Migrate Command!\\n`);\n const db = database();\n const schema = db.getSchema();\n\n if (this.fresh) {\n await db.dropDatabase(config.get(\"databases.default.database\"));\n await db.createDatabase(config.get(\"databases.default.database\"));\n logger().info(\"database dropped and created fresh!\");\n }\n\n if (this.refresh && (await schema.tableExists(\"migrations\"))) {\n logger().info(\"reverting all migrations!!\");\n // read all migrations and undo them all\n const existing_migrations = await db.runQuery({\n sql: \"select * from migrations order by created_at DESC\",\n parts: [],\n bindings: [],\n });\n\n const migrationsDir = config.get(\"migration.path\");\n\n for (const migration_record of existing_migrations) {\n logger().info(`rolling back ${migration_record.filename}`);\n try {\n const MigrationClass = (\n await import(path.join(migrationsDir, migration_record.filename))\n ).default;\n const migrationInstance: Migration = new MigrationClass();\n\n // Call the down method to rollback the migration\n await migrationInstance.down(db.getSchema());\n\n // Remove the migration record from the migrations table\n await db.runQuery({\n sql: \"delete from migrations where filename = $1\",\n parts: [],\n bindings: [migration_record.filename],\n });\n } catch (error) {\n logger().error(\n `Failed to rollback migration ${migration_record.filename}: ${error}`,\n );\n throw error;\n }\n }\n\n logger().info(\n `rolled back ${existing_migrations.length} migrations successfully!`,\n );\n }\n\n //create migration table if not exists\n if (!(await schema.tableExists(\"migrations\"))) {\n await schema.createTable(\"migrations\", (blueprint: Blueprint) => {\n blueprint.id();\n blueprint.timestamps();\n blueprint.string(\"filename\");\n blueprint.integer(\"batch\");\n });\n }\n\n const migrationsDir = config.get(\"migration.path\");\n let files: string[] = [];\n\n const dirEntries = await fs.readdir(migrationsDir);\n files = dirEntries\n .filter((entry) => entry.endsWith(\".ts\") || entry.endsWith(\".js\"))\n .sort();\n let batch_number = await db.runQuery({\n sql: \"select max(batch) as next_batch from migrations\",\n parts: [],\n bindings: [],\n });\n batch_number = batch_number[0].next_batch || 0;\n batch_number++;\n\n const migrations = await db.runQuery({\n sql: \"select * from migrations order by created_at ASC\",\n parts: [],\n bindings: [],\n });\n\n const completed_migrations = migrations.map((r: any) => r.filename);\n const pending_migrations = files.filter(\n (file) => !completed_migrations.includes(file),\n );\n\n let migrated_count = 0;\n for (const class_to_migrate of pending_migrations) {\n logger().info(`migrating up ${class_to_migrate}`);\n const ClassToMigrate = (\n await import(path.join(migrationsDir, class_to_migrate))\n ).default;\n const c: Migration = new ClassToMigrate();\n await c.up(db.getSchema());\n await db.runQuery({\n sql: \"insert into migrations (filename, batch) values ($1,$2)\",\n parts: [],\n bindings: [class_to_migrate, batch_number],\n });\n migrated_count++;\n }\n\n if (migrated_count === 0) {\n logger().warn(\"no migrations to run!\");\n return;\n }\n\n logger().info(`migrated ${migrated_count} migrations successfully!`);\n return;\n });\n }\n}\n\ncli().register(MigrateCommand);\n"],"mappings":"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","names":["migrationsDir"]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/app/console/migrate/MigrateRollbackCommand.mts"],"sourcesContent":["import { cli, db as database, logger } from \"../../../facades.mjs\";\nimport { Command, Option } from \"clipanion\";\nimport { context_provider } from \"@devbro/neko-context\";\nimport path from \"path\";\nimport fs from \"fs/promises\";\nimport { config } from \"@devbro/neko-config\";\nimport { Migration } from \"@devbro/neko-sql\";\nimport * as t from \"typanion\";\n\nexport class MigrateRollbackCommand extends Command {\n static paths = [[`migrate`, \"rollback\"]];\n\n steps = Option.String(`--steps`, \"1\", {\n description: `how many migrations to rollback`,\n validator: t.isNumber(),\n });\n\n async execute() {\n await context_provider.run(async () => {\n // this.context.stdout.write(`Hello Migrate Command!\\n`);\n const db = database();\n const schema = db.getSchema();\n\n const migrationsDir = config.get(\"migration.path\");\n let files: string[] = [];\n\n const dirEntries = await fs.readdir(migrationsDir);\n files = dirEntries.filter((entry) => entry.endsWith(\".ts\")).sort();\n\n const migrations = await db.runQuery({\n sql: \"select * from migrations order by created_at DESC limit $1\",\n parts: [],\n bindings: [this.steps],\n });\n\n for (const migration of migrations) {\n const class_to_migrate = migration.filename;\n logger().info(`rolling back ${class_to_migrate}`);\n\n const ClassToMigrate = (\n await import(path.join(migrationsDir, class_to_migrate))\n ).default;\n\n const c: Migration = new ClassToMigrate();\n await c.down(db.getSchema());\n await db.runQuery({\n sql: \"delete from migrations where id = $1\",\n parts: [],\n bindings: [migration.id],\n });\n }\n });\n }\n}\n\ncli().register(MigrateRollbackCommand);\n"],"mappings":";;AAAA,SAAS,KAAK,MAAM,UAAU,cAAc;AAC5C,SAAS,SAAS,cAAc;AAChC,SAAS,wBAAwB;AACjC,OAAO,UAAU;AACjB,OAAO,QAAQ;AACf,SAAS,cAAc;AAEvB,YAAY,OAAO;AAEZ,MAAM,+BAA+B,QAAQ;AAAA,EATpD,OASoD;AAAA;AAAA;AAAA,EAClD,OAAO,QAAQ,CAAC,CAAC,WAAW,UAAU,CAAC;AAAA,EAEvC,QAAQ,OAAO,OAAO,WAAW,KAAK;AAAA,IACpC,aAAa;AAAA,IACb,WAAW,EAAE,SAAS;AAAA,EACxB,CAAC;AAAA,EAED,MAAM,UAAU;AACd,UAAM,iBAAiB,IAAI,YAAY;AAErC,YAAM,KAAK,SAAS;AACpB,YAAM,SAAS,GAAG,UAAU;AAE5B,YAAM,gBAAgB,OAAO,IAAI,gBAAgB;AACjD,UAAI,QAAkB,CAAC;AAEvB,YAAM,aAAa,MAAM,GAAG,QAAQ,aAAa;AACjD,cAAQ,WAAW,OAAO,CAAC,UAAU,MAAM,SAAS,KAAK,CAAC,EAAE,KAAK;AAEjE,YAAM,aAAa,MAAM,GAAG,SAAS;AAAA,QACnC,KAAK;AAAA,QACL,OAAO,CAAC;AAAA,QACR,UAAU,CAAC,KAAK,KAAK;AAAA,MACvB,CAAC;AAED,iBAAW,aAAa,YAAY;AAClC,cAAM,mBAAmB,UAAU;AACnC,eAAO,EAAE,KAAK,gBAAgB,gBAAgB,EAAE;AAEhD,cAAM,kBACJ,MAAM,OAAO,KAAK,KAAK,eAAe,gBAAgB,IACtD;AAEF,cAAM,IAAe,IAAI,eAAe;AACxC,cAAM,EAAE,KAAK,GAAG,UAAU,CAAC;AAC3B,cAAM,GAAG,SAAS;AAAA,UAChB,KAAK;AAAA,UACL,OAAO,CAAC;AAAA,UACR,UAAU,CAAC,UAAU,EAAE;AAAA,QACzB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,IAAI,EAAE,SAAS,sBAAsB;","names":[]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/app/console/migrate/index.mts"],"sourcesContent":["export * from \"./MigrateCommand.mjs\";\nexport * from \"./GenerateMigrateCommand.mjs\";\nexport * from \"./MigrateRollbackCommand.mjs\";\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
@@ -0,0 +1,15 @@
1
+ import { Migration } from '@devbro/pashmak/sql';
2
+ import { Schema, Blueprint } from "@devbro/pashmak/sql";
3
+
4
+ export default class {{className}} extends Migration {
5
+ async up(schema: Schema) {
6
+ await schema.createTable("{{tableName}}", (table: Blueprint) => {
7
+ table.id();
8
+ table.timestamps();
9
+ });
10
+ }
11
+
12
+ async down(schema: Schema) {
13
+ await schema.dropTableIfExists("{{tableName}}");
14
+ }
15
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/app/console/project/CreateProjectCommand.mts"],"sourcesContent":["import { Command, Option } from \"clipanion\";\nimport { Case } from \"change-case-all\";\nimport path from \"path\";\nimport * as fs from \"fs/promises\";\nimport { fileURLToPath } from \"url\";\nimport handlebars from \"handlebars\";\nimport { execSync } from \"child_process\";\nimport { select, Separator } from \"@inquirer/prompts\";\n\nexport class CreateProjectCommand extends Command {\n static paths = [[`create`, `project`]];\n\n static usage = Command.Usage({\n category: `Project`,\n description: `Create a new project`,\n details: `\n This command creates a new project with the specified name at the given path.\n If no path is provided, the project will be created in the current directory.\n `,\n examples: [\n [\n `Create a new project in specified directory`,\n `create project --path /path/to/my-project --git`,\n ],\n [\n `Create a new project at a specific path with git initialized`,\n `create project --path /path/to/my-project --git`,\n ],\n ],\n });\n\n projectPath = Option.String(\"--path\", { required: true });\n\n git = Option.Boolean(`--git`, false, {\n description: `Initialize a git repository in the new project`,\n });\n\n async folderExists(folderPath: string): Promise<boolean> {\n try {\n const stats = await fs.stat(folderPath);\n return stats.isDirectory();\n } catch (error: any) {\n if (error.code === \"ENOENT\") {\n return false; // Folder does not exist\n }\n throw error; // Other errors (e.g., permission issues)\n }\n }\n\n async execute() {\n // Create the project directory path by joining the specified path and project name\n const projectPath = path.join(this.projectPath);\n // Check if directory already exists\n try {\n await fs.access(projectPath);\n console.error(`Error: Directory ${projectPath} already exists.`);\n return 1;\n } catch {\n // Directory doesn't exist, we can proceed\n }\n\n // ask what library to use for validation: yup or zod or none\n const validation_library = await select({\n message: \"Select a package you want for validation\",\n choices: [\n {\n name: \"Yup\",\n value: \"yup\",\n description: \"https://github.com/jquense/yup\",\n },\n {\n name: \"Zod\",\n value: \"zod\",\n description: \"https://zod.dev/\",\n },\n new Separator(),\n {\n name: \"None\",\n value: \"none\",\n disabled: false,\n },\n ],\n });\n\n await fs.mkdir(projectPath, { recursive: true });\n console.log(`Created project directory at: ${projectPath}`);\n\n const dirname =\n typeof __dirname === \"undefined\"\n ? path.dirname(fileURLToPath(import.meta.url))\n : __dirname;\n\n let basePath = path.join(dirname, `./base_project`);\n if ((await this.folderExists(basePath)) === false) {\n // we are running a compiled code that was bundled and the code is running from ./dist/bin/ folder.\n basePath = path.join(dirname, `../app/console/project/base_project`);\n }\n\n console.log(`Using base project path: ${basePath}`);\n //copy content of ./base_project to the new project directory\n const baseProjectPath = basePath;\n\n await this.processTplFolder(baseProjectPath, projectPath, {\n validation_library,\n });\n console.log(`Copied base project files to: ${projectPath}`);\n\n //modify package.json with foldername\n const packageJsonPath = path.join(projectPath, `package.json`);\n const packageJson = JSON.parse(await fs.readFile(packageJsonPath, `utf-8`));\n packageJson.name = Case.snake(path.basename(projectPath));\n await fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));\n console.log(`Updated package.json with project name: ${packageJson.name}`);\n\n if (this.git) {\n try {\n execSync(\n 'git init; git add --all; git commit --allow-empty -m \"chore: first commit for pashmak\"',\n {\n cwd: projectPath,\n },\n );\n } catch (error) {\n console.error(`Failed to create project.`, error);\n return 1;\n }\n }\n }\n\n async processTplFolder(src: string, dest: string, data: any = {}) {\n const files = await fs.readdir(src, { withFileTypes: true });\n for (const file of files) {\n const srcPath = path.join(src, file.name);\n const destPath =\n file.isFile() && file.name.endsWith(\".tpl\")\n ? path.join(dest, file.name.substring(0, file.name.length - 4))\n : path.join(dest, file.name);\n\n if (file.isDirectory()) {\n await fs.mkdir(destPath, { recursive: true });\n await this.processTplFolder(srcPath, destPath, data);\n } else if (file.name.endsWith(\".tpl\")) {\n await this.processTplFile(srcPath, destPath, data);\n } else {\n throw new Error(\n \"unexpected non tpl file: \" + srcPath + \" \" + file.name,\n );\n }\n }\n }\n\n async processTplFile(src: string, dest: string, data: any = {}) {\n handlebars.registerHelper(\"eq\", (a, b) => a === b);\n\n const compiledTemplate = handlebars.compile(\n (await fs.readFile(src)).toString(),\n );\n const template = await compiledTemplate(data);\n await fs.writeFile(dest, template);\n }\n}\n"],"mappings":";;AAAA,SAAS,SAAS,cAAc;AAChC,SAAS,YAAY;AACrB,OAAO,UAAU;AACjB,YAAY,QAAQ;AACpB,SAAS,qBAAqB;AAC9B,OAAO,gBAAgB;AACvB,SAAS,gBAAgB;AACzB,SAAS,QAAQ,iBAAiB;AAE3B,MAAM,6BAA6B,QAAQ;AAAA,EATlD,OASkD;AAAA;AAAA;AAAA,EAChD,OAAO,QAAQ,CAAC,CAAC,UAAU,SAAS,CAAC;AAAA,EAErC,OAAO,QAAQ,QAAQ,MAAM;AAAA,IAC3B,UAAU;AAAA,IACV,aAAa;AAAA,IACb,SAAS;AAAA;AAAA;AAAA;AAAA,IAIT,UAAU;AAAA,MACR;AAAA,QACE;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAAA,EAED,cAAc,OAAO,OAAO,UAAU,EAAE,UAAU,KAAK,CAAC;AAAA,EAExD,MAAM,OAAO,QAAQ,SAAS,OAAO;AAAA,IACnC,aAAa;AAAA,EACf,CAAC;AAAA,EAED,MAAM,aAAa,YAAsC;AACvD,QAAI;AACF,YAAM,QAAQ,MAAM,GAAG,KAAK,UAAU;AACtC,aAAO,MAAM,YAAY;AAAA,IAC3B,SAAS,OAAY;AACnB,UAAI,MAAM,SAAS,UAAU;AAC3B,eAAO;AAAA,MACT;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,UAAU;AAEd,UAAM,cAAc,KAAK,KAAK,KAAK,WAAW;AAE9C,QAAI;AACF,YAAM,GAAG,OAAO,WAAW;AAC3B,cAAQ,MAAM,oBAAoB,WAAW,kBAAkB;AAC/D,aAAO;AAAA,IACT,QAAQ;AAAA,IAER;AAGA,UAAM,qBAAqB,MAAM,OAAO;AAAA,MACtC,SAAS;AAAA,MACT,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aAAa;AAAA,QACf;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aAAa;AAAA,QACf;AAAA,QACA,IAAI,UAAU;AAAA,QACd;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,UACP,UAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,GAAG,MAAM,aAAa,EAAE,WAAW,KAAK,CAAC;AAC/C,YAAQ,IAAI,iCAAiC,WAAW,EAAE;AAE1D,UAAM,UACJ,OAAO,cAAc,cACjB,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC,IAC3C;AAEN,QAAI,WAAW,KAAK,KAAK,SAAS,gBAAgB;AAClD,QAAK,MAAM,KAAK,aAAa,QAAQ,MAAO,OAAO;AAEjD,iBAAW,KAAK,KAAK,SAAS,qCAAqC;AAAA,IACrE;AAEA,YAAQ,IAAI,4BAA4B,QAAQ,EAAE;AAElD,UAAM,kBAAkB;AAExB,UAAM,KAAK,iBAAiB,iBAAiB,aAAa;AAAA,MACxD;AAAA,IACF,CAAC;AACD,YAAQ,IAAI,iCAAiC,WAAW,EAAE;AAG1D,UAAM,kBAAkB,KAAK,KAAK,aAAa,cAAc;AAC7D,UAAM,cAAc,KAAK,MAAM,MAAM,GAAG,SAAS,iBAAiB,OAAO,CAAC;AAC1E,gBAAY,OAAO,KAAK,MAAM,KAAK,SAAS,WAAW,CAAC;AACxD,UAAM,GAAG,UAAU,iBAAiB,KAAK,UAAU,aAAa,MAAM,CAAC,CAAC;AACxE,YAAQ,IAAI,2CAA2C,YAAY,IAAI,EAAE;AAEzE,QAAI,KAAK,KAAK;AACZ,UAAI;AACF;AAAA,UACE;AAAA,UACA;AAAA,YACE,KAAK;AAAA,UACP;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,6BAA6B,KAAK;AAChD,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,iBAAiB,KAAa,MAAc,OAAY,CAAC,GAAG;AAChE,UAAM,QAAQ,MAAM,GAAG,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAC3D,eAAW,QAAQ,OAAO;AACxB,YAAM,UAAU,KAAK,KAAK,KAAK,KAAK,IAAI;AACxC,YAAM,WACJ,KAAK,OAAO,KAAK,KAAK,KAAK,SAAS,MAAM,IACtC,KAAK,KAAK,MAAM,KAAK,KAAK,UAAU,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,IAC5D,KAAK,KAAK,MAAM,KAAK,IAAI;AAE/B,UAAI,KAAK,YAAY,GAAG;AACtB,cAAM,GAAG,MAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AAC5C,cAAM,KAAK,iBAAiB,SAAS,UAAU,IAAI;AAAA,MACrD,WAAW,KAAK,KAAK,SAAS,MAAM,GAAG;AACrC,cAAM,KAAK,eAAe,SAAS,UAAU,IAAI;AAAA,MACnD,OAAO;AACL,cAAM,IAAI;AAAA,UACR,8BAA8B,UAAU,MAAM,KAAK;AAAA,QACrD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,KAAa,MAAc,OAAY,CAAC,GAAG;AAC9D,eAAW,eAAe,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC;AAEjD,UAAM,mBAAmB,WAAW;AAAA,OACjC,MAAM,GAAG,SAAS,GAAG,GAAG,SAAS;AAAA,IACpC;AACA,UAAM,WAAW,MAAM,iBAAiB,IAAI;AAC5C,UAAM,GAAG,UAAU,MAAM,QAAQ;AAAA,EACnC;AACF;","names":[]}
@@ -0,0 +1 @@
1
+ # Initial Pashmak Framework Project
@@ -0,0 +1,74 @@
1
+ {
2
+ "name": "test-app",
3
+ "version": "0.1.0",
4
+ "description": "testing application for the entire repo",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.ts",
8
+ "type": "module",
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "scripts": {
13
+ "build": "tsup",
14
+ "start": "tsx dist/index.js",
15
+ "test": "vitest run",
16
+ "test:watch": "vitest watch",
17
+ "test:coverage": "vitest run --coverage",
18
+ "format": "eslint . --fix --ext ts,tsx --report-unused-disable-directives --max-warnings 0 ",
19
+ "prepare": "husky",
20
+ "prettier": "prettier --write .",
21
+ "dev": "nodemon --watch src --ext ts,tsx,json --signal SIGTERM --exec \"clear && tsx -r tsconfig-paths/register src/index.ts start --all | npx pino-pretty\"",
22
+ "pdev": "tsx -r tsconfig-paths/register src/index.ts",
23
+ "clean": "rm -rf dist"
24
+ },
25
+ "author": "???",
26
+ "license": "MIT",
27
+ "devDependencies": {
28
+ "@swc/core": "^1.12.9",
29
+ "@types/config": "^3.3.5",
30
+ "@types/jsonwebtoken": "^9.0.9",
31
+ "@types/supertest": "^6.0.2",
32
+ "@types/yup": "^0.32.0",
33
+ "nodemon": "^3.1.10",
34
+ "supertest": "^6.3.3",
35
+ "tsx": "^4.20.3",
36
+ "typescript": "^5.8.3",
37
+ "pino-pretty": "^13.0.0",
38
+ "husky": "^9.1.7",
39
+ "vitest": "^3.2.4"
40
+ },
41
+ "dependencies": {
42
+ "@devbro/pashmak": "0.1.*",
43
+ "bcryptjs": "^3.0.2",
44
+ "clipanion": "^4.0.0-rc.4",
45
+ "jsonwebtoken": "^9.0.0",
46
+ "tsconfig-paths": "^4.2.0",
47
+ {{#if (eq validation_library "yup")}}
48
+ "yup": "^1.6.1",
49
+ {{/if}}
50
+ {{#if (eq validation_library "zod")}}
51
+ "zod": "^4.1.12",
52
+ {{/if}}
53
+ "dotenv": "^16.5.0"
54
+ },
55
+ "directories": {
56
+ "doc": "docs",
57
+ "test": "tests"
58
+ },
59
+ "repository": {
60
+ "type": "git",
61
+ "url": "git+ssh://git@github.com/devbro1/pashmak.git"
62
+ },
63
+ "keywords": [
64
+ "pashmak"
65
+ ],
66
+ "bugs": {
67
+ "url": "https://github.com/devbro1/pashmak/issues"
68
+ },
69
+ "homepage": "https://devbro1.github.io/pashmak/",
70
+ "tags": {
71
+ "needsCompile": true,
72
+ "canPublishToNpm": false
73
+ }
74
+ }
@@ -0,0 +1,23 @@
1
+ import { Command, Option } from "clipanion";
2
+ import { cli } from "@devbro/pashmak/facades";
3
+
4
+ export class YourFirstCommand extends Command {
5
+ static paths = [
6
+ [`hello`],
7
+ ];
8
+
9
+ static usage = Command.Usage({
10
+ category: `Main`,
11
+ description: `First example command.`,
12
+ details: `
13
+ This command says hello to the world.
14
+ `,
15
+ examples: [],
16
+ });
17
+
18
+ async execute() {
19
+ console.log("Hello world!");
20
+ }
21
+ }
22
+
23
+ cli().register(YourFirstCommand);
@@ -0,0 +1 @@
1
+ export * from "./YourFirstCommand";
@@ -0,0 +1,16 @@
1
+ import {
2
+ BaseController,
3
+ Controller,
4
+ Get,
5
+ } from "@devbro/pashmak/router";
6
+
7
+ @Controller("/api/v1/hello", { middlewares: [] })
8
+ export class HelloController extends BaseController {
9
+ @Get({ middlewares: [] })
10
+ async show() {
11
+
12
+ return {
13
+ message: "Hello world!",
14
+ };
15
+ }
16
+ }
@@ -0,0 +1 @@
1
+ // export all models from here
@@ -0,0 +1,9 @@
1
+ import { queue } from '@devbro/pashmak/facades';
2
+
3
+ export function startQueueListeners() {
4
+ let rc: any = {};
5
+ // rc.channel_name_1 = queue().listen('channel_name_1', MessageClass1);
6
+ // rc.channel_name_2 = queue().listen('channel_name_2', MessageClass2);
7
+
8
+ return rc;
9
+ }
@@ -0,0 +1,5 @@
1
+ export default {
2
+ default: {
3
+ type: 'disabled',
4
+ },
5
+ };
@@ -0,0 +1,10 @@
1
+ export default {
2
+ default: {
3
+ host: process.env.DB_HOST,
4
+ database: process.env.DB_NAME || 'test_db',
5
+ user: process.env.DB_USER,
6
+ password: process.env.DB_PASSWORD,
7
+ port: parseInt(process.env.DB_PORT || '5432'),
8
+ name: 'db',
9
+ },
10
+ };
@@ -0,0 +1,64 @@
1
+ import path from 'path';
2
+ import os from 'os';
3
+ import { getEnv } from '@devbro/pashmak/helper';
4
+ import { dirname } from 'path';
5
+ import { fileURLToPath } from 'url';
6
+ import { loadConfig } from '@devbro/pashmak/config';
7
+
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = dirname(__filename);
10
+
11
+ const project_configs = {
12
+ databases: await loadConfig('./databases'),
13
+ storages: await loadConfig('./storages'),
14
+ mailer: await loadConfig('./mailer'),
15
+ loggers: await loadConfig('./loggers'),
16
+ queues: await loadConfig('./queues'),
17
+ caches: await loadConfig('./caches'),
18
+ base_url: getEnv('BASE_URL', 'http://localhost:' + getEnv('PORT', '3000')),
19
+ port: getEnv('PORT', 3000),
20
+ file_upload_path: path.join(os.tmpdir(), ''),
21
+ migration: {
22
+ path: path.join(__dirname, '..', 'database/migrations'),
23
+ },
24
+ jwt: {
25
+ options: {
26
+ algorithm: 'RS256',
27
+ expiresIn: 8 * 3600,
28
+ },
29
+ refresh_options: {
30
+ algorithm: 'RS256',
31
+ expiresIn: 3 * 24 * 3600,
32
+ },
33
+ secret: '-----BEGIN PRIVATE KEY-----\n' + process.env.jwt_secret_private + '\n-----END PRIVATE KEY-----\n',
34
+ public: '-----BEGIN PUBLIC KEY-----\n' + process.env.jwt_secret_public + '\n-----END PUBLIC KEY-----\n',
35
+ public_retired:
36
+ '-----BEGIN PUBLIC KEY-----\n' + process.env.jwt_secret_public_retired + '\n-----END PUBLIC KEY-----\n',
37
+ },
38
+ public_path: path.join(__dirname, '../..', 'public'),
39
+ debug_mode: getEnv('APP_DEBUG', false),
40
+ };
41
+
42
+ export const $test = {
43
+ // Test environment overrides
44
+ };
45
+
46
+ export const $prod = {
47
+ port: getEnv('PORT', 80),
48
+ debug_mode: false,
49
+ };
50
+
51
+
52
+ type DotPaths<T> = {
53
+ [K in keyof T & string]:
54
+ T[K] extends Record<string, any>
55
+ ? K | `${K}.${DotPaths<T[K]>}`
56
+ : K
57
+ }[keyof T & string];
58
+
59
+ declare module '@devbro/neko-config' {
60
+ interface ConfigKeys extends Record<DotPaths<typeof project_configs>, string> {
61
+ }
62
+ }
63
+
64
+ export default project_configs;
@@ -0,0 +1,13 @@
1
+ import { ctxSafe } from '@devbro/pashmak/context';
2
+ import { LogMessage } from '@devbro/pashmak/logger';
3
+
4
+ export default {
5
+ default: {
6
+ level: process.env.NODE_ENV === 'test' ? 'silent' : 'info',
7
+ extrasFunction: (message: LogMessage) => {
8
+ let requestId = ctxSafe()?.get('requestId');
9
+ requestId && (message.requestId = requestId);
10
+ return message;
11
+ },
12
+ },
13
+ };
@@ -0,0 +1,22 @@
1
+ export default {
2
+ default: {
3
+ provider: 'memory',
4
+ config: {
5
+ default_from: 'no-reply@devbro.com',
6
+ },
7
+ },
8
+ };
9
+
10
+ export const $prod = {
11
+ default: {
12
+ provider: 'ses',
13
+ // credentials are loaded as env vars
14
+ },
15
+ };
16
+
17
+ export const $test = {
18
+ default: {
19
+ provider: 'memory',
20
+ // credentials are loaded as env vars
21
+ },
22
+ };
@@ -0,0 +1,5 @@
1
+ export default {
2
+ default: {
3
+ provider: 'memory',
4
+ },
5
+ };
@@ -0,0 +1,12 @@
1
+ import { LocalStorageProviderConfig } from '@devbro/pashmak/storage';
2
+ import path from 'path';
3
+ import os from 'os';
4
+
5
+ export default {
6
+ default: {
7
+ provider: 'local',
8
+ config: {
9
+ basePath: path.join(os.tmpdir(), '/app-storage/'),
10
+ } as LocalStorageProviderConfig,
11
+ },
12
+ };
@@ -0,0 +1,13 @@
1
+ import { Blueprint } from "@devbro/pashmak/sql";
2
+ import { Migration } from "@devbro/pashmak/sql";
3
+ import { Schema } from "@devbro/pashmak/sql";
4
+
5
+ export default class CreateAnimals extends Migration {
6
+ async up(schema: Schema) {
7
+ // add to db schema
8
+ }
9
+
10
+ async down(schema: Schema) {
11
+ // remove from db schema
12
+ }
13
+ }