@warlock.js/core 4.0.30 → 4.0.39

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 (703) hide show
  1. package/esm/cli/index.js +2 -1
  2. package/esm/cli/index.js.map +1 -1
  3. package/esm/cli/start.js +132 -2
  4. package/esm/cli/start.js.map +1 -1
  5. package/esm/index.js +72 -1
  6. package/esm/index.js.map +1 -1
  7. package/package.json +71 -65
  8. package/esm/application.d.ts +0 -27
  9. package/esm/application.d.ts.map +0 -1
  10. package/esm/bootstrap/setup.d.ts +0 -7
  11. package/esm/bootstrap/setup.d.ts.map +0 -1
  12. package/esm/bootstrap/setup.js +0 -38
  13. package/esm/bootstrap/setup.js.map +0 -1
  14. package/esm/bootstrap.d.ts +0 -2
  15. package/esm/bootstrap.d.ts.map +0 -1
  16. package/esm/bootstrap.js +0 -5
  17. package/esm/bootstrap.js.map +0 -1
  18. package/esm/cache/database-cache-driver.d.ts +0 -56
  19. package/esm/cache/database-cache-driver.d.ts.map +0 -1
  20. package/esm/cache/database-cache-driver.js +0 -96
  21. package/esm/cache/database-cache-driver.js.map +0 -1
  22. package/esm/cache/index.d.ts +0 -3
  23. package/esm/cache/index.d.ts.map +0 -1
  24. package/esm/cache/index.js +0 -1
  25. package/esm/cache/index.js.map +0 -1
  26. package/esm/cli/cli-command.d.ts +0 -115
  27. package/esm/cli/cli-command.d.ts.map +0 -1
  28. package/esm/cli/cli-command.js +0 -224
  29. package/esm/cli/cli-command.js.map +0 -1
  30. package/esm/cli/cli-commands.manager.d.ts +0 -71
  31. package/esm/cli/cli-commands.manager.d.ts.map +0 -1
  32. package/esm/cli/cli-commands.manager.js +0 -345
  33. package/esm/cli/cli-commands.manager.js.map +0 -1
  34. package/esm/cli/cli-commands.utils.d.ts +0 -68
  35. package/esm/cli/cli-commands.utils.d.ts.map +0 -1
  36. package/esm/cli/cli-commands.utils.js +0 -182
  37. package/esm/cli/cli-commands.utils.js.map +0 -1
  38. package/esm/cli/commands/build.command.d.ts +0 -2
  39. package/esm/cli/commands/build.command.d.ts.map +0 -1
  40. package/esm/cli/commands/build.command.js +0 -8
  41. package/esm/cli/commands/build.command.js.map +0 -1
  42. package/esm/cli/commands/dev-server.command.d.ts +0 -2
  43. package/esm/cli/commands/dev-server.command.d.ts.map +0 -1
  44. package/esm/cli/commands/dev-server.command.js +0 -16
  45. package/esm/cli/commands/dev-server.command.js.map +0 -1
  46. package/esm/cli/commands/start-production.command.d.ts +0 -2
  47. package/esm/cli/commands/start-production.command.d.ts.map +0 -1
  48. package/esm/cli/commands/start-production.command.js +0 -65
  49. package/esm/cli/commands/start-production.command.js.map +0 -1
  50. package/esm/cli/commands/typings-generator.command.d.ts +0 -2
  51. package/esm/cli/commands/typings-generator.command.d.ts.map +0 -1
  52. package/esm/cli/commands/typings-generator.command.js +0 -40
  53. package/esm/cli/commands/typings-generator.command.js.map +0 -1
  54. package/esm/cli/commands-loader.d.ts +0 -18
  55. package/esm/cli/commands-loader.d.ts.map +0 -1
  56. package/esm/cli/commands-loader.js +0 -45
  57. package/esm/cli/commands-loader.js.map +0 -1
  58. package/esm/cli/framework-cli-commands.d.ts +0 -2
  59. package/esm/cli/framework-cli-commands.d.ts.map +0 -1
  60. package/esm/cli/framework-cli-commands.js +0 -6
  61. package/esm/cli/framework-cli-commands.js.map +0 -1
  62. package/esm/cli/index.d.ts +0 -3
  63. package/esm/cli/index.d.ts.map +0 -1
  64. package/esm/cli/parse-cli-args.d.ts +0 -18
  65. package/esm/cli/parse-cli-args.d.ts.map +0 -1
  66. package/esm/cli/parse-cli-args.js +0 -82
  67. package/esm/cli/parse-cli-args.js.map +0 -1
  68. package/esm/cli/start.d.ts +0 -2
  69. package/esm/cli/start.d.ts.map +0 -1
  70. package/esm/cli/string-similarity.d.ts +0 -44
  71. package/esm/cli/string-similarity.d.ts.map +0 -1
  72. package/esm/cli/string-similarity.js +0 -57
  73. package/esm/cli/string-similarity.js.map +0 -1
  74. package/esm/cli/types.d.ts +0 -201
  75. package/esm/cli/types.d.ts.map +0 -1
  76. package/esm/config/config-getter.d.ts +0 -35
  77. package/esm/config/config-getter.d.ts.map +0 -1
  78. package/esm/config/config-getter.js +0 -21
  79. package/esm/config/config-getter.js.map +0 -1
  80. package/esm/config/config-handlers.d.ts +0 -19
  81. package/esm/config/config-handlers.d.ts.map +0 -1
  82. package/esm/config/config-handlers.js +0 -47
  83. package/esm/config/config-handlers.js.map +0 -1
  84. package/esm/config/config-loader.d.ts +0 -37
  85. package/esm/config/config-loader.d.ts.map +0 -1
  86. package/esm/config/config-loader.js +0 -83
  87. package/esm/config/config-loader.js.map +0 -1
  88. package/esm/config/config-manager.d.ts +0 -22
  89. package/esm/config/config-manager.d.ts.map +0 -1
  90. package/esm/config/config-manager.js +0 -25
  91. package/esm/config/config-manager.js.map +0 -1
  92. package/esm/config/config-special-handlers.d.ts +0 -17
  93. package/esm/config/config-special-handlers.d.ts.map +0 -1
  94. package/esm/config/config-special-handlers.js +0 -23
  95. package/esm/config/config-special-handlers.js.map +0 -1
  96. package/esm/config/index.d.ts +0 -5
  97. package/esm/config/index.d.ts.map +0 -1
  98. package/esm/config/load-config-files.d.ts +0 -6
  99. package/esm/config/load-config-files.d.ts.map +0 -1
  100. package/esm/config/load-config-files.js +0 -19
  101. package/esm/config/load-config-files.js.map +0 -1
  102. package/esm/config/types.d.ts +0 -52
  103. package/esm/config/types.d.ts.map +0 -1
  104. package/esm/database/decorators/index.d.ts +0 -2
  105. package/esm/database/decorators/index.d.ts.map +0 -1
  106. package/esm/database/decorators/sluggable.d.ts +0 -2
  107. package/esm/database/decorators/sluggable.d.ts.map +0 -1
  108. package/esm/database/decorators/sluggable.js +0 -8
  109. package/esm/database/decorators/sluggable.js.map +0 -1
  110. package/esm/database/index.d.ts +0 -3
  111. package/esm/database/index.d.ts.map +0 -1
  112. package/esm/database/models/database-log/database-log.d.ts +0 -13
  113. package/esm/database/models/database-log/database-log.d.ts.map +0 -1
  114. package/esm/database/models/database-log/database-log.js +0 -16
  115. package/esm/database/models/database-log/database-log.js.map +0 -1
  116. package/esm/database/models/database-log/index.d.ts +0 -2
  117. package/esm/database/models/database-log/index.d.ts.map +0 -1
  118. package/esm/dev2-server/config-handlers.d.ts +0 -8
  119. package/esm/dev2-server/config-handlers.d.ts.map +0 -1
  120. package/esm/dev2-server/config-loader.d.ts +0 -61
  121. package/esm/dev2-server/config-loader.d.ts.map +0 -1
  122. package/esm/dev2-server/connectors/base-connector.d.ts +0 -49
  123. package/esm/dev2-server/connectors/base-connector.d.ts.map +0 -1
  124. package/esm/dev2-server/connectors/base-connector.js +0 -48
  125. package/esm/dev2-server/connectors/base-connector.js.map +0 -1
  126. package/esm/dev2-server/connectors/cache-connector.d.ts +0 -23
  127. package/esm/dev2-server/connectors/cache-connector.d.ts.map +0 -1
  128. package/esm/dev2-server/connectors/cache-connector.js +0 -35
  129. package/esm/dev2-server/connectors/cache-connector.js.map +0 -1
  130. package/esm/dev2-server/connectors/connectors-manager.d.ts +0 -38
  131. package/esm/dev2-server/connectors/connectors-manager.d.ts.map +0 -1
  132. package/esm/dev2-server/connectors/connectors-manager.js +0 -80
  133. package/esm/dev2-server/connectors/connectors-manager.js.map +0 -1
  134. package/esm/dev2-server/connectors/database-connector.d.ts +0 -23
  135. package/esm/dev2-server/connectors/database-connector.d.ts.map +0 -1
  136. package/esm/dev2-server/connectors/database-connector.js +0 -42
  137. package/esm/dev2-server/connectors/database-connector.js.map +0 -1
  138. package/esm/dev2-server/connectors/http-connector.d.ts +0 -29
  139. package/esm/dev2-server/connectors/http-connector.d.ts.map +0 -1
  140. package/esm/dev2-server/connectors/http-connector.js +0 -69
  141. package/esm/dev2-server/connectors/http-connector.js.map +0 -1
  142. package/esm/dev2-server/connectors/index.d.ts +0 -11
  143. package/esm/dev2-server/connectors/index.d.ts.map +0 -1
  144. package/esm/dev2-server/connectors/types.d.ts +0 -49
  145. package/esm/dev2-server/connectors/types.d.ts.map +0 -1
  146. package/esm/dev2-server/connectors/types.js +0 -9
  147. package/esm/dev2-server/connectors/types.js.map +0 -1
  148. package/esm/dev2-server/create-worker.d.ts +0 -34
  149. package/esm/dev2-server/create-worker.d.ts.map +0 -1
  150. package/esm/dev2-server/create-worker.js +0 -37
  151. package/esm/dev2-server/create-worker.js.map +0 -1
  152. package/esm/dev2-server/dependency-graph.d.ts +0 -93
  153. package/esm/dev2-server/dependency-graph.d.ts.map +0 -1
  154. package/esm/dev2-server/dependency-graph.js +0 -266
  155. package/esm/dev2-server/dependency-graph.js.map +0 -1
  156. package/esm/dev2-server/dev-logger.d.ts +0 -14
  157. package/esm/dev2-server/dev-logger.d.ts.map +0 -1
  158. package/esm/dev2-server/dev-logger.js +0 -130
  159. package/esm/dev2-server/dev-logger.js.map +0 -1
  160. package/esm/dev2-server/development-server.d.ts +0 -47
  161. package/esm/dev2-server/development-server.d.ts.map +0 -1
  162. package/esm/dev2-server/development-server.js +0 -135
  163. package/esm/dev2-server/development-server.js.map +0 -1
  164. package/esm/dev2-server/events.d.ts +0 -5
  165. package/esm/dev2-server/events.d.ts.map +0 -1
  166. package/esm/dev2-server/events.js +0 -4
  167. package/esm/dev2-server/events.js.map +0 -1
  168. package/esm/dev2-server/file-event-handler.d.ts +0 -156
  169. package/esm/dev2-server/file-event-handler.d.ts.map +0 -1
  170. package/esm/dev2-server/file-event-handler.js +0 -300
  171. package/esm/dev2-server/file-event-handler.js.map +0 -1
  172. package/esm/dev2-server/file-manager.d.ts +0 -385
  173. package/esm/dev2-server/file-manager.d.ts.map +0 -1
  174. package/esm/dev2-server/file-manager.js +0 -580
  175. package/esm/dev2-server/file-manager.js.map +0 -1
  176. package/esm/dev2-server/file-operations.d.ts +0 -203
  177. package/esm/dev2-server/file-operations.d.ts.map +0 -1
  178. package/esm/dev2-server/file-operations.js +0 -365
  179. package/esm/dev2-server/file-operations.js.map +0 -1
  180. package/esm/dev2-server/files-orchestrator.d.ts +0 -146
  181. package/esm/dev2-server/files-orchestrator.d.ts.map +0 -1
  182. package/esm/dev2-server/files-orchestrator.js +0 -314
  183. package/esm/dev2-server/files-orchestrator.js.map +0 -1
  184. package/esm/dev2-server/files-watcher.d.ts +0 -67
  185. package/esm/dev2-server/files-watcher.d.ts.map +0 -1
  186. package/esm/dev2-server/files-watcher.js +0 -95
  187. package/esm/dev2-server/files-watcher.js.map +0 -1
  188. package/esm/dev2-server/flags.d.ts +0 -10
  189. package/esm/dev2-server/flags.d.ts.map +0 -1
  190. package/esm/dev2-server/flags.js +0 -9
  191. package/esm/dev2-server/flags.js.map +0 -1
  192. package/esm/dev2-server/health-checker/checkers/base-health-checker.d.ts +0 -52
  193. package/esm/dev2-server/health-checker/checkers/base-health-checker.d.ts.map +0 -1
  194. package/esm/dev2-server/health-checker/checkers/base-health-checker.js +0 -71
  195. package/esm/dev2-server/health-checker/checkers/base-health-checker.js.map +0 -1
  196. package/esm/dev2-server/health-checker/checkers/eslint-health-checker.d.ts +0 -40
  197. package/esm/dev2-server/health-checker/checkers/eslint-health-checker.d.ts.map +0 -1
  198. package/esm/dev2-server/health-checker/checkers/eslint-health-checker.js +0 -217
  199. package/esm/dev2-server/health-checker/checkers/eslint-health-checker.js.map +0 -1
  200. package/esm/dev2-server/health-checker/checkers/typescript-health-checker.d.ts +0 -56
  201. package/esm/dev2-server/health-checker/checkers/typescript-health-checker.d.ts.map +0 -1
  202. package/esm/dev2-server/health-checker/checkers/typescript-health-checker.js +0 -279
  203. package/esm/dev2-server/health-checker/checkers/typescript-health-checker.js.map +0 -1
  204. package/esm/dev2-server/health-checker/file-health-checker.contract.d.ts +0 -59
  205. package/esm/dev2-server/health-checker/file-health-checker.contract.d.ts.map +0 -1
  206. package/esm/dev2-server/health-checker/file-health-result.d.ts +0 -68
  207. package/esm/dev2-server/health-checker/file-health-result.d.ts.map +0 -1
  208. package/esm/dev2-server/health-checker/file-health-result.js +0 -40
  209. package/esm/dev2-server/health-checker/file-health-result.js.map +0 -1
  210. package/esm/dev2-server/health-checker/files-healthcare.manager.d.ts +0 -115
  211. package/esm/dev2-server/health-checker/files-healthcare.manager.d.ts.map +0 -1
  212. package/esm/dev2-server/health-checker/files-healthcare.manager.js +0 -422
  213. package/esm/dev2-server/health-checker/files-healthcare.manager.js.map +0 -1
  214. package/esm/dev2-server/health-checker/index.d.ts +0 -6
  215. package/esm/dev2-server/health-checker/index.d.ts.map +0 -1
  216. package/esm/dev2-server/health-checker/workers/eslint-health.worker.d.ts +0 -2
  217. package/esm/dev2-server/health-checker/workers/eslint-health.worker.d.ts.map +0 -1
  218. package/esm/dev2-server/health-checker/workers/eslint-health.worker.js +0 -214
  219. package/esm/dev2-server/health-checker/workers/eslint-health.worker.js.map +0 -1
  220. package/esm/dev2-server/health-checker/workers/ts-health.worker.d.ts +0 -2
  221. package/esm/dev2-server/health-checker/workers/ts-health.worker.d.ts.map +0 -1
  222. package/esm/dev2-server/health-checker/workers/ts-health.worker.js +0 -261
  223. package/esm/dev2-server/health-checker/workers/ts-health.worker.js.map +0 -1
  224. package/esm/dev2-server/import-transformer.d.ts +0 -17
  225. package/esm/dev2-server/import-transformer.d.ts.map +0 -1
  226. package/esm/dev2-server/import-transformer.js +0 -236
  227. package/esm/dev2-server/import-transformer.js.map +0 -1
  228. package/esm/dev2-server/index.d.ts +0 -1
  229. package/esm/dev2-server/index.d.ts.map +0 -1
  230. package/esm/dev2-server/layer-executor.d.ts +0 -60
  231. package/esm/dev2-server/layer-executor.d.ts.map +0 -1
  232. package/esm/dev2-server/layer-executor.js +0 -309
  233. package/esm/dev2-server/layer-executor.js.map +0 -1
  234. package/esm/dev2-server/manifest-manager.d.ts +0 -80
  235. package/esm/dev2-server/manifest-manager.d.ts.map +0 -1
  236. package/esm/dev2-server/manifest-manager.js +0 -107
  237. package/esm/dev2-server/manifest-manager.js.map +0 -1
  238. package/esm/dev2-server/module-loader.d.ts +0 -104
  239. package/esm/dev2-server/module-loader.d.ts.map +0 -1
  240. package/esm/dev2-server/module-loader.js +0 -251
  241. package/esm/dev2-server/module-loader.js.map +0 -1
  242. package/esm/dev2-server/package-json-manager.d.ts +0 -16
  243. package/esm/dev2-server/package-json-manager.d.ts.map +0 -1
  244. package/esm/dev2-server/package-json-manager.js +0 -20
  245. package/esm/dev2-server/package-json-manager.js.map +0 -1
  246. package/esm/dev2-server/parse-imports.d.ts +0 -13
  247. package/esm/dev2-server/parse-imports.d.ts.map +0 -1
  248. package/esm/dev2-server/parse-imports.js +0 -329
  249. package/esm/dev2-server/parse-imports.js.map +0 -1
  250. package/esm/dev2-server/path.d.ts +0 -39
  251. package/esm/dev2-server/path.d.ts.map +0 -1
  252. package/esm/dev2-server/path.js +0 -56
  253. package/esm/dev2-server/path.js.map +0 -1
  254. package/esm/dev2-server/runtime-import-helper.d.ts +0 -9
  255. package/esm/dev2-server/runtime-import-helper.d.ts.map +0 -1
  256. package/esm/dev2-server/runtime-import-helper.js +0 -150
  257. package/esm/dev2-server/runtime-import-helper.js.map +0 -1
  258. package/esm/dev2-server/special-files-collector.d.ts +0 -114
  259. package/esm/dev2-server/special-files-collector.d.ts.map +0 -1
  260. package/esm/dev2-server/special-files-collector.js +0 -212
  261. package/esm/dev2-server/special-files-collector.js.map +0 -1
  262. package/esm/dev2-server/start-development-server.d.ts +0 -7
  263. package/esm/dev2-server/start-development-server.d.ts.map +0 -1
  264. package/esm/dev2-server/start-development-server.js +0 -21
  265. package/esm/dev2-server/start-development-server.js.map +0 -1
  266. package/esm/dev2-server/transpile-file.d.ts +0 -11
  267. package/esm/dev2-server/transpile-file.d.ts.map +0 -1
  268. package/esm/dev2-server/transpile-file.js +0 -21
  269. package/esm/dev2-server/transpile-file.js.map +0 -1
  270. package/esm/dev2-server/tsconfig-manager.d.ts +0 -45
  271. package/esm/dev2-server/tsconfig-manager.d.ts.map +0 -1
  272. package/esm/dev2-server/tsconfig-manager.js +0 -107
  273. package/esm/dev2-server/tsconfig-manager.js.map +0 -1
  274. package/esm/dev2-server/type-generator.d.ts +0 -115
  275. package/esm/dev2-server/type-generator.d.ts.map +0 -1
  276. package/esm/dev2-server/type-generator.js +0 -566
  277. package/esm/dev2-server/type-generator.js.map +0 -1
  278. package/esm/dev2-server/types.d.ts +0 -30
  279. package/esm/dev2-server/types.d.ts.map +0 -1
  280. package/esm/dev2-server/utils.d.ts +0 -15
  281. package/esm/dev2-server/utils.d.ts.map +0 -1
  282. package/esm/dev2-server/utils.js +0 -40
  283. package/esm/dev2-server/utils.js.map +0 -1
  284. package/esm/http/config.d.ts +0 -10
  285. package/esm/http/config.d.ts.map +0 -1
  286. package/esm/http/config.js +0 -22
  287. package/esm/http/config.js.map +0 -1
  288. package/esm/http/createHttpApplication.d.ts +0 -3
  289. package/esm/http/createHttpApplication.d.ts.map +0 -1
  290. package/esm/http/createHttpApplication.js +0 -28
  291. package/esm/http/createHttpApplication.js.map +0 -1
  292. package/esm/http/database/RequestLog.d.ts +0 -13
  293. package/esm/http/database/RequestLog.d.ts.map +0 -1
  294. package/esm/http/database/RequestLog.js +0 -25
  295. package/esm/http/database/RequestLog.js.map +0 -1
  296. package/esm/http/errors/index.d.ts +0 -2
  297. package/esm/http/errors/index.d.ts.map +0 -1
  298. package/esm/http/errors/resource-not-found.error.d.ts +0 -21
  299. package/esm/http/errors/resource-not-found.error.d.ts.map +0 -1
  300. package/esm/http/errors/resource-not-found.error.js +0 -40
  301. package/esm/http/errors/resource-not-found.error.js.map +0 -1
  302. package/esm/http/events.d.ts +0 -4
  303. package/esm/http/events.d.ts.map +0 -1
  304. package/esm/http/events.js +0 -26
  305. package/esm/http/events.js.map +0 -1
  306. package/esm/http/index.d.ts +0 -16
  307. package/esm/http/index.d.ts.map +0 -1
  308. package/esm/http/middleware/cache-response-middleware.d.ts +0 -34
  309. package/esm/http/middleware/cache-response-middleware.d.ts.map +0 -1
  310. package/esm/http/middleware/cache-response-middleware.js +0 -45
  311. package/esm/http/middleware/cache-response-middleware.js.map +0 -1
  312. package/esm/http/middleware/index.d.ts +0 -3
  313. package/esm/http/middleware/index.d.ts.map +0 -1
  314. package/esm/http/middleware/inject-request-context.d.ts +0 -35
  315. package/esm/http/middleware/inject-request-context.d.ts.map +0 -1
  316. package/esm/http/middleware/inject-request-context.js +0 -110
  317. package/esm/http/middleware/inject-request-context.js.map +0 -1
  318. package/esm/http/plugins/index.d.ts +0 -3
  319. package/esm/http/plugins/index.d.ts.map +0 -1
  320. package/esm/http/plugins.d.ts +0 -3
  321. package/esm/http/plugins.d.ts.map +0 -1
  322. package/esm/http/plugins.js +0 -39
  323. package/esm/http/plugins.js.map +0 -1
  324. package/esm/http/request-controller.d.ts +0 -11
  325. package/esm/http/request-controller.d.ts.map +0 -1
  326. package/esm/http/request-controller.js +0 -9
  327. package/esm/http/request-controller.js.map +0 -1
  328. package/esm/http/request.d.ts +0 -376
  329. package/esm/http/request.d.ts.map +0 -1
  330. package/esm/http/request.js +0 -729
  331. package/esm/http/request.js.map +0 -1
  332. package/esm/http/response.d.ts +0 -271
  333. package/esm/http/response.d.ts.map +0 -1
  334. package/esm/http/response.js +0 -574
  335. package/esm/http/response.js.map +0 -1
  336. package/esm/http/server.d.ts +0 -8
  337. package/esm/http/server.d.ts.map +0 -1
  338. package/esm/http/server.js +0 -15
  339. package/esm/http/server.js.map +0 -1
  340. package/esm/http/types.d.ts +0 -174
  341. package/esm/http/types.d.ts.map +0 -1
  342. package/esm/http/uploaded-file.d.ts +0 -445
  343. package/esm/http/uploaded-file.d.ts.map +0 -1
  344. package/esm/http/uploaded-file.js +0 -694
  345. package/esm/http/uploaded-file.js.map +0 -1
  346. package/esm/http/uploads-config.d.ts +0 -26
  347. package/esm/http/uploads-config.d.ts.map +0 -1
  348. package/esm/http/uploads-config.js +0 -35
  349. package/esm/http/uploads-config.js.map +0 -1
  350. package/esm/http/uploads-types.d.ts +0 -236
  351. package/esm/http/uploads-types.d.ts.map +0 -1
  352. package/esm/image/image.d.ts +0 -382
  353. package/esm/image/image.d.ts.map +0 -1
  354. package/esm/image/image.js +0 -552
  355. package/esm/image/image.js.map +0 -1
  356. package/esm/image/index.d.ts +0 -2
  357. package/esm/image/index.d.ts.map +0 -1
  358. package/esm/index.d.ts +0 -29
  359. package/esm/index.d.ts.map +0 -1
  360. package/esm/logger/index.d.ts +0 -3
  361. package/esm/logger/index.d.ts.map +0 -1
  362. package/esm/logger/logger.d.ts +0 -3
  363. package/esm/logger/logger.d.ts.map +0 -1
  364. package/esm/logger/logger.js +0 -16
  365. package/esm/logger/logger.js.map +0 -1
  366. package/esm/logger/types.d.ts +0 -39
  367. package/esm/logger/types.d.ts.map +0 -1
  368. package/esm/mail/config.d.ts +0 -83
  369. package/esm/mail/config.d.ts.map +0 -1
  370. package/esm/mail/config.js +0 -152
  371. package/esm/mail/config.js.map +0 -1
  372. package/esm/mail/events.d.ts +0 -96
  373. package/esm/mail/events.d.ts.map +0 -1
  374. package/esm/mail/events.js +0 -123
  375. package/esm/mail/events.js.map +0 -1
  376. package/esm/mail/index.d.ts +0 -10
  377. package/esm/mail/index.d.ts.map +0 -1
  378. package/esm/mail/mail.d.ts +0 -175
  379. package/esm/mail/mail.d.ts.map +0 -1
  380. package/esm/mail/mail.js +0 -286
  381. package/esm/mail/mail.js.map +0 -1
  382. package/esm/mail/mailer-pool.d.ts +0 -26
  383. package/esm/mail/mailer-pool.d.ts.map +0 -1
  384. package/esm/mail/mailer-pool.js +0 -95
  385. package/esm/mail/mailer-pool.js.map +0 -1
  386. package/esm/mail/react-mail.d.ts +0 -6
  387. package/esm/mail/react-mail.d.ts.map +0 -1
  388. package/esm/mail/react-mail.js +0 -25
  389. package/esm/mail/react-mail.js.map +0 -1
  390. package/esm/mail/send-mail.d.ts +0 -33
  391. package/esm/mail/send-mail.d.ts.map +0 -1
  392. package/esm/mail/send-mail.js +0 -309
  393. package/esm/mail/send-mail.js.map +0 -1
  394. package/esm/mail/test-mailbox.d.ts +0 -110
  395. package/esm/mail/test-mailbox.d.ts.map +0 -1
  396. package/esm/mail/test-mailbox.js +0 -143
  397. package/esm/mail/test-mailbox.js.map +0 -1
  398. package/esm/mail/types.d.ts +0 -245
  399. package/esm/mail/types.d.ts.map +0 -1
  400. package/esm/mail/types.js +0 -13
  401. package/esm/mail/types.js.map +0 -1
  402. package/esm/manifest/manifest-manager.d.ts +0 -74
  403. package/esm/manifest/manifest-manager.d.ts.map +0 -1
  404. package/esm/manifest/manifest-manager.js +0 -88
  405. package/esm/manifest/manifest-manager.js.map +0 -1
  406. package/esm/output/index.d.ts +0 -3
  407. package/esm/output/index.d.ts.map +0 -1
  408. package/esm/output/output.d.ts +0 -193
  409. package/esm/output/output.d.ts.map +0 -1
  410. package/esm/output/output.js +0 -599
  411. package/esm/output/output.js.map +0 -1
  412. package/esm/output/types.d.ts +0 -23
  413. package/esm/output/types.d.ts.map +0 -1
  414. package/esm/production/build-app-production.d.ts +0 -6
  415. package/esm/production/build-app-production.d.ts.map +0 -1
  416. package/esm/production/build-app-production.js +0 -8
  417. package/esm/production/build-app-production.js.map +0 -1
  418. package/esm/production/esbuild-plugins.d.ts +0 -5
  419. package/esm/production/esbuild-plugins.d.ts.map +0 -1
  420. package/esm/production/esbuild-plugins.js +0 -23
  421. package/esm/production/esbuild-plugins.js.map +0 -1
  422. package/esm/production/production-builder.d.ts +0 -76
  423. package/esm/production/production-builder.d.ts.map +0 -1
  424. package/esm/production/production-builder.js +0 -245
  425. package/esm/production/production-builder.js.map +0 -1
  426. package/esm/react/index.d.ts +0 -3
  427. package/esm/react/index.d.ts.map +0 -1
  428. package/esm/react/index.js +0 -7
  429. package/esm/react/index.js.map +0 -1
  430. package/esm/repositories/base-repository-manager.d.ts +0 -47
  431. package/esm/repositories/base-repository-manager.d.ts.map +0 -1
  432. package/esm/repositories/base-repository-manager.js +0 -63
  433. package/esm/repositories/base-repository-manager.js.map +0 -1
  434. package/esm/repositories/index.d.ts +0 -8
  435. package/esm/repositories/index.d.ts.map +0 -1
  436. package/esm/repositories/repository-destroyer-manager.d.ts +0 -21
  437. package/esm/repositories/repository-destroyer-manager.d.ts.map +0 -1
  438. package/esm/repositories/repository-destroyer-manager.js +0 -38
  439. package/esm/repositories/repository-destroyer-manager.js.map +0 -1
  440. package/esm/repositories/repository-filler-manager.d.ts +0 -60
  441. package/esm/repositories/repository-filler-manager.d.ts.map +0 -1
  442. package/esm/repositories/repository-filler-manager.js +0 -102
  443. package/esm/repositories/repository-filler-manager.js.map +0 -1
  444. package/esm/repositories/repository-filler.d.ts +0 -26
  445. package/esm/repositories/repository-filler.d.ts.map +0 -1
  446. package/esm/repositories/repository-filler.js +0 -63
  447. package/esm/repositories/repository-filler.js.map +0 -1
  448. package/esm/repositories/repository-list-manager.d.ts +0 -385
  449. package/esm/repositories/repository-list-manager.d.ts.map +0 -1
  450. package/esm/repositories/repository-list-manager.js +0 -812
  451. package/esm/repositories/repository-list-manager.js.map +0 -1
  452. package/esm/repositories/repository-listing.d.ts +0 -82
  453. package/esm/repositories/repository-listing.d.ts.map +0 -1
  454. package/esm/repositories/repository-listing.js +0 -177
  455. package/esm/repositories/repository-listing.js.map +0 -1
  456. package/esm/repositories/repository-manager.d.ts +0 -5
  457. package/esm/repositories/repository-manager.d.ts.map +0 -1
  458. package/esm/repositories/repository-manager.js +0 -2
  459. package/esm/repositories/repository-manager.js.map +0 -1
  460. package/esm/repositories/types.d.ts +0 -114
  461. package/esm/repositories/types.d.ts.map +0 -1
  462. package/esm/repositories/utils.d.ts +0 -3
  463. package/esm/repositories/utils.d.ts.map +0 -1
  464. package/esm/repositories/utils.js +0 -7
  465. package/esm/repositories/utils.js.map +0 -1
  466. package/esm/restful/index.d.ts +0 -2
  467. package/esm/restful/index.d.ts.map +0 -1
  468. package/esm/restful/restful.d.ts +0 -110
  469. package/esm/restful/restful.d.ts.map +0 -1
  470. package/esm/restful/restful.js +0 -317
  471. package/esm/restful/restful.js.map +0 -1
  472. package/esm/router/index.d.ts +0 -4
  473. package/esm/router/index.d.ts.map +0 -1
  474. package/esm/router/route-registry.d.ts +0 -30
  475. package/esm/router/route-registry.d.ts.map +0 -1
  476. package/esm/router/route-registry.js +0 -67
  477. package/esm/router/route-registry.js.map +0 -1
  478. package/esm/router/route.d.ts +0 -34
  479. package/esm/router/route.d.ts.map +0 -1
  480. package/esm/router/router.d.ts +0 -169
  481. package/esm/router/router.d.ts.map +0 -1
  482. package/esm/router/router.js +0 -564
  483. package/esm/router/router.js.map +0 -1
  484. package/esm/router/types.d.ts +0 -258
  485. package/esm/router/types.d.ts.map +0 -1
  486. package/esm/router/utils.d.ts +0 -5
  487. package/esm/router/utils.d.ts.map +0 -1
  488. package/esm/router/utils.js +0 -6
  489. package/esm/router/utils.js.map +0 -1
  490. package/esm/storage/config.d.ts +0 -8
  491. package/esm/storage/config.d.ts.map +0 -1
  492. package/esm/storage/config.js +0 -6
  493. package/esm/storage/config.js.map +0 -1
  494. package/esm/storage/drivers/cloud-driver.d.ts +0 -127
  495. package/esm/storage/drivers/cloud-driver.d.ts.map +0 -1
  496. package/esm/storage/drivers/cloud-driver.js +0 -406
  497. package/esm/storage/drivers/cloud-driver.js.map +0 -1
  498. package/esm/storage/drivers/do-spaces-driver.d.ts +0 -47
  499. package/esm/storage/drivers/do-spaces-driver.d.ts.map +0 -1
  500. package/esm/storage/drivers/do-spaces-driver.js +0 -52
  501. package/esm/storage/drivers/do-spaces-driver.js.map +0 -1
  502. package/esm/storage/drivers/local-driver.d.ts +0 -136
  503. package/esm/storage/drivers/local-driver.d.ts.map +0 -1
  504. package/esm/storage/drivers/local-driver.js +0 -409
  505. package/esm/storage/drivers/local-driver.js.map +0 -1
  506. package/esm/storage/drivers/r2-driver.d.ts +0 -50
  507. package/esm/storage/drivers/r2-driver.d.ts.map +0 -1
  508. package/esm/storage/drivers/r2-driver.js +0 -59
  509. package/esm/storage/drivers/r2-driver.js.map +0 -1
  510. package/esm/storage/drivers/s3-driver.d.ts +0 -32
  511. package/esm/storage/drivers/s3-driver.d.ts.map +0 -1
  512. package/esm/storage/drivers/s3-driver.js +0 -34
  513. package/esm/storage/drivers/s3-driver.js.map +0 -1
  514. package/esm/storage/index.d.ts +0 -12
  515. package/esm/storage/index.d.ts.map +0 -1
  516. package/esm/storage/scoped-storage.d.ts +0 -402
  517. package/esm/storage/scoped-storage.d.ts.map +0 -1
  518. package/esm/storage/scoped-storage.js +0 -488
  519. package/esm/storage/scoped-storage.js.map +0 -1
  520. package/esm/storage/storage-file.d.ts +0 -216
  521. package/esm/storage/storage-file.d.ts.map +0 -1
  522. package/esm/storage/storage-file.js +0 -358
  523. package/esm/storage/storage-file.js.map +0 -1
  524. package/esm/storage/storage.d.ts +0 -582
  525. package/esm/storage/storage.d.ts.map +0 -1
  526. package/esm/storage/storage.js +0 -941
  527. package/esm/storage/storage.js.map +0 -1
  528. package/esm/storage/types.d.ts +0 -728
  529. package/esm/storage/types.d.ts.map +0 -1
  530. package/esm/storage/utils/mime.d.ts +0 -33
  531. package/esm/storage/utils/mime.d.ts.map +0 -1
  532. package/esm/storage/utils/mime.js +0 -45
  533. package/esm/storage/utils/mime.js.map +0 -1
  534. package/esm/store/index.d.ts +0 -25
  535. package/esm/store/index.d.ts.map +0 -1
  536. package/esm/store/index.js +0 -52
  537. package/esm/store/index.js.map +0 -1
  538. package/esm/tests/boot-testing.d.ts +0 -7
  539. package/esm/tests/boot-testing.d.ts.map +0 -1
  540. package/esm/tests/boot-testing.js +0 -23
  541. package/esm/tests/boot-testing.js.map +0 -1
  542. package/esm/tests/create-http-test-application.d.ts +0 -25
  543. package/esm/tests/create-http-test-application.d.ts.map +0 -1
  544. package/esm/tests/create-http-test-application.js +0 -76
  545. package/esm/tests/create-http-test-application.js.map +0 -1
  546. package/esm/tests/http-response-output-test.d.ts +0 -42
  547. package/esm/tests/http-response-output-test.d.ts.map +0 -1
  548. package/esm/tests/http-response-output-test.js +0 -53
  549. package/esm/tests/http-response-output-test.js.map +0 -1
  550. package/esm/tests/http-test-response.d.ts +0 -75
  551. package/esm/tests/http-test-response.d.ts.map +0 -1
  552. package/esm/tests/index.d.ts +0 -4
  553. package/esm/tests/index.d.ts.map +0 -1
  554. package/esm/tests/init-testing.d.ts +0 -7
  555. package/esm/tests/init-testing.d.ts.map +0 -1
  556. package/esm/tests/types.d.ts +0 -10
  557. package/esm/tests/types.d.ts.map +0 -1
  558. package/esm/utils/app-log.d.ts +0 -8
  559. package/esm/utils/app-log.d.ts.map +0 -1
  560. package/esm/utils/app-log.js +0 -7
  561. package/esm/utils/app-log.js.map +0 -1
  562. package/esm/utils/cleanup-temp-files.d.ts +0 -5
  563. package/esm/utils/cleanup-temp-files.d.ts.map +0 -1
  564. package/esm/utils/database-log.d.ts +0 -25
  565. package/esm/utils/database-log.d.ts.map +0 -1
  566. package/esm/utils/database-log.js +0 -44
  567. package/esm/utils/database-log.js.map +0 -1
  568. package/esm/utils/date-output.d.ts +0 -69
  569. package/esm/utils/date-output.d.ts.map +0 -1
  570. package/esm/utils/date-output.js +0 -62
  571. package/esm/utils/date-output.js.map +0 -1
  572. package/esm/utils/date-output.test.d.ts +0 -2
  573. package/esm/utils/date-output.test.d.ts.map +0 -1
  574. package/esm/utils/download-file.d.ts +0 -3
  575. package/esm/utils/download-file.d.ts.map +0 -1
  576. package/esm/utils/environment.d.ts +0 -4
  577. package/esm/utils/environment.d.ts.map +0 -1
  578. package/esm/utils/environment.js +0 -6
  579. package/esm/utils/environment.js.map +0 -1
  580. package/esm/utils/get-localized.d.ts +0 -10
  581. package/esm/utils/get-localized.d.ts.map +0 -1
  582. package/esm/utils/get-localized.js +0 -15
  583. package/esm/utils/get-localized.js.map +0 -1
  584. package/esm/utils/get-localized.test.d.ts +0 -2
  585. package/esm/utils/get-localized.test.d.ts.map +0 -1
  586. package/esm/utils/index.d.ts +0 -13
  587. package/esm/utils/index.d.ts.map +0 -1
  588. package/esm/utils/internal.d.ts +0 -4
  589. package/esm/utils/internal.d.ts.map +0 -1
  590. package/esm/utils/paths.d.ts +0 -55
  591. package/esm/utils/paths.d.ts.map +0 -1
  592. package/esm/utils/paths.js +0 -89
  593. package/esm/utils/paths.js.map +0 -1
  594. package/esm/utils/promise-all-object.d.ts +0 -8
  595. package/esm/utils/promise-all-object.d.ts.map +0 -1
  596. package/esm/utils/promise-all-object.js +0 -12
  597. package/esm/utils/promise-all-object.js.map +0 -1
  598. package/esm/utils/queue.d.ts +0 -49
  599. package/esm/utils/queue.d.ts.map +0 -1
  600. package/esm/utils/queue.js +0 -89
  601. package/esm/utils/queue.js.map +0 -1
  602. package/esm/utils/sleep.d.ts +0 -2
  603. package/esm/utils/sleep.d.ts.map +0 -1
  604. package/esm/utils/sleep.js +0 -3
  605. package/esm/utils/sleep.js.map +0 -1
  606. package/esm/utils/sluggable.d.ts +0 -5
  607. package/esm/utils/sluggable.d.ts.map +0 -1
  608. package/esm/utils/sluggable.js +0 -15
  609. package/esm/utils/sluggable.js.map +0 -1
  610. package/esm/utils/sluggable.test.d.ts +0 -2
  611. package/esm/utils/sluggable.test.d.ts.map +0 -1
  612. package/esm/utils/to-json.d.ts +0 -2
  613. package/esm/utils/to-json.d.ts.map +0 -1
  614. package/esm/utils/to-json.js +0 -26
  615. package/esm/utils/to-json.js.map +0 -1
  616. package/esm/utils/types.d.ts +0 -22
  617. package/esm/utils/types.d.ts.map +0 -1
  618. package/esm/utils/urls.d.ts +0 -21
  619. package/esm/utils/urls.d.ts.map +0 -1
  620. package/esm/utils/urls.js +0 -31
  621. package/esm/utils/urls.js.map +0 -1
  622. package/esm/validation/database/exists-except-current-id.d.ts +0 -7
  623. package/esm/validation/database/exists-except-current-id.d.ts.map +0 -1
  624. package/esm/validation/database/exists-except-current-id.js +0 -23
  625. package/esm/validation/database/exists-except-current-id.js.map +0 -1
  626. package/esm/validation/database/exists-except-current-user.d.ts +0 -7
  627. package/esm/validation/database/exists-except-current-user.d.ts.map +0 -1
  628. package/esm/validation/database/exists-except-current-user.js +0 -25
  629. package/esm/validation/database/exists-except-current-user.js.map +0 -1
  630. package/esm/validation/database/exists.d.ts +0 -7
  631. package/esm/validation/database/exists.d.ts.map +0 -1
  632. package/esm/validation/database/exists.js +0 -21
  633. package/esm/validation/database/exists.js.map +0 -1
  634. package/esm/validation/database/index.d.ts +0 -12
  635. package/esm/validation/database/index.d.ts.map +0 -1
  636. package/esm/validation/database/types.d.ts +0 -68
  637. package/esm/validation/database/types.d.ts.map +0 -1
  638. package/esm/validation/database/unique-except-current-id.d.ts +0 -7
  639. package/esm/validation/database/unique-except-current-id.d.ts.map +0 -1
  640. package/esm/validation/database/unique-except-current-id.js +0 -23
  641. package/esm/validation/database/unique-except-current-id.js.map +0 -1
  642. package/esm/validation/database/unique-except-current-user.d.ts +0 -7
  643. package/esm/validation/database/unique-except-current-user.d.ts.map +0 -1
  644. package/esm/validation/database/unique-except-current-user.js +0 -25
  645. package/esm/validation/database/unique-except-current-user.js.map +0 -1
  646. package/esm/validation/database/unique.d.ts +0 -7
  647. package/esm/validation/database/unique.d.ts.map +0 -1
  648. package/esm/validation/database/unique.js +0 -30
  649. package/esm/validation/database/unique.js.map +0 -1
  650. package/esm/validation/file/file.d.ts +0 -22
  651. package/esm/validation/file/file.d.ts.map +0 -1
  652. package/esm/validation/file/file.js +0 -60
  653. package/esm/validation/file/file.js.map +0 -1
  654. package/esm/validation/file/index.d.ts +0 -6
  655. package/esm/validation/file/index.d.ts.map +0 -1
  656. package/esm/validation/index.d.ts +0 -16
  657. package/esm/validation/index.d.ts.map +0 -1
  658. package/esm/validation/init.d.ts +0 -7
  659. package/esm/validation/init.d.ts.map +0 -1
  660. package/esm/validation/init.js +0 -34
  661. package/esm/validation/init.js.map +0 -1
  662. package/esm/validation/plugins/database-plugin.d.ts +0 -14
  663. package/esm/validation/plugins/database-plugin.d.ts.map +0 -1
  664. package/esm/validation/plugins/database-plugin.js +0 -95
  665. package/esm/validation/plugins/database-plugin.js.map +0 -1
  666. package/esm/validation/plugins/file-plugin.d.ts +0 -11
  667. package/esm/validation/plugins/file-plugin.d.ts.map +0 -1
  668. package/esm/validation/plugins/file-plugin.js +0 -17
  669. package/esm/validation/plugins/file-plugin.js.map +0 -1
  670. package/esm/validation/plugins/index.d.ts +0 -9
  671. package/esm/validation/plugins/index.d.ts.map +0 -1
  672. package/esm/validation/plugins/localized-plugin.d.ts +0 -11
  673. package/esm/validation/plugins/localized-plugin.d.ts.map +0 -1
  674. package/esm/validation/plugins/localized-plugin.js +0 -19
  675. package/esm/validation/plugins/localized-plugin.js.map +0 -1
  676. package/esm/validation/types.d.ts +0 -87
  677. package/esm/validation/types.d.ts.map +0 -1
  678. package/esm/validation/validateAll.d.ts +0 -7
  679. package/esm/validation/validateAll.d.ts.map +0 -1
  680. package/esm/validation/validateAll.js +0 -39
  681. package/esm/validation/validateAll.js.map +0 -1
  682. package/esm/validation/validators/file-validator.d.ts +0 -40
  683. package/esm/validation/validators/file-validator.d.ts.map +0 -1
  684. package/esm/validation/validators/file-validator.js +0 -94
  685. package/esm/validation/validators/file-validator.js.map +0 -1
  686. package/esm/validation/validators/index.d.ts +0 -7
  687. package/esm/validation/validators/index.d.ts.map +0 -1
  688. package/esm/warlock-config/default-configurations.d.ts +0 -3
  689. package/esm/warlock-config/default-configurations.d.ts.map +0 -1
  690. package/esm/warlock-config/default-configurations.js +0 -8
  691. package/esm/warlock-config/default-configurations.js.map +0 -1
  692. package/esm/warlock-config/define-config.d.ts +0 -3
  693. package/esm/warlock-config/define-config.d.ts.map +0 -1
  694. package/esm/warlock-config/define-config.js +0 -3
  695. package/esm/warlock-config/define-config.js.map +0 -1
  696. package/esm/warlock-config/index.d.ts +0 -4
  697. package/esm/warlock-config/index.d.ts.map +0 -1
  698. package/esm/warlock-config/types.d.ts +0 -79
  699. package/esm/warlock-config/types.d.ts.map +0 -1
  700. package/esm/warlock-config/warlock-config.manager.d.ts +0 -83
  701. package/esm/warlock-config/warlock-config.manager.d.ts.map +0 -1
  702. package/esm/warlock-config/warlock-config.manager.js +0 -141
  703. package/esm/warlock-config/warlock-config.manager.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"start.js","sources":["../../src/cli/start.ts"],"sourcesContent":[null],"names":[],"mappings":"2DAEA,MAAM,eAAe,GAAG,IAAI,kBAAkB,EAAE,CAAC;AACjD,MAAM,eAAe,CAAC,KAAK,EAAE"}
1
+ {"version":3,"sources":["../../../../../../../../warlock.js/core/src/bootstrap.ts","../../../../../../../../warlock.js/core/src/dev2-server/path.ts","../../../../../../../../warlock.js/core/src/dev2-server/dev-logger.ts","../../../../../../../../warlock.js/core/src/database/models/database-log/database-log.ts","../../../../../../../../warlock.js/core/src/utils/environment.ts","../../../../../../../../warlock.js/core/src/http/context/request-context.ts","../../../../../../../../warlock.js/core/src/utils/paths.ts","../../../../../../../../warlock.js/core/src/utils/urls.ts","../../../../../../../../warlock.js/core/src/dev2-server/tsconfig-manager.ts","../../../../../../../../warlock.js/core/src/dev2-server/transpile-file.ts","../../../../../../../../warlock.js/core/src/warlock-config/warlock-config.manager.ts","../../../../../../../../warlock.js/core/src/dev2-server/dependency-graph.ts","../../../../../../../../warlock.js/core/src/dev2-server/flags.ts","../../../../../../../../warlock.js/core/src/dev2-server/parse-imports.ts","../../../../../../../../warlock.js/core/src/dev2-server/file-event-handler.ts","../../../../../../../../warlock.js/core/src/dev2-server/events.ts","../../../../../../../../warlock.js/core/src/dev2-server/export-analyzer.ts","../../../../../../../../warlock.js/core/src/dev2-server/import-transformer.ts","../../../../../../../../warlock.js/core/src/dev2-server/utils.ts","../../../../../../../../warlock.js/core/src/dev2-server/file-manager.ts","../../../../../../../../warlock.js/core/src/dev2-server/file-operations.ts","../../../../../../../../warlock.js/core/src/dev2-server/files-watcher.ts","../../../../../../../../warlock.js/core/src/dev2-server/health-checker/file-health-result.ts","../../../../../../../../warlock.js/core/src/dev2-server/health-checker/checkers/base-health-checker.ts","../../../../../../../../warlock.js/core/src/dev2-server/health-checker/checkers/eslint-health-checker.ts","../../../../../../../../warlock.js/core/src/dev2-server/health-checker/checkers/typescript-health-checker.ts","../../../../../../../../warlock.js/core/src/dev2-server/create-worker.ts","../../../../../../../../warlock.js/core/src/dev2-server/health-checker/files-healthcare.manager.ts","../../../../../../../../warlock.js/core/src/dev2-server/manifest-manager.ts","../../../../../../../../warlock.js/core/src/config/config-getter.ts","../../../../../../../../warlock.js/core/src/validation/validateAll.ts","../../../../../../../../warlock.js/core/src/http/errors/resource-not-found.error.ts","../../../../../../../../warlock.js/core/src/http/middleware/inject-request-context.ts","../../../../../../../../warlock.js/core/src/react/index.ts","../../../../../../../../warlock.js/core/src/http/response.ts","../../../../../../../../warlock.js/core/src/image/image.ts","../../../../../../../../warlock.js/core/src/logger/logger.ts","../../../../../../../../warlock.js/core/src/mail/config.ts","../../../../../../../../warlock.js/core/src/mail/mailer-pool.ts","../../../../../../../../warlock.js/core/src/config/config-special-handlers.ts","../../../../../../../../warlock.js/core/src/config/config-handlers.ts","../../../../../../../../warlock.js/core/src/storage/config.ts","../../../../../../../../warlock.js/core/src/storage/storage-file.ts","../../../../../../../../warlock.js/core/src/storage/scoped-storage.ts","../../../../../../../../warlock.js/core/src/storage/context/storage-driver-context.ts","../../../../../../../../warlock.js/core/src/storage/utils/mime.ts","../../../../../../../../warlock.js/core/src/storage/drivers/cloud-driver.ts","../../../../../../../../warlock.js/core/src/storage/drivers/do-spaces-driver.ts","../../../../../../../../warlock.js/core/src/storage/drivers/local-driver.ts","../../../../../../../../warlock.js/core/src/storage/drivers/r2-driver.ts","../../../../../../../../warlock.js/core/src/storage/drivers/s3-driver.ts","../../../../../../../../warlock.js/core/src/storage/storage.ts","../../../../../../../../warlock.js/core/src/http/uploads-config.ts","../../../../../../../../warlock.js/core/src/http/uploaded-file.ts","../../../../../../../../warlock.js/core/src/http/request.ts","../../../../../../../../warlock.js/core/src/router/route-registry.ts","../../../../../../../../warlock.js/core/src/router/router.ts","../../../../../../../../warlock.js/core/src/dev2-server/module-loader.ts","../../../../../../../../warlock.js/core/src/dev2-server/package-json-manager.ts","../../../../../../../../warlock.js/core/src/dev2-server/runtime-import-helper.ts","../../../../../../../../warlock.js/core/src/dev2-server/special-files-collector.ts","../../../../../../../../warlock.js/core/src/dev2-server/files-orchestrator.ts","../../../../../../../../warlock.js/core/src/config/config-loader.ts","../../../../../../../../warlock.js/core/src/config/config-manager.ts","../../../../../../../../warlock.js/core/src/config/load-config-files.ts","../../../../../../../../warlock.js/core/src/dev2-server/connectors/base-connector.ts","../../../../../../../../warlock.js/core/src/dev2-server/connectors/cache-connector.ts","../../../../../../../../warlock.js/core/src/dev2-server/connectors/database-connector.ts","../../../../../../../../warlock.js/core/src/http/plugins.ts","../../../../../../../../warlock.js/core/src/http/server.ts","../../../../../../../../warlock.js/core/src/dev2-server/connectors/http-connector.ts","../../../../../../../../warlock.js/core/src/dev2-server/connectors/storage.connector.ts","../../../../../../../../warlock.js/core/src/dev2-server/connectors/connectors-manager.ts","../../../../../../../../warlock.js/core/src/manifest/manifest-manager.ts","../../../../../../../../warlock.js/core/src/cli/cli-commands.utils.ts","../../../../../../../../warlock.js/core/src/cli/commands-loader.ts","../../../../../../../../warlock.js/core/src/generations/add-command.action.ts","../../../../../../../../warlock.js/core/src/cli/cli-command.ts","../../../../../../../../warlock.js/core/src/cli/commands/add.command.ts","../../../../../../../../warlock.js/core/src/production/esbuild-plugins.ts","../../../../../../../../warlock.js/core/src/production/production-builder.ts","../../../../../../../../warlock.js/core/src/production/build-app-production.ts","../../../../../../../../warlock.js/core/src/cli/commands/build.command.ts","../../../../../../../../warlock.js/core/src/dev2-server/layer-executor.ts","../../../../../../../../warlock.js/core/src/dev2-server/type-generator.ts","../../../../../../../../warlock.js/core/src/dev2-server/development-server.ts","../../../../../../../../warlock.js/core/src/dev2-server/start-development-server.ts","../../../../../../../../warlock.js/core/src/cli/commands/dev-server.command.ts","../../../../../../../../warlock.js/core/src/database/migrate-action.ts","../../../../../../../../warlock.js/core/src/cli/commands/migrate.command.ts","../../../../../../../../warlock.js/core/src/database/seeds/utils.ts","../../../../../../../../warlock.js/core/src/database/seeds/seeds-table-migration.ts","../../../../../../../../warlock.js/core/src/database/seeds/seeders.manager.ts","../../../../../../../../warlock.js/core/src/database/seed-command-action.ts","../../../../../../../../warlock.js/core/src/cli/commands/seed.command.ts","../../../../../../../../warlock.js/core/src/cli/commands/start-production.command.ts","../../../../../../../../warlock.js/core/src/cli/commands/typings-generator.command.ts","../../../../../../../../warlock.js/core/src/cli/framework-cli-commands.ts","../../../../../../../../warlock.js/core/src/cli/parse-cli-args.ts","../../../../../../../../warlock.js/core/src/cli/string-similarity.ts","../../../../../../../../warlock.js/core/src/cli/cli-commands.manager.ts","../../../../../../../../warlock.js/core/src/cli/start.ts"],"names":["bootstrap","loadEnv","initializeDayjs","captureAnyUnhandledRejection","Path","absolutePath","path","relativePath","filePath","paths","ext","timestamp","colors","dayjs","devLog","message","devLogSuccess","devLogError","error","cleanStack","cleanErrorStack","devLogWarn","devLogInfo","devLogDim","devLogHMR","file","dependents","depInfo","devLogReady","devLogSection","title","stack","line","cleanedLine","match","p1","absolutePathMatch","formatModuleNotFoundError","suggestions","modulePath","importerPath","cleanModulePath","m","cleanImporterPath","relativeModule","relativeImporter","lines","devServeLog","v","environment","RequestContext","Context","payload","requestContext","contextManager","rootPath","srcPath","storagePath","appPath","invalidCharsRegex","sanitizePath","warlockPath","baseUrl","setBaseUrl","url","rtrim","ltrim","TSConfigManager","output","ts","alias","aliasPattern","aliasTargets","checkingPath","aliasKey","targetPattern","targetBase","relativePart","resolvedPath","tsconfigManager","transpileFile","fileManager","transpile","sourceCode","transpiled","transform","WarlockConfigManager","configPath","fileExistsAsync","fileUrl","pathToFileURL","content","getFileAsync","compiledContent","putFileAsync","key","defaultValue","get","warlockConfigManager","DependencyGraph","files","dependency","cycles","deps","dependent","newDependencies","oldDependencies","oldDep","newDep","chain","visited","traverse","current","dep","recursionStack","dfs","cycleStart","cycle","text","index","fileIndex","isLast","arrow","fileName","totalDependencies","maxDependencies","maxDependents","mostDependedFile","mostDependingFile","MANIFEST_PATH","FILE_PROCESSING_BATCH_SIZE","extractImportPathsWithRegex","source","imports","seenPaths","isTypeOnlyImport","trimmed","hasRuntimeImports","specifiersMatch","s","item","importRegex","fullMatch","importPath","sideEffectRegex","dynamicImportPattern","exportFromPattern","parseImports","parse","resolveImports","regexImports","resolvedImports","isNodeBuiltin","resolveAliasImport","resolveRelativeImport","imp","resolvedBase","tryResolveWithExtensions","currentFilePath","dir","fileExistsCache","clearFileExistsCache","cachedFileExists","exists","basePath","normalizedBase","extensions","validExtensions","pathsToCheck","extension","results","p","result","isDirectoryAsync","indexPaths","indexResults","builtins","moduleName","FileEventHandler","fileOperations","manifest","dependencyGraph","debounce","changes","adds","deletes","resolve","events","relativePaths","BATCH_SIZE","i","batch","batchSet","validFiles","f","orderedFiles","fileMap","inDegree","graph","queue","dependentPath","newDegree","dependentFile","DEV_SERVER_EVENTS","ExportAnalyzer","cacheKey","info","sourceText","sourceFile","visit","node","element","exportName","declaration","mod","exportAnalyzer","transformImports","code","sideEffectImportRegex","exportRegex","transformedCode","unresolvedImports","importMatches","fullImport","importSpecifier","isRelativeImport","isAliasImport","cachePath","findCachePathForImport","newImport","buildImportReplacement","startIndex","endIndex","sideEffectMatches","exportMatches","fullExport","exportSpecifier","resolvedAbsPath","targetFileManager","filesOrchestrator","newExport","exportInfo","moduleVar","statements","exportStatements","name","defaultImport","namedImports","normalized","createFreshWarlockDirectory","cacheDirectory","removeDirectoryAsync","createDirectoryAsync","getFilesFromDirectory","directoryPath","pattern","glob","getCertainFilesFromDirectory","filesNames","warlockCachePath","areSetsEqual","set1","set2","FileManager","fileManifest","options","force","shouldTransform","saveToCache","newSource","newHash","crypto","lastModifiedAsync","absPath","currentHash","FileOperations","specialFilesCollector","depPath","newFilePath","potentialDependents","existingPath","existingFile","importMap","_importPath","unlinkAsync","DEFAULT_EXCLUDE","FilesWatcher","Random","config","ignored","watcher","chokidar","event","callback","FileHealthResult","messages","BaseHealthChecker","stats","isHealthy","EslintHealthChecker","flatConfigPath","flatConfigMjsPath","flatConfigCjsPath","fs","ESLint","errorCount","warningCount","sourceLines","errorMessages","icon","level","ruleId","lineIndex","lineContent","lineNum","errorLength","columnIndex","prefixPadding","columnPadding","underline","warningMessages","warning","warningLength","summary","lintResults","lintResult","errors","warnings","isError","isWarning","TypescriptHealthChecker","diagnostic","character","cleanMessage","syntacticDiagnostics","semanticDiagnostics","allDiagnostics","location","createWorker","workerPath","isDevServerCore","env","workerUrl","workerFilePath","fileURLToPath","workerOptions","Worker","FilesHealthcareManager","checkers","initPromises","checker","worker","initPromise","handler","response","allFiles","checkPromises","checkerResults","checkerName","serializedFiles","healthResult","c","deletedPaths","allStats","totalFiles","hasIssues","statusIcon","filesLine","warningsText","errorsText","ManifestManager","getJsonFileAsync","total","baseConfig","resolveDataToParse","validating","request","data","validatingType","merge","validateAll","validation","log","ResourceNotFoundError","UnAuthorizedError","ForbiddenError","BadRequestError","ServerError","createRequestStore","httpContextStore","handleRequestError","DatabaseWriterValidationError","REACT_INSTALL_INSTRUCTIONS","moduleExists","react","reactDomServer","loadReactModules","renderReact","reactElement","Response","_Response","body","route","contentType","listener","args","value","isScalar","isIterable","values","isPlainObject","subValue","statusCode","triggerEvents","status","isEnded","chunks","html","id","headers","defaultFilename","cacheControl","ifNoneMatch","disposition","filename","opts","lastModified","etag","ifModifiedSince","modifiedSinceDate","stream","buffer","image","metadata","format","width","height","cacheTime","mime","inputKey","inputError","SHARP_INSTALL_INSTRUCTIONS","sharpFn","loadSharpModule","Image","_Image","axios","operation","sharpenOptions","negateOptions","trimOptions","quality","alpha","alphaPixel","buffers","input","formatOptions","originalFormat","compressionLevel","configs","angle","sigma","mimeType","base64","color","clonedImage","setLogConfigurations","channels","envChannels","defaultChannels","logger","setMailConfigurations","nodemailerModule","loadNodemailerModule","ConfigSpecialHandlers","configName","configSpecialHandlers","registerAppConfig","locales","locale","registerLogConfig","logConfig","registerMailConfig","mailConfig","storageConfig","StorageFile","_StorageFile","driver","basename","extname","dirname","expiresIn","destination","newName","newPath","visibility","storageClass","ScopedStorage","dataUrl","matches","base64Data","locations","from","to","fromPath","concurrency","filesToCopy","copied","count","filePaths","directory","chunk","prefix","suffix","lastDot","StorageDriverContext","storageDriverContext","getMimeType","S3Client","S3Storage","S3Presigner","isModuleExists","S3_INSTALL_INSTRUCTIONS","loadS3","CloudDriver","cleanPrefix","cleanLocation","operationName","maxRetries","initialDelayMs","backoffMultiplier","maxDelayMs","lastError","attempt","delayMs","PutObjectCommand","hash","command","Upload","GetObjectCommand","DeleteObjectCommand","DeleteObjectsCommand","prefixedLocations","loc","Key","deleted","hasMore","objects","obj","HeadObjectCommand","getSignedUrl","CopyObjectCommand","headCommand","headResult","ListObjectsV2Command","object","PutObjectAclCommand","GetObjectAclCommand","grant","DOSpacesDriver","LocalDriver","ensureDirectoryAsync","fileBuffer","writeFile","stat","writeStream","createWriteStream","pipeline","readFile","createReadStream","token","exp","sig","json","now","expectedSig","sigBuffer","expectedBuffer","toPath","copyFile","rename","entries","readdir","entry","entryPath","join","entryStats","subFiles","prefixedLocation","R2Driver","S3Driver","Storage","defaultName","contextDriver","drivers","apepndedPath","instance","arrayBuffer","driverName","required","field","resolver","storage","UPLOADS_DEFAULTS","uploadsConfig","fallback","UploadedFile","fileData","dimensions","degrees","allowedMimeTypes","allowedExtensions","maxSize","fileSize","storageInstance","finalLocation","img","namingStrategy","baseName","length","configPrefix","parts","combined","as","formatted","currentExt","Request","trans","localeCode","transFrom","keyword","placeholders","defaultLocaleCode","selectedInputs","domain","authorization","type","arrayOfObjectValues","isArrayKey","keyParts","keyName","keyNameParts","keyName2","set","eventName","middlewareOutput","inputs","only","except","middlewares","middleware","middlewaresList","keys","unset","bodyInputs","heavyInputs","isEmpty","realIp","RouteRegistry","FindMyWay","routes","req","res","params","method","Router","_Router","redirectMode","_request","_router","server","proxy","concatRoute","prefixName","trim","controller","action","routeData","resource","baseResourceName","toCamelCase","routeResource","isAcceptableResource","resourceName","methodValidation","validationMethods","requestMethod","requestMethodFunction","baseRequest","reply","directoryOptions","fastifyStatic","wildcardHandler","fastifyRequest","fastifyReply","routeRegistry","methods","fastifyResponse","router","ModuleLoader","mainFiles","localeFiles","eventFiles","routeFiles","bustCache","module","cleanupFunction","fn","moduleType","absolutePaths","PackageJsonManager","packageName","packageJsonManager","moduleVersions","loadingModules","modulePromises","normalizePath","useModuleVersion","cleanPath","__import","existingPromise","importPromise","cleanups","exportedValue","cleanup","__clearModuleVersion","__clearAllModuleVersions","__getModuleVersion","initializeRuntimeImportHelper","SpecialFilesCollector","a","b","pathA","pathB","FilesOrchestrator","init","filesInFilesystem","manifestExists","filesToCheck","filesToDelete","typescriptHealthChecker","eslintHealthChecker","filesInManifest","filesInFilesystemSet","newFiles","deletedFiles","existingFiles","newText","deletedText","existingText","manifestEntry","manifestData","watchConfig","ConfigLoader","configFiles","configValue","ConfigManager","configManager","loadConfigFiles","BaseConnector","changedFiles","watchedFile","CacheConnector","cacheConfig","cache","DatabaseConnector","databaseConfig","connectToDatabase","dataSources","dataSourceRegistry","dataSource","defaultCorsOptions","registerHttpPlugins","corsOptions","fastifyMultipart","startServer","Fastify","getServer","HttpConnector","httpConfig","port","StorageConnector","ConnectorsManager","connector","connectorsNames","isShuttingDown","gracefulShutdown","signal","connectorsManager","putJsonFileAsync","manifestManager","isMatchingCommandName","commandName","targetingCommandName","cachedVersion","getWarlockVersion","version","displayWarlockVersionInTerminal","getTextColorMethod","displayStartupBanner","textColorMethod","displayExecutingCommand","displayCommandNotFound","suggestion","displayMissingCommand","displayCommandSuccess","durationMs","duration","displayCommandError","displayMissingOptions","opt","displayHelp","commands","grouped","cmd","groupLabels","cmds","maxLen","aliasStr","nameWithAlias","padding","desc","globalFlags","maxFlagLen","flag","description","displayCommandHelp","o","CLICommandsLoader","relativeFiles","relativeFile","cliCommandsLoader","featuresMap","allowedFeatures","addCommandAction","features","packageManager","list","feature","validateFeatures","packageManagerCommand","getPackageManagerCommand","dependencies","devDependencies","featurePackages","execSync","detectPackageManager","CLICommand","isPersistent","option","part","first","second","equalIndex","spaceIndex","commandInstnace","addCommand","nativeNodeModulesPlugin","build","__require","ProductionBuilder","main","appDirectory","configDirectory","configNames","configImports","configSetCalls","executors","varName","importPaths","outputFile","entryPoint","outfile","esbuild","buildAppProduction","buildCommand","LayerExecutor","moduleLoader","changedPaths","filesMap","fileSystem","allInvalidatedFiles","fsrFiles","hmrFiles","invalidationChain","dependentCount","firstHmrFile","changedFile","configFile","affectedFiles","connectorsToRestart","isAffected","affectedMainFiles","affectedRouteFiles","affectedEventFiles","affectedLocaleFiles","isEnvFileAffected","affectedConfigFiles","lastFileInChain","TypeGenerator","storageFile","storageExists","configExists","storageConfigPath","configChanged","unchangedCount","driverKeys","sourceHash","interfaceContent","k","outputPath","changedPath","configDir","configTypeInfos","allKeys","importStatements","types","configEntries","keyEntries","importedTypes","localExportedTypes","foundTypeName","visitForTypes","moduleSpecifier","importClause","visitKeys","objNode","prop","fullKey","typeName","importSource","possiblePaths","fullPath","access","constants","isDevServeCore","spawn","upcomingFiles","configFilesOnly","typeGenerator","DevelopmentServer","parseDuration","diffInMilliseconds","startDevelopmentServer","devServer","devServerCommand","listMigrationsAction","createdMigrations","migrationRunner","migration","executedAt","createdAt","allMigrationsFilesAction","migrationFiles","migrateAction","fresh","rollback","all","loadMigrationFile","loadAllMigrations","loadedModule","MigrationClass","separateMigrationsFolderFIles","migrations","migrationFile","migrateCommand","seedsTableName","SeedsTableMigration","Migration","SeedersManager","seeders","successCount","skippedCount","failedCount","seeder","startTime","err","orderA","orderB","oldResult","clearAllTables","datasource","tables","table","seedCommandAction","seeds","loadSeedFile","listSeedsFiles","seedersManager","seedsFiles","seedFile","seed","seedImport","seedCommand","startProductionCommand","buildConfig","outDir","outFile","nodeArgs","arg","extraArgs","child","forwardSignal","typingsGeneratorCommand","configFilesPaths","failed","r","frameworkCommands","parseCliArgs","argv","potentialCommand","isFirstArgOption","withoutDashes","nextArg","flags","levenshteinDistance","str1","str2","s1","s2","len1","len2","matrix","_","j","cost","findSimilar","candidates","maxDistance","maxResults","candidate","distance","CLICommandsManager","commandKey","realName","names","manifestCommands","isHelpCommand","allCommandNames","helpCommands","projectCommands","jsonCommandsFile","fullCommandName","cmdMeta","commandPath","executedCommand","missing","missingOptions","preloaders","commandsManager"],"mappings":"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","file":"start.js","sourcesContent":["import { loadEnv } from \"@mongez/dotenv\";\nimport { initializeDayjs } from \"@mongez/time-wizard\";\nimport { captureAnyUnhandledRejection } from \"@warlock.js/logger\";\n\nexport async function bootstrap() {\n await loadEnv();\n\n initializeDayjs();\n captureAnyUnhandledRejection();\n}\n","import path from \"node:path\";\n\nexport class Path {\n /**\n * Convert the given absolute path to a relative path\n */\n public static toRelative(absolutePath: string) {\n return this.normalize(path.relative(process.cwd(), absolutePath));\n }\n\n /**\n * Get relative path of the given path\n */\n public static relative(relativePath: string) {\n return this.normalize(path.relative(process.cwd(), relativePath));\n }\n\n /**\n * Get normalized absolute path of the given path\n */\n public static toNormalizedAbsolute(relativePath: string) {\n return this.normalize(path.resolve(process.cwd(), relativePath));\n }\n\n /**\n * Get absolute path of the given path\n */\n public static toAbsolute(relativePath: string) {\n return this.normalize(path.resolve(process.cwd(), relativePath));\n }\n\n /**\n * Normalize the given path (convert backslashes to forward slashes)\n */\n public static normalize(filePath: string) {\n return filePath.replace(/\\\\/g, \"/\");\n }\n\n /**\n * Join paths and normalize\n */\n public static join(...paths: string[]) {\n return this.normalize(path.join(...paths));\n }\n\n /**\n * Get directory name of a path\n */\n public static dirname(filePath: string) {\n return this.normalize(path.dirname(filePath));\n }\n\n /**\n * Get base name of a path\n */\n public static basename(filePath: string, ext?: string) {\n return path.basename(filePath, ext);\n }\n\n /**\n * Get extension of a path\n */\n public static extname(filePath: string) {\n return path.extname(filePath);\n }\n}\n","import { colors } from \"@mongez/copper\";\r\nimport dayjs from \"dayjs\";\r\nimport { Path } from \"./path\";\r\n\r\n/**\r\n * Dev server logger with Vite-like formatting\r\n */\r\n\r\n// Timestamp formatter\r\nfunction timestamp(): string {\r\n return colors.dim(`${dayjs().format(\"HH:mm:ss A\")}`);\r\n}\r\n\r\n// Main log function\r\nexport function devLog(message: string) {\r\n console.log(`${timestamp()} ${message}`);\r\n}\r\n\r\n// Success log (green checkmark)\r\nexport function devLogSuccess(message: string) {\r\n console.log(`${timestamp()} ${colors.green(\"✓\")} ${colors.green(message)}`);\r\n}\r\n\r\n// Error log (red X)\r\nexport function devLogError(message: string, error?: any) {\r\n console.log(`${timestamp()} ${colors.red(\"✗\")} ${colors.red(message)}`);\r\n if (error && error.stack) {\r\n // Clean up error stack to show relative paths\r\n const cleanStack = cleanErrorStack(error.stack);\r\n console.log(colors.dim(cleanStack));\r\n }\r\n}\r\n\r\n// Warning log (yellow)\r\nexport function devLogWarn(message: string) {\r\n console.log(`${timestamp()} ${colors.yellow(\"⚠\")} ${colors.yellow(message)}`);\r\n}\r\n\r\n// Info log (cyan)\r\nexport function devLogInfo(message: string) {\r\n console.log(`${timestamp()} ${colors.cyan(message)}`);\r\n}\r\n\r\n// Dim log (for less important info)\r\nexport function devLogDim(message: string) {\r\n console.log(`${timestamp()} ${colors.dim(message)}`);\r\n}\r\n\r\n// HMR update log (like Vite)\r\nexport function devLogHMR(file: string, dependents?: number) {\r\n const relativePath = Path.toRelative(file);\r\n const depInfo = dependents\r\n ? colors.dim(` +${dependents} module${dependents > 1 ? \"s\" : \"\"}`)\r\n : \"\";\r\n // console.log(`${timestamp()} ✨ ${colors.green(\"hmr update\")}✨ ${colors.dim(relativePath)}${depInfo}`);\r\n console.log(\r\n `${timestamp()} 🔥 ${colors.green(\"hmr update\")} ${colors.dim(relativePath)}${depInfo}`,\r\n );\r\n}\r\n\r\n// FSR log\r\nexport function devLogFSR(reason: string) {\r\n console.log(`${timestamp()} ${colors.yellow(\"full restart\")} ${colors.dim(reason)}`);\r\n}\r\n\r\n// Config reload log\r\nexport function devLogConfig(file: string, connectors?: string[]) {\r\n const relativePath = Path.toRelative(file);\r\n const connectorInfo =\r\n connectors && connectors.length > 0 ? colors.dim(` → restarting ${connectors.join(\", \")}`) : \"\";\r\n console.log(\r\n `${timestamp()} ${colors.cyan(\"config reload\")} ${colors.dim(relativePath)}${connectorInfo}`,\r\n );\r\n}\r\n\r\n// Ready log (like Vite's ready message)\r\nexport function devLogReady(message: string) {\r\n console.log(`\\n${timestamp()} ${colors.green(\"➜\")} ${colors.bold(message)}`);\r\n}\r\n\r\n// Section header\r\nexport function devLogSection(title: string) {\r\n console.log(`\\n${timestamp()} ${colors.bold(colors.cyan(title))}`);\r\n}\r\n\r\n// Clean error stack to show relative paths instead of absolute cache paths\r\nfunction cleanErrorStack(stack: string): string {\r\n const lines = stack.split(\"\\n\");\r\n const cleaned = lines.map((line) => {\r\n // Replace absolute cache paths with relative source paths\r\n // Pattern: D:\\...\\dev-server\\.warlock\\cache\\src-app-users-main.js\r\n // Replace with: src/app/users/main.ts\r\n\r\n let cleanedLine = line;\r\n\r\n // Remove cache directory references\r\n cleanedLine = cleanedLine.replace(/\\.warlock[\\\\\\/]cache[\\\\\\/]/g, \"\");\r\n\r\n // Convert cache file names back to source paths\r\n // src-app-users-main.js → src/app/users/main.ts\r\n cleanedLine = cleanedLine.replace(/([a-zA-Z0-9_-]+(?:-[a-zA-Z0-9_-]+)+)\\.js/g, (match, p1) => {\r\n const sourcePath = p1.replace(/-/g, \"/\") + \".ts\";\r\n return sourcePath;\r\n });\r\n\r\n // Make paths relative\r\n try {\r\n const absolutePathMatch = cleanedLine.match(/([A-Z]:\\\\[^:]+|\\/[^:]+)(?=:|\\))/);\r\n if (absolutePathMatch) {\r\n const absolutePath = absolutePathMatch[1];\r\n const relativePath = Path.toRelative(absolutePath);\r\n cleanedLine = cleanedLine.replace(absolutePath, relativePath);\r\n }\r\n } catch {\r\n // If path conversion fails, keep original\r\n }\r\n\r\n return cleanedLine;\r\n });\r\n\r\n return cleaned.join(\"\\n\");\r\n}\r\n\r\n// Format module not found errors with enhanced context\r\nexport function formatModuleNotFoundError(error: Error, suggestions?: string[]): string {\r\n const message = error.message;\r\n\r\n // Extract paths from error message\r\n // Pattern: Cannot find module 'D:\\...\\cache\\src-app-users-utils.js' imported from 'D:\\...\\main.js'\r\n const match = message.match(/Cannot find module '([^']+)' imported from '([^']+)'/);\r\n\r\n if (match) {\r\n const [, modulePath, importerPath] = match;\r\n\r\n // Convert cache paths to source paths\r\n const cleanModulePath = modulePath\r\n .replace(/\\.warlock[\\\\\\/]cache[\\\\\\/]/, \"\")\r\n .replace(\r\n /([a-zA-Z0-9_-]+(?:-[a-zA-Z0-9_-]+)+)\\.js/,\r\n (m, p1) => p1.replace(/-/g, \"/\") + \".ts\",\r\n );\r\n\r\n const cleanImporterPath = importerPath\r\n .replace(/\\.warlock[\\\\\\/]cache[\\\\\\/]/, \"\")\r\n .replace(\r\n /([a-zA-Z0-9_-]+(?:-[a-zA-Z0-9_-]+)+)\\.js/,\r\n (m, p1) => p1.replace(/-/g, \"/\") + \".ts\",\r\n );\r\n\r\n // Make paths relative\r\n const relativeModule = Path.toRelative(cleanModulePath);\r\n const relativeImporter = Path.toRelative(cleanImporterPath);\r\n\r\n // Build formatted message\r\n const lines: string[] = [\r\n \"\",\r\n `${colors.red(\"❌ MODULE NOT FOUND\")}`,\r\n \"\",\r\n `${colors.dim(\"Cannot find:\")} ${colors.cyan(relativeModule)}`,\r\n \"\",\r\n `${colors.dim(\"Imported by:\")}`,\r\n ` ${colors.yellow(\"→\")} ${colors.white(relativeImporter)}`,\r\n ];\r\n\r\n // Add suggestions if provided\r\n if (suggestions && suggestions.length > 0) {\r\n lines.push(\"\");\r\n lines.push(`${colors.dim(\"Did you mean?\")}`);\r\n suggestions.forEach((s) => {\r\n lines.push(` ${colors.cyan(\"→\")} ${colors.green(s)}`);\r\n });\r\n }\r\n\r\n lines.push(\"\");\r\n\r\n return lines.join(\"\\n\");\r\n }\r\n\r\n return message;\r\n}\r\n\r\n// Legacy function for backward compatibility\r\nexport function devServeLog(message: string) {\r\n devLog(message);\r\n}\r\n","import { Model } from \"@warlock.js/cascade\";\r\nimport { Infer, v } from \"@warlock.js/seal\";\r\n\r\nconst schema = v.object({\r\n module: v.string(),\r\n action: v.string(),\r\n message: v.string(),\r\n trace: v.record(v.any()),\r\n level: v.string(),\r\n});\r\n\r\ntype LogSchema = Infer<typeof schema>;\r\n\r\nexport class DatabaseLogModel extends Model<LogSchema> {\r\n /**\r\n * Table name\r\n */\r\n public static table = \"logs\";\r\n\r\n /**\r\n * {@inheritdoc}\r\n */\r\n public static schema = schema;\r\n}\r\n","export type Environment = \"development\" | \"production\" | \"test\";\r\n\r\nexport function environment(): Environment {\r\n return (process.env.NODE_ENV as Environment) || \"development\";\r\n}\r\n\r\nexport function setEnvironment(env: Environment) {\r\n process.env.NODE_ENV = env;\r\n}\r\n","import type { Model } from \"@warlock.js/cascade\";\nimport { Context, contextManager } from \"@warlock.js/context\";\nimport type { Request } from \"../request\";\nimport type { Response } from \"../response\";\n\n/**\n * Request Context Store\n */\nexport type RequestContextStore<User extends Model = Model> = {\n request: Request<User>;\n response: Response;\n};\n\n/**\n * Request Context\n *\n * Manages request-scoped data (request, response, user) using AsyncLocalStorage.\n * Extends the base Context class for consistent API.\n */\nclass RequestContext<User extends Model = Model> extends Context<RequestContextStore<User>> {\n /**\n * Get the current request\n */\n public getRequest(): Request<User> | undefined {\n return this.get(\"request\");\n }\n\n /**\n * Get the current response\n */\n public getResponse(): Response | undefined {\n return this.get(\"response\");\n }\n\n /**\n * Get the current user\n */\n public getUser(): User | undefined {\n return this.getRequest()?.user;\n }\n\n /**\n * Build the initial request store from HTTP context\n */\n public buildStore(payload?: Record<string, any>): RequestContextStore<User> {\n return {\n request: payload?.request,\n response: payload?.response,\n };\n }\n}\n\n/**\n * Global request context instance\n */\nexport const requestContext = new RequestContext();\n\ncontextManager.register(\"request\", requestContext);\n\n/**\n * Use request store (for backward compatibility)\n */\nexport function useRequestStore<UserType extends Model = Model>() {\n return (requestContext.getStore() || {}) as RequestContextStore<UserType>;\n}\n\nexport function useRequest<UserType extends Model = Model>() {\n return requestContext.getRequest() as Request<UserType>;\n}\n\nexport function useCurrentUser<UserType extends Model = Model>() {\n return requestContext.getUser() as UserType;\n}\n","import config from \"@mongez/config\";\r\nimport path from \"path\";\r\n\r\n/**\r\n * Get root path or join the given paths to the root path\r\n */\r\nexport function rootPath(...paths: string[]) {\r\n return path.resolve(process.cwd(), ...paths);\r\n}\r\n\r\n/**\r\n * Get src directory path or join the given paths to the src directory path\r\n */\r\nexport function srcPath(...paths: string[]) {\r\n return rootPath(\"src\", ...paths);\r\n}\r\n\r\n/**\r\n * Get the absolute path to the storage folder to the given path\r\n *\r\n * If no path is given, it will return the absolute path to the storage folder\r\n */\r\nexport function storagePath(relativePath = \"\") {\r\n return rootPath(\"storage\", relativePath);\r\n}\r\n\r\n/**\r\n * Get the absolute path to the uploads folder to the given path\r\n *\r\n * If no path is given, it will return the absolute path to the uploads folder\r\n */\r\nexport function uploadsPath(relativePath = \"\") {\r\n const configPath = config.get(\"uploads.root\");\r\n if (!configPath) {\r\n return rootPath(\"storage\", \"uploads\", relativePath);\r\n }\r\n\r\n return typeof configPath === \"function\"\r\n ? configPath(relativePath)\r\n : path.resolve(configPath, relativePath);\r\n}\r\n\r\n/**\r\n * Get the absolute path to the public folder to the given path\r\n *\r\n * If no path is given, it will return the absolute path to the public folder\r\n */\r\nexport function publicPath(relativePath = \"\") {\r\n return rootPath(\"public\", relativePath);\r\n}\r\n\r\n/**\r\n * Get the absolute path to the cache folder to the given path\r\n *\r\n * If no path is given, it will return the absolute path to the cache folder\r\n */\r\nexport function cachePath(relativePath = \"\") {\r\n return rootPath(\"storage\", \"cache\", relativePath);\r\n}\r\n\r\n/**\r\n * App path\r\n */\r\nexport function appPath(relativePath = \"\") {\r\n return rootPath(\"src/app\", relativePath);\r\n}\r\n\r\n/**\r\n * Console path\r\n */\r\nexport function consolePath(relativePath = \"\") {\r\n return rootPath(\"src/console\", relativePath);\r\n}\r\n\r\n/**\r\n * Get a temp path\r\n */\r\nexport function tempPath(relativePath = \"\") {\r\n return rootPath(\"storage/temp\", relativePath);\r\n}\r\n\r\n/**\r\n * Remove any invalid characters from the file path using regex\r\n * It should accept any language character, numbers, and the following characters: _ - .\r\n */\r\nconst invalidCharsRegex = /[<>:\"/\\\\|?*]/g; // Regex to match invalid characters\r\nexport function sanitizePath(filePath: string) {\r\n return filePath.replace(invalidCharsRegex, \"\"); // Replace invalid characters with an empty string\r\n}\r\n\r\n/**\r\n * Warlock path\r\n * PLEASE DO NOT add any files in this directory as it may be deleted\r\n */\r\nexport function warlockPath(...path: string[]) {\r\n return rootPath(\".warlock\", ...path);\r\n}\r\n\r\n/**\r\n * Get config directory path\r\n */\r\nexport function configPath(...path: string[]) {\r\n return rootPath(\"src/config\", ...path);\r\n}\r\n","import { ltrim, rtrim } from \"@mongez/reinforcements\";\r\n\r\nlet baseUrl = \"\";\r\n\r\n/**\r\n * Set base url\r\n */\r\nexport function setBaseUrl(url: string) {\r\n baseUrl = url;\r\n}\r\n\r\n/**\r\n * Get full path for the given path\r\n */\r\nexport function url(path = \"\") {\r\n return rtrim(baseUrl, \"/\") + \"/\" + ltrim(path, \"/\");\r\n}\r\n\r\n/**\r\n * Get uploads url\r\n */\r\nexport function uploadsUrl(path = \"\") {\r\n return url(\"/uploads/\" + ltrim(path, \"/\"));\r\n}\r\n\r\n/**\r\n * Get full path for the given path related to public route\r\n */\r\nexport function publicUrl(path = \"\") {\r\n return url(\"/public/\" + ltrim(path, \"/\"));\r\n}\r\n\r\n/**\r\n * Assets url\r\n */\r\nexport function assetsUrl(path = \"\") {\r\n return publicUrl(\"/assets/\" + ltrim(path, \"/\"));\r\n}\r\n","import path from \"node:path\";\nimport ts from \"typescript\";\nimport { Path } from \"./path\";\n\nexport class TSConfigManager {\n /**\n * Aliases list (from tsconfig paths)\n */\n public aliases: Record<string, string[]> = {};\n\n /**\n * Base URL for resolving paths\n */\n public baseUrl: string = \".\";\n\n /**\n * TSConfig\n */\n public tsconfig: any;\n\n public init() {\n if (this.tsconfig) return;\n\n // use typescript to load the tsconfig.json file\n const output = ts.readConfigFile(Path.toAbsolute(\"tsconfig.json\"), ts.sys.readFile);\n\n this.tsconfig = output.config!;\n\n this.aliases = output.config?.compilerOptions?.paths || {};\n\n this.baseUrl = output.config?.compilerOptions?.baseUrl || \".\";\n }\n\n /**\n * Check if the given path is an alias\n * This checks if it's a REAL path alias (not an external package alias)\n *\n * Real aliases map to local paths (e.g., app/* -> src/app/*, src/* -> src/*)\n * External package aliases map to themselves with @ prefix (e.g., @warlock.js/core -> @warlock.js/core)\n */\n public isAlias(path: string) {\n if (!this.tsconfig) {\n this.init();\n }\n\n return Object.keys(this.aliases).some((alias) => {\n // Remove /* from alias pattern for matching\n const aliasPattern = alias.replace(\"/*\", \"\");\n\n if (!path.startsWith(aliasPattern)) {\n return false;\n }\n\n // Check if this is a real alias or just an external package mapping\n const aliasTargets = this.aliases[alias];\n if (!Array.isArray(aliasTargets) || aliasTargets.length === 0) {\n return false;\n }\n\n // If the alias starts with @, it's likely an external package alias\n // Example: \"@warlock.js/core\" -> \"@warlock.js/core\" (external package)\n if (aliasPattern.startsWith(\"@\")) {\n return false;\n }\n\n // Otherwise, it's a real path alias (including self-referencing ones like src/* -> src/*)\n // Example: \"app/*\" -> \"src/app/*\" (real alias)\n // Example: \"src/*\" -> \"src/*\" (self-referencing alias, still valid)\n return true;\n });\n }\n\n /**\n * Get the alias key that matches the given import path\n */\n public getMatchingAlias(path: string): string | null {\n const aliasKey = Object.keys(this.aliases).find((alias) => {\n const aliasPattern = alias.replace(\"/*\", \"\");\n return path.startsWith(aliasPattern);\n });\n\n return aliasKey || null;\n }\n\n /**\n * Resolve an alias import path to a relative path based on tsconfig paths\n * Example: \"app/users/services/get-users.service\" -> \"src/app/users/services/get-users.service\"\n *\n * @param path - The import path with alias (e.g., \"app/users/services/get-users.service\")\n * @returns The resolved relative path or null if alias not found\n */\n public resolveAliasPath(checkingPath: string): string | null {\n // Find matching alias from tsconfig paths\n const aliasKey = this.getMatchingAlias(checkingPath);\n\n if (!aliasKey) return null;\n\n const aliasTargets = this.aliases[aliasKey];\n if (!Array.isArray(aliasTargets) || aliasTargets.length === 0) {\n return null;\n }\n\n // Get the first target path (usually there's only one)\n const targetPattern = aliasTargets[0];\n\n // Replace alias pattern with target pattern\n const aliasPattern = aliasKey.replace(\"/*\", \"\");\n const targetBase = targetPattern.replace(\"/*\", \"\");\n // Remove any leading slash so path.join does not drop the base\n const relativePart = checkingPath.substring(aliasPattern.length).replace(/^[/\\\\]/, \"\");\n\n // Join the target base with the relative part\n const resolvedPath = path.join(targetBase, relativePart);\n\n return Path.normalize(resolvedPath);\n }\n\n /**\n * Resolve an alias import path to an absolute path\n * Example: \"app/users/services/get-users.service\" -> \"/absolute/path/to/src/app/users/services/get-users.service\"\n *\n * @param path - The import path with alias\n * @returns The resolved absolute path or null if alias not found\n */\n public resolveAliasToAbsolute(path: string): string | null {\n const relativePath = this.resolveAliasPath(path);\n\n if (!relativePath) return null;\n\n return Path.normalize(Path.toAbsolute(relativePath));\n }\n}\n\nexport const tsconfigManager = new TSConfigManager();\n","import { transform } from \"esbuild\";\nimport type { FileManager } from \"./file-manager\";\nimport { tsconfigManager } from \"./tsconfig-manager\";\n\n/**\n * Using esbuild to transpile the given code\n * Uses external sourcemaps for better performance:\n * - Inline sourcemaps double file size and require base64 parsing on every import\n * - External sourcemaps keep files small and fast to parse\n * - Sourcemap files are written separately and only loaded when debugging\n */\nexport async function transpileFile(fileManager: FileManager) {\n return transpile(fileManager.source, fileManager.absolutePath);\n}\n\nexport async function transpile(sourceCode: string, filePath: string) {\n const { code: transpiled } = await transform(sourceCode, {\n loader: filePath.endsWith(\".tsx\") ? \"tsx\" : \"ts\",\n format: \"esm\",\n sourcemap: \"inline\",\n target: \"es2022\",\n sourcefile: filePath,\n tsconfigRaw: tsconfigManager.tsconfig,\n });\n\n return transpiled;\n}\n","import { fileExistsAsync, getFileAsync, putFileAsync } from \"@mongez/fs\";\r\nimport { get } from \"@mongez/reinforcements\";\r\nimport { pathToFileURL } from \"url\";\r\nimport { devLogWarn } from \"../dev2-server/dev-logger\";\r\nimport { rootPath, warlockPath } from \"../utils\";\r\nimport { transpile } from \"./../dev2-server/transpile-file\";\r\nimport { WarlockConfig } from \"./types\";\r\n\r\n/**\r\n * Warlock Config Manager\r\n *\r\n * Manages lazy loading of the pre-compiled warlock.config.js file\r\n * from the .warlock/cache directory.\r\n */\r\nexport class WarlockConfigManager {\r\n /**\r\n * Cached config instance\r\n */\r\n private config?: WarlockConfig;\r\n\r\n /**\r\n * Loading promise to prevent duplicate loads\r\n */\r\n private loading?: Promise<WarlockConfig | undefined>;\r\n\r\n /**\r\n * Load warlock.config.js (cached after first load)\r\n *\r\n * @returns The resolved Warlock configuration\r\n */\r\n public async load(): Promise<WarlockConfig | undefined> {\r\n // Already loaded\r\n if (this.config) {\r\n return this.config;\r\n }\r\n\r\n // Currently loading (prevent duplicate loads)\r\n if (this.loading) {\r\n return this.loading;\r\n }\r\n\r\n // Start loading\r\n this.loading = this.doLoad();\r\n this.config = await this.loading;\r\n this.loading = undefined;\r\n\r\n return this.config;\r\n }\r\n\r\n /**\r\n * Internal load implementation\r\n */\r\n private async doLoad(): Promise<WarlockConfig | undefined> {\r\n const configPath = warlockPath(\"cache/warlock-config.js\");\r\n\r\n if (!(await fileExistsAsync(configPath))) {\r\n const result = await this.compile();\r\n\r\n if (!result) {\r\n devLogWarn(\r\n \"warlock.config.ts is missing, it's highly recommended to create it, run warlock init to create it\",\r\n );\r\n return;\r\n }\r\n }\r\n\r\n const fileUrl = pathToFileURL(configPath).href;\r\n try {\r\n const configModule = await import(fileUrl);\r\n\r\n return configModule.default;\r\n } catch (error) {\r\n throw new Error(\r\n `Failed to load warlock.config.js from ${fileUrl}. ` +\r\n `Make sure the config has been compiled. Error: ${error}`,\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Compile warlock.config.ts file\r\n */\r\n protected async compile() {\r\n const configPath = rootPath(\"warlock.config.ts\");\r\n if (!(await fileExistsAsync(configPath))) {\r\n return false;\r\n }\r\n\r\n const content = await getFileAsync(configPath);\r\n const compiledContent = await transpile(content, configPath);\r\n await putFileAsync(warlockPath(\"cache/warlock-config.js\"), compiledContent);\r\n return true;\r\n }\r\n\r\n /**\r\n * Get config value by key (dot notation supported)\r\n *\r\n * @example\r\n * config.get(\"server.port\") // Returns 3000\r\n * config.get(\"cli.commands\") // Returns array of commands\r\n *\r\n * @param key - Config key (supports dot notation), autocompletes for first level only\r\n * @returns The config value\r\n * @throws Error if config is not loaded\r\n */\r\n public get<Key extends keyof WarlockConfig>(\r\n key: Key,\r\n defaultValue?: WarlockConfig[Key],\r\n ): WarlockConfig[Key] {\r\n if (!this.config) {\r\n throw new Error(\"WarlockConfig not loaded. Call load() first or use lazyGet().\");\r\n }\r\n\r\n return get(this.config, key as string, defaultValue);\r\n }\r\n\r\n /**\r\n * Lazy get - loads config if not already loaded\r\n *\r\n * @example\r\n * const port = await config.lazyGet(\"server\");\r\n *\r\n * @param key - Config key (supports dot notation), autocompletes for first level only\r\n * @param defaultValue - Default value if config key is undefined\r\n * @returns The config value\r\n */\r\n async lazyGet<Key extends keyof WarlockConfig>(\r\n key: Key,\r\n defaultValue?: WarlockConfig[Key],\r\n ): Promise<WarlockConfig[Key]> {\r\n await this.load();\r\n return this.get(key, defaultValue);\r\n }\r\n\r\n /**\r\n * Check if config is loaded\r\n */\r\n public get isLoaded(): boolean {\r\n return this.config !== undefined;\r\n }\r\n\r\n /**\r\n * Get the entire config object\r\n *\r\n * @throws Error if config is not loaded\r\n */\r\n public getAll(): WarlockConfig {\r\n if (!this.config) {\r\n throw new Error(\"WarlockConfig not loaded. Call load() first or use lazyGet().\");\r\n }\r\n\r\n return this.config;\r\n }\r\n\r\n /**\r\n * Reload config (useful for HMR/development)\r\n */\r\n public async reload(): Promise<void> {\r\n this.config = undefined;\r\n this.loading = undefined;\r\n await this.load();\r\n }\r\n}\r\n\r\n/**\r\n * Exported singleton instance\r\n *\r\n * @example\r\n * import { warlockConfig } from \"@warlock.js/core\";\r\n *\r\n * // Lazy load and get value\r\n * const port = await warlockConfig.lazyGet(\"server.port\");\r\n *\r\n * // Or load first, then get\r\n * await warlockConfig.load();\r\n * const commands = warlockConfig.get(\"cli.commands\");\r\n */\r\nexport const warlockConfigManager = new WarlockConfigManager();\r\n","import type { FileManager } from \"./file-manager\";\n\n/**\n * Dependency Graph\n * Tracks bidirectional relationships between files:\n * - dependencies: files that this file imports\n * - dependents: files that import this file\n */\nexport class DependencyGraph {\n /**\n * Map of file -> files it depends on (imports)\n * Key: relative file path\n * Value: Set of relative file paths this file imports\n */\n private dependencies = new Map<string, Set<string>>();\n\n /**\n * Map of file -> files that depend on it (importers)\n * Key: relative file path\n * Value: Set of relative file paths that import this file\n */\n private dependents = new Map<string, Set<string>>();\n\n /**\n * Build dependency graph from FileManager map\n */\n public build(files: Map<string, FileManager>) {\n // Clear existing graph\n this.dependencies.clear();\n this.dependents.clear();\n\n // Build graph from all files\n for (const [relativePath, fileManager] of files) {\n // Initialize empty sets ONLY if not already present\n // (addDependency may have already created entries for this file)\n if (!this.dependencies.has(relativePath)) {\n this.dependencies.set(relativePath, new Set());\n }\n if (!this.dependents.has(relativePath)) {\n this.dependents.set(relativePath, new Set());\n }\n\n // Add dependencies\n for (const dependency of fileManager.dependencies) {\n this.addDependency(relativePath, dependency);\n }\n }\n\n // Detect circular dependencies\n const cycles = this.detectCircularDependencies();\n if (cycles.length > 0) {\n this.displayCircularDependencyWarnings(cycles);\n }\n }\n\n /**\n * Add a dependency relationship\n * @param file The file that has the dependency\n * @param dependency The file being depended upon\n */\n public addDependency(file: string, dependency: string) {\n // Ensure both files exist in the graph\n if (!this.dependencies.has(file)) {\n this.dependencies.set(file, new Set());\n }\n if (!this.dependents.has(dependency)) {\n this.dependents.set(dependency, new Set());\n }\n\n // Add bidirectional relationship\n this.dependencies.get(file)!.add(dependency);\n this.dependents.get(dependency)!.add(file);\n }\n\n /**\n * Remove a dependency relationship\n * @param file The file that has the dependency\n * @param dependency The file being depended upon\n */\n public removeDependency(file: string, dependency: string) {\n this.dependencies.get(file)?.delete(dependency);\n this.dependents.get(dependency)?.delete(file);\n }\n\n /**\n * Remove all relationships for a file\n * @param file The file to remove\n */\n public removeFile(file: string) {\n // Remove as dependent from all its dependencies\n const deps = this.dependencies.get(file);\n if (deps) {\n for (const dependency of deps) {\n this.dependents.get(dependency)?.delete(file);\n }\n }\n\n // Remove as dependency from all its dependents\n const dependents = this.dependents.get(file);\n if (dependents) {\n for (const dependent of dependents) {\n this.dependencies.get(dependent)?.delete(file);\n }\n }\n\n // Remove from maps\n this.dependencies.delete(file);\n this.dependents.delete(file);\n }\n\n /**\n * Update dependencies for a file\n * @param file The file to update\n * @param newDependencies New set of dependencies\n */\n public updateFile(file: string, newDependencies: Set<string>) {\n // Get old dependencies\n const oldDependencies = this.dependencies.get(file) || new Set();\n\n // Find removed dependencies\n for (const oldDep of oldDependencies) {\n if (!newDependencies.has(oldDep)) {\n this.removeDependency(file, oldDep);\n }\n }\n\n // Find added dependencies\n for (const newDep of newDependencies) {\n if (!oldDependencies.has(newDep)) {\n this.addDependency(file, newDep);\n }\n }\n }\n\n /**\n * Get files that this file depends on (imports)\n * @param file The file to check\n * @returns Set of files this file imports\n */\n public getDependencies(file: string): Set<string> {\n return this.dependencies.get(file) || new Set();\n }\n\n /**\n * Get files that depend on this file (importers)\n * @param file The file to check\n * @returns Set of files that import this file\n */\n public getDependents(file: string): Set<string> {\n return this.dependents.get(file) || new Set();\n }\n\n /**\n * Get invalidation chain for a file\n * Returns all files that need to be reloaded when this file changes\n * Includes the file itself and all transitive dependents\n * @param file The file that changed\n * @returns Array of files to invalidate (in order)\n */\n public getInvalidationChain(file: string): string[] {\n const chain: string[] = [file];\n const visited = new Set([file]);\n\n const traverse = (current: string) => {\n const deps = this.getDependents(current);\n for (const dep of deps) {\n if (!visited.has(dep)) {\n visited.add(dep);\n chain.push(dep);\n traverse(dep); // Recursive traversal\n }\n }\n };\n\n traverse(file);\n return chain;\n }\n\n /**\n * Detect circular dependencies in the dependency graph\n * Uses depth-first search to find cycles\n * Note: Type-only imports are already excluded at the parsing level (parse-imports.ts)\n * @returns Array of circular dependency chains (each chain is an array of file paths)\n */\n public detectCircularDependencies(): string[][] {\n const cycles: string[][] = [];\n const visited = new Set<string>();\n const recursionStack = new Set<string>();\n\n const dfs = (file: string, path: string[]): void => {\n visited.add(file);\n recursionStack.add(file);\n path.push(file);\n\n const deps = this.getDependencies(file);\n for (const dep of deps) {\n if (!visited.has(dep)) {\n dfs(dep, [...path]);\n } else if (recursionStack.has(dep)) {\n // Found a cycle\n const cycleStart = path.indexOf(dep);\n const cycle = [...path.slice(cycleStart), dep];\n cycles.push(cycle);\n }\n }\n\n recursionStack.delete(file);\n };\n\n for (const file of this.dependencies.keys()) {\n if (!visited.has(file)) {\n dfs(file, []);\n }\n }\n\n return cycles;\n }\n\n /**\n * Display circular dependency warnings in a formatted, user-friendly way\n * Shows each cycle with visual tree structure and helpful recommendations\n */\n private displayCircularDependencyWarnings(cycles: string[][]): void {\n const colors = {\n yellow: (text: string) => `\\x1b[33m${text}\\x1b[0m`,\n cyan: (text: string) => `\\x1b[36m${text}\\x1b[0m`,\n dim: (text: string) => `\\x1b[2m${text}\\x1b[0m`,\n bold: (text: string) => `\\x1b[1m${text}\\x1b[0m`,\n };\n\n console.log(\"\");\n console.log(colors.yellow(\"⚠️ Circular Dependencies Detected\"));\n console.log(colors.dim(\"━\".repeat(60)));\n console.log(\"\");\n console.log(\n colors.dim(\n `Found ${colors.bold(cycles.length.toString())} circular dependency chain${cycles.length > 1 ? \"s\" : \"\"}`,\n ),\n );\n console.log(\"\");\n\n cycles.forEach((cycle, index) => {\n console.log(colors.cyan(` ${index + 1}. Cycle with ${cycle.length - 1} files:`));\n console.log(\"\");\n\n // Display the cycle chain\n cycle.forEach((file, fileIndex) => {\n const isLast = fileIndex === cycle.length - 1;\n const arrow = isLast ? colors.dim(\" └─→ \") : colors.dim(\" ├─→ \");\n const fileName = file.split(\"/\").pop() || file;\n const filePath = colors.dim(file.replace(fileName, \"\"));\n\n if (isLast) {\n // Last item is the same as first (completes the cycle)\n console.log(arrow + colors.yellow(`${filePath}${colors.bold(fileName)} (cycle completes)`));\n } else {\n console.log(arrow + filePath + colors.bold(fileName));\n }\n });\n\n console.log(\"\");\n });\n\n console.log(colors.dim(\"━\".repeat(60)));\n console.log(colors.yellow(\"💡 Recommendation:\"));\n console.log(\n colors.dim(\n \" Refactor your code to remove circular dependencies for better\",\n ),\n );\n console.log(colors.dim(\" maintainability and HMR performance.\"));\n console.log(\"\");\n }\n\n /**\n * Get statistics about the dependency graph\n */\n public getStats() {\n let totalDependencies = 0;\n let maxDependencies = 0;\n let maxDependents = 0;\n let mostDependedFile = \"\";\n let mostDependingFile = \"\";\n\n for (const [file, deps] of this.dependencies) {\n totalDependencies += deps.size;\n if (deps.size > maxDependencies) {\n maxDependencies = deps.size;\n mostDependingFile = file;\n }\n }\n\n for (const [file, deps] of this.dependents) {\n if (deps.size > maxDependents) {\n maxDependents = deps.size;\n mostDependedFile = file;\n }\n }\n\n return {\n totalFiles: this.dependencies.size,\n totalDependencies,\n avgDependenciesPerFile: totalDependencies / this.dependencies.size || 0,\n maxDependencies,\n maxDependents,\n mostDependingFile,\n mostDependedFile,\n };\n }\n}\n","import { warlockPath } from \"../utils\";\n\nexport const MANIFEST_PATH = warlockPath(\"manifest.json\");\n\n/**\n * Number of files to process in parallel per batch\n * Adjust this value to optimize performance vs memory usage\n * - Lower values (10-20): More stable, less memory, slower\n * - Higher values (100-200): Faster, more memory, potential instability\n * - Recommended: 50 for most projects\n */\nexport const FILE_PROCESSING_BATCH_SIZE = 500;\n","import { fileExistsAsync, isDirectoryAsync } from \"@mongez/fs\";\nimport { ImportSpecifier, parse } from \"es-module-lexer\";\nimport path from \"node:path\";\nimport { Path } from \"./path\";\nimport { tsconfigManager } from \"./tsconfig-manager\";\n\n/**\n * Extract import paths using regex (more reliable for TypeScript)\n * This is a fallback when es-module-lexer fails\n */\nfunction extractImportPathsWithRegex(\n source: string,\n): Array<{ path: string; originalLine: string }> {\n const imports: Array<{ path: string; originalLine: string }> = [];\n const seenPaths = new Set<string>();\n\n /**\n * Check if an import line is type-only\n * Handles:\n * - import type { Foo } from \"module\"\n * - import type Foo from \"module\"\n * - import type * as Foo from \"module\"\n */\n const isTypeOnlyImport = (line: string): boolean => {\n const trimmed = line.trim();\n return trimmed.startsWith(\"import type \") || !!trimmed.match(/^import\\s+type\\s+[\\{\\*]/);\n };\n\n /**\n * Check if an import has any runtime (non-type) imports\n * Handles mixed imports: import { type Foo, runtimeBar } from \"module\"\n * Returns true if there are runtime imports (should be tracked)\n */\n const hasRuntimeImports = (line: string): boolean => {\n const trimmed = line.trim();\n\n // If it's a pure type-only import, no runtime imports\n if (isTypeOnlyImport(trimmed)) {\n return false;\n }\n\n // Extract the import specifiers part: import { ... } from \"module\"\n const specifiersMatch = trimmed.match(/import\\s+\\{([^}]+)\\}/);\n if (!specifiersMatch) {\n // Not a destructured import, or it's a default/namespace import\n // These are runtime imports unless marked with \"import type\"\n return true;\n }\n\n const specifiers = specifiersMatch[1];\n\n // Split by comma and check each specifier\n const items = specifiers.split(\",\").map((s) => s.trim());\n\n // Check if ALL items are type-only (prefixed with \"type \")\n const allTypeOnly = items.every((item) => {\n // Match: \"type Foo\" or \"type Foo as Bar\"\n return /^type\\s+\\w+/.test(item);\n });\n\n // If all are type-only, this import has no runtime imports\n // Otherwise, it has at least one runtime import\n return !allTypeOnly;\n };\n\n // Pattern 1: Standard ES module imports (handles multiline)\n // Matches: import { ... } from \"path\", import Foo from \"path\", import Foo, { ... } from \"path\"\n const importRegex =\n /import\\s+(?:type\\s+)?(\\{[\\s\\S]*?\\}|\\*\\s+as\\s+\\w+|\\w+(?:\\s*,\\s*\\{[\\s\\S]*?\\})?)\\s+from\\s+['\"]([^'\"]+)['\"]/g;\n\n let match;\n while ((match = importRegex.exec(source)) !== null) {\n const fullMatch = match[0];\n const importSpecifier = match[1];\n const importPath = match[2];\n\n // Skip type-only imports\n if (fullMatch.match(/^import\\s+type\\s+/)) {\n continue;\n }\n\n // Skip if it's a mixed import with only types\n if (!hasRuntimeImports(fullMatch)) {\n continue;\n }\n\n if (importPath && !seenPaths.has(importPath)) {\n seenPaths.add(importPath);\n imports.push({\n path: importPath,\n originalLine: fullMatch,\n });\n }\n }\n\n // Pattern 1b: Side-effect imports - import \"path\"\n const sideEffectRegex = /import\\s+['\"]([^'\"]+)['\"]/g;\n while ((match = sideEffectRegex.exec(source)) !== null) {\n const importPath = match[1];\n if (importPath && !seenPaths.has(importPath)) {\n seenPaths.add(importPath);\n imports.push({\n path: importPath,\n originalLine: match[0],\n });\n }\n }\n\n // Pattern 2: Dynamic imports - import(\"path\")\n const dynamicImportPattern = /import\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g;\n while ((match = dynamicImportPattern.exec(source)) !== null) {\n const importPath = match[1];\n if (importPath && !seenPaths.has(importPath)) {\n seenPaths.add(importPath);\n imports.push({\n path: importPath,\n originalLine: match[0],\n });\n }\n }\n\n // Pattern 3: Export from - export ... from \"path\"\n // Skip export type statements (e.g., export type { Foo } from \"module\")\n const exportFromPattern = /export\\s+(?:\\{[^}]*\\}|\\*|\\w+)\\s+from\\s+['\"]([^'\"]+)['\"]/g;\n while ((match = exportFromPattern.exec(source)) !== null) {\n const fullMatch = match[0];\n\n // Skip type-only exports: export type ... from \"module\"\n if (/^export\\s+type\\s+/.test(fullMatch)) {\n continue;\n }\n\n const importPath = match[1];\n if (importPath && !seenPaths.has(importPath)) {\n seenPaths.add(importPath);\n imports.push({\n path: importPath,\n originalLine: fullMatch,\n });\n }\n }\n\n return imports;\n}\n\n/**\n * This function will transpile the given ts/tsx code to js code\n * // also it will return the dependencies of the file\n *\n * @returns Map of originalImportPath -> resolvedAbsolutePath\n */\nexport async function parseImports(source: string, filePath: string) {\n try {\n // Skip .d.ts files - they're type declarations, not runtime code\n if (filePath.endsWith(\".d.ts\")) {\n return new Map<string, string>();\n }\n\n // Try es-module-lexer first (faster and more accurate for simple cases)\n try {\n const [imports] = await parse(source);\n if (imports && imports.length > 0) {\n return await resolveImports(imports as ImportSpecifier[], filePath);\n }\n } catch (lexerError) {\n // es-module-lexer failed, fall back to regex-based extraction\n // This is common with TypeScript files that have complex syntax\n }\n\n // Fallback: Use regex-based extraction (more forgiving with TypeScript)\n const regexImports = extractImportPathsWithRegex(source);\n const resolvedImports = new Map<string, string>();\n\n for (const { path: importPath } of regexImports) {\n // Skip node built-ins and external packages\n if (isNodeBuiltin(importPath)) {\n continue;\n }\n\n // Skip external node_modules packages (not starting with . or alias)\n if (!importPath.startsWith(\".\") && !tsconfigManager.isAlias(importPath)) {\n continue;\n }\n\n let resolvedPath: string | null = null;\n\n // Handle alias imports\n if (tsconfigManager.isAlias(importPath)) {\n resolvedPath = await resolveAliasImport(importPath);\n } else if (importPath.startsWith(\".\")) {\n // Handle relative imports\n resolvedPath = await resolveRelativeImport(importPath, filePath);\n }\n\n if (resolvedPath) {\n resolvedImports.set(importPath, resolvedPath);\n }\n }\n\n return resolvedImports;\n } catch (error) {\n console.error(`Error parsing imports for ${filePath}:`, error);\n return new Map<string, string>();\n }\n}\n\nasync function resolveImports(imports: ImportSpecifier[], filePath: string) {\n const resolvedImports = new Map<string, string>();\n\n for (const imp of imports) {\n const importPath = imp.n;\n\n if (!importPath) continue;\n\n // Skip node built-ins and external packages\n if (isNodeBuiltin(importPath)) {\n continue;\n }\n\n // console.log(importPath, tsconfigManager.isAlias(importPath));\n\n // Skip external node_modules packages (not starting with . or alias)\n if (!importPath.startsWith(\".\") && !tsconfigManager.isAlias(importPath)) {\n continue;\n }\n\n let resolvedPath: string | null = null;\n\n // Handle alias imports (e.g., app/users/services/get-users.service)\n if (tsconfigManager.isAlias(importPath)) {\n resolvedPath = await resolveAliasImport(importPath);\n } else if (importPath.startsWith(\".\")) {\n // Handle relative imports (e.g., ./../services/get-user.service)\n resolvedPath = await resolveRelativeImport(importPath, filePath);\n }\n\n if (resolvedPath) {\n // Store mapping: original import path -> resolved absolute path\n resolvedImports.set(importPath, resolvedPath);\n }\n }\n\n return resolvedImports;\n}\n\n/**\n * Resolve alias imports to actual file paths with extensions\n * Example: app/users/services/get-users.service -> /absolute/path/to/src/app/users/services/get-users.service.ts\n */\nasync function resolveAliasImport(importPath: string): Promise<string | null> {\n // Use tsconfig manager to resolve the alias to an absolute path\n const resolvedBase = tsconfigManager.resolveAliasToAbsolute(importPath);\n\n if (!resolvedBase) return null;\n\n // Try to resolve with extensions\n const resolvedPath = await tryResolveWithExtensions(resolvedBase);\n\n return resolvedPath;\n}\n\n/**\n * Resolve relative imports to actual file paths\n * Example: ./../services/get-user.service -> /absolute/path/to/services/get-user.service.ts\n */\nasync function resolveRelativeImport(\n importPath: string,\n currentFilePath: string,\n): Promise<string | null> {\n const dir = path.dirname(currentFilePath);\n // Use path.resolve to handle .. and . properly, then normalize to forward slashes\n const resolvedBase = Path.normalize(path.resolve(dir, importPath));\n\n // Try to resolve with extensions\n const resolvedPath = await tryResolveWithExtensions(resolvedBase);\n\n return resolvedPath;\n}\n\n/**\n * Try to resolve a file path by checking different extensions\n * TypeScript/JavaScript files can be imported without extensions\n *\n * @TODO: For better performance, we need to check the files in files orchestrator\n * instead of using the file system as we will be fetching all project files anyway.\n */\n// Cache for file existence checks to avoid redundant filesystem calls\nconst fileExistsCache = new Map<string, boolean>();\n\n/**\n * Clear the file exists cache\n * Should be called when new files are created to ensure fresh lookups\n */\nexport function clearFileExistsCache(): void {\n fileExistsCache.clear();\n}\n\nasync function cachedFileExists(filePath: string): Promise<boolean> {\n if (fileExistsCache.has(filePath)) {\n return fileExistsCache.get(filePath)!;\n }\n const exists = (await fileExistsAsync(filePath)) as boolean;\n fileExistsCache.set(filePath, exists);\n return exists;\n}\n\nasync function tryResolveWithExtensions(basePath: string): Promise<string | null> {\n // Normalize the base path first (handle Windows paths)\n const normalizedBase = Path.normalize(basePath);\n\n // List of extensions to try, in order of preference\n const extensions = [\".ts\", \".tsx\", \".js\", \".jsx\", \".mjs\", \".cjs\"];\n const validExtensions = new Set(extensions);\n\n // If the path already has a VALID code file extension, check if it exists\n const ext = path.extname(normalizedBase);\n if (ext && validExtensions.has(ext)) {\n if (await cachedFileExists(normalizedBase)) {\n return normalizedBase;\n }\n // If explicit extension doesn't exist, return null\n return null;\n }\n\n // Try all extensions in parallel for better performance\n const pathsToCheck = extensions.map((extension) => normalizedBase + extension);\n const results = await Promise.all(\n pathsToCheck.map(async (p) => ({ path: p, exists: await cachedFileExists(p) })),\n );\n\n // Return the first one that exists (in order of preference)\n for (const result of results) {\n if (result.exists) {\n return result.path;\n }\n }\n\n // Try index files in directory\n if (await isDirectoryAsync(normalizedBase)) {\n const indexPaths = extensions.map((extension) =>\n Path.join(normalizedBase, `index${extension}`),\n );\n const indexResults = await Promise.all(\n indexPaths.map(async (p) => ({ path: p, exists: await cachedFileExists(p) })),\n );\n\n for (const result of indexResults) {\n if (result.exists) {\n return result.path;\n }\n }\n }\n\n return null;\n}\n\n/**\n * Check if import is a Node.js built-in module\n */\nfunction isNodeBuiltin(importPath: string): boolean {\n const builtins = [\n \"fs\",\n \"path\",\n \"http\",\n \"https\",\n \"crypto\",\n \"stream\",\n \"util\",\n \"events\",\n \"buffer\",\n \"child_process\",\n \"os\",\n \"url\",\n \"querystring\",\n \"zlib\",\n \"net\",\n \"tls\",\n \"dns\",\n \"dgram\",\n \"cluster\",\n \"worker_threads\",\n \"perf_hooks\",\n \"async_hooks\",\n \"timers\",\n \"readline\",\n \"repl\",\n \"vm\",\n \"assert\",\n \"console\",\n \"process\",\n \"v8\",\n ];\n\n // Check for node: prefix or direct builtin name\n if (importPath.startsWith(\"node:\")) return true;\n\n const moduleName = importPath.split(\"/\")[0];\n return builtins.includes(moduleName);\n}\n","import events from \"@mongez/events\";\r\nimport { debounce } from \"@mongez/reinforcements\";\r\nimport type { DependencyGraph } from \"./dependency-graph\";\r\nimport { devLogSuccess } from \"./dev-logger\";\r\nimport type { FileManager } from \"./file-manager\";\r\nimport type { FileOperations } from \"./file-operations\";\r\nimport { FILE_PROCESSING_BATCH_SIZE } from \"./flags\";\r\nimport type { ManifestManager } from \"./manifest-manager\";\r\nimport { clearFileExistsCache } from \"./parse-imports\";\r\nimport { Path } from \"./path\";\r\n\r\n/**\r\n * FileEventHandler - Handles runtime file system events\r\n *\r\n * This class receives file system events (add, change, delete) from the\r\n * FilesWatcher and processes them in batches for optimal performance.\r\n *\r\n * ## Batching Strategy\r\n *\r\n * Events are collected and processed after a debounce period (150ms).\r\n * This batching is crucial when:\r\n * - Multiple files are created at once (e.g., VSCode extension creating a module)\r\n * - A file save triggers multiple filesystem events\r\n * - Large refactoring operations affect many files\r\n *\r\n * ## Processing Order\r\n *\r\n * 1. **Added files** - Processed first so they're available for imports\r\n * 2. **Changed files** - Can reference newly added files\r\n * 3. **Deleted files** - Processed last, dependents are notified\r\n *\r\n * ## Batch Add Strategy\r\n *\r\n * When multiple files are added (e.g., creating a Warlock module), they're\r\n * processed using a two-phase approach with topological sorting:\r\n *\r\n * 1. **Parse Phase**: All files are parsed to discover dependencies\r\n * 2. **Sort Phase**: Files are topologically sorted by dependencies\r\n * 3. **Complete Phase**: Files are finalized in dependency order\r\n *\r\n * This ensures that when file A imports file B, file B is processed first.\r\n *\r\n * @class FileEventHandler\r\n */\r\nexport class FileEventHandler {\r\n /**\r\n * Pending file change events (relative paths)\r\n */\r\n private pendingChanges = new Set<string>();\r\n\r\n /**\r\n * Pending file add events (relative paths)\r\n */\r\n private pendingAdds = new Set<string>();\r\n\r\n /**\r\n * Pending file delete events (relative paths)\r\n */\r\n private pendingDeletes = new Set<string>();\r\n\r\n /**\r\n * Debounced batch processor\r\n * Waits 150ms after the last event before processing\r\n */\r\n private readonly processPendingEvents = debounce(async () => {\r\n await this.processBatch();\r\n }, 150);\r\n\r\n /**\r\n * Creates a new FileEventHandler\r\n *\r\n * @param fileOperations - FileOperations instance for file lifecycle management\r\n * @param manifest - ManifestManager for persisting file metadata\r\n * @param dependencyGraph - DependencyGraph for tracking dependencies\r\n * @param files - Map of all tracked FileManager instances\r\n */\r\n constructor(\r\n private readonly fileOperations: FileOperations,\r\n private readonly manifest: ManifestManager,\r\n private readonly dependencyGraph: DependencyGraph,\r\n private readonly files: Map<string, FileManager>,\r\n ) {}\r\n\r\n /**\r\n * Handle a file change event from the file watcher\r\n *\r\n * The event is queued and will be processed in the next batch.\r\n *\r\n * @param absolutePath - Absolute path to the changed file\r\n */\r\n public handleFileChange(absolutePath: string): void {\r\n const relativePath = Path.toRelative(absolutePath);\r\n this.pendingChanges.add(relativePath);\r\n this.processPendingEvents();\r\n }\r\n\r\n /**\r\n * Handle a file add event from the file watcher\r\n *\r\n * The event is queued and will be processed in the next batch.\r\n *\r\n * @param absolutePath - Absolute path to the new file\r\n */\r\n public handleFileAdd(absolutePath: string): void {\r\n const relativePath = Path.toRelative(absolutePath);\r\n this.pendingAdds.add(relativePath);\r\n this.processPendingEvents();\r\n }\r\n\r\n /**\r\n * Handle a file delete event from the file watcher\r\n *\r\n * The event is queued and will be processed in the next batch.\r\n *\r\n * @param absolutePath - Absolute path to the deleted file\r\n */\r\n public handleFileDelete(absolutePath: string): void {\r\n const relativePath = Path.toRelative(absolutePath);\r\n this.pendingDeletes.add(relativePath);\r\n this.processPendingEvents();\r\n }\r\n\r\n /**\r\n * Process all pending events in a batch\r\n *\r\n * Events are processed in order: adds → changes → deletes\r\n * After processing, the dependency graph and manifest are updated.\r\n *\r\n * @internal\r\n */\r\n private async processBatch(): Promise<void> {\r\n // Snapshot pending events\r\n const changes = Array.from(this.pendingChanges);\r\n const adds = Array.from(this.pendingAdds);\r\n const deletes = Array.from(this.pendingDeletes);\r\n\r\n // Clear pending sets\r\n this.pendingChanges.clear();\r\n this.pendingAdds.clear();\r\n this.pendingDeletes.clear();\r\n\r\n // Skip if nothing to process\r\n if (changes.length === 0 && adds.length === 0 && deletes.length === 0) {\r\n return;\r\n }\r\n\r\n // For batch operations, add extra delay to let filesystem settle\r\n const totalFiles = adds.length + changes.length;\r\n if (totalFiles > 1) {\r\n await new Promise((resolve) => setTimeout(resolve, 500));\r\n clearFileExistsCache();\r\n }\r\n\r\n // Process in order: adds first, then changes, then deletes\r\n await this.processBatchAdds(adds);\r\n await this.processBatchChanges(changes);\r\n await this.processBatchDeletes(deletes);\r\n\r\n // Update dependency graph and manifest once\r\n this.fileOperations.updateFileDependents();\r\n this.fileOperations.syncFilesToManifest();\r\n await this.manifest.save();\r\n\r\n // Trigger batch completion event (for HMR/reload execution)\r\n events.trigger(\"dev-server:batch-complete\", {\r\n added: adds,\r\n changed: changes,\r\n deleted: deletes,\r\n });\r\n }\r\n\r\n /**\r\n * Process a batch of changed files\r\n *\r\n * Each file is updated (reprocessed if content changed).\r\n * Processing is done in parallel batches for performance.\r\n *\r\n * @param relativePaths - Array of relative paths to changed files\r\n * @internal\r\n */\r\n private async processBatchChanges(relativePaths: string[]): Promise<void> {\r\n if (relativePaths.length === 0) return;\r\n\r\n const BATCH_SIZE = FILE_PROCESSING_BATCH_SIZE;\r\n\r\n for (let i = 0; i < relativePaths.length; i += BATCH_SIZE) {\r\n const batch = relativePaths.slice(i, i + BATCH_SIZE);\r\n\r\n await Promise.all(\r\n batch.map(async (relativePath) => {\r\n await this.fileOperations.updateFile(relativePath);\r\n }),\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Process a batch of added files using topological sort\r\n *\r\n * This method uses a two-phase approach:\r\n * 1. Parse all files to discover dependencies\r\n * 2. Complete files in topological order (dependencies first)\r\n *\r\n * This ensures that when file A imports file B (both in the batch),\r\n * file B is fully processed before file A tries to resolve the import.\r\n *\r\n * @param relativePaths - Array of relative paths to new files\r\n * @internal\r\n */\r\n private async processBatchAdds(relativePaths: string[]): Promise<void> {\r\n if (relativePaths.length === 0) return;\r\n\r\n const batchSet = new Set(relativePaths);\r\n\r\n // PHASE 1: Parse all files in parallel to discover dependencies\r\n const parsedFiles = await Promise.all(\r\n relativePaths.map(async (relativePath) => {\r\n try {\r\n return await this.fileOperations.parseNewFile(relativePath);\r\n } catch (error) {\r\n return null;\r\n }\r\n }),\r\n );\r\n\r\n // Filter out nulls (files that couldn't be parsed)\r\n const validFiles = parsedFiles.filter((f): f is FileManager => f !== null);\r\n\r\n // PHASE 2: Topological sort for proper dependency order\r\n const orderedFiles = this.topologicalSort(validFiles, batchSet);\r\n\r\n // PHASE 3: Complete processing in dependency order\r\n for (const file of orderedFiles) {\r\n try {\r\n await this.fileOperations.finalizeNewFile(file);\r\n devLogSuccess(`Added file: ${file.relativePath}`);\r\n } catch (error) {\r\n // File may have issues, but we continue with others\r\n console.error(`Failed to add file ${file.relativePath}:`, error);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Topologically sort files by their dependencies\r\n *\r\n * Uses Kahn's algorithm to produce an ordering where files with\r\n * no batch dependencies come first, and files that depend on other\r\n * batch files come after their dependencies.\r\n *\r\n * @param files - Array of FileManager instances to sort\r\n * @param batchSet - Set of relative paths in this batch (for filtering deps)\r\n * @returns Files in topological order (dependencies first)\r\n *\r\n * @example\r\n * ```typescript\r\n * // If A imports B, and B imports C, result will be: [C, B, A]\r\n * const ordered = this.topologicalSort([fileA, fileB, fileC], batchSet);\r\n * ```\r\n *\r\n * @internal\r\n */\r\n private topologicalSort(files: FileManager[], batchSet: Set<string>): FileManager[] {\r\n const fileMap = new Map<string, FileManager>();\r\n const inDegree = new Map<string, number>();\r\n const graph = new Map<string, string[]>();\r\n\r\n // Initialize data structures\r\n for (const file of files) {\r\n fileMap.set(file.relativePath, file);\r\n inDegree.set(file.relativePath, 0);\r\n graph.set(file.relativePath, []);\r\n }\r\n\r\n // Build graph: for each file, record which files depend on it\r\n for (const file of files) {\r\n for (const dep of file.dependencies) {\r\n // Only consider dependencies that are in this batch\r\n if (batchSet.has(dep) && fileMap.has(dep)) {\r\n // dep → file (file depends on dep)\r\n graph.get(dep)!.push(file.relativePath);\r\n inDegree.set(file.relativePath, (inDegree.get(file.relativePath) || 0) + 1);\r\n }\r\n }\r\n }\r\n\r\n // Kahn's algorithm: start with files that have no batch dependencies\r\n const queue: FileManager[] = [];\r\n for (const file of files) {\r\n if (inDegree.get(file.relativePath) === 0) {\r\n queue.push(file);\r\n }\r\n }\r\n\r\n const result: FileManager[] = [];\r\n while (queue.length > 0) {\r\n const file = queue.shift()!;\r\n result.push(file);\r\n\r\n // For each file that depends on this one, reduce its in-degree\r\n for (const dependentPath of graph.get(file.relativePath) || []) {\r\n const newDegree = (inDegree.get(dependentPath) || 0) - 1;\r\n inDegree.set(dependentPath, newDegree);\r\n\r\n if (newDegree === 0) {\r\n const dependentFile = fileMap.get(dependentPath);\r\n if (dependentFile) {\r\n queue.push(dependentFile);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Handle any remaining files (cycles or isolated)\r\n // These are added at the end to ensure all files are processed\r\n for (const file of files) {\r\n if (!result.includes(file)) {\r\n result.push(file);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Process a batch of deleted files\r\n *\r\n * Each file is removed from the system and its dependents are notified.\r\n *\r\n * @param relativePaths - Array of relative paths to deleted files\r\n * @internal\r\n */\r\n private async processBatchDeletes(relativePaths: string[]): Promise<void> {\r\n if (relativePaths.length === 0) return;\r\n\r\n for (const relativePath of relativePaths) {\r\n await this.fileOperations.deleteFile(relativePath);\r\n devLogSuccess(`Deleted file: ${relativePath}`);\r\n }\r\n }\r\n}\r\n","export const DEV_SERVER_EVENTS = {\n MANIFEST_NOT_FOUND: \"dev-server.manifest.not-found\",\n FILE_READY: \"dev-server.file.ready\",\n};\n","import ts from \"typescript\";\nimport type { FileManager } from \"./file-manager\";\n\n/**\n * Export information for a file\n */\nexport interface ExportInfo {\n /** Named exports (e.g., [\"User\", \"userSchema\"]) */\n namedExports: string[];\n /** Whether the file has a default export */\n hasDefaultExport: boolean;\n /** Paths of re-exported modules (for recursive analysis) */\n reExports: string[];\n}\n\n/**\n * Export Analyzer\n * Analyzes TypeScript files to extract export information\n * Used for transforming re-exports to dynamic imports\n */\nexport class ExportAnalyzer {\n /**\n * Cache of analyzed exports\n * Maps relative file path to export info (consistent with rest of codebase)\n */\n private cache = new Map<string, ExportInfo>();\n\n /**\n * Analyze exports from a FileManager\n * Reuses the already-loaded source code instead of reading the file again\n * @param fileManager FileManager instance with source code\n * @returns Export information\n */\n public analyzeExports(fileManager: FileManager): ExportInfo {\n // Use relative path for cache key (consistent with rest of codebase)\n const cacheKey = fileManager.relativePath;\n\n // Check cache first\n if (this.cache.has(cacheKey)) {\n return this.cache.get(cacheKey)!;\n }\n\n // Parse and analyze the file using the already-loaded source\n const info = this.parseExports(fileManager);\n\n // Cache the result\n this.cache.set(cacheKey, info);\n\n return info;\n }\n\n /**\n * Parse exports from a FileManager's source code\n * @param fileManager FileManager instance with source code\n * @returns Export information\n */\n private parseExports(fileManager: FileManager): ExportInfo {\n const info: ExportInfo = {\n namedExports: [],\n hasDefaultExport: false,\n reExports: [],\n };\n\n try {\n // Use the already-loaded source from FileManager\n const sourceText = fileManager.source;\n if (!sourceText) {\n return info;\n }\n\n // Create a source file\n const sourceFile = ts.createSourceFile(\n fileManager.absolutePath,\n sourceText,\n ts.ScriptTarget.Latest,\n true,\n );\n\n // Visit all nodes to find exports\n const visit = (node: ts.Node) => {\n // Handle export declarations\n if (ts.isExportDeclaration(node)) {\n this.handleExportDeclaration(node, info);\n }\n // Handle export assignments (export = ...)\n else if (ts.isExportAssignment(node)) {\n if (!node.isExportEquals) {\n // export default ...\n info.hasDefaultExport = true;\n }\n }\n // Handle variable statements with export modifier\n else if (ts.isVariableStatement(node)) {\n this.handleVariableStatement(node, info);\n }\n // Handle function declarations with export modifier\n else if (ts.isFunctionDeclaration(node)) {\n this.handleFunctionDeclaration(node, info);\n }\n // Handle class declarations with export modifier\n else if (ts.isClassDeclaration(node)) {\n this.handleClassDeclaration(node, info);\n }\n // Handle enum declarations with export modifier (enums exist at runtime)\n else if (ts.isEnumDeclaration(node)) {\n this.handleEnumDeclaration(node, info);\n }\n // Note: Interfaces and type aliases are intentionally skipped\n // They are type-only and don't exist at runtime\n\n // Recursively visit child nodes\n ts.forEachChild(node, visit);\n };\n\n visit(sourceFile);\n } catch (error) {\n // If parsing fails, return empty info\n console.error(`Failed to parse exports from ${fileManager.relativePath}:`, error);\n }\n\n return info;\n }\n\n /**\n * Handle export declarations (export { x }, export * from, etc.)\n */\n private handleExportDeclaration(node: ts.ExportDeclaration, info: ExportInfo): void {\n // export * from \"./module\" or export { x } from \"./module\"\n if (node.moduleSpecifier && ts.isStringLiteral(node.moduleSpecifier)) {\n const modulePath = node.moduleSpecifier.text;\n\n // If it's export *, track it as a re-export\n if (!node.exportClause) {\n // export * from \"./module\"\n info.reExports.push(modulePath);\n } else if (ts.isNamedExports(node.exportClause)) {\n // export { x, y } from \"./module\"\n // These are also re-exports, but we can extract the names\n for (const element of node.exportClause.elements) {\n const exportName = element.name.text;\n info.namedExports.push(exportName);\n }\n }\n }\n // export { x, y } (without from)\n else if (node.exportClause && ts.isNamedExports(node.exportClause)) {\n for (const element of node.exportClause.elements) {\n const exportName = element.name.text;\n info.namedExports.push(exportName);\n }\n }\n }\n\n /**\n * Handle variable statements (export const x = ...)\n */\n private handleVariableStatement(node: ts.VariableStatement, info: ExportInfo): void {\n if (this.hasExportModifier(node)) {\n for (const declaration of node.declarationList.declarations) {\n if (ts.isIdentifier(declaration.name)) {\n info.namedExports.push(declaration.name.text);\n }\n }\n }\n }\n\n /**\n * Handle function declarations (export function x() {})\n */\n private handleFunctionDeclaration(node: ts.FunctionDeclaration, info: ExportInfo): void {\n if (this.hasExportModifier(node)) {\n if (this.hasDefaultModifier(node)) {\n info.hasDefaultExport = true;\n } else if (node.name) {\n info.namedExports.push(node.name.text);\n }\n }\n }\n\n /**\n * Handle class declarations (export class X {})\n */\n private handleClassDeclaration(node: ts.ClassDeclaration, info: ExportInfo): void {\n if (this.hasExportModifier(node)) {\n if (this.hasDefaultModifier(node)) {\n info.hasDefaultExport = true;\n } else if (node.name) {\n info.namedExports.push(node.name.text);\n }\n }\n }\n\n /**\n * Handle enum declarations (export enum X {})\n * Enums exist at runtime, so they should be included\n */\n private handleEnumDeclaration(node: ts.EnumDeclaration, info: ExportInfo): void {\n if (this.hasExportModifier(node)) {\n info.namedExports.push(node.name.text);\n }\n }\n\n /**\n * Check if a node has an export modifier\n */\n private hasExportModifier(node: ts.Node): boolean {\n return (\n ts.canHaveModifiers(node) &&\n ts.getModifiers(node)?.some((mod) => mod.kind === ts.SyntaxKind.ExportKeyword) === true\n );\n }\n\n /**\n * Check if a node has a default modifier\n */\n private hasDefaultModifier(node: ts.Node): boolean {\n return (\n ts.canHaveModifiers(node) &&\n ts.getModifiers(node)?.some((mod) => mod.kind === ts.SyntaxKind.DefaultKeyword) === true\n );\n }\n\n /**\n * Clear cache for a specific file\n * @param relativePath Relative path to the file\n */\n public clearCache(relativePath: string): void {\n this.cache.delete(relativePath);\n }\n\n /**\n * Clear all cached export information\n */\n public clearAllCache(): void {\n this.cache.clear();\n }\n\n /**\n * Get cache statistics\n */\n public getCacheStats(): { size: number; files: string[] } {\n return {\n size: this.cache.size,\n files: Array.from(this.cache.keys()),\n };\n }\n}\n\n// Singleton instance\nexport const exportAnalyzer = new ExportAnalyzer();\n","import { devLogError } from \"./dev-logger\";\nimport { exportAnalyzer } from \"./export-analyzer\";\nimport type { FileManager } from \"./file-manager\";\nimport { filesOrchestrator } from \"./files-orchestrator\";\nimport { Path } from \"./path\";\nimport { tsconfigManager } from \"./tsconfig-manager\";\n\n/**\n * Transform imports in transpiled code to use cache paths\n *\n * This can be called immediately after transpilation - no need to wait for\n * other files to be processed because cache paths are computed deterministically.\n *\n * Strategy:\n * - All cached files are in the same directory (.warlock/cache/)\n * - So all imports become: \"./${cachePath}\"\n * - Cache path is computed from the resolved import path\n *\n * @param fileManager FileManager with transpiled code and importMap\n * @returns Transformed code with cache-relative imports\n */\nexport function transformImports(fileManager: FileManager): string {\n const code = fileManager.transpiled;\n\n // Pattern to match ES6 import statements\n // Matches: import ... from \"...\"\n // Handles:\n // - import { a, b } from \"module\" (named imports, can span multiple lines)\n // - import * as Foo from \"module\" (namespace imports)\n // - import Foo from \"module\" (default imports)\n // - import Foo, { a, b } from \"module\" (mixed imports)\n const importRegex =\n /import\\s+(\\{[\\s\\S]*?\\}|\\*\\s+as\\s+\\w+|\\w+(?:\\s*,\\s*\\{[\\s\\S]*?\\})?)\\s+from\\s+[\"']([^\"']+)[\"'];?/gm;\n\n // Pattern to match side-effect imports: import \"module\";\n const sideEffectImportRegex = /import\\s+[\"']([^\"']+)[\"'];?/g;\n\n // Pattern to match ES6 export statements\n // Matches: export * from \"...\" and export { ... } from \"...\"\n const exportRegex = /export\\s+((?:\\*|\\{[^}]*\\}))\\s+from\\s+[\"']([^\"']+)[\"'];?/g;\n\n let transformedCode = code;\n const unresolvedImports: string[] = [];\n\n // Process imports first\n const importMatches = Array.from(code.matchAll(importRegex));\n\n for (let i = importMatches.length - 1; i >= 0; i--) {\n const match = importMatches[i];\n const fullImport = match[0];\n const importSpecifier = match[1]; // What's being imported (e.g., \"{ foo }\", \"* as bar\", \"default\")\n const importPath = match[2]; // The module path\n\n // Only transform relative imports and alias imports\n // Skip external packages (node_modules, node built-ins)\n const isRelativeImport = importPath.startsWith(\".\") || importPath.startsWith(\"/\");\n const isAliasImport = tsconfigManager.isAlias(importPath);\n\n if (!isRelativeImport && !isAliasImport) {\n // This is an external package - keep as-is\n continue;\n }\n\n // Check if this import was resolved by parseImports (exists in importMap)\n // If not in importMap, it means parseImports skipped it (external package), so we skip it too\n if (!fileManager.importMap.has(importPath)) {\n // Not in importMap = external package, skip transformation\n continue;\n }\n\n // Find the cache path for this import\n const cachePath = findCachePathForImport(importPath, fileManager);\n\n if (!cachePath) {\n // Could not resolve - track it (this is a local file that should exist but doesn't)\n unresolvedImports.push(importPath);\n continue;\n }\n\n // Build the correct replacement depending on the import shape\n const newImport = buildImportReplacement(importSpecifier, cachePath);\n\n // Replace in code\n const startIndex = match.index!;\n const endIndex = startIndex + fullImport.length;\n transformedCode =\n transformedCode.slice(0, startIndex) + newImport + transformedCode.slice(endIndex);\n }\n\n // Process side-effect imports: import \"module\";\n const sideEffectMatches = Array.from(transformedCode.matchAll(sideEffectImportRegex));\n\n for (let i = sideEffectMatches.length - 1; i >= 0; i--) {\n const match = sideEffectMatches[i];\n const fullImport = match[0];\n const importPath = match[1];\n\n // Only transform relative imports and alias imports\n // Skip external packages (node_modules, node built-ins)\n const isRelativeImport = importPath.startsWith(\".\") || importPath.startsWith(\"/\");\n const isAliasImport = tsconfigManager.isAlias(importPath);\n\n if (!isRelativeImport && !isAliasImport) {\n continue;\n }\n\n if (!fileManager.importMap.has(importPath)) {\n continue;\n }\n\n const cachePath = findCachePathForImport(importPath, fileManager);\n\n if (!cachePath) {\n unresolvedImports.push(importPath);\n continue;\n }\n\n // FROM: import \"./themes\";\n // TO: await __import(\"./src-app-mail-themes.js\");\n const newImport = `await __import(\"./${cachePath}\")`;\n\n const startIndex = match.index!;\n const endIndex = startIndex + fullImport.length;\n transformedCode =\n transformedCode.slice(0, startIndex) + newImport + transformedCode.slice(endIndex);\n }\n\n // Process exports (need to re-process after imports to get updated string positions)\n const exportMatches = Array.from(transformedCode.matchAll(exportRegex));\n for (let i = exportMatches.length - 1; i >= 0; i--) {\n const match = exportMatches[i];\n const fullExport = match[0];\n const exportSpecifier = match[1]; // \"*\" or \"{ foo, bar }\"\n const importPath = match[2]; // The module path\n\n // Only transform relative imports and alias imports\n // Skip external packages (node_modules, node built-ins)\n const isRelativeImport = importPath.startsWith(\".\") || importPath.startsWith(\"/\");\n const isAliasImport = tsconfigManager.isAlias(importPath);\n\n if (!isRelativeImport && !isAliasImport) {\n // This is an external package - keep as-is\n continue;\n }\n\n // Check if this import was resolved by parseImports (exists in importMap)\n // If not in importMap, it means parseImports skipped it (external package), so we skip it too\n if (!fileManager.importMap.has(importPath)) {\n // Not in importMap = external package, skip transformation\n continue;\n }\n\n // Find the cache path for this import\n const cachePath = findCachePathForImport(importPath, fileManager);\n\n if (!cachePath) {\n // Could not resolve - track it (this is a local file that should exist but doesn't)\n unresolvedImports.push(importPath);\n continue;\n }\n\n // Transform export to use cache path\n // Note: export * from requires a static string literal in ES modules\n // So we can't use __import with timestamps. We rely on module loader cache clearing.\n // For export { ... }, we can use __import and individual exports\n\n if (exportSpecifier === \"*\") {\n // export * from \"./module\"\n // Transform to dynamic re-export for HMR cache busting\n\n // Get the resolved absolute path for the import\n const resolvedAbsPath = fileManager.importMap.get(importPath);\n\n if (!resolvedAbsPath) {\n unresolvedImports.push(importPath);\n continue;\n }\n\n // Get the FileManager for the target file to reuse its source\n const relativePath = Path.toRelative(resolvedAbsPath);\n const targetFileManager = filesOrchestrator.files.get(relativePath);\n\n if (!targetFileManager) {\n // Target file not in files map - fall back to static export\n const newExport = `export * from \"./${cachePath}\"`;\n const startIndex = match.index!;\n const endIndex = startIndex + fullExport.length;\n transformedCode =\n transformedCode.slice(0, startIndex) + newExport + transformedCode.slice(endIndex);\n continue;\n }\n\n // Analyze the target file to get export information\n const exportInfo = exportAnalyzer.analyzeExports(targetFileManager);\n\n // If we have exports to re-export, generate dynamic re-export code\n if (exportInfo.namedExports.length > 0 || exportInfo.hasDefaultExport) {\n const moduleVar = `__reexport_${i}`;\n const statements: string[] = [];\n\n // Import the module dynamically\n statements.push(`const ${moduleVar} = await __import(\"./${cachePath}\");`);\n\n // Re-export named exports\n for (const exportName of exportInfo.namedExports) {\n statements.push(`export const ${exportName} = ${moduleVar}.${exportName};`);\n }\n\n // Re-export default if exists\n if (exportInfo.hasDefaultExport) {\n statements.push(`export default ${moduleVar}.default;`);\n }\n\n const newExport = statements.join(\"\\n\");\n\n // Replace in code\n const startIndex = match.index!;\n const endIndex = startIndex + fullExport.length;\n transformedCode =\n transformedCode.slice(0, startIndex) + newExport + transformedCode.slice(endIndex);\n } else {\n // Fallback to static export if no exports found (shouldn't happen normally)\n // This handles edge cases where analysis might fail\n const newExport = `export * from \"./${cachePath}\"`;\n\n // Replace in code\n const startIndex = match.index!;\n const endIndex = startIndex + fullExport.length;\n transformedCode =\n transformedCode.slice(0, startIndex) + newExport + transformedCode.slice(endIndex);\n }\n } else {\n // export { foo, bar } from \"./module\"\n // Transform to individual exports using __import\n const moduleVar = `__module_${i}`;\n const namedExports = exportSpecifier; // e.g., \"{ foo, bar }\"\n // Extract export names from the specifier\n const exportNames =\n namedExports\n .match(/\\{([^}]+)\\}/)?.[1]\n ?.split(\",\")\n .map((s) => s.trim()) || [];\n const exportStatements = exportNames\n .map((name) => `export const ${name} = ${moduleVar}.${name};`)\n .join(\"\\n\");\n const newExport = `const ${moduleVar} = await __import(\"./${cachePath}\");\\n${exportStatements}`;\n\n // Replace in code\n const startIndex = match.index!;\n const endIndex = startIndex + fullExport.length;\n transformedCode =\n transformedCode.slice(0, startIndex) + newExport + transformedCode.slice(endIndex);\n }\n }\n\n // If there are unresolved imports, throw an error\n if (unresolvedImports.length > 0) {\n devLogError(\n `Failed to transform imports in ${fileManager.relativePath}:\\n` +\n `Unresolved imports: ${unresolvedImports.join(\", \")}\\n` +\n `These files may not exist or are not being tracked.`,\n );\n return \"\";\n }\n\n return transformedCode;\n}\n\n/**\n * Build a replacement statement for different import syntaxes\n * @param importSpecifier The import specifier (e.g., \"Foo\", \"{ a, b }\", \"Foo, { a, b }\", \"* as Bar\")\n * @param cachePath The path to the cached file\n */\nfunction buildImportReplacement(importSpecifier: string, cachePath: string): string {\n const trimmed = importSpecifier.trim();\n\n // Namespace import: import * as Foo from \"module\";\n if (trimmed.startsWith(\"* as \")) {\n const identifier = trimmed.replace(\"* as \", \"\").trim();\n return `const ${identifier} = await __import(\"./${cachePath}\")`;\n }\n\n // Mixed import: import Foo, { a, b } from \"module\";\n // Transform to: const __module = await __import(...); const Foo = __module?.default ?? __module; const { a, b } = __module;\n // Handle multiline: import Foo, {\\n a,\\n b\\n} from \"module\";\n if (trimmed.match(/^(\\w+)\\s*,\\s*\\{/)) {\n const match = trimmed.match(/^(\\w+)\\s*,\\s*(\\{[\\s\\S]*?\\})/);\n if (match) {\n const defaultImport = match[1];\n let namedImports = match[2];\n const moduleVar = `__module_${Math.random().toString(36).slice(2, 8)}`;\n\n // Clean up whitespace and normalize\n namedImports = namedImports.replace(/\\s+/g, \" \").trim();\n // Normalize `{ default as X }` to `{ default: X }` for valid destructuring\n const normalized = namedImports.replace(/default\\s+as\\s+/g, \"default: \");\n\n // Generate correct syntax with proper separators\n return `const ${moduleVar} = await __import(\"./${cachePath}\");\nconst ${defaultImport} = ${moduleVar}?.default ?? ${moduleVar};\nconst ${normalized} = ${moduleVar};`;\n }\n }\n\n // Destructured / named imports (including default alias): import { a, default as X } from \"module\";\n if (trimmed.startsWith(\"{\")) {\n // Clean up multiline formatting\n let cleanedImports = trimmed.replace(/\\s+/g, \" \").trim();\n // Normalize `{ default as X }` to `{ default: X }` for valid destructuring\n const normalized = cleanedImports.replace(/default\\s+as\\s+/g, \"default: \");\n return `const ${normalized} = await __import(\"./${cachePath}\")`;\n }\n\n // Default import: import Foo from \"module\";\n // Use default with fallback to module object\n const moduleVar = `__module_${Math.random().toString(36).slice(2, 8)}`;\n return `const ${moduleVar} = await __import(\"./${cachePath}\");\\nconst ${trimmed} = ${moduleVar}?.default ?? ${moduleVar};`;\n}\n\n/**\n * Find the cache path for an import\n *\n * Uses the fileManager's importMap which maps original imports to resolved paths.\n * The cache path is computed deterministically from the resolved path,\n * so we don't need to look up the dependency in the files map.\n *\n * @param importPath The import path from the import statement\n * @param fileManager The file that contains this import\n * @returns The cache path string, or null if not resolved\n */\nfunction findCachePathForImport(importPath: string, fileManager: FileManager): string | null {\n // Look up the resolved absolute path from the import map\n const resolvedAbsPath = fileManager.importMap.get(importPath);\n\n if (!resolvedAbsPath) {\n return null;\n }\n\n // Convert to relative path\n const relativePath = Path.toRelative(resolvedAbsPath);\n\n // Compute cache path deterministically - no need for filesMap!\n // This is the same formula used in FileManager.cachePath\n return relativePath.replace(/\\//g, \"-\").replace(/\\.(ts|tsx)$/, \".js\");\n}\n","import { createDirectoryAsync, removeDirectoryAsync } from \"@mongez/fs\";\nimport glob from \"fast-glob\";\nimport { srcPath, warlockPath } from \"../utils\";\nimport { Path } from \"./path\";\n\nexport async function createFreshWarlockDirectory() {\n const cacheDirectory = warlockPath(\"cache\");\n try {\n await removeDirectoryAsync(cacheDirectory);\n } catch {\n // ignore\n }\n\n await createDirectoryAsync(cacheDirectory, { recursive: true });\n}\n\n/**\n * Get files from directory\n * @param directoryPath\n * @param pattern\n * @returns array of files full paths\n */\nexport async function getFilesFromDirectory(directoryPath = srcPath(), pattern = \"**/*.{ts,tsx}\") {\n const files = await glob(`${Path.normalize(directoryPath)}/${pattern}`, {\n absolute: true, // Return absolute paths\n });\n\n return files.map((file) => Path.normalize(file));\n}\n\nexport async function getCertainFilesFromDirectory(directoryPath: string, filesNames: string[]) {\n return getFilesFromDirectory(directoryPath, \"(\" + filesNames.join(\"|\") + \").{ts,tsx}\");\n}\n\nexport function warlockCachePath(relativePath: string) {\n return `${warlockPath(\"cache\")}/${relativePath}`;\n}\n\n/**\n * Compare two sets for equality\n */\nexport function areSetsEqual<T>(set1: Set<T>, set2: Set<T>): boolean {\n if (set1.size !== set2.size) return false;\n for (const item of set1) {\n if (!set2.has(item)) return false;\n }\n return true;\n}\n","import events from \"@mongez/events\";\nimport { getFileAsync, lastModifiedAsync, putFileAsync } from \"@mongez/fs\";\nimport crypto from \"crypto\";\nimport { pathToFileURL } from \"url\";\nimport { DEV_SERVER_EVENTS } from \"./events\";\nimport { type FileOperations } from \"./file-operations\";\nimport { transformImports } from \"./import-transformer\";\nimport { parseImports } from \"./parse-imports\";\nimport { Path } from \"./path\";\nimport { transpileFile } from \"./transpile-file\";\nimport type { FileManifest, FileState, FileType, LayerType } from \"./types\";\nimport { warlockCachePath } from \"./utils\";\n\n/**\n * Options for the process() method\n */\nexport interface ProcessOptions {\n /**\n * Force reprocessing even if file hasn't changed\n * @default false\n */\n force?: boolean;\n\n /**\n * Whether to transform imports to cache paths\n * Set to false during batch operations where imports are transformed later\n * @default true\n */\n transformImports?: boolean;\n\n /**\n * Whether to save to cache after processing\n * Set to false if you need to do additional transformations before saving\n * @default true\n */\n saveToCache?: boolean;\n}\n\n/**\n * FileManager - Manages the lifecycle of a single source file\n *\n * ## Lifecycle States\n *\n * ```\n * idle → loading → parsed → transpiled → ready\n * ↑ │\n * └──────────── (file changed) ──────────┘\n * ```\n *\n * ## Processing Pipeline\n *\n * All file processing flows through a unified pipeline:\n * 1. **Load** - Read source from disk\n * 2. **Hash** - Calculate content hash for change detection\n * 3. **Parse** - Discover imports and dependencies\n * 4. **Transpile** - Convert TypeScript to JavaScript\n * 5. **Transform** - Rewrite import paths to cache locations\n * 6. **Save** - Write transformed code to cache (ONCE)\n *\n * ## Usage Examples\n *\n * ```typescript\n * // Standard processing (full pipeline)\n * const file = new FileManager(absolutePath, filesMap, fileOps);\n * await file.process();\n *\n * // Batch processing (parse first, complete later)\n * await file.parse();\n * // ... after dependencies are ready ...\n * await file.complete();\n *\n * // Check for changes and reprocess if needed\n * const changed = await file.process(); // returns false if unchanged\n *\n * // Force reprocessing\n * await file.process({ force: true });\n * ```\n *\n * @class FileManager\n */\nexport class FileManager {\n /**\n * Relative path from the project root directory\n * Used as the primary identifier for files throughout the system\n * @example \"src/app/users/controllers/get-user.controller.ts\"\n */\n public relativePath = \"\";\n\n /**\n * Unix timestamp of the last modification time\n * Used with hash for change detection\n */\n public lastModified = 0;\n\n /**\n * SHA-256 hash of the source content\n * Primary mechanism for detecting file changes\n */\n public hash = \"\";\n\n /**\n * Original TypeScript/JavaScript source code\n * Loaded from disk during processing\n */\n public source = \"\";\n\n /**\n * Transpiled JavaScript code with transformed imports\n * This is the final output that gets saved to cache and loaded at runtime\n */\n public transpiled = \"\";\n\n /**\n * Set of relative paths that this file depends on (imports)\n * Used to build the dependency graph for HMR invalidation\n * @example Set([\"src/app/users/models/user.model.ts\", \"src/config/database.ts\"])\n */\n public dependencies = new Set<string>();\n\n /**\n * Map of original import specifiers to resolved absolute paths\n * Key: the exact import string from source (e.g., \"./user.model\")\n * Value: resolved absolute path (e.g., \"D:/project/src/app/users/models/user.model.ts\")\n *\n * Used during import transformation to rewrite paths to cache locations\n */\n public importMap = new Map<string, string>();\n\n /**\n * Set of relative paths that depend on this file\n * Populated from the dependency graph after initial processing\n * Used to determine what needs reloading when this file changes\n */\n public dependents = new Set<string>();\n\n /**\n * Version number incremented on each change\n * Used for cache busting in dynamic imports\n */\n public version = 0;\n\n /**\n * Semantic type of the file based on its path/content\n * Used to determine reload behavior and special handling\n */\n public type: FileType | undefined;\n\n /**\n * Reload layer: HMR (hot module replacement) or FSR (full server restart)\n * Determines how changes to this file are applied at runtime\n */\n public layer: LayerType | undefined;\n\n /**\n * Path to the cached transpiled file (relative to .warlock/cache/)\n * @example \"src-app-users-controllers-get-user.controller.js\"\n */\n public cachePath = \"\";\n\n /**\n * Cleanup function called before the file is unloaded\n * Set by module loader for files that export cleanup handlers\n */\n public cleanup?: (() => void)[] | (() => void);\n\n /**\n * Whether imports have been transformed to cache paths\n * Prevents double transformation and tracks processing state\n */\n public importsTransformed = false;\n\n /**\n * Whether this file contains only type definitions (no runtime code)\n * Type-only files are excluded from circular dependency detection\n */\n public isTypeOnlyFile = false;\n\n /**\n * Current processing state of the file\n *\n * - `idle`: Initial state, no processing started\n * - `loading`: Reading source from disk\n * - `parsed`: Source loaded and imports discovered\n * - `transpiled`: TypeScript compiled to JavaScript\n * - `ready`: Fully processed and available for use\n * - `updating`: Being reprocessed after a change\n * - `deleted`: File has been removed from disk\n */\n public state: FileState = \"idle\";\n\n /**\n * Creates a new FileManager instance\n *\n * @param absolutePath - Full filesystem path to the source file\n * @param files - Map of all tracked files (for import resolution)\n * @param fileOperations - FileOperations instance (for adding missing dependencies)\n *\n * @example\n * ```typescript\n * const fileManager = new FileManager(\n * \"D:/project/src/app/users/controllers/get-user.controller.ts\",\n * filesMap,\n * fileOperations\n * );\n * ```\n */\n public constructor(\n public readonly absolutePath: string,\n public files: Map<string, FileManager>,\n public fileOperations: FileOperations,\n ) {}\n\n /**\n * Initialize the file manager from disk or manifest cache\n *\n * This is the primary entry point for file initialization.\n * If manifest data is provided, it will attempt to use cached data\n * and only reprocess if the file has changed.\n *\n * @param fileManifest - Optional cached manifest data from previous build\n *\n * @example\n * ```typescript\n * // Fresh initialization (no cache)\n * await fileManager.init();\n *\n * // Initialize with cached manifest data\n * await fileManager.init(manifestEntry);\n * ```\n */\n public async init(fileManifest?: Partial<FileManifest>): Promise<void> {\n // Set up basic paths\n this.relativePath = Path.toRelative(this.absolutePath);\n this.cachePath = this.relativePath.replace(/\\//g, \"-\").replace(/\\.(ts|tsx)$/, \".js\");\n this.detectFileTypeAndLayer();\n\n if (fileManifest) {\n await this.initFromManifest(fileManifest);\n } else {\n // Fresh file - run full processing pipeline\n await this.process();\n }\n }\n\n /**\n * Get the cache path as a file:// URL for dynamic import\n * Includes cache busting query parameter based on version\n *\n * @returns File URL ready for dynamic import, or empty string if no cache\n *\n * @example\n * ```typescript\n * const module = await import(fileManager.cachePathUrl);\n * ```\n */\n public get cachePathUrl(): string {\n if (!this.cachePath) return \"\";\n return pathToFileURL(warlockCachePath(this.cachePath)).href;\n }\n\n /**\n * Process the file through the unified pipeline\n *\n * This is the core method that handles all file processing.\n * It implements a single-pass pipeline that:\n * 1. Loads source from disk\n * 2. Checks if content changed (skip if unchanged)\n * 3. Parses imports to discover dependencies\n * 4. Ensures all dependencies exist\n * 5. Transpiles TypeScript to JavaScript\n * 6. Transforms imports to cache paths\n * 7. Saves to cache (ONCE - no duplicate writes)\n *\n * @param options - Processing options\n * @param options.force - Force reprocessing even if unchanged\n * @param options.transformImports - Whether to transform import paths (default: true)\n * @param options.saveToCache - Whether to save to cache file (default: true)\n *\n * @returns True if file was processed, false if unchanged and skipped\n *\n * @example\n * ```typescript\n * // Normal processing\n * const changed = await fileManager.process();\n *\n * // Force reprocess\n * await fileManager.process({ force: true });\n *\n * // Batch mode: transform imports later\n * await fileManager.process({ transformImports: false });\n * ```\n */\n public async process(options: ProcessOptions = {}): Promise<boolean> {\n const { force = false, transformImports: shouldTransform = true, saveToCache = true } = options;\n\n // Ensure paths are initialized (in case process() is called directly)\n if (!this.relativePath) {\n this.relativePath = Path.toRelative(this.absolutePath);\n }\n if (!this.cachePath) {\n this.cachePath = this.relativePath.replace(/\\//g, \"-\").replace(/\\.(ts|tsx)$/, \".js\");\n }\n if (!this.type) {\n this.detectFileTypeAndLayer();\n }\n\n this.state = \"loading\";\n\n // Step 1: Load source from disk\n let newSource: string;\n try {\n newSource = await getFileAsync(this.absolutePath);\n } catch (error) {\n this.state = \"deleted\";\n return false;\n }\n\n // Step 2: Calculate hash and check for changes\n const newHash = crypto.createHash(\"sha256\").update(newSource).digest(\"hex\");\n\n if (!force && newHash === this.hash && this.transpiled && this.importsTransformed) {\n // File unchanged and already processed\n this.state = \"ready\";\n return false;\n }\n\n // Update source and metadata\n this.source = newSource;\n this.hash = newHash;\n this.lastModified = (await lastModifiedAsync(this.absolutePath)).getTime();\n this.version++;\n\n // Step 3: Parse imports to discover dependencies\n this.state = \"parsed\";\n this.importMap = await parseImports(this.source, this.absolutePath);\n this.dependencies = new Set(\n Array.from(this.importMap.values()).map((absPath) => Path.toRelative(absPath)),\n );\n\n // Note: Dependency existence is handled at orchestrator level, not here\n // This keeps FM focused on single-file processing\n\n // Step 4: Transpile TypeScript to JavaScript\n this.state = \"transpiled\";\n this.transpiled = await transpileFile(this);\n\n // Step 5: Transform imports to cache paths\n if (shouldTransform && this.dependencies.size > 0) {\n this.transpiled = transformImports(this);\n this.importsTransformed = true;\n } else {\n this.importsTransformed = false;\n }\n\n // Step 6: Save to cache (ONCE - after all transformations)\n if (saveToCache) {\n await putFileAsync(warlockCachePath(this.cachePath), this.transpiled);\n }\n\n // Step 7: Mark as ready\n this.state = \"ready\";\n events.trigger(DEV_SERVER_EVENTS.FILE_READY, this);\n\n return true;\n }\n\n /**\n * Parse the file to discover dependencies (Phase 1 of batch processing)\n *\n * This method only performs the first half of processing:\n * - Loads source from disk\n * - Calculates hash\n * - Parses imports to discover dependencies\n * - Sets up file metadata\n *\n * Use this for batch file operations where you need to know\n * dependencies before deciding processing order.\n *\n * **Important**: After calling parse(), you must call complete()\n * to finish processing and make the file usable.\n *\n * @example\n * ```typescript\n * // Batch processing pattern\n * const files = await Promise.all(\n * paths.map(async (path) => {\n * const file = new FileManager(path, filesMap, fileOps);\n * await file.parse();\n * return file;\n * })\n * );\n *\n * // Order by dependencies, then complete\n * for (const file of orderedFiles) {\n * await file.complete();\n * }\n * ```\n */\n public async parse(): Promise<void> {\n this.state = \"loading\";\n\n // Load source\n this.source = await getFileAsync(this.absolutePath);\n this.hash = crypto.createHash(\"sha256\").update(this.source).digest(\"hex\");\n this.relativePath = Path.toRelative(this.absolutePath);\n this.lastModified = (await lastModifiedAsync(this.absolutePath)).getTime();\n this.version = 0;\n\n // Set up cache path\n this.cachePath = this.relativePath.replace(/\\//g, \"-\").replace(/\\.(ts|tsx)$/, \".js\");\n\n // Detect type and layer\n this.detectFileTypeAndLayer();\n\n // Parse imports to discover dependencies\n this.importMap = await parseImports(this.source, this.absolutePath);\n this.dependencies = new Set(\n Array.from(this.importMap.values()).map((absPath) => Path.toRelative(absPath)),\n );\n\n this.state = \"parsed\";\n }\n\n /**\n * Complete file processing after parse() (Phase 2 of batch processing)\n *\n * This method completes the processing pipeline:\n * - Ensures dependencies exist\n * - Transpiles TypeScript to JavaScript\n * - Transforms imports to cache paths\n * - Saves to cache\n *\n * **Important**: This must be called after parse() to finish processing.\n * The file is not usable until complete() has been called.\n *\n * @example\n * ```typescript\n * await file.parse();\n * // ... after dependencies are ready ...\n * await file.complete();\n * // File is now ready for use\n * ```\n */\n public async complete(): Promise<void> {\n // Ensure we're in the right state\n if (this.state !== \"parsed\") {\n throw new Error(`Cannot complete file in state \"${this.state}\". Call parse() first.`);\n }\n\n // Note: Dependency existence is handled at orchestrator/batch level\n // by the time complete() is called, dependencies should already exist\n\n // Transpile\n this.state = \"transpiled\";\n this.transpiled = await transpileFile(this);\n\n // Transform imports\n if (this.dependencies.size > 0) {\n this.transpiled = transformImports(this);\n }\n\n this.importsTransformed = true;\n\n // Save to cache (ONCE)\n await putFileAsync(warlockCachePath(this.cachePath), this.transpiled);\n\n // Mark as ready\n this.state = \"ready\";\n events.trigger(DEV_SERVER_EVENTS.FILE_READY, this);\n }\n\n /**\n * Update the file after a change during development\n *\n * This is a convenience method that delegates to process().\n * It checks if the file has actually changed and only reprocesses if needed.\n *\n * @returns True if file was reprocessed, false if unchanged\n *\n * @example\n * ```typescript\n * // Called by file watcher\n * const changed = await fileManager.update();\n * if (changed) {\n * console.log(\"File was updated\");\n * }\n * ```\n */\n public async update(): Promise<boolean> {\n return this.process();\n }\n\n /**\n * Force reprocess the file regardless of hash match\n *\n * Use this when:\n * - A dependency that was previously missing is now available\n * - Import transformation needs to be redone\n * - Cache is corrupted or missing\n *\n * @example\n * ```typescript\n * // After a missing dependency is added\n * await fileManager.forceReprocess();\n * ```\n */\n public async forceReprocess(): Promise<void> {\n await this.process({ force: true });\n }\n\n /**\n * Initialize from cached manifest data\n *\n * Attempts to use cached data from a previous build.\n * If the file has changed (hash mismatch) or cache is missing,\n * falls back to full processing.\n *\n * @param fileManifest - Cached manifest entry\n * @internal\n */\n protected async initFromManifest(fileManifest: Partial<FileManifest>): Promise<void> {\n // Apply manifest properties\n this.version = fileManifest.version || 0;\n this.type = fileManifest.type;\n this.layer = fileManifest.layer;\n this.cachePath =\n fileManifest.cachePath || this.relativePath.replace(/\\//g, \"-\").replace(/\\.(ts|tsx)$/, \".js\");\n\n // Load source and check for changes\n this.state = \"loading\";\n try {\n this.source = await getFileAsync(this.absolutePath);\n } catch (error) {\n this.state = \"deleted\";\n return;\n }\n\n const currentHash = crypto.createHash(\"sha256\").update(this.source).digest(\"hex\");\n const hasChanged = currentHash !== fileManifest.hash;\n\n if (hasChanged) {\n // File changed - full reprocess\n this.hash = currentHash;\n this.lastModified = (await lastModifiedAsync(this.absolutePath)).getTime();\n this.version++;\n await this.process({ force: true });\n } else {\n // File unchanged - load from cache\n this.hash = fileManifest.hash!;\n this.lastModified = fileManifest.lastModified!;\n this.dependencies = new Set(fileManifest.dependencies || []);\n this.dependents = new Set(fileManifest.dependents || []);\n\n try {\n this.transpiled = await getFileAsync(warlockCachePath(this.cachePath));\n this.importsTransformed = true;\n this.state = \"ready\";\n events.trigger(DEV_SERVER_EVENTS.FILE_READY, this);\n } catch (error) {\n // Cache missing - reprocess\n await this.process({ force: true });\n }\n }\n }\n\n /**\n * Detect the file type and reload layer based on path patterns\n *\n * File types determine special handling:\n * - `main`: Application entry point\n * - `config`: Configuration files\n * - `route`: Route definitions\n * - `controller`: HTTP controllers\n * - `service`: Business logic services\n * - `model`: Database models\n * - `event`: Event handlers\n * - `other`: Everything else\n *\n * Layers determine reload behavior:\n * - `HMR`: Hot module replacement (instant reload)\n * - `FSR`: Full server restart (required for some changes)\n *\n * @internal\n */\n protected detectFileTypeAndLayer(): void {\n // Main entry files\n if (this.relativePath.includes(\"main.ts\") || this.relativePath.includes(\"main.tsx\")) {\n this.type = \"main\";\n this.layer = \"HMR\";\n return;\n }\n\n // Config files\n if (this.relativePath.startsWith(\"src/config/\")) {\n this.type = \"config\";\n this.layer = \"HMR\";\n return;\n }\n\n // Routes files\n if (this.relativePath.endsWith(\"routes.ts\") || this.relativePath.endsWith(\"routes.tsx\")) {\n this.type = \"route\";\n this.layer = \"HMR\";\n return;\n }\n\n // Event files\n if (this.relativePath.includes(\"/events/\")) {\n this.type = \"event\";\n this.layer = \"HMR\";\n return;\n }\n\n // Controllers\n if (this.relativePath.includes(\"controller\")) {\n this.type = \"controller\";\n this.layer = \"HMR\";\n return;\n }\n\n // Services\n if (this.relativePath.includes(\"service\")) {\n this.type = \"service\";\n this.layer = \"HMR\";\n return;\n }\n\n // Models\n if (this.relativePath.includes(\"model\")) {\n this.type = \"model\";\n this.layer = \"HMR\";\n return;\n }\n\n // Default: other files use HMR\n this.type = \"other\";\n this.layer = \"HMR\";\n }\n\n /**\n * Export file data as a manifest entry for caching\n *\n * The manifest stores metadata about each file to enable:\n * - Fast startup by skipping unchanged files\n * - Dependency tracking across restarts\n * - Cache validation via hash comparison\n *\n * Note: Source code and transpiled output are NOT stored in manifest.\n * - Source is always read from disk\n * - Transpiled code is stored in .warlock/cache/\n *\n * @returns Manifest entry for this file\n *\n * @example\n * ```typescript\n * const entry = fileManager.toManifest();\n * manifest.setFile(fileManager.relativePath, entry);\n * ```\n */\n public toManifest(): FileManifest {\n return {\n absolutePath: this.absolutePath,\n relativePath: this.relativePath,\n lastModified: this.lastModified,\n hash: this.hash,\n dependencies: Array.from(this.dependencies),\n dependents: Array.from(this.dependents),\n version: this.version,\n type: this.type!,\n layer: this.layer!,\n cachePath: this.cachePath,\n };\n }\n}\n","import events from \"@mongez/events\";\r\nimport { unlinkAsync } from \"@mongez/fs\";\r\nimport type { DependencyGraph } from \"./dependency-graph\";\r\nimport { DEV_SERVER_EVENTS } from \"./events\";\r\nimport { FileManager } from \"./file-manager\";\r\nimport type { ManifestManager } from \"./manifest-manager\";\r\nimport { parseImports } from \"./parse-imports\";\r\nimport { Path } from \"./path\";\r\nimport type { SpecialFilesCollector } from \"./special-files-collector\";\r\nimport { areSetsEqual, warlockCachePath } from \"./utils\";\r\n\r\n/**\r\n * FileOperations - Handles file lifecycle operations\r\n *\r\n * This class is responsible for managing the lifecycle of files:\r\n * - **Add**: Register and process new files\r\n * - **Update**: Reprocess changed files\r\n * - **Delete**: Remove files and clean up resources\r\n *\r\n * It coordinates between:\r\n * - FileManager instances (individual file processing)\r\n * - DependencyGraph (tracking imports/dependents)\r\n * - ManifestManager (caching file metadata)\r\n * - SpecialFilesCollector (categorizing files by type)\r\n *\r\n * ## Usage\r\n *\r\n * ```typescript\r\n * const fileOps = new FileOperations(files, graph, manifest, collector);\r\n *\r\n * // Add a new file\r\n * const file = await fileOps.addFile(\"src/app/users/user.controller.ts\");\r\n *\r\n * // Update an existing file\r\n * const changed = await fileOps.updateFile(\"src/app/users/user.controller.ts\");\r\n *\r\n * // Delete a file\r\n * await fileOps.deleteFile(\"src/app/users/user.controller.ts\");\r\n * ```\r\n *\r\n * @class FileOperations\r\n */\r\nexport class FileOperations {\r\n /**\r\n * Creates a new FileOperations instance\r\n *\r\n * @param files - Map of all tracked FileManager instances (key: relative path)\r\n * @param dependencyGraph - Graph tracking file dependencies\r\n * @param manifest - Manager for persisting file metadata\r\n * @param specialFilesCollector - Collector for categorizing special files\r\n */\r\n public constructor(\r\n private readonly files: Map<string, FileManager>,\r\n private readonly dependencyGraph: DependencyGraph,\r\n private readonly manifest: ManifestManager,\r\n private readonly specialFilesCollector: SpecialFilesCollector,\r\n ) {}\r\n\r\n /**\r\n * Add a new file to the system\r\n *\r\n * This method uses a two-phase approach to ensure dependencies are processed:\r\n * 1. Parse the file to discover dependencies\r\n * 2. Recursively add all dependencies (so their cache files exist)\r\n * 3. Complete processing (transpile + transform + save)\r\n *\r\n * This ensures that when imports are transformed to cache paths,\r\n * the dependency cache files actually exist.\r\n *\r\n * If the file is already tracked, returns the existing FileManager.\r\n *\r\n * @param relativePath - Relative path from project root\r\n * @returns The FileManager instance for the file\r\n *\r\n * @example\r\n * ```typescript\r\n * const file = await fileOps.addFile(\"src/config/auth.ts\");\r\n * // Dependencies like \"app/users/models/user\" are also processed\r\n * console.log(file.state); // \"ready\"\r\n * ```\r\n */\r\n public async addFile(relativePath: string): Promise<FileManager> {\r\n // Return existing if already tracked (idempotent)\r\n if (this.files.has(relativePath)) {\r\n return this.files.get(relativePath)!;\r\n }\r\n\r\n const absolutePath = Path.toAbsolute(relativePath);\r\n const fileManager = new FileManager(absolutePath, this.files, this);\r\n\r\n // Add to tracking FIRST so other files can find it during recursion\r\n this.files.set(relativePath, fileManager);\r\n\r\n // Phase 1: Parse to discover dependencies (no transpile yet)\r\n await fileManager.parse();\r\n\r\n // Phase 2: Recursively add all dependencies\r\n // This ensures their cache files exist before we transform our imports\r\n for (const depPath of fileManager.dependencies) {\r\n if (!this.files.has(depPath)) {\r\n try {\r\n await this.addFile(depPath); // Recursive\r\n } catch (error) {\r\n // Dependency might be external or not exist, continue\r\n }\r\n }\r\n }\r\n\r\n // Phase 3: Complete processing (transpile + transform + save)\r\n // Now all dependencies have cache files, so transforms will work\r\n await fileManager.complete();\r\n\r\n // Register dependencies in graph\r\n for (const dependency of fileManager.dependencies) {\r\n this.dependencyGraph.addDependency(relativePath, dependency);\r\n }\r\n\r\n // Add to special files collector\r\n this.specialFilesCollector.addFile(fileManager);\r\n\r\n // Reload any files that were waiting for this dependency\r\n await this.reloadFilesWaitingForDependency(relativePath);\r\n\r\n return fileManager;\r\n }\r\n\r\n /**\r\n * Parse a new file without completing processing (Phase 1 of batch add)\r\n *\r\n * This is used during batch file operations where you need to:\r\n * 1. Discover all dependencies first\r\n * 2. Determine processing order (topological sort)\r\n * 3. Complete processing in dependency order\r\n *\r\n * After calling this, call `finalizeNewFile()` to complete processing.\r\n *\r\n * @param relativePath - Relative path from project root\r\n * @returns The FileManager instance (in \"parsed\" state)\r\n *\r\n * @example\r\n * ```typescript\r\n * // Phase 1: Parse all files to discover dependencies\r\n * const files = await Promise.all(\r\n * paths.map(path => fileOps.parseNewFile(path))\r\n * );\r\n *\r\n * // Phase 2: Order by dependencies, then finalize\r\n * for (const file of orderedFiles) {\r\n * await fileOps.finalizeNewFile(file);\r\n * }\r\n * ```\r\n */\r\n public async parseNewFile(relativePath: string): Promise<FileManager> {\r\n // Return existing if already tracked\r\n if (this.files.has(relativePath)) {\r\n return this.files.get(relativePath)!;\r\n }\r\n\r\n const absolutePath = Path.toAbsolute(relativePath);\r\n const fileManager = new FileManager(absolutePath, this.files, this);\r\n\r\n // Parse only - discover dependencies without full processing\r\n await fileManager.parse();\r\n\r\n // Add to files map so other files can find it during import resolution\r\n this.files.set(relativePath, fileManager);\r\n\r\n return fileManager;\r\n }\r\n\r\n /**\r\n * Complete processing for a parsed file (Phase 2 of batch add)\r\n *\r\n * This completes the processing pipeline for a file that was\r\n * previously parsed with `parseNewFile()`.\r\n *\r\n * @param fileManager - The FileManager to finalize (must be in \"parsed\" state)\r\n *\r\n * @example\r\n * ```typescript\r\n * const file = await fileOps.parseNewFile(\"src/app/users/user.controller.ts\");\r\n * // ... after dependencies are ready ...\r\n * await fileOps.finalizeNewFile(file);\r\n * ```\r\n */\r\n public async finalizeNewFile(fileManager: FileManager): Promise<void> {\r\n // Complete processing (transpile, transform imports, save cache)\r\n await fileManager.complete();\r\n\r\n // Register dependencies in graph\r\n for (const dependency of fileManager.dependencies) {\r\n this.dependencyGraph.addDependency(fileManager.relativePath, dependency);\r\n }\r\n\r\n // Add to special files collector\r\n this.specialFilesCollector.addFile(fileManager);\r\n\r\n // Reload any files that were waiting for this dependency\r\n await this.reloadFilesWaitingForDependency(fileManager.relativePath);\r\n }\r\n\r\n /**\r\n * Reload files that might have been waiting for a newly added dependency\r\n *\r\n * When a file is added, check if any existing files have imports\r\n * that could now resolve to this new file. If so, reprocess them.\r\n *\r\n * This handles cases where:\r\n * - A file was created that another file was trying to import\r\n * - A batch of files is added where some depend on others\r\n *\r\n * @param newFilePath - Relative path of the newly added file\r\n * @internal\r\n */\r\n private async reloadFilesWaitingForDependency(newFilePath: string): Promise<void> {\r\n const potentialDependents: string[] = [];\r\n\r\n // Check all existing files to see if any could now resolve to the new file\r\n for (const [existingPath, existingFile] of this.files) {\r\n if (existingPath === newFilePath) continue;\r\n if (existingFile.state !== \"ready\") continue;\r\n\r\n try {\r\n // Re-parse imports to check if any resolve to the new file\r\n const importMap = await parseImports(existingFile.source, existingFile.absolutePath);\r\n\r\n for (const [_importPath, resolvedPath] of importMap) {\r\n if (resolvedPath && Path.toRelative(resolvedPath) === newFilePath) {\r\n potentialDependents.push(existingPath);\r\n break;\r\n }\r\n }\r\n } catch (error) {\r\n // Skip files that can't be parsed\r\n continue;\r\n }\r\n }\r\n\r\n // Reprocess dependents\r\n for (const dependentPath of potentialDependents) {\r\n const dependentFile = this.files.get(dependentPath);\r\n if (dependentFile) {\r\n try {\r\n await dependentFile.forceReprocess();\r\n this.dependencyGraph.updateFile(dependentPath, dependentFile.dependencies);\r\n } catch (error) {\r\n // Ignore - file might still have issues\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Update an existing file after it has changed\r\n *\r\n * This method:\r\n * 1. Reprocesses the file if content has changed\r\n * 2. Updates the dependency graph if dependencies changed\r\n * 3. Updates the special files collector\r\n * 4. Triggers the FILE_READY event\r\n *\r\n * If the file isn't tracked, it's treated as a new file.\r\n *\r\n * @param relativePath - Relative path from project root\r\n * @returns True if file was changed and reprocessed, false if unchanged\r\n *\r\n * @example\r\n * ```typescript\r\n * const changed = await fileOps.updateFile(\"src/app/users/user.controller.ts\");\r\n * if (changed) {\r\n * console.log(\"File was updated, triggering HMR...\");\r\n * }\r\n * ```\r\n */\r\n public async updateFile(relativePath: string): Promise<boolean> {\r\n const fileManager = this.files.get(relativePath);\r\n\r\n if (!fileManager) {\r\n // File not tracked - treat as new file\r\n await this.addFile(relativePath);\r\n return true;\r\n }\r\n\r\n // Store old dependencies for comparison\r\n const oldDependencies = new Set(fileManager.dependencies);\r\n\r\n try {\r\n // Update the file (reprocess if changed)\r\n const hasChanged = await fileManager.update();\r\n\r\n if (!hasChanged) {\r\n return false;\r\n }\r\n\r\n // Update dependency graph if dependencies changed\r\n if (!areSetsEqual(oldDependencies, fileManager.dependencies)) {\r\n this.dependencyGraph.updateFile(relativePath, fileManager.dependencies);\r\n }\r\n\r\n // Update special files collector\r\n this.specialFilesCollector.updateFile(fileManager);\r\n\r\n return true;\r\n } catch (error) {\r\n // Failed to update (likely broken imports)\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Delete a file from the system\r\n *\r\n * This method:\r\n * 1. Removes the cache file from disk\r\n * 2. Removes the file from the dependency graph\r\n * 3. Removes from special files collector\r\n * 4. Removes from manifest\r\n * 5. Triggers reload of dependents (so they see broken import errors)\r\n * 6. Removes from the files map\r\n *\r\n * @param relativePath - Relative path from project root\r\n *\r\n * @example\r\n * ```typescript\r\n * await fileOps.deleteFile(\"src/app/users/user.controller.ts\");\r\n * // File is now fully removed from the system\r\n * ```\r\n */\r\n public async deleteFile(relativePath: string): Promise<void> {\r\n const fileManager = this.files.get(relativePath);\r\n\r\n if (!fileManager) {\r\n return;\r\n }\r\n\r\n // Get dependents before removal (so we can notify them)\r\n const dependents = this.dependencyGraph.getDependents(relativePath);\r\n\r\n // Delete cache file\r\n try {\r\n const cachePath = warlockCachePath(fileManager.cachePath);\r\n await unlinkAsync(cachePath);\r\n } catch (error) {\r\n // Cache file might not exist - ignore\r\n }\r\n\r\n // Remove from dependency graph\r\n this.dependencyGraph.removeFile(relativePath);\r\n\r\n // Remove from special files collector\r\n this.specialFilesCollector.removeFile(relativePath);\r\n\r\n // Remove from manifest\r\n this.manifest.removeFile(relativePath);\r\n\r\n // Trigger reload of dependents (they'll see broken import errors)\r\n for (const dependentPath of dependents) {\r\n const dependentFile = this.files.get(dependentPath);\r\n if (dependentFile) {\r\n events.trigger(DEV_SERVER_EVENTS.FILE_READY, dependentFile);\r\n }\r\n }\r\n\r\n // Remove from files map (delayed to allow other operations to complete)\r\n setTimeout(() => {\r\n this.files.delete(relativePath);\r\n }, 300);\r\n }\r\n\r\n /**\r\n * Update dependents in all FileManager instances from the dependency graph\r\n *\r\n * This synchronizes the `dependents` property of each FileManager\r\n * with the current state of the dependency graph. Called after\r\n * initial file processing or batch operations.\r\n *\r\n * @example\r\n * ```typescript\r\n * // After processing all files\r\n * fileOps.updateFileDependents();\r\n * ```\r\n */\r\n public updateFileDependents(): void {\r\n for (const [relativePath, fileManager] of this.files) {\r\n const dependents = this.dependencyGraph.getDependents(relativePath);\r\n fileManager.dependents = dependents;\r\n }\r\n }\r\n\r\n /**\r\n * Sync all FileManager instances to the manifest\r\n *\r\n * This persists the current state of all files to the manifest\r\n * for caching across dev server restarts.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Before saving manifest\r\n * fileOps.syncFilesToManifest();\r\n * await manifest.save();\r\n * ```\r\n */\r\n public syncFilesToManifest(): void {\r\n for (const [relativePath, fileManager] of this.files) {\r\n this.manifest.setFile(relativePath, fileManager.toManifest());\r\n }\r\n }\r\n}\r\n","import events from \"@mongez/events\";\nimport { Random } from \"@mongez/reinforcements\";\nimport chokidar from \"chokidar\";\nimport { rootPath, srcPath } from \"../utils\";\nimport { Path } from \"./path\";\n\ntype FileWatcherEvent = \"change\" | \"delete\" | \"add\" | \"error\" | \"addDir\" | \"unlinkDir\";\n\ntype FileChangeCallback = (filePath: string) => void;\ntype FileDeleteCallback = (filePath: string) => void;\ntype FileAddCallback = (filePath: string) => void;\ntype FileErrorCallback = (filePath: string, error: Error) => void;\ntype FileAddDirCallback = (filePath: string) => void;\ntype FileUnlinkDirCallback = (filePath: string) => void;\ntype OnFileEventCallback =\n | FileChangeCallback\n | FileDeleteCallback\n | FileAddCallback\n | FileErrorCallback\n | FileAddDirCallback\n | FileUnlinkDirCallback;\n\n/**\n * Watch configuration options\n */\nexport type WatchConfig = {\n /**\n * Glob patterns to include\n */\n include?: string[];\n /**\n * Glob patterns to exclude\n */\n exclude?: string[];\n};\n\n/**\n * Default patterns to exclude from watching\n */\nconst DEFAULT_EXCLUDE = [\"**/node_modules/**\", \"**/dist/**\", \"**/.warlock/**\", \"**/.git/**\"];\n\nexport class FilesWatcher {\n /**\n * File watcher id\n */\n private id = Random.string();\n\n /**\n * Watch for files changes\n * @param config Optional watch configuration\n */\n public async watch(config?: WatchConfig) {\n // watch for .env file change and any changes in the src directory\n const paths = [rootPath(\".env\"), srcPath()].map((path) => Path.normalize(path));\n\n // Merge default exclude with config exclude\n const ignored = [...DEFAULT_EXCLUDE, ...(config?.exclude || [])];\n\n const watcher = chokidar.watch(paths, {\n ignoreInitial: true,\n ignored,\n persistent: true,\n usePolling: false, // Try native first, will fallback if needed\n interval: 100,\n binaryInterval: 300,\n awaitWriteFinish: {\n stabilityThreshold: 100,\n pollInterval: 50,\n },\n // On Windows, explicitly enable recursive watching\n depth: 99,\n });\n\n watcher.on(\"add\", (filePath) => this.triggerEvent(\"add\", filePath));\n watcher.on(\"change\", (filePath) => this.triggerEvent(\"change\", filePath));\n watcher.on(\"unlink\", (filePath) => this.triggerEvent(\"delete\", filePath));\n watcher.on(\"addDir\", (filePath) => this.triggerEvent(\"addDir\", filePath));\n watcher.on(\"unlinkDir\", (filePath) => this.triggerEvent(\"unlinkDir\", filePath));\n // watcher.on(\"error\", (error: Error, filePath: string) =>\n // this.triggerEvent(\"error\", filePath, error),\n // );\n\n // Cleanup on process exit\n process.on(\"SIGINT\", async () => {\n await watcher.close();\n });\n }\n\n /**\n * Trigger event immediately (no debouncing here)\n * Debouncing is handled at the orchestrator level for batch processing\n */\n private triggerEvent(event: FileWatcherEvent, filePath: string, error?: Error) {\n events.trigger(`file-watcher.${this.id}.${event}`, Path.normalize(filePath), error);\n }\n\n /**\n * On file change event\n */\n public onFileChange(callback: FileChangeCallback) {\n return this.on(\"change\", callback);\n }\n\n /**\n * On file delete event\n */\n public onFileDelete(callback: FileDeleteCallback) {\n return this.on(\"delete\", callback);\n }\n\n /**\n * On file add event\n */\n public onFileAdd(callback: FileAddCallback) {\n return this.on(\"add\", callback);\n }\n\n /**\n * On file error event\n */\n public onFileError(callback: FileErrorCallback) {\n return this.on(\"error\", callback);\n }\n\n /**\n * On file add dir event\n */\n public onDirectoryAdd(callback: FileAddDirCallback) {\n return this.on(\"addDir\", callback);\n }\n\n /**\n * On file unlink dir event\n */\n public onDirectoryRemove(callback: FileUnlinkDirCallback) {\n return this.on(\"unlinkDir\", callback);\n }\n\n /**\n * On file event\n */\n public on(event: FileWatcherEvent, callback: OnFileEventCallback) {\n return events.subscribe(`file-watcher.${this.id}.${event}`, callback);\n }\n}\n","type FileHealthStats = {\r\n /**\r\n * File Health State\r\n */\r\n state: \"healthy\" | \"defective\";\r\n /**\r\n * Number of errors\r\n */\r\n errors: number;\r\n /**\r\n * Number of warnings\r\n */\r\n warnings: number;\r\n};\r\n\r\ntype FileHealthMessage = {\r\n /**\r\n * Message\r\n */\r\n message: string;\r\n /**\r\n * Type of the message\r\n */\r\n type: \"error\" | \"warning\";\r\n /**\r\n * Line number\r\n */\r\n lineNumber: number;\r\n /**\r\n * Column number\r\n */\r\n columnNumber: number;\r\n /**\r\n * Length of the error/warning span\r\n */\r\n length?: number;\r\n /**\r\n * Rule ID (for ESLint)\r\n */\r\n ruleId?: string;\r\n};\r\n\r\nexport class FileHealthResult {\r\n /**\r\n * Result of the health check\r\n */\r\n public result: \"healthy\" | \"defective\" = \"healthy\";\r\n\r\n /**\r\n * Messages list (either for errors or warnings)\r\n */\r\n public messages: FileHealthMessage[] = [];\r\n\r\n /**\r\n * Mark as healthy\r\n */\r\n public markAsHealthy(): void {\r\n this.result = \"healthy\";\r\n }\r\n\r\n /**\r\n * Add errors\r\n */\r\n public addErrors(messages: FileHealthMessage[]): void {\r\n this.result = \"defective\";\r\n this.messages.push(...messages);\r\n }\r\n\r\n /**\r\n * Add warnings\r\n */\r\n public addWarnings(messages: FileHealthMessage[]): void {\r\n this.result = \"defective\";\r\n this.messages.push(...messages);\r\n }\r\n\r\n /**\r\n * Get file health stats\r\n */\r\n public getStats(): FileHealthStats {\r\n return {\r\n state: this.result,\r\n errors: this.messages.filter((message) => message.type === \"error\").length,\r\n warnings: this.messages.filter((message) => message.type === \"warning\").length,\r\n };\r\n }\r\n}\r\n","import type { FileManager } from \"../../file-manager\";\r\nimport type {\r\n FileHealthCheckerContract,\r\n HealthCheckerFilesStats,\r\n} from \"../file-health-checker.contract\";\r\nimport { FileHealthResult } from \"../file-health-result\";\r\n\r\ntype CheckerFile = {\r\n file: FileManager;\r\n healthResult: FileHealthResult;\r\n};\r\n\r\nexport abstract class BaseHealthChecker implements FileHealthCheckerContract {\r\n /**\r\n * List of checked files\r\n */\r\n protected files: Map<string, CheckerFile> = new Map();\r\n\r\n /**\r\n * Health checker name (unique identifier)\r\n */\r\n public abstract name: string;\r\n\r\n /**\r\n * Path to worker file (without extension)\r\n *\r\n * If provided, the checker runs in a dedicated worker thread.\r\n * If undefined, the checker runs in the main thread.\r\n *\r\n * @see FileHealthCheckerContract.workerPath\r\n */\r\n public workerPath?: string;\r\n\r\n /**\r\n * Initialize the health checker\r\n */\r\n public abstract initialize(): void;\r\n\r\n /**\r\n * Detect when files are changed\r\n */\r\n public async onFileChanges(files: FileManager[]): Promise<void> {\r\n //\r\n }\r\n\r\n /**\r\n * Remove the given file from the checker\r\n */\r\n public removeFile(file: FileManager): BaseHealthChecker {\r\n this.files.delete(file.relativePath);\r\n return this;\r\n }\r\n\r\n /**\r\n * Validate the health of the file\r\n */\r\n public async check(file: FileManager): Promise<FileHealthResult> {\r\n const result = new FileHealthResult();\r\n\r\n this.files.set(file.relativePath, {\r\n file,\r\n healthResult: result,\r\n });\r\n\r\n return await this.validate(file, result);\r\n }\r\n\r\n /**\r\n * Validate the health of the file\r\n */\r\n public abstract validate(file: FileManager, result: FileHealthResult): Promise<FileHealthResult>;\r\n\r\n /**\r\n * Get the stats of the health checker\r\n */\r\n public async stats(): Promise<HealthCheckerFilesStats> {\r\n const result: HealthCheckerFilesStats = {\r\n name: this.name,\r\n files: {\r\n healthy: 0,\r\n defective: 0,\r\n },\r\n warnings: {\r\n total: 0,\r\n totalFiles: 0,\r\n },\r\n errors: {\r\n total: 0,\r\n totalFiles: 0,\r\n },\r\n };\r\n\r\n for (const file of this.files.values()) {\r\n const healthResult = file.healthResult;\r\n const stats = healthResult.getStats();\r\n const isHealthy = stats.state === \"healthy\";\r\n result.files.healthy += isHealthy ? 1 : 0;\r\n result.files.defective += !isHealthy ? 1 : 0;\r\n result.warnings.total += stats.warnings;\r\n result.warnings.totalFiles += stats.warnings > 0 ? 1 : 0;\r\n result.errors.total += stats.errors;\r\n result.errors.totalFiles += stats.errors > 0 ? 1 : 0;\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n","import { colors } from \"@mongez/copper\";\r\nimport { ESLint } from \"eslint\";\r\nimport fs from \"fs\";\r\nimport path from \"path\";\r\nimport { FileManager } from \"../../file-manager\";\r\nimport { FileHealthCheckerContract } from \"../file-health-checker.contract\";\r\nimport { FileHealthResult } from \"../file-health-result\";\r\nimport { BaseHealthChecker } from \"./base-health-checker\";\r\n\r\nexport class EslintHealthChecker extends BaseHealthChecker implements FileHealthCheckerContract {\r\n /**\r\n * ESLint instance (using new ESLint v9 API with flat config)\r\n */\r\n private eslint: ESLint | null = null;\r\n\r\n /**\r\n * Health checker name\r\n */\r\n public name: string = \"ESLint\";\r\n\r\n /**\r\n * Path to dedicated worker file for ESLint checking\r\n * Runs in a separate thread to avoid blocking the main dev server\r\n */\r\n public workerPath: string = \"./workers/eslint-health.worker\";\r\n\r\n /**\r\n * Whether checker is initialized\r\n */\r\n private initialized: boolean = false;\r\n\r\n /**\r\n * Check if file is a lintable file\r\n */\r\n private isLintableFile(filePath: string): boolean {\r\n const ext = filePath.toLowerCase();\r\n return (\r\n ext.endsWith(\".ts\") || ext.endsWith(\".tsx\") || ext.endsWith(\".js\") || ext.endsWith(\".jsx\")\r\n );\r\n }\r\n\r\n /**\r\n * Initialize the health checker\r\n */\r\n public initialize(): EslintHealthChecker {\r\n try {\r\n // Check if eslint.config.js exists (new flat config format)\r\n const flatConfigPath = path.join(process.cwd(), \"eslint.config.js\");\r\n const flatConfigMjsPath = path.join(process.cwd(), \"eslint.config.mjs\");\r\n const flatConfigCjsPath = path.join(process.cwd(), \"eslint.config.cjs\");\r\n\r\n const hasFlatConfig =\r\n fs.existsSync(flatConfigPath) ||\r\n fs.existsSync(flatConfigMjsPath) ||\r\n fs.existsSync(flatConfigCjsPath);\r\n\r\n if (!hasFlatConfig) {\r\n // No flat config found, skip initialization\r\n this.initialized = true;\r\n return this;\r\n }\r\n\r\n // Use new ESLint v9 API with flat config\r\n // ESLint will automatically find eslint.config.js in the project root\r\n this.eslint = new ESLint({\r\n cwd: process.cwd(),\r\n });\r\n\r\n this.initialized = true;\r\n } catch (error) {\r\n // Handle any errors during initialization gracefully\r\n console.warn(\"ESLint Health Checker: Failed to initialize:\", error);\r\n this.initialized = true; // Mark as initialized to prevent retries\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Display health check results in a pretty format\r\n */\r\n private displayResults(file: FileManager, result: FileHealthResult): void {\r\n const stats = result.getStats();\r\n\r\n // Only display if there are errors or warnings\r\n if (stats.errors === 0 && stats.warnings === 0) {\r\n return;\r\n }\r\n\r\n const fileName = file.relativePath.replace(/\\\\/g, \"/\");\r\n const errorCount = stats.errors;\r\n const warningCount = stats.warnings;\r\n const sourceLines = file.source ? file.source.split(\"\\n\") : [];\r\n\r\n // Display errors\r\n if (errorCount > 0) {\r\n const errorMessages = result.messages.filter((m) => m.type === \"error\");\r\n for (const error of errorMessages) {\r\n const icon = colors.redBright(\"✖\");\r\n const level = colors.redBright(colors.bold(\"ERROR\"));\r\n console.log(\r\n `\\n${icon} ${level} ${colors.dim(\"in\")} ${colors.cyanBright(fileName)}${colors.dim(`(${error.lineNumber},${error.columnNumber})`)}`,\r\n );\r\n // Get rule ID from the error if available\r\n const ruleId = error.ruleId || \"eslint\";\r\n console.log(\r\n ` ${colors.magentaBright(ruleId)} ${colors.dim(\"→\")} ${colors.red(error.message)}`,\r\n );\r\n\r\n // Display code line with underline indicator\r\n if (\r\n sourceLines.length > 0 &&\r\n error.lineNumber > 0 &&\r\n error.lineNumber <= sourceLines.length\r\n ) {\r\n const lineIndex = error.lineNumber - 1; // Convert to 0-based index\r\n const lineContent = sourceLines[lineIndex];\r\n const lineNum = error.lineNumber.toString().padStart(4, \" \");\r\n const errorLength = error.length || 1;\r\n const columnIndex = error.columnNumber - 1; // Convert to 0-based index\r\n\r\n // Display the line with normal color (not all red)\r\n console.log(` ${colors.dim(lineNum)} ${colors.dim(\"│\")} ${lineContent || \"\"}`);\r\n\r\n // Display underline indicator\r\n // Padding accounts for: lineNum.length + 1 space + 1 (│) + 1 space = lineNum.length + 3\r\n // (The initial 2 spaces indent is already in the console.log)\r\n const prefixPadding = lineNum.length + 3;\r\n const columnPadding = \" \".repeat(columnIndex);\r\n const underline = colors.redBright(\"~\".repeat(Math.max(1, errorLength)));\r\n console.log(` ${colors.dim(\" \".repeat(prefixPadding))}${columnPadding}${underline}`);\r\n }\r\n }\r\n }\r\n\r\n // Display warnings\r\n if (warningCount > 0) {\r\n const warningMessages = result.messages.filter((m) => m.type === \"warning\");\r\n for (const warning of warningMessages) {\r\n const icon = colors.yellowBright(\"⚠\");\r\n const level = colors.yellowBright(colors.bold(\"WARNING\"));\r\n console.log(\r\n `\\n${icon} ${level} ${colors.dim(\"in\")} ${colors.cyanBright(fileName)}${colors.dim(`(${warning.lineNumber},${warning.columnNumber})`)}`,\r\n );\r\n // Get rule ID from the warning if available\r\n const ruleId = warning.ruleId || \"eslint\";\r\n console.log(\r\n ` ${colors.magentaBright(ruleId)} ${colors.dim(\"→\")} ${colors.yellow(warning.message)}`,\r\n );\r\n\r\n // Display code line with underline indicator\r\n if (\r\n sourceLines.length > 0 &&\r\n warning.lineNumber > 0 &&\r\n warning.lineNumber <= sourceLines.length\r\n ) {\r\n const lineIndex = warning.lineNumber - 1; // Convert to 0-based index\r\n const lineContent = sourceLines[lineIndex];\r\n const lineNum = warning.lineNumber.toString().padStart(4, \" \");\r\n const warningLength = warning.length || 1;\r\n const columnIndex = warning.columnNumber - 1; // Convert to 0-based index\r\n\r\n // Display the line with normal color (not all yellow)\r\n console.log(` ${colors.dim(lineNum)} ${colors.dim(\"│\")} ${lineContent || \"\"}`);\r\n\r\n // Display underline indicator\r\n // Padding accounts for: lineNum.length + 1 space + 1 (│) + 1 space = lineNum.length + 3\r\n // (The initial 2 spaces indent is already in the console.log)\r\n const prefixPadding = lineNum.length + 3;\r\n const columnPadding = \" \".repeat(columnIndex);\r\n const underline = colors.yellowBright(\"~\".repeat(Math.max(1, warningLength)));\r\n console.log(` ${colors.dim(\" \".repeat(prefixPadding))}${columnPadding}${underline}`);\r\n }\r\n }\r\n }\r\n\r\n // Display summary\r\n const summary = [];\r\n if (errorCount > 0) {\r\n summary.push(colors.red(`${errorCount} error${errorCount > 1 ? \"s\" : \"\"}`));\r\n }\r\n if (warningCount > 0) {\r\n summary.push(colors.yellow(`${warningCount} warning${warningCount > 1 ? \"s\" : \"\"}`));\r\n }\r\n }\r\n\r\n /**\r\n * Validate the health of the file\r\n */\r\n public async validate(file: FileManager, result: FileHealthResult): Promise<FileHealthResult> {\r\n // Early exit: skip non-lintable files\r\n if (!this.isLintableFile(file.absolutePath)) {\r\n result.markAsHealthy();\r\n return result;\r\n }\r\n\r\n // Early exit: check if ESLint is available\r\n if (!this.eslint) {\r\n result.markAsHealthy();\r\n return result;\r\n }\r\n\r\n try {\r\n // Use lintText to lint the source code directly from FileManager\r\n // This ensures we always use the latest content\r\n const lintResults = await this.eslint.lintText(file.source, {\r\n filePath: file.absolutePath,\r\n });\r\n\r\n if (lintResults.length === 0) {\r\n console.log(\"No lint results\", file.relativePath);\r\n result.markAsHealthy();\r\n return result;\r\n }\r\n\r\n const lintResult = lintResults[0];\r\n\r\n // Convert ESLint messages to FileHealthResult format\r\n const errors: Array<{\r\n message: string;\r\n type: \"error\";\r\n lineNumber: number;\r\n columnNumber: number;\r\n length: number;\r\n ruleId?: string;\r\n }> = [];\r\n const warnings: Array<{\r\n message: string;\r\n type: \"warning\";\r\n lineNumber: number;\r\n columnNumber: number;\r\n length: number;\r\n ruleId?: string;\r\n }> = [];\r\n\r\n for (const message of lintResult.messages) {\r\n const isError = message.severity === 2;\r\n const isWarning = message.severity === 1;\r\n\r\n if (isError) {\r\n errors.push({\r\n message: message.message,\r\n type: \"error\",\r\n lineNumber: message.line || 1,\r\n columnNumber: message.column || 1,\r\n length: message.endColumn && message.column ? message.endColumn - message.column : 1,\r\n ruleId: message.ruleId || undefined,\r\n });\r\n } else if (isWarning) {\r\n warnings.push({\r\n message: message.message,\r\n type: \"warning\",\r\n lineNumber: message.line || 1,\r\n columnNumber: message.column || 1,\r\n length: message.endColumn && message.column ? message.endColumn - message.column : 1,\r\n ruleId: message.ruleId || undefined,\r\n });\r\n }\r\n }\r\n\r\n // Add errors and warnings to result\r\n if (errors.length > 0) {\r\n result.addErrors(errors);\r\n }\r\n\r\n if (warnings.length > 0) {\r\n result.addWarnings(warnings);\r\n }\r\n\r\n // If no errors or warnings, mark as healthy\r\n if (errors.length === 0 && warnings.length === 0) {\r\n result.markAsHealthy();\r\n } else {\r\n // Display results if there are errors or warnings\r\n this.displayResults(file, result);\r\n }\r\n } catch (error) {\r\n // Handle any errors during validation gracefully\r\n console.log(\"ESlint Error:\", error);\r\n result.markAsHealthy(); // Return healthy on error to avoid blocking\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n","import { colors } from \"@mongez/copper\";\r\nimport ts from \"typescript\";\r\nimport { FileManager } from \"../../file-manager\";\r\nimport { tsconfigManager } from \"../../tsconfig-manager\";\r\nimport { FileHealthCheckerContract } from \"../file-health-checker.contract\";\r\nimport { FileHealthResult } from \"../file-health-result\";\r\nimport { BaseHealthChecker } from \"./base-health-checker\";\r\n\r\nexport class TypescriptHealthChecker\r\n extends BaseHealthChecker\r\n implements FileHealthCheckerContract\r\n{\r\n /**\r\n * Cached TypeScript program instance\r\n */\r\n private program: ts.Program | null = null;\r\n\r\n /**\r\n * Cached parsed TypeScript configuration\r\n */\r\n private parsedConfig: ts.ParsedCommandLine | null = null;\r\n\r\n /**\r\n * Health checker name\r\n */\r\n public name: string = \"TypeScript\";\r\n\r\n /**\r\n * Path to dedicated worker file for TypeScript checking\r\n * Runs in a separate thread to avoid blocking the main dev server\r\n */\r\n public workerPath: string = \"./workers/ts-health.worker\";\r\n\r\n /**\r\n * Whether checker is initialized\r\n */\r\n private initialized: boolean = false;\r\n\r\n /**\r\n * Check if file is a TypeScript file\r\n */\r\n private isTypeScriptFile(filePath: string): boolean {\r\n const ext = filePath.toLowerCase();\r\n return ext.endsWith(\".ts\") || ext.endsWith(\".tsx\");\r\n }\r\n\r\n /**\r\n * Extract line and column from diagnostic location\r\n */\r\n private getDiagnosticLocation(diagnostic: ts.Diagnostic): {\r\n lineNumber: number;\r\n columnNumber: number;\r\n } {\r\n if (diagnostic.file && diagnostic.start !== undefined) {\r\n const { line, character } = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start);\r\n return {\r\n lineNumber: line + 1, // TypeScript uses 0-based, we use 1-based\r\n columnNumber: character + 1,\r\n };\r\n }\r\n return {\r\n lineNumber: 1,\r\n columnNumber: 1,\r\n };\r\n }\r\n\r\n /**\r\n * Format diagnostic message\r\n */\r\n private formatDiagnosticMessage(diagnostic: ts.Diagnostic): string {\r\n if (diagnostic.file && diagnostic.start !== undefined) {\r\n return ts.formatDiagnostic(diagnostic, {\r\n getCurrentDirectory: () => process.cwd(),\r\n getCanonicalFileName: (fileName) => fileName,\r\n getNewLine: () => \"\\n\",\r\n });\r\n }\r\n return diagnostic.messageText.toString();\r\n }\r\n\r\n /**\r\n * Display health check results in a pretty format\r\n */\r\n private displayResults(file: FileManager, result: FileHealthResult): void {\r\n const stats = result.getStats();\r\n\r\n // Only display if there are errors or warnings\r\n if (stats.errors === 0 && stats.warnings === 0) {\r\n return;\r\n }\r\n\r\n const fileName = file.relativePath.replace(/\\\\/g, \"/\");\r\n const errorCount = stats.errors;\r\n const warningCount = stats.warnings;\r\n const sourceLines = file.source ? file.source.split(\"\\n\") : [];\r\n\r\n // Display header\r\n // console.log(\r\n // `\\n${colors.dim(\"╭─\")} ${colors.bold(colors.cyanBright(\"TypeScript Health\"))} ${colors.dim(\"→\")} ${colors.cyan(fileName)}`,\r\n // );\r\n\r\n // Display errors\r\n if (errorCount > 0) {\r\n const errorMessages = result.messages.filter((m) => m.type === \"error\");\r\n for (const error of errorMessages) {\r\n const icon = colors.redBright(\"✖\");\r\n const level = colors.redBright(colors.bold(\"ERROR\"));\r\n console.log(\r\n `\\n${icon} ${level} ${colors.dim(\"in\")} ${colors.cyanBright(fileName)}${colors.dim(`(${error.lineNumber},${error.columnNumber})`)}`,\r\n );\r\n // Extract just the message text (remove file path prefix if present)\r\n const messageLines = error.message.split(\"\\n\");\r\n const cleanMessage = messageLines\r\n .map((line) => line.replace(/^[^:]+:\\d+:\\d+ - /, \"\").trim())\r\n .filter((line) => line.length > 0)\r\n .join(\"\\n\");\r\n console.log(` ${colors.dim(\"→\")} ${colors.red(cleanMessage)}`);\r\n\r\n // Display code line with underline indicator\r\n if (\r\n sourceLines.length > 0 &&\r\n error.lineNumber > 0 &&\r\n error.lineNumber <= sourceLines.length\r\n ) {\r\n const lineIndex = error.lineNumber - 1; // Convert to 0-based index\r\n const lineContent = sourceLines[lineIndex];\r\n const lineNum = error.lineNumber.toString().padStart(4, \" \");\r\n const errorLength = error.length || 1;\r\n const columnIndex = error.columnNumber - 1; // Convert to 0-based index\r\n\r\n // Display the line with normal color (not all red)\r\n console.log(` ${colors.dim(lineNum)} ${colors.dim(\"│\")} ${lineContent || \"\"}`);\r\n\r\n // Display underline indicator\r\n // Padding accounts for: lineNum.length + 1 space + 1 (│) + 1 space = lineNum.length + 3\r\n // (The initial 2 spaces indent is already in the console.log)\r\n const prefixPadding = lineNum.length + 3;\r\n const columnPadding = \" \".repeat(columnIndex);\r\n const underline = colors.redBright(\"~\".repeat(Math.max(1, errorLength)));\r\n console.log(` ${colors.dim(\" \".repeat(prefixPadding))}${columnPadding}${underline}`);\r\n }\r\n }\r\n }\r\n\r\n // Display warnings\r\n if (warningCount > 0) {\r\n const warningMessages = result.messages.filter((m) => m.type === \"warning\");\r\n for (const warning of warningMessages) {\r\n const icon = colors.yellowBright(\"⚠\");\r\n const level = colors.yellowBright(colors.bold(\"WARNING\"));\r\n console.log(\r\n `\\n${icon} ${level} ${colors.dim(\"in\")} ${colors.cyanBright(fileName)}${colors.dim(`(${warning.lineNumber},${warning.columnNumber})`)}`,\r\n );\r\n // Extract just the message text (remove file path prefix if present)\r\n const messageLines = warning.message.split(\"\\n\");\r\n const cleanMessage = messageLines\r\n .map((line) => line.replace(/^[^:]+:\\d+:\\d+ - /, \"\").trim())\r\n .filter((line) => line.length > 0)\r\n .join(\"\\n\");\r\n console.log(` ${colors.dim(\"→\")} ${colors.yellow(cleanMessage)}`);\r\n\r\n // Display code line with underline indicator\r\n if (\r\n sourceLines.length > 0 &&\r\n warning.lineNumber > 0 &&\r\n warning.lineNumber <= sourceLines.length\r\n ) {\r\n const lineIndex = warning.lineNumber - 1; // Convert to 0-based index\r\n const lineContent = sourceLines[lineIndex];\r\n const lineNum = warning.lineNumber.toString().padStart(4, \" \");\r\n const warningLength = warning.length || 1;\r\n const columnIndex = warning.columnNumber - 1; // Convert to 0-based index\r\n\r\n // Display the line with normal color (not all yellow)\r\n console.log(` ${colors.dim(lineNum)} ${colors.dim(\"│\")} ${lineContent || \"\"}`);\r\n\r\n // Display underline indicator\r\n // Padding accounts for: lineNum.length + 1 space + 1 (│) + 1 space = lineNum.length + 3\r\n // (The initial 2 spaces indent is already in the console.log)\r\n const prefixPadding = lineNum.length + 3;\r\n const columnPadding = \" \".repeat(columnIndex);\r\n const underline = colors.yellowBright(\"~\".repeat(Math.max(1, warningLength)));\r\n console.log(` ${colors.dim(\" \".repeat(prefixPadding))}${columnPadding}${underline}`);\r\n }\r\n }\r\n }\r\n\r\n // Display summary\r\n const summary = [];\r\n if (errorCount > 0) {\r\n summary.push(colors.red(`${errorCount} error${errorCount > 1 ? \"s\" : \"\"}`));\r\n }\r\n if (warningCount > 0) {\r\n summary.push(colors.yellow(`${warningCount} warning${warningCount > 1 ? \"s\" : \"\"}`));\r\n }\r\n\r\n // console.log(\r\n // `\\n${colors.dim(\"╰─\")} ${colors.bold(\"TypeScript\")} ${colors.dim(\"→\")} ${summary.join(colors.dim(\" and \"))}`,\r\n // );\r\n }\r\n\r\n /**\r\n * Detect when files are changed\r\n */\r\n public async onFileChanges(files: FileManager[]): Promise<void> {\r\n // recreate an incremental program\r\n if (!this.parsedConfig) {\r\n return;\r\n }\r\n\r\n this.program = ts.createProgram(\r\n files.map((file) => file.absolutePath),\r\n {\r\n ...this.parsedConfig.options,\r\n incremental: true,\r\n },\r\n undefined,\r\n this.program!,\r\n );\r\n }\r\n\r\n /**\r\n * Initialize the health checker\r\n */\r\n public initialize(): TypescriptHealthChecker {\r\n try {\r\n // Verify tsconfigManager is initialized and has config\r\n if (!tsconfigManager.tsconfig || Object.keys(tsconfigManager.tsconfig).length === 0) {\r\n this.initialized = true;\r\n return this;\r\n }\r\n\r\n // Parse the config using tsconfigManager's cached config\r\n this.parsedConfig = ts.parseJsonConfigFileContent(\r\n tsconfigManager.tsconfig,\r\n ts.sys,\r\n process.cwd(),\r\n );\r\n\r\n // Check for config errors\r\n if (this.parsedConfig.errors.length > 0) {\r\n // Log config errors but continue (will skip validation)\r\n console.warn(\r\n \"TypeScript Health Checker: tsconfig.json has errors:\",\r\n this.parsedConfig.errors.map((e) => ts.formatDiagnostic(e, ts.createCompilerHost({}))),\r\n );\r\n }\r\n\r\n this.program = ts.createProgram(this.parsedConfig.fileNames, this.parsedConfig.options);\r\n\r\n this.initialized = true;\r\n } catch (error) {\r\n // Handle any errors during initialization gracefully\r\n console.warn(\"TypeScript Health Checker: Failed to initialize:\", error);\r\n this.initialized = true; // Mark as initialized to prevent retries\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Validate the health of the file\r\n */\r\n public async validate(file: FileManager, result: FileHealthResult): Promise<FileHealthResult> {\r\n // Early exit: skip non-TypeScript files\r\n if (!this.isTypeScriptFile(file.absolutePath)) {\r\n result.markAsHealthy();\r\n return result;\r\n }\r\n\r\n // Early exit: check if parsed config is available\r\n if (!this.parsedConfig) {\r\n result.markAsHealthy();\r\n return result;\r\n }\r\n\r\n try {\r\n // Lazy-load program on first validation if not already created\r\n if (!this.program) {\r\n // Create program with all project files from parsed config (for proper type checking)\r\n this.program = ts.createProgram(this.parsedConfig.fileNames, this.parsedConfig.options);\r\n }\r\n\r\n // Get source file from program\r\n const sourceFile = this.program.getSourceFile(file.absolutePath);\r\n\r\n // If file is not in the program, return healthy (might be excluded)\r\n if (!sourceFile) {\r\n result.markAsHealthy();\r\n return result;\r\n }\r\n\r\n // Get diagnostics for the specific file only\r\n const syntacticDiagnostics = this.program.getSyntacticDiagnostics(sourceFile);\r\n const semanticDiagnostics = this.program.getSemanticDiagnostics(sourceFile);\r\n\r\n // Combine all diagnostics\r\n const allDiagnostics = [...syntacticDiagnostics, ...semanticDiagnostics];\r\n\r\n // Convert TypeScript diagnostics to FileHealthResult format\r\n const errors: Array<{\r\n message: string;\r\n type: \"error\";\r\n lineNumber: number;\r\n columnNumber: number;\r\n length: number;\r\n }> = [];\r\n const warnings: Array<{\r\n message: string;\r\n type: \"warning\";\r\n lineNumber: number;\r\n columnNumber: number;\r\n length: number;\r\n }> = [];\r\n\r\n for (const diagnostic of allDiagnostics) {\r\n const location = this.getDiagnosticLocation(diagnostic);\r\n const message = this.formatDiagnosticMessage(diagnostic);\r\n const errorLength = diagnostic.length || 1;\r\n\r\n if (diagnostic.category === ts.DiagnosticCategory.Error) {\r\n errors.push({\r\n message,\r\n type: \"error\",\r\n lineNumber: location.lineNumber,\r\n columnNumber: location.columnNumber,\r\n length: errorLength,\r\n });\r\n } else if (diagnostic.category === ts.DiagnosticCategory.Warning) {\r\n warnings.push({\r\n message,\r\n type: \"warning\",\r\n lineNumber: location.lineNumber,\r\n columnNumber: location.columnNumber,\r\n length: errorLength,\r\n });\r\n }\r\n }\r\n\r\n // Add errors and warnings to result\r\n if (errors.length > 0) {\r\n result.addErrors(errors);\r\n }\r\n if (warnings.length > 0) {\r\n result.addWarnings(warnings);\r\n }\r\n\r\n // If no errors or warnings, mark as healthy\r\n if (errors.length === 0 && warnings.length === 0) {\r\n result.markAsHealthy();\r\n } else {\r\n // Display results if there are errors or warnings\r\n this.displayResults(file, result);\r\n }\r\n } catch (error) {\r\n // Handle any errors during validation gracefully\r\n console.warn(`TypeScript Health Checker: Error validating file ${file.relativePath}:`, error);\r\n result.markAsHealthy(); // Return healthy on error to avoid blocking\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n","import { env } from \"@mongez/dotenv\";\nimport { fileURLToPath } from \"url\";\nimport { Worker, type WorkerOptions } from \"worker_threads\";\n\n/**\n * Options for creating a health check worker\n */\nexport type CreateWorkerOptions = WorkerOptions & {\n /**\n * Worker data to pass to the worker thread\n */\n workerData?: Record<string, unknown>;\n};\n\n/**\n * Create a worker that works in both dev (TypeScript) and production (JavaScript) environments.\n *\n * In development mode (DEV_SERVER_CORE env set), workers are loaded with tsx\n * to support TypeScript execution. In production, compiled .js files are used.\n *\n * @param workerPath - Relative path to worker file WITHOUT extension (e.g., \"./workers/ts-health.worker\")\n * @param baseUrl - The import.meta.url of the calling module (used to resolve relative paths)\n * @param options - Additional worker options\n * @returns A new Worker instance\n *\n * @example\n * ```typescript\n * // In FilesHealthcareManager\n * const worker = createWorker(\n * \"./workers/ts-health.worker\",\n * import.meta.url,\n * { workerData: { cwd: process.cwd() } }\n * );\n * ```\n */\nexport function createWorker(\n workerPath: string,\n baseUrl: string,\n options?: CreateWorkerOptions,\n): Worker {\n const isDevServerCore = env(\"DEV_SERVER_CORE\");\n\n // In dev: .ts file with tsx loader\n // In prod: .js file (compiled)\n const extension = isDevServerCore ? \".ts\" : \".js\";\n const workerUrl = new URL(`${workerPath}${extension}`, baseUrl);\n const workerFilePath = fileURLToPath(workerUrl);\n\n const workerOptions: WorkerOptions = {\n ...options,\n };\n\n // Add tsx loader for TypeScript in dev environment\n if (isDevServerCore) {\n workerOptions.execArgv = [...(options?.execArgv || []), \"--import\", \"tsx/esm\"];\n }\n\n return new Worker(workerFilePath, workerOptions);\n}\n","import { colors } from \"@mongez/copper\";\r\nimport type { Worker } from \"worker_threads\";\r\nimport { createWorker } from \"../create-worker\";\r\nimport { devLogInfo } from \"../dev-logger\";\r\nimport type { FileManager } from \"../file-manager\";\r\nimport type {\r\n FileHealthCheckerContract,\r\n HealthCheckerFilesStats,\r\n} from \"./file-health-checker.contract\";\r\n\r\n/**\r\n * Serialized file data to send to workers\r\n */\r\ntype SerializedFile = {\r\n path: string;\r\n content: string;\r\n relativePath: string;\r\n};\r\n\r\n/**\r\n * Diagnostic message from worker\r\n */\r\ntype DiagnosticMessage = {\r\n type: \"error\" | \"warning\";\r\n message: string;\r\n lineNumber: number;\r\n columnNumber: number;\r\n length: number;\r\n filePath: string;\r\n relativePath: string;\r\n ruleId?: string;\r\n};\r\n\r\n/**\r\n * File check result from worker\r\n */\r\ntype FileCheckResult = {\r\n path: string;\r\n relativePath: string;\r\n healthy: boolean;\r\n errors: DiagnosticMessage[];\r\n warnings: DiagnosticMessage[];\r\n};\r\n\r\n/**\r\n * Worker response type\r\n */\r\ntype WorkerResponse =\r\n | { type: \"initialized\"; success: boolean; hasConfig?: boolean; error?: string }\r\n | { type: \"results\"; results: FileCheckResult[] }\r\n | { type: \"error\"; message: string };\r\n\r\n/**\r\n * Files Healthcare Manager\r\n *\r\n * Manages health checkers for file validation during development.\r\n * Supports both main-thread and worker-based checkers.\r\n *\r\n * Checkers with `workerPath` run in dedicated worker threads for performance.\r\n * Checkers without `workerPath` run in the main thread.\r\n *\r\n * @example\r\n * ```typescript\r\n * const manager = new FilesHealthcareManager(files);\r\n *\r\n * manager.setHealthCheckers([\r\n * new TypescriptHealthChecker(), // Has workerPath → runs in worker\r\n * new CustomChecker(), // No workerPath → runs in main thread\r\n * ]);\r\n *\r\n * await manager.initialize();\r\n * await manager.validateAllFiles();\r\n * ```\r\n */\r\nexport class FilesHealthcareManager {\r\n /**\r\n * Registered health checkers\r\n */\r\n private healthCheckers: FileHealthCheckerContract[] = [];\r\n\r\n /**\r\n * Active worker instances (checkerName → Worker)\r\n */\r\n private workers = new Map<string, Worker>();\r\n\r\n /**\r\n * Worker initialization promises (for ensuring workers are ready)\r\n */\r\n private workerInitPromises = new Map<string, Promise<boolean>>();\r\n\r\n /**\r\n * Aggregated stats for each checker\r\n */\r\n private checkerStats = new Map<\r\n string,\r\n {\r\n totalFiles: number;\r\n healthyFiles: number;\r\n defectiveFiles: number;\r\n totalErrors: number;\r\n totalWarnings: number;\r\n filesWithErrors: number;\r\n filesWithWarnings: number;\r\n }\r\n >();\r\n\r\n /**\r\n * Constructor\r\n * @param files - Map of tracked files\r\n */\r\n public constructor(private readonly files: Map<string, FileManager>) {}\r\n\r\n /**\r\n * Add health checkers to the manager\r\n * @param checkers - Checkers to add\r\n */\r\n public addHealthCheckers(...checkers: FileHealthCheckerContract[]): FilesHealthcareManager {\r\n this.healthCheckers.push(...checkers);\r\n return this;\r\n }\r\n\r\n /**\r\n * Set (replace) all health checkers\r\n * @param checkers - New set of checkers\r\n */\r\n public setHealthCheckers(checkers: FileHealthCheckerContract[]): FilesHealthcareManager {\r\n this.healthCheckers = checkers;\r\n return this;\r\n }\r\n\r\n /**\r\n * Initialize all health checkers\r\n *\r\n * For checkers with `workerPath`, spawns dedicated worker threads.\r\n * For other checkers, calls their `initialize()` method directly.\r\n */\r\n public async initialize(): Promise<void> {\r\n const initPromises = this.healthCheckers.map(async (checker) => {\r\n // Initialize stats for this checker\r\n this.checkerStats.set(checker.name, {\r\n totalFiles: 0,\r\n healthyFiles: 0,\r\n defectiveFiles: 0,\r\n totalErrors: 0,\r\n totalWarnings: 0,\r\n filesWithErrors: 0,\r\n filesWithWarnings: 0,\r\n });\r\n\r\n if (checker.workerPath) {\r\n // Spawn dedicated worker for this checker\r\n await this.spawnWorker(checker);\r\n } else {\r\n // Initialize checker on main thread\r\n checker.initialize();\r\n }\r\n });\r\n\r\n await Promise.all(initPromises);\r\n }\r\n\r\n /**\r\n * Spawn a worker for a checker\r\n */\r\n private async spawnWorker(checker: FileHealthCheckerContract): Promise<void> {\r\n if (!checker.workerPath) return;\r\n\r\n const worker = createWorker(checker.workerPath, import.meta.url, {\r\n workerData: { cwd: process.cwd() },\r\n });\r\n\r\n this.workers.set(checker.name, worker);\r\n\r\n // Create init promise\r\n const initPromise = new Promise<boolean>((resolve) => {\r\n const handler = (response: WorkerResponse) => {\r\n if (response.type === \"initialized\") {\r\n worker.off(\"message\", handler);\r\n resolve(response.success);\r\n }\r\n };\r\n\r\n worker.on(\"message\", handler);\r\n\r\n // Handle worker errors\r\n worker.on(\"error\", (error) => {\r\n console.error(`Health Checker Worker Error (${checker.name}):`, error);\r\n resolve(false);\r\n });\r\n\r\n // Send init message\r\n worker.postMessage({ type: \"init\", config: { cwd: process.cwd() } });\r\n });\r\n\r\n this.workerInitPromises.set(checker.name, initPromise);\r\n\r\n // Wait for initialization\r\n await initPromise;\r\n }\r\n\r\n /**\r\n * Validate all tracked files\r\n */\r\n public async validateAllFiles(): Promise<void> {\r\n const allFiles = Array.from(this.files.values());\r\n await this.checkFiles(allFiles);\r\n\r\n // Display stats\r\n await this.displayStats();\r\n }\r\n\r\n /**\r\n * Check the given files with all registered checkers\r\n *\r\n * All checkers run in parallel for performance.\r\n * Worker-based checkers communicate via postMessage.\r\n * Main-thread checkers are called directly.\r\n */\r\n public async checkFiles(files: FileManager[]): Promise<void> {\r\n const checkPromises = this.healthCheckers.map(async (checker) => {\r\n if (checker.workerPath) {\r\n return this.runInWorker(checker.name, files);\r\n } else {\r\n return this.runInline(checker, files);\r\n }\r\n });\r\n\r\n const results = await Promise.all(checkPromises);\r\n\r\n // Display any errors/warnings\r\n for (const checkerResults of results) {\r\n for (const result of checkerResults) {\r\n if (!result.healthy) {\r\n this.displayFileResults(result);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Run checker in worker thread\r\n */\r\n private async runInWorker(checkerName: string, files: FileManager[]): Promise<FileCheckResult[]> {\r\n const worker = this.workers.get(checkerName);\r\n\r\n if (!worker) {\r\n return files.map((f) => ({\r\n path: f.absolutePath,\r\n relativePath: f.relativePath,\r\n healthy: true,\r\n errors: [],\r\n warnings: [],\r\n }));\r\n }\r\n\r\n // Wait for worker to be initialized\r\n const initPromise = this.workerInitPromises.get(checkerName);\r\n if (initPromise) {\r\n const success = await initPromise;\r\n if (!success) {\r\n return files.map((f) => ({\r\n path: f.absolutePath,\r\n relativePath: f.relativePath,\r\n healthy: true,\r\n errors: [],\r\n warnings: [],\r\n }));\r\n }\r\n }\r\n\r\n // Serialize files for worker\r\n const serializedFiles: SerializedFile[] = files.map((f) => ({\r\n path: f.absolutePath,\r\n content: f.source,\r\n relativePath: f.relativePath,\r\n }));\r\n\r\n return new Promise((resolve) => {\r\n const handler = (response: WorkerResponse) => {\r\n if (response.type === \"results\") {\r\n worker.off(\"message\", handler);\r\n\r\n // Update stats\r\n this.updateStats(checkerName, response.results);\r\n\r\n resolve(response.results);\r\n } else if (response.type === \"error\") {\r\n worker.off(\"message\", handler);\r\n resolve(\r\n files.map((f) => ({\r\n path: f.absolutePath,\r\n relativePath: f.relativePath,\r\n healthy: true,\r\n errors: [],\r\n warnings: [],\r\n })),\r\n );\r\n }\r\n };\r\n\r\n worker.on(\"message\", handler);\r\n worker.postMessage({ type: \"check\", files: serializedFiles });\r\n });\r\n }\r\n\r\n /**\r\n * Run checker inline (main thread)\r\n */\r\n private async runInline(\r\n checker: FileHealthCheckerContract,\r\n files: FileManager[],\r\n ): Promise<FileCheckResult[]> {\r\n const results: FileCheckResult[] = [];\r\n\r\n for (const file of files) {\r\n const healthResult = await checker.check(file);\r\n const stats = healthResult.getStats();\r\n\r\n results.push({\r\n path: file.absolutePath,\r\n relativePath: file.relativePath,\r\n healthy: stats.state === \"healthy\",\r\n errors: healthResult.messages\r\n .filter((m) => m.type === \"error\")\r\n .map((m) => ({\r\n type: \"error\" as const,\r\n message: m.message,\r\n lineNumber: m.lineNumber,\r\n columnNumber: m.columnNumber,\r\n length: m.length || 1,\r\n filePath: file.absolutePath,\r\n relativePath: file.relativePath,\r\n ruleId: m.ruleId,\r\n })),\r\n warnings: healthResult.messages\r\n .filter((m) => m.type === \"warning\")\r\n .map((m) => ({\r\n type: \"warning\" as const,\r\n message: m.message,\r\n lineNumber: m.lineNumber,\r\n columnNumber: m.columnNumber,\r\n length: m.length || 1,\r\n filePath: file.absolutePath,\r\n relativePath: file.relativePath,\r\n ruleId: m.ruleId,\r\n })),\r\n });\r\n }\r\n\r\n // Update stats\r\n const checkerResults = results;\r\n this.updateStats(checker.name, checkerResults);\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Update aggregated stats for a checker\r\n */\r\n private updateStats(checkerName: string, results: FileCheckResult[]): void {\r\n const stats = this.checkerStats.get(checkerName);\r\n if (!stats) return;\r\n\r\n for (const result of results) {\r\n stats.totalFiles++;\r\n if (result.healthy) {\r\n stats.healthyFiles++;\r\n } else {\r\n stats.defectiveFiles++;\r\n }\r\n stats.totalErrors += result.errors.length;\r\n stats.totalWarnings += result.warnings.length;\r\n if (result.errors.length > 0) stats.filesWithErrors++;\r\n if (result.warnings.length > 0) stats.filesWithWarnings++;\r\n }\r\n }\r\n\r\n /**\r\n * Detect when files are changed\r\n */\r\n public async onFileChanges(files: FileManager[]): Promise<void> {\r\n // Notify workers of file changes\r\n const serializedFiles: SerializedFile[] = files.map((f) => ({\r\n path: f.absolutePath,\r\n content: f.source,\r\n relativePath: f.relativePath,\r\n }));\r\n\r\n for (const [, worker] of this.workers) {\r\n worker.postMessage({ type: \"fileChanges\", files: serializedFiles });\r\n }\r\n\r\n // Notify inline checkers\r\n await Promise.all(\r\n this.healthCheckers.filter((c) => !c.workerPath).map((c) => c.onFileChanges(files)),\r\n );\r\n }\r\n\r\n /**\r\n * Remove files from tracking\r\n * Notifies both inline checkers and worker-based checkers about removed files\r\n */\r\n public removeFiles(files: FileManager[]): void {\r\n // Notify inline checkers\r\n this.healthCheckers\r\n .filter((c) => !c.workerPath)\r\n .forEach((checker) => files.forEach((file) => checker.removeFile(file)));\r\n\r\n // Notify workers about deleted files\r\n if (files.length > 0) {\r\n const deletedPaths = files.map((f) => ({\r\n path: f.absolutePath,\r\n relativePath: f.relativePath,\r\n }));\r\n\r\n for (const [, worker] of this.workers) {\r\n worker.postMessage({ type: \"filesDeleted\", files: deletedPaths });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Display file results (errors/warnings)\r\n */\r\n private displayFileResults(result: FileCheckResult): void {\r\n const fileName = result.relativePath.replace(/\\\\/g, \"/\");\r\n\r\n // Display errors\r\n for (const error of result.errors) {\r\n const icon = colors.redBright(\"✖\");\r\n const level = colors.redBright(colors.bold(\"ERROR\"));\r\n console.log(\r\n `\\n${icon} ${level} ${colors.dim(\"in\")} ${colors.cyanBright(fileName)}${colors.dim(`(${error.lineNumber},${error.columnNumber})`)}`,\r\n );\r\n if (error.ruleId) {\r\n console.log(\r\n ` ${colors.magentaBright(error.ruleId)} ${colors.dim(\"→\")} ${colors.red(error.message)}`,\r\n );\r\n } else {\r\n console.log(` ${colors.dim(\"→\")} ${colors.red(error.message)}`);\r\n }\r\n }\r\n\r\n // Display warnings\r\n for (const warning of result.warnings) {\r\n const icon = colors.yellowBright(\"⚠\");\r\n const level = colors.yellowBright(colors.bold(\"WARNING\"));\r\n console.log(\r\n `\\n${icon} ${level} ${colors.dim(\"in\")} ${colors.cyanBright(fileName)}${colors.dim(`(${warning.lineNumber},${warning.columnNumber})`)}`,\r\n );\r\n if (warning.ruleId) {\r\n console.log(\r\n ` ${colors.magentaBright(warning.ruleId)} ${colors.dim(\"→\")} ${colors.yellow(warning.message)}`,\r\n );\r\n } else {\r\n console.log(` ${colors.dim(\"→\")} ${colors.yellow(warning.message)}`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Display stats for all health checkers\r\n */\r\n private async displayStats(): Promise<void> {\r\n const allStats: HealthCheckerFilesStats[] = [];\r\n\r\n for (const checker of this.healthCheckers) {\r\n const stats = this.checkerStats.get(checker.name);\r\n if (stats) {\r\n allStats.push({\r\n name: checker.name,\r\n files: {\r\n healthy: stats.healthyFiles,\r\n defective: stats.defectiveFiles,\r\n },\r\n warnings: {\r\n total: stats.totalWarnings,\r\n totalFiles: stats.filesWithWarnings,\r\n },\r\n errors: {\r\n total: stats.totalErrors,\r\n totalFiles: stats.filesWithErrors,\r\n },\r\n });\r\n }\r\n }\r\n\r\n console.log(\"\\n\");\r\n console.log(colors.bold(colors.cyan(\"━\".repeat(80))));\r\n devLogInfo(colors.bold(\" 📊 Health Checker Statistics\"));\r\n console.log(colors.bold(colors.cyan(\"━\".repeat(80))));\r\n console.log(\"\");\r\n\r\n allStats.forEach((stats: HealthCheckerFilesStats, index: number) => {\r\n const totalFiles = stats.files.healthy + stats.files.defective;\r\n const hasIssues = stats.files.defective > 0;\r\n\r\n // Checker name with icon\r\n const statusIcon = hasIssues ? \"⚠️\" : \"✅\";\r\n console.log(colors.bold(` ${statusIcon} ${stats.name}`));\r\n console.log(colors.dim(\" \" + \"─\".repeat(76)));\r\n\r\n // Files summary\r\n const filesLine = ` Files: ${colors.white(totalFiles.toString())} total │ ${colors.green(\"✓ \" + stats.files.healthy)} healthy │ ${hasIssues ? colors.red(\"✗ \" + stats.files.defective) : colors.dim(\"✗ 0\")} defective`;\r\n console.log(filesLine);\r\n\r\n // Issues summary\r\n const warningsText =\r\n stats.warnings.total > 0\r\n ? colors.yellow(`⚠ ${stats.warnings.total} warnings`)\r\n : colors.dim(\"⚠ 0 warnings\");\r\n\r\n const errorsText =\r\n stats.errors.total > 0\r\n ? colors.red(`✗ ${stats.errors.total} errors`)\r\n : colors.dim(\"✗ 0 errors\");\r\n\r\n console.log(` Issues: ${warningsText} │ ${errorsText}`);\r\n\r\n // Add spacing between checkers\r\n if (index < allStats.length - 1) {\r\n console.log(\"\");\r\n }\r\n });\r\n\r\n console.log(\"\");\r\n console.log(colors.bold(colors.cyan(\"━\".repeat(80))));\r\n console.log(\"\");\r\n }\r\n\r\n /**\r\n * Shutdown all workers\r\n */\r\n public async shutdown(): Promise<void> {\r\n for (const [name, worker] of this.workers) {\r\n try {\r\n worker.postMessage({ type: \"shutdown\" });\r\n await worker.terminate();\r\n } catch {\r\n // Worker may already be terminated\r\n }\r\n }\r\n\r\n this.workers.clear();\r\n this.workerInitPromises.clear();\r\n this.checkerStats.clear();\r\n }\r\n}\r\n","import { fileExistsAsync, getJsonFileAsync, putFileAsync } from \"@mongez/fs\";\nimport { FileManager } from \"./file-manager\";\nimport type { FileManifest } from \"./types\";\nimport { MANIFEST_PATH } from \"./flags\";\n\n/**\n * Manifest structure with metadata and files\n */\nexport type Manifest = {\n version: string;\n lastBuildTime: number;\n projectHash?: string;\n stats: {\n totalFiles: number;\n totalDependencies: number;\n };\n files: Record<string, FileManifest>;\n};\n\nexport class ManifestManager {\n /**\n * Manifest data with metadata\n */\n private manifest: Manifest = {\n version: \"1.0.0\",\n lastBuildTime: Date.now(),\n stats: {\n totalFiles: 0,\n totalDependencies: 0,\n },\n files: {},\n };\n\n /**\n * Constructor\n */\n public constructor(private readonly files: Map<string, FileManager>) {}\n\n /**\n * Initialize manifest manager\n * @returns true if manifest exists, false otherwise\n */\n public async init(): Promise<boolean> {\n if (await fileExistsAsync(MANIFEST_PATH)) {\n this.manifest = await getJsonFileAsync(MANIFEST_PATH);\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * Save manifest to disk\n */\n public async save(): Promise<void> {\n // Update stats before saving\n this.manifest.stats.totalFiles = Object.keys(this.manifest.files).length;\n this.manifest.stats.totalDependencies = this.calculateTotalDependencies();\n this.manifest.lastBuildTime = Date.now();\n\n await putFileAsync(MANIFEST_PATH, JSON.stringify(this.manifest, null, 2));\n }\n\n /**\n * Get file manifest data\n */\n public getFile(filePath: string): FileManifest | undefined {\n return this.manifest.files[filePath];\n }\n\n /**\n * Check if file exists in manifest\n */\n public hasFile(filePath: string): boolean {\n return filePath in this.manifest.files;\n }\n\n /**\n * Set file manifest data\n */\n public setFile(filePath: string, fileManifest: FileManifest): void {\n this.manifest.files[filePath] = fileManifest;\n }\n\n /**\n * Remove file from manifest\n */\n public removeFile(filePath: string): void {\n delete this.manifest.files[filePath];\n }\n\n /**\n * Get all file paths in manifest\n */\n public getAllFilePaths(): string[] {\n return Object.keys(this.manifest.files);\n }\n\n /**\n * Get all file manifests\n */\n public getAllFiles(): Record<string, FileManifest> {\n return this.manifest.files;\n }\n\n /**\n * Get manifest metadata\n */\n public getMetadata() {\n return {\n version: this.manifest.version,\n lastBuildTime: this.manifest.lastBuildTime,\n projectHash: this.manifest.projectHash,\n stats: this.manifest.stats,\n };\n }\n\n /**\n * Calculate total dependencies across all files\n */\n private calculateTotalDependencies(): number {\n return Object.values(this.manifest.files).reduce(\n (total, file) => total + (file.dependencies?.length || 0),\n 0,\n );\n }\n\n /**\n * Clear all files from manifest\n */\n public clear(): void {\n this.manifest.files = {};\n this.manifest.stats = {\n totalFiles: 0,\n totalDependencies: 0,\n };\n }\n}\n","import baseConfig from \"@mongez/config\";\nimport type { ConfigKey, ConfigRegistry } from \"./types\";\n\n/**\n * Config accessor interface with typed overloads\n */\ninterface ConfigAccessor {\n /**\n * Get a config value by dot-notation key path.\n */\n key<T = any>(key: ConfigKey | string, defaultValue?: T): T;\n\n /**\n * Get an entire config group by name with type inference.\n * Returns the typed config object for known config names.\n */\n get<K extends keyof ConfigRegistry>(name: K, defaultValue?: ConfigRegistry[K]): ConfigRegistry[K];\n\n /**\n * Get an entire config group by name (dynamic string).\n */\n get<T = any>(name: string, defaultValue?: T): T;\n}\n\n/**\n * Config accessor with typed autocomplete and return type inference.\n *\n * @example\n * ```typescript\n * // Get entire config group - returns the actual config type\n * const db = config.get(\"database\"); // → DatabaseConfigurations\n *\n * // Get specific key with dot notation\n * const host = config.key(\"database.host\");\n * const port = config.key<number>(\"database.port\", 27017);\n * ```\n */\nexport const config: ConfigAccessor = {\n key(key: ConfigKey | string, defaultValue?: any): any {\n return baseConfig.get(key, defaultValue);\n },\n\n get(name: string, defaultValue?: any): any {\n return baseConfig.get(name, defaultValue);\n },\n};\n","import config from \"@mongez/config\";\r\nimport { merge } from \"@mongez/reinforcements\";\r\nimport { log } from \"@warlock.js/logger\";\r\nimport { v } from \"@warlock.js/seal\";\r\nimport type { Request, Response } from \"../http\";\r\nimport type { Route, RouteHandlerValidation } from \"../router\";\r\n\r\nfunction resolveDataToParse(validating: RouteHandlerValidation[\"validating\"], request: Request) {\r\n if (!validating || validating.length === 0) return request.allExceptParams();\r\n\r\n let data: any = {};\r\n\r\n for (const validatingType of validating) {\r\n if (validatingType === \"body\") {\r\n data = merge(data, request.body);\r\n }\r\n\r\n if (validatingType === \"query\") {\r\n data = merge(data, request.query);\r\n }\r\n\r\n if (validatingType === \"params\") {\r\n data = merge(data, request.params);\r\n }\r\n\r\n if (validatingType === \"headers\") {\r\n data = merge(data, request.headers);\r\n }\r\n }\r\n\r\n return data;\r\n}\r\n\r\n/**\r\n * Validate the request route\r\n */\r\nexport async function validateAll(\r\n validation: Route[\"handler\"][\"validation\"],\r\n request: Request,\r\n response: Response,\r\n) {\r\n if (!validation) return;\r\n\r\n log.info(\"validation\", \"started\", \"Start validating the request\");\r\n\r\n if (validation.schema) {\r\n log.info(\"validation\", \"schema\", \"Validating request schema\");\r\n try {\r\n const data = resolveDataToParse(validation.validating, request);\r\n const result = await v.validate(validation.schema, data);\r\n\r\n if (result.data && result.isValid) {\r\n request.setValidatedData(result.data);\r\n }\r\n\r\n if (!result.isValid) {\r\n log.warn(\"validation\", \"schema\", \"Schema Validation failed\");\r\n return response.failedSchema(result);\r\n }\r\n\r\n log.success(\"validation\", \"schema\", \"Schema Validation passed\");\r\n } catch (error) {\r\n log.warn(\"app.validation\", \"error\", error);\r\n throw error;\r\n }\r\n }\r\n\r\n if (validation.validate) {\r\n const result = await validation.validate(request, response);\r\n\r\n // if there is a result, it means it failed\r\n if (result) {\r\n // check if there is no response status code, then set it to config value or 400 as default\r\n if (!response.statusCode) {\r\n response.setStatusCode(config.get(\"validation.responseStatus\", 400));\r\n }\r\n\r\n log.info(\"validation\", \"failed\", \"Validation failed\");\r\n\r\n return result;\r\n }\r\n\r\n log.info(\"validation\", \"passed\", \"Validation passed\");\r\n }\r\n}\r\n","export class ResourceNotFoundError extends Error {\r\n public constructor(\r\n message: string,\r\n public payload?: any,\r\n ) {\r\n super(message);\r\n this.name = \"ResourceNotFoundError\";\r\n }\r\n}\r\n\r\nexport class UnAuthorizedError extends Error {\r\n public constructor(\r\n message: string,\r\n public payload?: any,\r\n ) {\r\n super(message);\r\n this.name = \"UnAuthorizedError\";\r\n }\r\n}\r\n\r\nexport class ForbiddenError extends Error {\r\n public constructor(\r\n message: string,\r\n public payload?: any,\r\n ) {\r\n super(message);\r\n this.name = \"ForbiddenError\";\r\n }\r\n}\r\n\r\nexport class BadRequestError extends Error {\r\n public constructor(\r\n message: string,\r\n public payload?: any,\r\n ) {\r\n super(message);\r\n this.name = \"BadRequestError\";\r\n }\r\n}\r\n\r\nexport class ServerError extends Error {\r\n public constructor(\r\n message: string,\r\n public payload?: any,\r\n ) {\r\n super(message);\r\n this.name = \"ServerError\";\r\n }\r\n}\r\n","/**\r\n * Request Context Middleware\r\n *\r\n * Creates a unified context for each request using the ContextManager.\r\n * All framework contexts (request, storage, database) are available throughout the request lifecycle.\r\n */\r\nimport { trans } from \"@mongez/localization\";\r\nimport { DatabaseWriterValidationError } from \"@warlock.js/cascade\";\r\nimport { contextManager } from \"@warlock.js/context\";\r\nimport {\r\n requestContext as requestContextInstance,\r\n useRequestStore,\r\n} from \"../context/request-context\";\r\nimport {\r\n BadRequestError,\r\n ForbiddenError,\r\n ResourceNotFoundError,\r\n ServerError,\r\n UnAuthorizedError,\r\n} from \"../errors\";\r\nimport { type Request } from \"../request\";\r\nimport { type Response } from \"../response\";\r\nimport { type ReturnedResponse } from \"./../types\";\r\n\r\n// Contexts are now registered in core/context/init-contexts.ts via initializeContexts()\r\n\r\n/**\r\n * Create request store and execute middleware + handler\r\n *\r\n * Runs all registered contexts together using ContextManager.\r\n */\r\nexport function createRequestStore(\r\n request: Request<any>,\r\n response: Response,\r\n): Promise<ReturnedResponse> {\r\n // Build all context stores using the immutable API\r\n // Each context defines its own store initialization via buildStore()\r\n const httpContextStore = contextManager.buildStores({ request, response });\r\n\r\n // Run all contexts together!\r\n return contextManager.runAll(httpContextStore, async () => {\r\n try {\r\n // Run middleware chain\r\n const result = await request.runMiddleware();\r\n\r\n if (result) {\r\n return result as ReturnedResponse;\r\n }\r\n\r\n // Execute route handler\r\n request.trigger(\"executingAction\", request.route);\r\n\r\n const handler = request.getHandler();\r\n\r\n request.log(\"Executing Handler\", \"info\");\r\n\r\n const output = await handler(request, response);\r\n\r\n request.log(\"Handler Executed Successfully\", \"success\");\r\n\r\n request.trigger(\"executedAction\", request.route);\r\n\r\n return output as ReturnedResponse;\r\n } catch (error: any) {\r\n return handleRequestError(error, response);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Handle request errors\r\n * @internal\r\n */\r\nfunction handleRequestError(error: any, response: Response): ReturnedResponse {\r\n if (error instanceof ResourceNotFoundError) {\r\n return response.notFound({\r\n error: error.message,\r\n ...error.payload,\r\n });\r\n }\r\n\r\n if (error instanceof UnAuthorizedError) {\r\n return response.unauthorized({\r\n error: error.message,\r\n ...error.payload,\r\n });\r\n }\r\n\r\n if (error instanceof ForbiddenError) {\r\n return response.forbidden({\r\n error: error.message,\r\n ...error.payload,\r\n });\r\n }\r\n\r\n if (error instanceof BadRequestError) {\r\n return response.badRequest({\r\n error: error.message,\r\n ...error.payload,\r\n });\r\n }\r\n\r\n if (error instanceof DatabaseWriterValidationError) {\r\n return response.badRequest({\r\n errors: error.errors,\r\n });\r\n }\r\n\r\n if (error instanceof ServerError) {\r\n return response.serverError({\r\n error: error.message,\r\n ...error.payload,\r\n });\r\n }\r\n\r\n console.log(error);\r\n\r\n return response.badRequest({\r\n error: error.message,\r\n ...error.payload,\r\n });\r\n}\r\n\r\n/**\r\n * Translate a keyword (uses request context for locale)\r\n */\r\nexport function t(keyword: string, placeholders?: any) {\r\n return requestContextInstance.getRequest()?.trans(keyword, placeholders) || trans(keyword);\r\n}\r\n\r\n/**\r\n * Get or compute a value from the request cache\r\n *\r\n * If the value exists in request, return it.\r\n * Otherwise, execute callback, store result in request, and return it.\r\n */\r\nexport async function fromRequest<T>(\r\n key: string,\r\n callback: (request?: Request) => Promise<T>,\r\n): Promise<T> {\r\n const { request } = useRequestStore();\r\n\r\n if (!request) return await callback();\r\n\r\n if (request[key]) return request[key];\r\n\r\n request[key] = await callback(request);\r\n\r\n return request[key];\r\n}\r\n","import type { ComponentType, ReactElement, ReactNode } from \"react\";\n\n// ============================================================\n// Eager-loaded React Modules\n// ============================================================\n\n/**\n * Installation instructions for React\n */\nconst REACT_INSTALL_INSTRUCTIONS = `\nReact SSR functionality requires React packages.\nInstall them with:\n\n warlock add react\n\nOr manually:\n\n npm install react react-dom\n pnpm add react react-dom\n yarn add react react-dom\n`.trim();\n\n/**\n * Module availability flag\n */\nlet moduleExists: boolean | null = null;\n\n/**\n * Cached React modules (loaded at import time)\n */\nlet react: typeof import(\"react\");\nlet reactDomServer: typeof import(\"react-dom/server\");\n\n/**\n * Eagerly load React modules at import time\n */\nasync function loadReactModules() {\n try {\n react = await import(\"react\");\n reactDomServer = await import(\"react-dom/server\");\n moduleExists = true;\n } catch {\n moduleExists = false;\n }\n}\n\n// Kick off eager loading immediately\nloadReactModules();\n\n// ============================================================\n// Render Function\n// ============================================================\n\n/**\n * Render a React element/component to HTML string\n *\n * **Important:** This function requires React packages to be installed.\n * Install them with: `warlock add react` or `yarn add react react-dom`\n *\n * @example\n * ```typescript\n * const html = renderReact(<WelcomeEmail name=\"John\" />);\n * ```\n */\nexport function renderReact(reactElement: ReactElement | ComponentType | ReactNode): string {\n if (moduleExists === false) {\n throw new Error(`react is not installed.\\n\\n${REACT_INSTALL_INSTRUCTIONS}`);\n }\n\n if (typeof reactElement === \"function\") {\n reactElement = react.createElement(reactElement);\n }\n\n return reactDomServer.renderToString(reactElement);\n}\n","import config from \"@mongez/config\";\nimport type { EventSubscription } from \"@mongez/events\";\nimport events from \"@mongez/events\";\nimport { fileExistsAsync } from \"@mongez/fs\";\nimport { isIterable, isPlainObject, isScalar } from \"@mongez/supportive-is\";\nimport type { LogLevel } from \"@warlock.js/logger\";\nimport { log } from \"@warlock.js/logger\";\nimport type { ValidationResult } from \"@warlock.js/seal\";\nimport type { FastifyReply } from \"fastify\";\nimport fs from \"fs\";\nimport mime from \"mime\";\nimport path from \"path\";\nimport type React from \"react\";\nimport { type ReactNode } from \"react\";\nimport type { Route } from \"../router\";\nimport { renderReact } from \"./../react\";\nimport type { Request } from \"./request\";\nimport type { ResponseEvent } from \"./types\";\n\nexport enum ResponseStatus {\n OK = 200,\n CREATED = 201,\n ACCEPTED = 202,\n MOVED_PERMANENTLY = 301,\n FOUND = 302,\n SEE_OTHER = 303,\n NOT_MODIFIED = 304,\n TEMPORARY_REDIRECT = 307,\n PERMANENT_REDIRECT = 308,\n NO_CONTENT = 204,\n BAD_REQUEST = 400,\n UNAUTHORIZED = 401,\n FORBIDDEN = 403,\n NOT_FOUND = 404,\n METHOD_NOT_ALLOWED = 405,\n CONFLICT = 409,\n TOO_MANY_REQUESTS = 429,\n INTERNAL_SERVER_ERROR = 500,\n SERVICE_UNAVAILABLE = 503,\n}\n\n/**\n * Options for sending files\n */\nexport type SendFileOptions = {\n cacheTime?: number;\n immutable?: boolean;\n inline?: boolean;\n filename?: string;\n};\n\n/**\n * Options for sending buffers\n */\nexport type SendBufferOptions = SendFileOptions & {\n contentType?: string;\n etag?: string;\n};\n\nexport class Response {\n /**\n * Current route\n */\n protected route!: Route;\n\n /**\n * Fastify response object\n */\n public baseResponse!: FastifyReply;\n\n /**\n * Current status code\n */\n protected currentStatusCode = 200;\n\n /**\n * Current response body\n */\n protected currentBody: any;\n\n /**\n * A flag to determine if response is being sent\n */\n protected isSending = false;\n\n /**\n * Request object\n */\n public request!: Request;\n\n /**\n * Internal events related to this particular response object\n */\n protected events = new Map<string, any[]>();\n\n /**\n * Parsed body\n * This will return the parsed body of the response\n * Please note that if this property is called before the response is sent, it will return undefined\n */\n public parsedBody: any;\n\n /**\n * Get Current response body\n */\n public get body() {\n return this.currentBody;\n }\n\n /**\n * Set response body\n */\n public set body(body: any) {\n this.currentBody = body;\n }\n\n /**\n * Add event on sending response\n */\n public onSending(callback: any) {\n this.events.set(\"sending\", [...(this.events.get(\"sending\") || []), callback]);\n\n return this;\n }\n\n /**\n * Add event on sent response\n */\n public onSent(callback: any) {\n this.events.set(\"sent\", [...(this.events.get(\"sent\") || []), callback]);\n\n return this;\n }\n\n /**\n * Set the Fastify response object\n */\n public setResponse(response: FastifyReply) {\n this.baseResponse = response;\n\n return this;\n }\n\n /**\n * Reset the response state\n */\n public reset() {\n this.route = {} as Route;\n this.currentBody = null;\n this.currentStatusCode = 200;\n }\n\n /**\n * Set current route\n */\n public setRoute(route: Route) {\n this.route = route;\n\n return this;\n }\n\n /**\n * Get the content type\n */\n public get contentType() {\n return this.baseResponse.getHeader(\"Content-Type\");\n }\n\n /**\n * Set the content type\n */\n public setContentType(contentType: string) {\n this.baseResponse.header(\"Content-Type\", contentType);\n\n return this;\n }\n\n /**\n * Get the status code\n */\n public get statusCode(): number {\n return this.currentStatusCode ?? this.baseResponse.statusCode;\n }\n\n /**\n * Check if response status is ok\n */\n public get isOk() {\n return this.currentStatusCode >= 200 && this.currentStatusCode < 300;\n }\n\n /**\n * Check if the response has been sent\n */\n public get sent() {\n return this.baseResponse.sent;\n }\n\n /**\n * Add a listener to the response event\n */\n public static on(\n event: ResponseEvent,\n listener: (response: Response) => void,\n ): EventSubscription {\n return events.subscribe(`response.${event}`, listener);\n }\n\n /**\n * Trigger the response event\n */\n protected static async trigger(event: ResponseEvent, ...args: any[]) {\n // make a timeout to make sure the request events is executed first\n return new Promise((resolve) => {\n setTimeout(async () => {\n await events.triggerAllAsync(`response.${event}`, ...args);\n resolve(true);\n }, 0);\n });\n }\n\n /**\n * Parse body\n */\n protected async parseBody() {\n return await this.parse(this.currentBody);\n }\n\n /**\n * Parse the given value\n */\n public async parse(value: any): Promise<any> {\n // if it is a falsy value, return it\n if (!value || isScalar(value)) return value;\n\n // if it has a `toJSON` method, call it and await the result then return it\n if (value.toJSON) {\n value.request = this.request;\n return await value.toJSON();\n }\n\n // if it is iterable, an array or array-like object then parse each item\n if (isIterable(value)) {\n const values = Array.from(value);\n\n return Promise.all(\n values.map(async (item: any) => {\n return await this.parse(item);\n }),\n );\n }\n\n // if not plain object, then return it\n if (!isPlainObject(value)) {\n return value;\n }\n\n // loop over the object and check if the value and call `parse` on it\n for (const key in value) {\n const subValue = value[key];\n\n value[key] = await this.parse(subValue);\n }\n\n return value;\n }\n\n /**\n * Make a log message\n */\n public log(message: string, level: LogLevel = \"info\") {\n if (!config.get(\"http.log\")) return;\n\n log({\n module: \"response\",\n action: this.route.method + \" \" + this.route.path.replace(\"/*\", \"\") + `:${this.request.id}`,\n message,\n type: level,\n context: {\n request: this.request,\n response: this,\n },\n });\n }\n\n /**\n * Check if returning response is json\n */\n public get isJson() {\n return this.getHeader(\"Content-Type\") === \"application/json\";\n }\n\n /**\n * Send the response\n * @param data - Response data\n * @param statusCode - HTTP status code\n * @param triggerEvents - Whether to trigger response events (default: true)\n */\n public async send(data?: any, statusCode?: number, triggerEvents = true): Promise<Response> {\n if (statusCode) {\n this.currentStatusCode = statusCode;\n }\n\n if (data === this) return this;\n\n if (data) {\n this.currentBody = data;\n }\n\n if (!this.currentStatusCode) {\n this.currentStatusCode = 200;\n }\n\n this.log(\"Sending response\");\n // trigger the sending event\n if (Array.isArray(this.currentBody) || isPlainObject(this.currentBody)) {\n this.setContentType(\"application/json\");\n }\n\n if (triggerEvents) {\n await Response.trigger(\"sending\", this);\n\n for (const callback of this.events.get(\"sending\") || []) {\n await callback(this);\n }\n\n if (this.isJson) {\n await Response.trigger(\"sendingJson\", this);\n for (const callback of this.events.get(\"sendingJson\") || []) {\n await callback(this);\n }\n\n if (this.isOk) {\n await Response.trigger(\"sendingSuccessJson\", this);\n for (const callback of this.events.get(\"sendingSuccessJson\") || []) {\n await callback(this);\n }\n }\n }\n }\n\n // parse the body and make sure it is transformed to sync data instead of async data\n if (typeof this.currentBody !== \"string\") {\n this.parsedBody = await this.parseBody();\n } else {\n this.parsedBody = data;\n }\n\n // Set the status first\n this.baseResponse.status(this.currentStatusCode);\n\n // Then send the response with the parsed body\n await this.baseResponse.send(this.parsedBody);\n\n this.log(\"Response sent\");\n\n if (triggerEvents) {\n // trigger the sent event\n Response.trigger(\"sent\", this);\n\n for (const callback of this.events.get(\"sent\") || []) {\n callback(this);\n }\n\n // trigger the success event if the status code is 2xx\n if (this.currentStatusCode >= 200 && this.currentStatusCode < 300) {\n Response.trigger(\"success\", this);\n }\n\n // trigger the successCreate event if the status code is 201\n if (this.currentStatusCode === 201) {\n Response.trigger(\"successCreate\", this);\n }\n\n // trigger the badRequest event if the status code is 400\n if (this.currentStatusCode === 400) {\n Response.trigger(\"badRequest\", this);\n }\n\n // trigger the unauthorized event if the status code is 401\n if (this.currentStatusCode === 401) {\n Response.trigger(\"unauthorized\", this);\n }\n\n // trigger the forbidden event if the status code is 403\n if (this.currentStatusCode === 403) {\n Response.trigger(\"forbidden\", this);\n }\n\n // trigger the notFound event if the status code is 404\n if (this.currentStatusCode === 404) {\n Response.trigger(\"notFound\", this);\n }\n\n // trigger the throttled event if the status code is 429\n if (this.currentStatusCode === 429) {\n Response.trigger(\"throttled\", this);\n }\n\n // trigger the serverError event if the status code is 500\n if (this.currentStatusCode === 500) {\n Response.trigger(\"serverError\", this);\n }\n\n // trigger the error event if the status code is 4xx or 5xx\n if (this.currentStatusCode >= 400) {\n Response.trigger(\"error\", this);\n }\n }\n\n return this;\n }\n\n /**\n * Send html response\n */\n public html(data: string, statusCode?: number) {\n return this.setContentType(\"text/html\").send(data, statusCode);\n }\n\n /**\n * Render the given react component\n */\n public render(element: React.ReactElement | React.ComponentType, status = 200) {\n return this.setStatusCode(status).html(renderReact(element));\n }\n\n /**\n * Send xml response\n */\n public xml(data: string, statusCode?: number) {\n return this.setContentType(\"text/xml\").send(data, statusCode);\n }\n\n /**\n * Send plain text response\n */\n public text(data: string, statusCode?: number) {\n return this.setContentType(\"text/plain\").send(data, statusCode);\n }\n\n /**\n * Create a streaming response for progressive/chunked data sending\n *\n * This method allows you to send data in chunks and control when the response ends.\n * Perfect for Server-Sent Events (SSE), progressive rendering, or streaming large responses.\n *\n * @example\n * ```ts\n * const stream = response.stream(\"text/html\");\n * stream.send(\"<html><body>\");\n * stream.send(\"<h1>Hello</h1>\");\n * stream.render(<MyComponent />);\n * stream.send(\"</body></html>\");\n * stream.end();\n * ```\n *\n * @param contentType - The content type for the stream (default: \"text/plain\")\n * @returns Stream controller with send(), render(), and end() methods\n */\n public stream(contentType = \"text/plain\") {\n // Set headers using the response API\n this.setContentType(contentType);\n this.header(\"Transfer-Encoding\", \"chunked\");\n this.header(\"Cache-Control\", \"no-cache\");\n this.header(\"Connection\", \"keep-alive\");\n this.header(\"X-Content-Type-Options\", \"nosniff\");\n\n // Trigger sending events\n Response.trigger(\"sending\", this);\n for (const callback of this.events.get(\"sending\") || []) {\n callback(this);\n }\n\n this.log(\"Starting stream\");\n\n // Track stream state\n let isEnded = false;\n const chunks: any[] = [];\n\n // Write headers to start the stream\n // Note: We use raw here because we need chunked encoding control\n // This is the only valid use case for bypassing Fastify's abstraction\n this.baseResponse.raw.writeHead(this.statusCode, this.getHeaders() as any);\n\n return {\n /**\n * Send a chunk of data to the client\n * @param data - Data to send (string, Buffer, or any serializable data)\n */\n send: (data: any) => {\n if (isEnded) {\n throw new Error(\"Cannot send data: stream has already ended\");\n }\n\n this.baseResponse.raw.write(data);\n\n return this;\n },\n\n /**\n * Render a React component and send it as a chunk\n * @param element - React element or component to render\n */\n render: (element: ReactNode) => {\n if (isEnded) {\n throw new Error(\"Cannot render: stream has already ended\");\n }\n\n const html = renderReact(element);\n chunks.push(html);\n this.baseResponse.raw.write(html);\n\n return this;\n },\n\n /**\n * End the stream and trigger completion events\n */\n end: () => {\n if (isEnded) {\n return this;\n }\n\n isEnded = true;\n\n // Store the streamed content for logging/debugging\n this.currentBody = chunks;\n this.parsedBody = chunks;\n\n // End the response\n this.baseResponse.raw.end();\n\n this.log(\"Stream ended\");\n\n // Trigger sent events\n Response.trigger(\"sent\", this);\n for (const callback of this.events.get(\"sent\") || []) {\n callback(this);\n }\n\n // Trigger success event if status is 2xx\n if (this.isOk) {\n Response.trigger(\"success\", this);\n }\n\n // Trigger status-specific events\n if (this.currentStatusCode === 201) {\n Response.trigger(\"successCreate\", this);\n }\n\n return this;\n },\n\n /**\n * Check if the stream has ended\n */\n get ended() {\n return isEnded;\n },\n };\n }\n\n /**\n * Create a Server-Sent Events (SSE) stream\n *\n * SSE is a standard for pushing real-time updates from server to client.\n * Perfect for live notifications, progress updates, or real-time data feeds.\n *\n * @example\n * ```ts\n * const sse = response.sse();\n *\n * // Send events\n * sse.send(\"message\", { text: \"Hello!\" });\n * sse.send(\"notification\", { type: \"info\", message: \"Update available\" }, \"msg-123\");\n *\n * // Keep connection alive\n * const keepAlive = setInterval(() => sse.comment(\"ping\"), 30000);\n *\n * // Clean up when done\n * clearInterval(keepAlive);\n * sse.end();\n * ```\n *\n * @returns SSE controller with send(), comment(), and end() methods\n */\n public sse() {\n // Set SSE-specific headers\n this.setContentType(\"text/event-stream\");\n this.header(\"Cache-Control\", \"no-cache, no-store, must-revalidate\");\n this.header(\"Connection\", \"keep-alive\");\n this.header(\"X-Accel-Buffering\", \"no\"); // Disable nginx buffering\n\n // Trigger sending events\n Response.trigger(\"sending\", this);\n for (const callback of this.events.get(\"sending\") || []) {\n callback(this);\n }\n\n this.log(\"Starting SSE stream\");\n\n // Track stream state\n let isEnded = false;\n const events: any[] = [];\n\n // Write headers to start the stream\n this.baseResponse.raw.writeHead(this.statusCode, this.getHeaders() as any);\n\n return {\n /**\n * Send an SSE event\n * @param event - Event name (e.g., \"message\", \"notification\")\n * @param data - Event data (will be JSON stringified)\n * @param id - Optional event ID for client-side tracking\n */\n send: (event: string, data: any, id?: string) => {\n if (isEnded) {\n throw new Error(\"Cannot send event: SSE stream has already ended\");\n }\n\n let message = \"\";\n if (id) message += `id: ${id}\\n`;\n message += `event: ${event}\\n`;\n message += `data: ${JSON.stringify(data)}\\n\\n`;\n\n events.push({ event, data, id });\n this.baseResponse.raw.write(message);\n\n return this;\n },\n\n /**\n * Send a comment (keeps connection alive, invisible to client)\n * Useful for preventing timeout on long-lived connections\n * @param text - Comment text\n */\n comment: (text: string) => {\n if (isEnded) {\n throw new Error(\"Cannot send comment: SSE stream has already ended\");\n }\n\n this.baseResponse.raw.write(`: ${text}\\n\\n`);\n\n return this;\n },\n\n /**\n * End the SSE stream and trigger completion events\n */\n end: () => {\n if (isEnded) {\n return;\n }\n\n isEnded = true;\n\n // Store the events for logging/debugging\n this.currentBody = events;\n this.parsedBody = events;\n\n // End the response\n this.baseResponse.raw.end();\n\n this.log(\"SSE stream ended\");\n\n // Trigger sent events\n Response.trigger(\"sent\", this);\n for (const callback of this.events.get(\"sent\") || []) {\n callback(this);\n }\n\n // Trigger success event if status is 2xx\n if (this.isOk) {\n Response.trigger(\"success\", this);\n }\n },\n\n /**\n * Check if the stream has ended\n */\n get ended() {\n return isEnded;\n },\n };\n }\n\n /**\n * Set the status code\n */\n public setStatusCode(statusCode: number) {\n this.currentStatusCode = statusCode;\n\n return this;\n }\n\n /**\n * Redirect the user to another route\n */\n public redirect(url: string, statusCode = 302) {\n this.baseResponse.redirect(url, statusCode);\n\n return this;\n }\n\n /**\n * Permanent redirect\n */\n public permanentRedirect(url: string) {\n this.baseResponse.redirect(url, 301);\n\n return this;\n }\n\n /**\n * Get the response time\n */\n public getResponseTime() {\n return this.baseResponse.elapsedTime;\n }\n\n /**\n * Remove a specific header\n */\n public removeHeader(key: string) {\n this.baseResponse.removeHeader(key);\n\n return this;\n }\n\n /**\n * Get a specific header\n */\n public getHeader(key: string) {\n return this.baseResponse.getHeader(key);\n }\n\n /**\n * Get the response headers\n */\n public getHeaders() {\n return this.baseResponse.getHeaders();\n }\n\n /**\n * Set multiple headers\n */\n public headers(headers: Record<string, string>) {\n this.baseResponse.headers(headers);\n\n return this;\n }\n\n /**\n * Set the response header\n */\n public header(key: string, value: any) {\n this.baseResponse.header(key, value);\n\n return this;\n }\n\n /**\n * Alias to header method\n */\n public setHeader(key: string, value: any) {\n return this.header(key, value);\n }\n\n /**\n * Send an error response with status code 500\n */\n public serverError(data: any) {\n return this.send(data, 500);\n }\n\n /**\n * Send a forbidden response with status code 403\n */\n public forbidden(\n data: any = {\n error: \"You are not allowed to access this resource, FORBIDDEN\",\n },\n ) {\n return this.send(data, 403);\n }\n\n /**\n * Send a service unavailable response with status code 503\n */\n public serviceUnavailable(data: any) {\n return this.send(data, 503);\n }\n\n /**\n * Send an unauthorized response with status code 401\n */\n public unauthorized(\n data: any = {\n error: \"unauthorized\",\n },\n ) {\n return this.send(data, 401);\n }\n\n /**\n * Send a not found response with status code 404\n */\n public notFound(\n data: any = {\n error: \"notFound\",\n },\n ) {\n return this.send(data, 404);\n }\n\n /**\n * Send a bad request response with status code 400\n */\n public badRequest(data: any) {\n return this.send(data, 400);\n }\n\n /**\n * Send a success response with status code 201\n */\n public successCreate(data: any) {\n return this.send(data, 201);\n }\n\n /**\n * Send a success response\n */\n public success(data: any = { success: true }) {\n return this.send(data);\n }\n\n /**\n * Send a no content response with status code 204\n */\n public noContent() {\n return this.baseResponse.status(204).send();\n }\n\n /**\n * Send an accepted response with status code 202\n * Used for async operations that have been accepted but not yet processed\n */\n public accepted(data: any = { message: \"Request accepted for processing\" }) {\n return this.send(data, 202);\n }\n\n /**\n * Send a conflict response with status code 409\n */\n public conflict(data: any = { error: \"Resource conflict\" }) {\n return this.send(data, 409);\n }\n\n /**\n * Send an unprocessable entity response with status code 422\n * Used for semantic validation errors\n */\n public unprocessableEntity(data: any) {\n return this.send(data, 422);\n }\n\n /**\n * Apply response options (cache, disposition, etag)\n * Shared helper for sendFile and sendBuffer\n */\n private applyResponseOptions(options: SendBufferOptions, defaultFilename?: string): boolean {\n // Set content type if provided\n if (options.contentType) {\n this.baseResponse.type(options.contentType);\n }\n\n // Set cache headers if specified\n if (options.cacheTime) {\n const cacheControl = options.immutable\n ? `public, max-age=${options.cacheTime}, immutable`\n : `public, max-age=${options.cacheTime}`;\n this.header(\"Cache-Control\", cacheControl);\n this.header(\"Expires\", new Date(Date.now() + options.cacheTime * 1000).toUTCString());\n }\n\n // Set ETag if provided (for conditional requests)\n if (options.etag) {\n this.header(\"ETag\", options.etag);\n\n // Check If-None-Match for conditional request\n const ifNoneMatch = this.request.header(\"if-none-match\");\n if (ifNoneMatch && ifNoneMatch === options.etag) {\n this.log(\"Content not modified (ETag match), sending 304\");\n this.baseResponse.status(304).send();\n return true; // Indicates 304 was sent\n }\n }\n\n // Set Content-Disposition if inline or filename is specified\n if (options.inline !== undefined || options.filename) {\n const disposition = options.inline ? \"inline\" : \"attachment\";\n const filename = options.filename || defaultFilename || \"file\";\n this.header(\"Content-Disposition\", `${disposition}; filename=\\\"${filename}\\\"`);\n }\n\n return false; // No 304 sent\n }\n\n /**\n * Send a file as a response\n */\n public async sendFile(filePath: string, options?: number | SendFileOptions) {\n this.log(`Sending file: ${filePath}`);\n\n // Check if file exists first\n if (!(await fileExistsAsync(filePath))) {\n return this.notFound({\n error: \"File Not Found\",\n });\n }\n\n try {\n // Normalize options to object format\n const opts = typeof options === \"number\" ? { cacheTime: options } : options || {};\n\n // Get file stats for ETag and Last-Modified\n const stats = await fs.promises.stat(filePath);\n const lastModified = stats.mtime;\n\n // Generate ETag based on file size and modification time\n const etag = `\"${stats.size}-${stats.mtime.getTime()}\"`;\n\n // Set Last-Modified header\n this.header(\"Last-Modified\", lastModified.toUTCString());\n this.header(\"ETag\", etag);\n\n // Set content type\n const contentType = this.getFileContentType(filePath);\n this.baseResponse.type(contentType);\n\n // Apply common response options (cache, disposition)\n const defaultFilename = path.basename(filePath);\n const sent304 = this.applyResponseOptions({ ...opts, etag, contentType }, defaultFilename);\n if (sent304) return this.baseResponse;\n\n // Check conditional request headers\n const ifNoneMatch = this.request.header(\"if-none-match\");\n const ifModifiedSince = this.request.header(\"if-modified-since\");\n\n // Handle If-None-Match (ETag validation)\n if (ifNoneMatch && ifNoneMatch === etag) {\n this.log(\"File not modified (ETag match), sending 304\");\n return this.baseResponse.status(304).send();\n }\n\n // Handle If-Modified-Since (Last-Modified validation)\n if (ifModifiedSince) {\n const modifiedSinceDate = new Date(ifModifiedSince);\n if (lastModified.getTime() <= modifiedSinceDate.getTime()) {\n this.log(\"File not modified (Last-Modified check), sending 304\");\n return this.baseResponse.status(304).send();\n }\n }\n\n // Use streaming for efficient file sending\n const stream = fs.createReadStream(filePath);\n\n // Handle stream errors\n stream.on(\"error\", (error) => {\n this.log(`Error reading file: ${error.message}`, \"error\");\n if (!this.baseResponse.sent) {\n this.serverError({\n error: \"Error reading file\",\n message: error.message,\n });\n }\n });\n\n // Send the stream\n return this.baseResponse.send(stream);\n } catch (error: any) {\n this.log(`Error sending file: ${error.message}`, \"error\");\n return this.serverError({\n error: \"Error sending file\",\n message: error.message,\n });\n }\n }\n\n /**\n * Send buffer as a response\n * Useful for dynamically generated content (e.g., resized images, generated PDFs)\n */\n public sendBuffer(buffer: Buffer, options?: number | SendBufferOptions) {\n this.log(\"Sending buffer\");\n\n // Normalize options to object format\n const opts = typeof options === \"number\" ? { cacheTime: options } : options || {};\n\n // Apply common response options (cache, disposition, etag)\n const sent304 = this.applyResponseOptions(opts);\n if (sent304) return this.baseResponse;\n\n return this.baseResponse.send(buffer);\n }\n\n /**\n * Send an Image instance as a response\n * Automatically detects image format and sets content type\n */\n public async sendImage(\n image: any, // Type as 'any' to avoid circular dependency with Image class\n options?: number | (Omit<SendBufferOptions, \"contentType\"> & { contentType?: string }),\n ) {\n this.log(\"Sending image\");\n\n // Normalize options to object format\n const opts = typeof options === \"number\" ? { cacheTime: options } : options || {};\n\n // Get image metadata to determine format\n const metadata = await image.metadata();\n const format = metadata.format || \"jpeg\";\n\n // Convert image to buffer\n const buffer = await image.toBuffer();\n\n // Auto-set content type if not provided\n const contentType = opts.contentType || `image/${format}`;\n\n // Auto-generate ETag if not provided\n // Format: \"format-widthxheight-size\" (e.g., \"jpeg-800x600-45231\")\n // This catches changes in dimensions, quality, filters, and format\n if (!opts.etag) {\n const width = metadata.width || 0;\n const height = metadata.height || 0;\n opts.etag = `\"${format}-${width}x${height}-${buffer.length}\"`;\n }\n\n // Apply common response options with auto-detected content type\n const sent304 = this.applyResponseOptions({ ...opts, contentType });\n if (sent304) return this.baseResponse;\n\n return this.baseResponse.send(buffer);\n }\n\n /**\n * Send file and cache it\n * Cache time in seconds\n * Cache time will be one year\n */\n public sendCachedFile(path: string, cacheTime = 31536000) {\n return this.sendFile(path, cacheTime);\n }\n\n /**\n * Download the given file path\n */\n public download(path: string, filename?: string) {\n return this.downloadFile(path, filename);\n }\n\n /**\n * Download the given file path\n */\n public async downloadFile(filePath: string, filename?: string) {\n // Check if file exists first\n if (!(await fileExistsAsync(filePath))) {\n return this.notFound({\n error: \"File Not Found\",\n });\n }\n\n try {\n if (!filename) {\n filename = path.basename(filePath);\n }\n\n this.baseResponse.header(\"Content-Disposition\", `attachment; filename=\"${filename}\"`);\n\n // this.baseResponse.header(\"Content-Type\", this.getFileContentType(filePath));\n this.baseResponse.header(\"Content-Type\", \"application/octet-stream\");\n\n const stream = fs.createReadStream(filePath);\n\n // Handle stream errors\n stream.on(\"error\", (error) => {\n this.log(`Error reading file for download: ${error.message}`, \"error\");\n if (!this.baseResponse.sent) {\n this.serverError({\n error: \"Error reading file\",\n message: error.message,\n });\n }\n });\n\n return this.baseResponse.send(stream);\n } catch (error: any) {\n this.log(`Error downloading file: ${error.message}`, \"error\");\n return this.serverError({\n error: \"Error downloading file\",\n message: error.message,\n });\n }\n }\n\n /**\n * Get content type of the given path\n */\n public getFileContentType(filePath: string) {\n const type = mime.getType(filePath) || \"application/octet-stream\";\n return type;\n }\n\n /**\n * Mark the response as failed\n */\n public failedSchema(result: ValidationResult) {\n const { errors, inputKey, inputError, status } = config.get(\"validation.response\", {\n errors: \"errors\",\n inputKey: \"input\",\n inputError: \"error\",\n status: 400,\n });\n\n log.error(\"request\", \"validation\", `${this.request.id} - Validation failed`);\n\n return this.send(\n {\n [errors]: result.errors.map((error) => ({\n [inputKey]: error.input,\n [inputError]: error.error,\n })),\n },\n status,\n );\n }\n}\n","import axios from \"axios\";\nimport type sharp from \"sharp\";\nimport type { FormatEnum } from \"sharp\";\n\n// ============================================================\n// Eager-loaded Sharp Module\n// ============================================================\n\n/**\n * Installation instructions for sharp\n */\nconst SHARP_INSTALL_INSTRUCTIONS = `\nImage processing requires the sharp package.\nInstall it with:\n\n warlock add image\n\nOr manually:\n\n npm install sharp\n pnpm add sharp\n yarn add sharp\n`.trim();\n\n/**\n * Module availability flag\n */\nlet moduleExists: boolean | null = null;\n\n/**\n * Cached sharp function (loaded at import time)\n */\nlet sharpFn: typeof sharp;\n\n/**\n * Eagerly load sharp module at import time\n */\nasync function loadSharpModule() {\n try {\n const module = await import(\"sharp\");\n sharpFn = module.default;\n moduleExists = true;\n } catch {\n moduleExists = false;\n }\n}\n\n// Kick off eager loading immediately\nloadSharpModule();\n\n// ============================================================\n// Types\n// ============================================================\n\nexport type ImageFormat = keyof FormatEnum;\n\nexport type ImageInput = string | Buffer | Uint8Array | ArrayBuffer;\n\n/**\n * Watermark configuration for deferred execution\n */\nexport type WatermarkConfig = {\n image: ImageInput | Image;\n options: sharp.OverlayOptions;\n};\n\n/**\n * Operation descriptor for deferred pipeline execution.\n * All operations are stored and executed at save/toBuffer time.\n */\ntype ImageOperation =\n | { type: \"resize\"; options: sharp.ResizeOptions }\n | { type: \"crop\"; options: sharp.Region }\n | { type: \"rotate\"; angle: number }\n | { type: \"flip\" }\n | { type: \"flop\" }\n | { type: \"blur\"; sigma: number }\n | { type: \"sharpen\"; options?: sharp.SharpenOptions }\n | { type: \"blackAndWhite\" }\n | { type: \"opacity\"; value: number }\n | { type: \"negate\"; options?: sharp.NegateOptions }\n | { type: \"tint\"; color: sharp.Color }\n | { type: \"trim\"; options?: sharp.TrimOptions }\n | { type: \"watermark\"; config: WatermarkConfig }\n | { type: \"watermarks\"; configs: WatermarkConfig[] };\n\n/**\n * Transformation options that can be applied in batch via `apply()` method.\n *\n * **Execution Order (when using apply()):**\n * 1. resize - Resize first to work with correct dimensions\n * 2. crop - Crop after resize to extract the desired region\n * 3. rotate - Rotation after sizing\n * 4. flip/flop - Mirror operations\n * 5. blackAndWhite/grayscale - Color space conversion\n * 6. blur - Blur effect\n * 7. sharpen - Sharpen effect\n * 8. tint - Color overlay\n * 9. negate - Invert colors\n * 10. opacity - Transparency (applied via composite)\n * 11. format/quality - Applied on save/export\n */\nexport type ImageTransformOptions = {\n /**\n * Output quality (1-100), applied based on final format\n */\n quality?: number;\n /**\n * Output format (jpeg, png, webp, avif, etc.)\n */\n format?: ImageFormat;\n /**\n * Resize options\n */\n resize?: sharp.ResizeOptions;\n /**\n * Crop/extract region\n */\n crop?: sharp.Region;\n /**\n * Rotation angle in degrees\n */\n rotate?: number;\n /**\n * Flip vertically (top to bottom)\n */\n flip?: boolean;\n /**\n * Flop horizontally (left to right)\n */\n flop?: boolean;\n /**\n * Convert to black and white\n */\n blackAndWhite?: boolean;\n /**\n * Alias for blackAndWhite\n */\n grayscale?: boolean;\n /**\n * Blur sigma (must be >= 0.3)\n */\n blur?: number;\n /**\n * Sharpen options\n */\n sharpen?: sharp.SharpenOptions | boolean;\n /**\n * Tint color\n */\n tint?: sharp.Color;\n /**\n * Negate/invert colors\n */\n negate?: sharp.NegateOptions | boolean;\n /**\n * Opacity (0-100)\n */\n opacity?: number;\n /**\n * Trim options\n */\n trim?: sharp.TrimOptions | boolean;\n /**\n * Single watermark\n */\n watermark?: WatermarkConfig;\n /**\n * Multiple watermarks\n */\n watermarks?: WatermarkConfig[];\n};\n\n/**\n * Internal options stored for deferred application\n */\ntype InternalOptions = {\n quality?: number;\n format?: ImageFormat;\n};\n\n/**\n * Image manipulation class with deferred pipeline execution.\n *\n * **Important:** This class requires the `sharp` package to be installed.\n * Install it with: `warlock add image` or `npm install sharp`\n *\n * Sharp is lazy-loaded on the first async operation (save, toBuffer, etc.),\n * so the constructor and all chainable methods remain synchronous.\n *\n * All operations are synchronous and stored as descriptors.\n * The pipeline is executed only when calling output methods:\n * - `save()` - Save to file\n * - `toBuffer()` - Get as buffer\n * - `toBase64()` - Get as base64 string\n * - `toDataUrl()` - Get as data URL\n *\n * @example\n * ```typescript\n * // All chaining is synchronous - single await at the end\n * await new Image(\"photo.jpg\")\n * .resize({ width: 800 })\n * .watermark(\"logo.png\", { gravity: \"southeast\" })\n * .quality(85)\n * .save(\"output.jpg\");\n * ```\n */\nexport class Image {\n /**\n * Image options that will be applied on save/export\n */\n protected options: InternalOptions = {};\n\n /**\n * Deferred operations pipeline\n */\n protected operations: ImageOperation[] = [];\n\n /**\n * Cached metadata to avoid repeated async calls\n */\n protected cachedMetadata: sharp.Metadata | null = null;\n\n /**\n * Whether the pipeline has been executed\n */\n protected pipelineExecuted = false;\n\n /**\n * Sharp image object\n */\n public readonly image: sharp.Sharp;\n\n /**\n * Formats that support quality option\n */\n protected static readonly QUALITY_FORMATS = [\"jpeg\", \"jpg\", \"webp\", \"avif\", \"tiff\", \"heif\"];\n\n /**\n * Constructor\n */\n public constructor(image: ImageInput | sharp.Sharp) {\n if (moduleExists === false) {\n throw new Error(`sharp is not installed.\\n\\n${SHARP_INSTALL_INSTRUCTIONS}`);\n }\n\n // Check if it's already a sharp instance\n if (image instanceof Object && \"clone\" in image && typeof image.clone === \"function\") {\n this.image = image as sharp.Sharp;\n } else {\n this.image = sharpFn(image as ImageInput);\n }\n }\n\n /**\n * Create image instance from file path\n */\n public static fromFile(path: string): Image {\n return new Image(path);\n }\n\n /**\n * Create image instance from buffer\n */\n public static fromBuffer(buffer: Buffer): Image {\n return new Image(buffer);\n }\n\n /**\n * Create image instance from url\n */\n public static async fromUrl(url: string): Promise<Image> {\n try {\n const response = await axios.get(url, {\n responseType: \"arraybuffer\",\n });\n\n if (!response.data) {\n throw new Error(\"Empty response received\");\n }\n\n const buffer = Buffer.from(response.data, \"binary\");\n\n return new Image(buffer);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n throw new Error(`Failed to load image from URL \"${url}\": ${message}`);\n }\n }\n\n /**\n * Add an operation to the deferred pipeline\n */\n protected addOperation(operation: ImageOperation): this {\n this.operations.push(operation);\n\n return this;\n }\n\n /**\n * Apply multiple transformations at once with a predefined execution order.\n *\n * This method ensures transformations are applied in a logical order:\n * resize → crop → rotate → flip/flop → colorspace → effects → opacity → format\n *\n * For custom ordering, use individual chained methods instead.\n */\n public apply(options: ImageTransformOptions): this {\n // 1. Resize first to work with correct dimensions\n if (options.resize) {\n this.resize(options.resize);\n }\n\n // 2. Crop after resize\n if (options.crop) {\n this.crop(options.crop);\n }\n\n // 3. Rotation\n if (options.rotate !== undefined) {\n this.rotate(options.rotate);\n }\n\n // 4. Mirror operations\n if (options.flip) {\n this.flip();\n }\n\n if (options.flop) {\n this.flop();\n }\n\n // 5. Color space conversion\n if (options.blackAndWhite || options.grayscale) {\n this.blackAndWhite();\n }\n\n // 6. Blur effect\n if (options.blur !== undefined) {\n this.blur(options.blur);\n }\n\n // 7. Sharpen effect\n if (options.sharpen) {\n const sharpenOptions = typeof options.sharpen === \"boolean\" ? undefined : options.sharpen;\n this.sharpen(sharpenOptions);\n }\n\n // 8. Tint color\n if (options.tint) {\n this.tint(options.tint);\n }\n\n // 9. Negate/invert\n if (options.negate) {\n const negateOptions = typeof options.negate === \"boolean\" ? undefined : options.negate;\n this.negate(negateOptions);\n }\n\n // 10. Trim edges\n if (options.trim) {\n const trimOptions = typeof options.trim === \"boolean\" ? undefined : options.trim;\n this.trim(trimOptions);\n }\n\n // 11. Watermarks\n if (options.watermark) {\n this.watermark(options.watermark.image, options.watermark.options);\n }\n\n if (options.watermarks) {\n this.watermarks(options.watermarks);\n }\n\n // 12. Opacity (applied via composite)\n if (options.opacity !== undefined) {\n this.opacity(options.opacity);\n }\n\n // 13. Store format/quality for deferred application\n if (options.format) {\n this.format(options.format);\n }\n\n if (options.quality !== undefined) {\n this.quality(options.quality);\n }\n\n return this;\n }\n\n /**\n * Set image opacity (0-100)\n */\n public opacity(value: number): this {\n if (value < 0 || value > 100) {\n throw new Error(\"Opacity must be between 0 and 100\");\n }\n\n return this.addOperation({ type: \"opacity\", value });\n }\n\n /**\n * Convert image to black and white\n */\n public blackAndWhite(): this {\n return this.addOperation({ type: \"blackAndWhite\" });\n }\n\n /**\n * Alias for blackAndWhite\n */\n public grayscale(): this {\n return this.blackAndWhite();\n }\n\n /**\n * Get image dimensions (cached after first call)\n */\n public async dimensions(): Promise<{\n width: number | undefined;\n height: number | undefined;\n }> {\n const metadata = await this.metadata();\n\n return { width: metadata.width, height: metadata.height };\n }\n\n /**\n * Get image metadata (cached after first call)\n *\n * The metadata is cached to avoid repeated async operations.\n * Use `refreshMetadata()` to force a fresh fetch.\n */\n public async metadata(): Promise<sharp.Metadata> {\n if (!this.cachedMetadata) {\n this.cachedMetadata = await this.image.metadata();\n }\n\n return this.cachedMetadata;\n }\n\n /**\n * Force refresh of cached metadata\n *\n * Call this after transformations if you need updated metadata.\n */\n public async refreshMetadata(): Promise<sharp.Metadata> {\n this.cachedMetadata = await this.image.metadata();\n\n return this.cachedMetadata;\n }\n\n /**\n * Clear cached metadata\n */\n public clearMetadataCache(): this {\n this.cachedMetadata = null;\n\n return this;\n }\n\n /**\n * Resize image\n */\n public resize(options: sharp.ResizeOptions): this {\n return this.addOperation({ type: \"resize\", options });\n }\n\n /**\n * Crop/extract a region from the image\n */\n public crop(options: sharp.Region): this {\n return this.addOperation({ type: \"crop\", options });\n }\n\n /**\n * Set image quality (1-100)\n * Quality is stored and applied when saving/exporting\n * based on the final format.\n */\n public quality(quality: number): this {\n if (quality < 1 || quality > 100) {\n throw new Error(\"Quality must be between 1 and 100\");\n }\n\n this.options.quality = quality;\n\n return this;\n }\n\n /**\n * Execute the deferred pipeline - apply all stored operations\n */\n protected async executePipeline(): Promise<sharp.Sharp> {\n if (this.pipelineExecuted) {\n return this.image;\n }\n\n for (const operation of this.operations) {\n await this.executeOperation(this.image, operation);\n }\n\n await this.applyFormatAndQuality(this.image);\n\n this.pipelineExecuted = true;\n\n return this.image;\n }\n\n /**\n * Execute a single operation\n */\n protected async executeOperation(image: sharp.Sharp, operation: ImageOperation): Promise<void> {\n switch (operation.type) {\n case \"resize\":\n image.resize(operation.options);\n break;\n\n case \"crop\":\n image.extract(operation.options);\n break;\n\n case \"rotate\":\n image.rotate(operation.angle);\n break;\n\n case \"flip\":\n image.flip();\n break;\n\n case \"flop\":\n image.flop();\n break;\n\n case \"blur\":\n image.blur(operation.sigma);\n break;\n\n case \"sharpen\":\n image.sharpen(operation.options);\n break;\n\n case \"blackAndWhite\":\n image.toColourspace(\"b-w\");\n break;\n\n case \"opacity\": {\n const alpha = Math.round((operation.value / 100) * 255);\n const alphaPixel = Buffer.from([255, 255, 255, alpha]);\n image.composite([\n {\n blend: \"dest-in\",\n input: alphaPixel,\n },\n ]);\n break;\n }\n\n case \"negate\":\n image.negate(operation.options);\n break;\n\n case \"tint\":\n image.tint(operation.color);\n break;\n\n case \"trim\":\n image.trim(operation.options);\n break;\n\n case \"watermark\": {\n const buffer = await this.resolveImageBuffer(operation.config.image);\n image.composite([\n {\n input: buffer,\n ...operation.config.options,\n },\n ]);\n break;\n }\n\n case \"watermarks\": {\n const buffers = await Promise.all(\n operation.configs.map((config) => this.resolveImageBuffer(config.image)),\n );\n image.composite(\n operation.configs.map((config, index) => ({\n input: buffers[index],\n ...config.options,\n })),\n );\n break;\n }\n }\n }\n\n /**\n * Resolve an image input to a buffer\n */\n protected async resolveImageBuffer(input: ImageInput | Image): Promise<Buffer> {\n if (input instanceof Image) {\n // For Image instances, get buffer without applying options (raw buffer)\n return input.image.toBuffer();\n }\n\n // For other inputs (path, buffer, etc.), create temp sharp instance\n const tempImage = sharpFn(input);\n\n return tempImage.toBuffer();\n }\n\n /**\n * Apply format and quality options.\n * If no format is explicitly set, preserves the original format and applies\n * quality appropriately based on the format type.\n */\n protected async applyFormatAndQuality(image: sharp.Sharp): Promise<void> {\n const { quality, format } = this.options;\n\n if (format) {\n // Explicit format specified\n const formatOptions = quality ? { quality } : undefined;\n image.toFormat(format, formatOptions);\n return;\n }\n\n if (quality === undefined) {\n // No quality or format set, nothing to apply\n return;\n }\n\n // Quality is set but no format specified - detect original format\n const metadata = await this.metadata();\n const originalFormat = metadata.format;\n\n if (!originalFormat) {\n // Cannot detect format, default to webp with quality\n image.webp({ quality });\n return;\n }\n\n // Apply quality based on original format\n if (Image.QUALITY_FORMATS.includes(originalFormat)) {\n // Format supports quality option\n image.toFormat(originalFormat as ImageFormat, { quality });\n } else if (originalFormat === \"png\") {\n // PNG uses compressionLevel (0-9) instead of quality\n // Map quality 1-100 to compressionLevel 9-0 (higher quality = lower compression)\n const compressionLevel = Math.round(9 - (quality / 100) * 9);\n image.png({ compressionLevel });\n } else if (originalFormat === \"gif\") {\n // GIF doesn't support quality, just preserve format\n image.gif();\n }\n // Unknown format: preserve as-is (no quality applied)\n }\n\n /**\n * Save to file\n */\n public async save(path: string): Promise<sharp.OutputInfo> {\n const image = await this.executePipeline();\n\n return image.toFile(path);\n }\n\n /**\n * Convert to webp and save to file\n */\n public async saveAsWebp(path: string): Promise<sharp.OutputInfo> {\n // Override format to webp\n this.options.format = \"webp\";\n const image = await this.executePipeline();\n\n return image.toFile(path);\n }\n\n /**\n * Change the file format\n */\n public format(format: ImageFormat): this {\n this.options.format = format;\n\n return this;\n }\n\n /**\n * Add watermark (deferred - executed at save time)\n */\n public watermark(image: ImageInput | Image, options: sharp.OverlayOptions = {}): this {\n return this.addOperation({\n type: \"watermark\",\n config: { image, options },\n });\n }\n\n /**\n * Add multiple watermarks (deferred - executed at save time)\n */\n public watermarks(configs: WatermarkConfig[]): this {\n return this.addOperation({\n type: \"watermarks\",\n configs,\n });\n }\n\n /**\n * Rotate image\n */\n public rotate(angle: number): this {\n return this.addOperation({ type: \"rotate\", angle });\n }\n\n /**\n * Flip image vertically (top to bottom)\n */\n public flip(): this {\n return this.addOperation({ type: \"flip\" });\n }\n\n /**\n * Flop image horizontally (left to right)\n */\n public flop(): this {\n return this.addOperation({ type: \"flop\" });\n }\n\n /**\n * Blur image\n */\n public blur(sigma: number): this {\n if (sigma < 0.3) {\n throw new Error(\"Blur sigma must be at least 0.3\");\n }\n\n return this.addOperation({ type: \"blur\", sigma });\n }\n\n /**\n * Convert to base64\n */\n public async toBase64(): Promise<string> {\n const image = await this.executePipeline();\n const buffer = await image.toBuffer();\n\n return buffer.toString(\"base64\");\n }\n\n /**\n * Convert to data URL (base64 with mime type prefix)\n */\n public async toDataUrl(): Promise<string> {\n const metadata = await this.metadata();\n const format = this.options.format || metadata.format || \"png\";\n const mimeType = `image/${format === \"jpg\" ? \"jpeg\" : format}`;\n const base64 = await this.toBase64();\n\n return `data:${mimeType};base64,${base64}`;\n }\n\n /**\n * Sharpen image\n */\n public sharpen(options?: sharp.SharpenOptions): this {\n return this.addOperation({ type: \"sharpen\", options });\n }\n\n /**\n * Negate/invert image colors\n */\n public negate(options?: sharp.NegateOptions): this {\n return this.addOperation({ type: \"negate\", options });\n }\n\n /**\n * Tint image with a color\n */\n public tint(color: sharp.Color): this {\n return this.addOperation({ type: \"tint\", color });\n }\n\n /**\n * Trim edges from the image\n */\n public trim(options?: sharp.TrimOptions): this {\n return this.addOperation({ type: \"trim\", options });\n }\n\n /**\n * Convert to buffer\n */\n public async toBuffer(): Promise<Buffer> {\n const image = await this.executePipeline();\n\n return image.toBuffer();\n }\n\n /**\n * Clone the image for separate transformations\n */\n public clone(): Image {\n const clonedImage = new Image(this.image.clone());\n clonedImage.options = { ...this.options };\n clonedImage.operations = [...this.operations];\n clonedImage.cachedMetadata = this.cachedMetadata ? { ...this.cachedMetadata } : null;\n\n return clonedImage;\n }\n\n /**\n * Get the current stored options\n */\n public getOptions(): Readonly<InternalOptions> {\n return { ...this.options };\n }\n\n /**\n * Get the pending operations count\n */\n public getPendingOperationsCount(): number {\n return this.operations.length;\n }\n\n /**\n * Reset all stored options\n */\n public resetOptions(): this {\n this.options = {};\n\n return this;\n }\n\n /**\n * Clear all pending operations\n */\n public clearOperations(): this {\n this.operations = [];\n this.pipelineExecuted = false;\n\n return this;\n }\n\n /**\n * Reset the image to its initial state (clear operations and options)\n */\n public reset(): this {\n this.operations = [];\n this.options = {};\n this.pipelineExecuted = false;\n this.cachedMetadata = null;\n\n return this;\n }\n}\n","import type { LogChannel } from \"@warlock.js/logger\";\r\nimport { logger } from \"@warlock.js/logger\";\r\nimport { environment } from \"../utils\";\r\nimport type { LogConfigurations } from \"./types\";\r\n\r\nexport function setLogConfigurations(options: LogConfigurations) {\r\n // log configurations\r\n const channels: LogChannel[] = [];\r\n\r\n const env = environment();\r\n\r\n const envChannels = options[env as \"development\" | \"production\"]?.channels;\r\n const defaultChannels = options.channels;\r\n\r\n if (defaultChannels) {\r\n channels.push(...defaultChannels);\r\n }\r\n\r\n if (envChannels) {\r\n channels.push(...envChannels);\r\n }\r\n\r\n logger.configure({\r\n channels,\r\n });\r\n}\r\n","import type { MailConfigurations, MailersConfig, MailMode } from \"./types\";\r\n\r\n/**\r\n * Default mail configurations\r\n */\r\nconst defaultConfigurations: Partial<MailConfigurations> = {\r\n secure: true,\r\n tls: true,\r\n};\r\n\r\n/**\r\n * Current mail mode\r\n */\r\nlet currentMode: MailMode = \"production\";\r\n\r\n/**\r\n * Registered mailers configuration\r\n */\r\nlet mailersConfig: MailersConfig = {};\r\n\r\n/**\r\n * Set the mail mode\r\n *\r\n * @param mode \"production\" | \"development\" | \"test\"\r\n *\r\n * - **production**: Actually sends emails via SMTP\r\n * - **development**: Logs emails to console without sending\r\n * - **test**: Captures emails to test mailbox for assertions\r\n *\r\n * @example\r\n * ```typescript\r\n * // In test setup\r\n * setMailMode(\"test\");\r\n *\r\n * // In development\r\n * setMailMode(\"development\");\r\n * ```\r\n */\r\nexport function setMailMode(mode: MailMode): void {\r\n currentMode = mode;\r\n}\r\n\r\n/**\r\n * Get the current mail mode\r\n */\r\nexport function getMailMode(): MailMode {\r\n return currentMode;\r\n}\r\n\r\n/**\r\n * Check if in production mode\r\n */\r\nexport function isProductionMode(): boolean {\r\n return currentMode === \"production\";\r\n}\r\n\r\n/**\r\n * Check if in development mode\r\n */\r\nexport function isDevelopmentMode(): boolean {\r\n return currentMode === \"development\";\r\n}\r\n\r\n/**\r\n * Check if in test mode\r\n */\r\nexport function isTestMode(): boolean {\r\n return currentMode === \"test\";\r\n}\r\n\r\n/**\r\n * Set mail configurations\r\n *\r\n * Supports both simple config and named mailers.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Simple config (sets as default)\r\n * setMailConfigurations({\r\n * host: \"smtp.gmail.com\",\r\n * port: 587,\r\n * username: \"...\",\r\n * password: \"...\",\r\n * });\r\n *\r\n * // Named mailers\r\n * setMailConfigurations({\r\n * default: { host: \"smtp.sendgrid.net\", ... },\r\n * mailers: {\r\n * marketing: { host: \"smtp.mailchimp.com\", ... },\r\n * transactional: { host: \"smtp.postmark.com\", ... },\r\n * },\r\n * });\r\n * ```\r\n */\r\nexport function setMailConfigurations(config: MailConfigurations | MailersConfig): void {\r\n // Check if it's a MailersConfig (has 'default' or 'mailers' key)\r\n if (\"default\" in config || \"mailers\" in config) {\r\n mailersConfig = config as MailersConfig;\r\n } else {\r\n // Simple config - set as default\r\n mailersConfig = {\r\n default: config as MailConfigurations,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Get the default mail configuration\r\n */\r\nexport function getDefaultMailConfig(): MailConfigurations {\r\n return {\r\n ...defaultConfigurations,\r\n ...mailersConfig.default,\r\n };\r\n}\r\n\r\n/**\r\n * Get a named mailer configuration\r\n */\r\nexport function getMailerConfig(name: string): MailConfigurations | undefined {\r\n if (name === \"default\") {\r\n return getDefaultMailConfig();\r\n }\r\n\r\n const config = mailersConfig.mailers?.[name];\r\n if (!config) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n ...defaultConfigurations,\r\n ...config,\r\n };\r\n}\r\n\r\n/**\r\n * Resolve configuration from options\r\n * Priority: config > mailer > default\r\n */\r\nexport function resolveMailConfig(options: {\r\n config?: MailConfigurations;\r\n mailer?: string;\r\n}): MailConfigurations {\r\n // Direct config takes highest priority\r\n if (options.config) {\r\n return {\r\n ...defaultConfigurations,\r\n ...options.config,\r\n };\r\n }\r\n\r\n // Named mailer\r\n if (options.mailer) {\r\n const config = getMailerConfig(options.mailer);\r\n if (!config) {\r\n throw new Error(`Mailer \"${options.mailer}\" not found in configuration`);\r\n }\r\n return config;\r\n }\r\n\r\n // Default\r\n return getDefaultMailConfig();\r\n}\r\n\r\n/**\r\n * Reset all configurations (useful for testing)\r\n */\r\nexport function resetMailConfig(): void {\r\n currentMode = \"production\";\r\n mailersConfig = {};\r\n}\r\n","import { log } from \"@warlock.js/logger\";\r\nimport type nodemailer from \"nodemailer\";\r\nimport type { Transporter } from \"nodemailer\";\r\nimport type { MailConfigurations } from \"./types\";\r\n\r\n// ============================================================\r\n// Eager-loaded Nodemailer Module\r\n// ============================================================\r\n\r\n/**\r\n * Installation instructions for nodemailer\r\n */\r\nconst NODEMAILER_INSTALL_INSTRUCTIONS = `\r\nEmail functionality requires the nodemailer package.\r\nInstall it with:\r\n\r\n warlock add mailer\r\n\r\nOr manually:\r\n\r\n npm install nodemailer\r\n pnpm add nodemailer\r\n yarn add nodemailer\r\n`.trim();\r\n\r\n/**\r\n * Module availability flag\r\n */\r\nlet moduleExists: boolean | null = null;\r\n\r\n/**\r\n * Cached nodemailer module (loaded at import time)\r\n */\r\nlet nodemailerModule: typeof nodemailer;\r\n\r\n/**\r\n * Eagerly load nodemailer module at import time\r\n */\r\nasync function loadNodemailerModule() {\r\n try {\r\n const module = await import(\"nodemailer\");\r\n nodemailerModule = module.default;\r\n moduleExists = true;\r\n } catch {\r\n moduleExists = false;\r\n }\r\n}\r\n\r\n// Kick off eager loading immediately\r\nloadNodemailerModule();\r\n\r\n// ============================================================\r\n// Mailer Pool\r\n// ============================================================\r\n\r\n/**\r\n * Mailer pool for connection reuse\r\n * Maps config hash to transporter instance\r\n */\r\nconst mailerPool = new Map<string, Transporter>();\r\n\r\n/**\r\n * Create a hash from mail configuration for pooling\r\n */\r\nfunction createConfigHash(config: MailConfigurations): string {\r\n const key = JSON.stringify({\r\n host: config.host,\r\n port: config.port,\r\n secure: config.secure,\r\n auth: config.auth,\r\n username: config.username,\r\n password: config.password,\r\n });\r\n\r\n // Simple hash function\r\n let hash = 0;\r\n for (let i = 0; i < key.length; i++) {\r\n const char = key.charCodeAt(i);\r\n hash = (hash << 5) - hash + char;\r\n hash = hash & hash;\r\n }\r\n\r\n return `mailer_${hash}`;\r\n}\r\n\r\n/**\r\n * Get or create a mailer transporter from the pool\r\n * Nodemailer is eagerly loaded at import time\r\n */\r\nexport function getMailer(config: MailConfigurations): Transporter {\r\n if (moduleExists === false) {\r\n throw new Error(`nodemailer is not installed.\\n\\n${NODEMAILER_INSTALL_INSTRUCTIONS}`);\r\n }\r\n\r\n const hash = createConfigHash(config);\r\n\r\n // Return existing transporter if available\r\n const existingTransporter = mailerPool.get(hash);\r\n\r\n if (existingTransporter) {\r\n return existingTransporter;\r\n }\r\n\r\n // Create new transporter\r\n log.info(\"mail\", \"pool\", `Creating new mailer transport (pool size: ${mailerPool.size + 1})`);\r\n\r\n const { auth, username, password, requireTLS, tls, ...transportConfig } = config;\r\n\r\n const transporter = nodemailerModule.createTransport({\r\n requireTLS: requireTLS ?? tls,\r\n auth: auth ?? {\r\n user: username,\r\n pass: password,\r\n },\r\n ...transportConfig,\r\n });\r\n\r\n // Store in pool\r\n mailerPool.set(hash, transporter);\r\n\r\n return transporter;\r\n}\r\n\r\n/**\r\n * Verify a mailer connection\r\n */\r\nexport async function verifyMailer(config: MailConfigurations): Promise<boolean> {\r\n const transporter = getMailer(config);\r\n\r\n try {\r\n await transporter.verify();\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Close a specific mailer connection\r\n */\r\nexport function closeMailer(config: MailConfigurations): void {\r\n const hash = createConfigHash(config);\r\n const transporter = mailerPool.get(hash);\r\n\r\n if (transporter) {\r\n transporter.close();\r\n mailerPool.delete(hash);\r\n log.info(\"mail\", \"pool\", `Closed mailer transport (pool size: ${mailerPool.size})`);\r\n }\r\n}\r\n\r\n/**\r\n * Close all mailer connections\r\n */\r\nexport function closeAllMailers(): void {\r\n for (const [hash, transporter] of mailerPool) {\r\n transporter.close();\r\n mailerPool.delete(hash);\r\n }\r\n\r\n log.info(\"mail\", \"pool\", \"Closed all mailer transports\");\r\n}\r\n\r\n/**\r\n * Get pool statistics\r\n */\r\nexport function getPoolStats(): { size: number; hashes: string[] } {\r\n return {\r\n size: mailerPool.size,\r\n hashes: Array.from(mailerPool.keys()),\r\n };\r\n}\r\n","import { SpecialConfigHandler } from \"./config-loader\";\n\nexport class ConfigSpecialHandlers {\n /**\n * Handlers\n */\n protected handlers: Map<string, SpecialConfigHandler> = new Map();\n\n /**\n * Register a new handler\n */\n public register(configName: string, handler: SpecialConfigHandler) {\n this.handlers.set(configName, handler);\n }\n\n /**\n * Execute handler for the given config name\n */\n public async execute(configName: string, config: any) {\n const handler = this.handlers.get(configName);\n if (!handler) {\n return; // do nothing\n }\n\n return handler(config);\n }\n}\n\nexport const configSpecialHandlers = new ConfigSpecialHandlers();\n","import { LogConfigurations, setLogConfigurations } from \"../logger\";\r\nimport { MailConfigurations, setMailConfigurations } from \"../mail\";\r\nimport { AppConfigurations } from \"../utils/types\";\r\nimport { configSpecialHandlers } from \"./config-special-handlers\";\r\n\r\n/**\r\n * App Config Handler\r\n * Handles locale loading for dayjs\r\n */\r\nexport const registerAppConfig = async (config: AppConfigurations) => {\r\n // Load dayjs locales based on app.localeCodes\r\n const locales = config.locales || [\"en\"];\r\n\r\n for (const locale of locales) {\r\n if (locale === \"en\") continue; // English is default\r\n\r\n try {\r\n await import(`dayjs/locale/${locale}.js`);\r\n } catch (error) {\r\n console.warn(` ⚠️ Failed to load dayjs locale: ${locale}`);\r\n }\r\n }\r\n};\r\n\r\nconfigSpecialHandlers.register(\"app\", registerAppConfig);\r\n\r\n/**\r\n * Log Config Handler\r\n * Sets log configurations in @warlock.js/core\r\n */\r\nexport const registerLogConfig = async (logConfig: LogConfigurations) => {\r\n try {\r\n setLogConfigurations(logConfig);\r\n } catch (error) {\r\n // @warlock.js/core might not be available in all projects\r\n console.warn(\" ⚠️ Could not set log configurations\");\r\n }\r\n};\r\n\r\nconfigSpecialHandlers.register(\"log\", registerLogConfig);\r\n\r\n/**\r\n * Mail Config Handler\r\n * Sets mail configurations in @warlock.js/core\r\n */\r\nexport const registerMailConfig = async (mailConfig: MailConfigurations) => {\r\n try {\r\n setMailConfigurations(mailConfig);\r\n } catch (error) {\r\n // @warlock.js/core might not be available in all projects\r\n console.warn(\" ⚠️ Could not set mail configurations\");\r\n }\r\n};\r\n\r\nconfigSpecialHandlers.register(\"mail\", registerMailConfig);\r\n","import { S3ClientConfig } from \"@aws-sdk/client-s3\";\r\nimport { config } from \"../config\";\r\nimport type {\r\n CloudStorageDriverOptions,\r\n LocalStorageDriverOptions,\r\n R2StorageDriverOptions,\r\n StorageConfigurations,\r\n StorageDriverConfig,\r\n} from \"./types\";\r\n\r\n/**\r\n * Get storage configuration\r\n */\r\nexport function storageConfig(): StorageConfigurations;\r\nexport function storageConfig<T = any>(key: string): T;\r\nexport function storageConfig<T = any>(key: string, defaultValue: T): T;\r\nexport function storageConfig(key?: string, defaultValue?: any): any {\r\n if (!key) {\r\n return config.get(\"storage\");\r\n }\r\n\r\n return config.get(`storage.${key}`, defaultValue);\r\n}\r\n\r\nexport const storageConfigurations = {\r\n local: (options: LocalStorageDriverOptions): StorageDriverConfig => {\r\n return {\r\n driver: \"local\",\r\n ...options,\r\n };\r\n },\r\n aws: (options: CloudStorageDriverOptions & S3ClientConfig): StorageDriverConfig => {\r\n return {\r\n driver: \"s3\",\r\n ...options,\r\n };\r\n },\r\n r2: (options: R2StorageDriverOptions & S3ClientConfig): StorageDriverConfig => {\r\n return {\r\n driver: \"r2\",\r\n ...options,\r\n };\r\n },\r\n spaces: (options: CloudStorageDriverOptions & S3ClientConfig): StorageDriverConfig => {\r\n return {\r\n driver: \"spaces\",\r\n ...options,\r\n };\r\n },\r\n};\r\n","import { basename, dirname, extname } from \"path\";\r\nimport type { Readable } from \"stream\";\r\nimport type {\r\n CloudStorageDriverContract,\r\n FileVisibility,\r\n StorageDriverContract,\r\n StorageFileData,\r\n} from \"./types\";\r\n\r\n/**\r\n * StorageFile class - OOP wrapper for storage file operations\r\n *\r\n * Provides a fluent interface for working with files in storage,\r\n * wrapping the underlying driver operations.\r\n *\r\n * @example\r\n * ```typescript\r\n * const file = await storage.put(buffer, \"uploads/image.jpg\");\r\n *\r\n * // Properties (sync, from cached data)\r\n * file.name // \"image.jpg\"\r\n * file.extension // \"jpg\"\r\n * file.path // \"uploads/image.jpg\"\r\n * file.hash // \"sha256:abc123...\"\r\n *\r\n * // Operations\r\n * await file.copy(\"uploads/backup.jpg\")\r\n * await file.move(\"archive/image.jpg\")\r\n * await file.delete()\r\n *\r\n * // Content\r\n * const buffer = await file.contents();\r\n * const stream = await file.stream();\r\n * ```\r\n */\r\nexport class StorageFile {\r\n /**\r\n * Relative file path\r\n */\r\n protected _path: string;\r\n\r\n /**\r\n * The driver instance\r\n */\r\n protected _driver: StorageDriverContract;\r\n\r\n /**\r\n * Cached file data (from put operations or lazy loaded)\r\n */\r\n protected _data?: StorageFileData;\r\n\r\n /**\r\n * Whether the file has been deleted\r\n */\r\n protected _deleted = false;\r\n\r\n /**\r\n * Create a new StorageFile instance\r\n *\r\n * @param path - Relative file path\r\n * @param driver - Driver instance\r\n * @param data - Optional initial data from put/copy operations\r\n */\r\n public constructor(path: string, driver: StorageDriverContract, data?: StorageFileData) {\r\n this._path = path;\r\n this._driver = driver;\r\n this._data = data;\r\n }\r\n\r\n // ============================================================\r\n // Properties\r\n // ============================================================\r\n\r\n /**\r\n * Get the relative file path\r\n */\r\n public get path(): string {\r\n return this._path;\r\n }\r\n\r\n /**\r\n * Get the file name (with extension)\r\n */\r\n public get name(): string {\r\n return basename(this._path);\r\n }\r\n\r\n /**\r\n * Get the file extension (without dot)\r\n */\r\n public get extension(): string {\r\n return extname(this._path).slice(1).toLowerCase();\r\n }\r\n\r\n /**\r\n * Get the directory path\r\n */\r\n public get directory(): string {\r\n return dirname(this._path);\r\n }\r\n\r\n /**\r\n * Get the driver name\r\n */\r\n public get driver(): string {\r\n return this._driver.name;\r\n }\r\n\r\n /**\r\n * Check if file has been deleted\r\n */\r\n public get isDeleted(): boolean {\r\n return this._deleted;\r\n }\r\n\r\n /**\r\n * Get public URL (sync if data cached, otherwise computed)\r\n */\r\n public get url(): string {\r\n this.ensureNotDeleted();\r\n return this._data?.url || this._driver.url(this._path);\r\n }\r\n\r\n /**\r\n * Get the absolute filesystem path (local driver only)\r\n */\r\n public get absolutePath(): string | undefined {\r\n this.ensureNotDeleted();\r\n if (\"path\" in this._driver && typeof this._driver.path === \"function\") {\r\n return this._driver.path(this._path);\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Get file hash (SHA-256, available from put operations)\r\n */\r\n public get hash(): string | undefined {\r\n return this._data?.hash;\r\n }\r\n\r\n // ============================================================\r\n // Data Methods (Lazy Loaded)\r\n // ============================================================\r\n\r\n /**\r\n * Get cached file data, or fetch it if not available\r\n */\r\n public async data(): Promise<StorageFileData> {\r\n this.ensureNotDeleted();\r\n if (!this._data) {\r\n // Fetch info and construct data\r\n const info = await this._driver.getInfo(this._path);\r\n this._data = {\r\n path: info.path,\r\n url: this._driver.url(this._path),\r\n size: info.size,\r\n hash: \"\", // Not available from getInfo\r\n mimeType: info.mimeType || \"application/octet-stream\",\r\n driver: this._driver.name,\r\n };\r\n }\r\n return this._data;\r\n }\r\n\r\n /**\r\n * Get file size in bytes\r\n */\r\n public async size(): Promise<number> {\r\n const data = await this.data();\r\n return data.size;\r\n }\r\n\r\n /**\r\n * Get MIME type\r\n */\r\n public async mimeType(): Promise<string> {\r\n const data = await this.data();\r\n return data.mimeType;\r\n }\r\n\r\n /**\r\n * Get last modified date (fetches from driver)\r\n */\r\n public async lastModified(): Promise<Date | undefined> {\r\n this.ensureNotDeleted();\r\n const info = await this._driver.getInfo(this._path);\r\n return info.lastModified;\r\n }\r\n\r\n /**\r\n * Get ETag (cloud drivers, fetches from driver)\r\n */\r\n public async etag(): Promise<string | undefined> {\r\n this.ensureNotDeleted();\r\n const info = await this._driver.getInfo(this._path);\r\n return info.etag;\r\n }\r\n\r\n // ============================================================\r\n // Content Methods\r\n // ============================================================\r\n\r\n /**\r\n * Get file contents as Buffer\r\n */\r\n public async contents(): Promise<Buffer> {\r\n this.ensureNotDeleted();\r\n return this._driver.get(this._path);\r\n }\r\n\r\n /**\r\n * Get file contents as readable stream\r\n */\r\n public async stream(): Promise<Readable> {\r\n this.ensureNotDeleted();\r\n return this._driver.getStream(this._path);\r\n }\r\n\r\n /**\r\n * Get file contents as UTF-8 text\r\n */\r\n public async text(): Promise<string> {\r\n const buffer = await this.contents();\r\n return buffer.toString(\"utf-8\");\r\n }\r\n\r\n /**\r\n * Get file contents as base64 string\r\n */\r\n public async base64(): Promise<string> {\r\n const buffer = await this.contents();\r\n return buffer.toString(\"base64\");\r\n }\r\n\r\n /**\r\n * Get file contents as data URL\r\n */\r\n public async dataUrl(): Promise<string> {\r\n const [buffer, data] = await Promise.all([this.contents(), this.data()]);\r\n return `data:${data.mimeType};base64,${buffer.toString(\"base64\")}`;\r\n }\r\n\r\n // ============================================================\r\n // URL Methods\r\n // ============================================================\r\n\r\n /**\r\n * Get a temporary signed URL\r\n *\r\n * @param expiresIn - Seconds until expiration (default: 3600)\r\n */\r\n public async temporaryUrl(expiresIn = 3600): Promise<string> {\r\n this.ensureNotDeleted();\r\n return this._driver.temporaryUrl(this._path, expiresIn);\r\n }\r\n\r\n // ============================================================\r\n // File Operations\r\n // ============================================================\r\n\r\n /**\r\n * Check if the file exists\r\n */\r\n public async exists(): Promise<boolean> {\r\n if (this._deleted) return false;\r\n return this._driver.exists(this._path);\r\n }\r\n\r\n /**\r\n * Copy the file to a new location\r\n *\r\n * @param destination - Destination path\r\n * @returns New StorageFile instance at destination\r\n */\r\n public async copy(destination: string): Promise<StorageFile> {\r\n this.ensureNotDeleted();\r\n const result = await this._driver.copy(this._path, destination);\r\n return new StorageFile(destination, this._driver, result);\r\n }\r\n\r\n /**\r\n * Move the file to a new location\r\n *\r\n * @param destination - Destination path\r\n * @returns This StorageFile instance with updated path\r\n */\r\n public async move(destination: string): Promise<this> {\r\n this.ensureNotDeleted();\r\n const result = await this._driver.move(this._path, destination);\r\n this._path = destination;\r\n this._data = result; // Update cached data\r\n return this;\r\n }\r\n\r\n /**\r\n * Rename the file (move within same directory)\r\n *\r\n * @param newName - New file name\r\n * @returns This StorageFile instance with updated path\r\n */\r\n public async rename(newName: string): Promise<this> {\r\n const newPath = this.directory === \".\" ? newName : `${this.directory}/${newName}`;\r\n return this.move(newPath);\r\n }\r\n\r\n /**\r\n * Delete the file\r\n *\r\n * @returns true if deleted, false if not found\r\n */\r\n public async delete(): Promise<boolean> {\r\n this.ensureNotDeleted();\r\n const result = await this._driver.delete(this._path);\r\n this._deleted = true;\r\n return result;\r\n }\r\n\r\n // ============================================================\r\n // Cloud-Specific Methods\r\n // ============================================================\r\n\r\n /**\r\n * Set file visibility (cloud drivers only)\r\n *\r\n * @param visibility - \"public\" or \"private\"\r\n * @throws Error if driver doesn't support visibility\r\n */\r\n public async setVisibility(visibility: FileVisibility): Promise<this> {\r\n this.ensureNotDeleted();\r\n\r\n if (!(\"setVisibility\" in this._driver)) {\r\n throw new Error(\"setVisibility is only available for cloud storage drivers\");\r\n }\r\n\r\n await (this._driver as CloudStorageDriverContract).setVisibility(this._path, visibility);\r\n return this;\r\n }\r\n\r\n /**\r\n * Get file visibility (cloud drivers only)\r\n *\r\n * @throws Error if driver doesn't support visibility\r\n */\r\n public async getVisibility(): Promise<FileVisibility> {\r\n this.ensureNotDeleted();\r\n\r\n if (!(\"getVisibility\" in this._driver)) {\r\n throw new Error(\"getVisibility is only available for cloud storage drivers\");\r\n }\r\n\r\n return (this._driver as CloudStorageDriverContract).getVisibility(this._path);\r\n }\r\n\r\n /**\r\n * Set storage class (cloud drivers only)\r\n *\r\n * @param storageClass - Storage class (e.g., \"STANDARD\", \"GLACIER\")\r\n * @throws Error if driver doesn't support storage class\r\n */\r\n public async setStorageClass(storageClass: string): Promise<this> {\r\n this.ensureNotDeleted();\r\n\r\n if (!(\"setStorageClass\" in this._driver)) {\r\n throw new Error(\"setStorageClass is only available for cloud storage drivers\");\r\n }\r\n\r\n await (this._driver as CloudStorageDriverContract).setStorageClass(this._path, storageClass);\r\n return this;\r\n }\r\n\r\n // ============================================================\r\n // Utilities\r\n // ============================================================\r\n\r\n /**\r\n * Ensure the file has not been deleted\r\n */\r\n protected ensureNotDeleted(): void {\r\n if (this._deleted) {\r\n throw new Error(`File \"${this._path}\" has been deleted`);\r\n }\r\n }\r\n\r\n /**\r\n * Create a StorageFile instance from StorageFileData\r\n *\r\n * @param data - Storage file data from put/copy/move operations\r\n * @param driver - Driver instance\r\n */\r\n public static fromData(data: StorageFileData, driver: StorageDriverContract): StorageFile {\r\n return new StorageFile(data.path, driver, data);\r\n }\r\n\r\n /**\r\n * Convert to plain object (returns cached data or constructs it)\r\n */\r\n public toJSON(): {\r\n path: string;\r\n name: string;\r\n extension: string;\r\n driver: string;\r\n url: string;\r\n hash?: string;\r\n } {\r\n return {\r\n path: this._path,\r\n name: this.name,\r\n extension: this.extension,\r\n driver: this._driver.name,\r\n url: this._deleted ? \"\" : this.url,\r\n hash: this._data?.hash,\r\n };\r\n }\r\n\r\n /**\r\n * String representation\r\n */\r\n public toString(): string {\r\n return this._path;\r\n }\r\n}\r\n","import { fileExistsAsync } from \"@mongez/fs\";\nimport fs from \"fs/promises\";\nimport type { Readable } from \"stream\";\nimport type { UploadedFile } from \"../http\";\nimport { StorageFile } from \"./storage-file\";\nimport type {\n DeleteManyResult,\n ListOptions,\n PutOptions,\n StorageDriverContract,\n StorageDriverType,\n StorageFileInfo,\n} from \"./types\";\n\n/**\n * ScopedStorage - Base class for storage operations\n *\n * Wraps a storage driver and provides a consistent, developer-friendly API\n * that returns `StorageFile` instances instead of raw data objects.\n *\n * This class serves as the base for both direct driver usage and the\n * full `Storage` manager class.\n *\n * @example\n * ```typescript\n * // Using via storage.use()\n * const s3Storage = storage.use(\"s3\");\n * const file = await s3Storage.put(buffer, \"images/photo.jpg\");\n *\n * // file is a StorageFile instance with rich API\n * console.log(file.name); // \"photo.jpg\"\n * console.log(file.url); // \"https://...\"\n * await file.copy(\"backup/photo.jpg\");\n * ```\n */\nexport class ScopedStorage {\n /**\n * The underlying storage driver instance\n * @internal\n */\n protected _driver: StorageDriverContract;\n\n /**\n * Create a new ScopedStorage instance\n *\n * @param driver - The storage driver to wrap\n */\n public constructor(driver: StorageDriverContract) {\n this._driver = driver;\n }\n\n // ============================================================\n // Properties\n // ============================================================\n\n /**\n * Get the driver name\n *\n * @returns The name identifier of the underlying driver (e.g., \"local\", \"s3\", \"r2\")\n */\n public get name(): StorageDriverType {\n return this.activeDriver.name;\n }\n\n /**\n * Get the default driver instance\n *\n * Use this for advanced operations that require direct driver access.\n *\n * @returns The raw storage driver\n */\n public get defaultDriver(): StorageDriverContract {\n return this._driver;\n }\n\n /**\n * Get the currently active driver\n *\n * Returns the driver being used for storage operations.\n * Can be overridden in subclasses for dynamic driver resolution (e.g., multi-tenant contexts).\n *\n * @returns The active storage driver\n */\n public get activeDriver(): StorageDriverContract {\n return this._driver;\n }\n\n // ============================================================\n // File Operations\n // ============================================================\n\n /**\n * Store a file in storage\n *\n * Accepts multiple input types and stores the file at the specified location.\n * Returns a `StorageFile` instance for further operations.\n *\n * @param file - File content as Buffer, string path, UploadedFile, or Readable stream\n * @param location - Destination path in storage (e.g., \"uploads/images/photo.jpg\")\n * @param options - Optional storage options\n * @returns StorageFile instance with cached metadata\n *\n * @example\n * ```typescript\n * // From buffer\n * const file = await storage.put(buffer, \"documents/report.pdf\");\n *\n * // From uploaded file\n * const file = await storage.put(uploadedFile, \"avatars/user-123.jpg\");\n *\n * // With options\n * const file = await storage.put(buffer, \"images/photo.jpg\", {\n * mimeType: \"image/jpeg\",\n * cacheControl: \"max-age=31536000\"\n * });\n * ```\n */\n public async put(\n file: UploadedFile | Buffer | string | Readable,\n location: string,\n options?: PutOptions,\n ): Promise<StorageFile> {\n const buffer = await this.toBuffer(file);\n const data = await this.activeDriver.put(buffer, location, options);\n return StorageFile.fromData(data, this.activeDriver);\n }\n\n /**\n * Store a file from a readable stream\n *\n * Optimized for large files - streams data directly without full buffering.\n * Ideal for file uploads, remote file fetching, or processing pipelines.\n *\n * @param stream - Readable stream of file content\n * @param location - Destination path in storage\n * @param options - Optional storage options\n * @returns StorageFile instance with cached metadata\n *\n * @example\n * ```typescript\n * import { createReadStream } from \"fs\";\n *\n * const stream = createReadStream(\"./large-video.mp4\");\n * const file = await storage.putStream(stream, \"videos/upload.mp4\");\n * ```\n */\n public async putStream(\n stream: Readable,\n location: string,\n options?: PutOptions,\n ): Promise<StorageFile> {\n const data = await this.activeDriver.putStream(stream, location, options);\n return StorageFile.fromData(data, this.activeDriver);\n }\n\n /**\n * Store a file from a URL\n *\n * Downloads the file from the URL and stores it.\n *\n * @param url - URL to download from\n * @param location - Destination path in storage\n * @param options - Optional storage options\n * @returns StorageFile instance\n *\n * @example\n * ```typescript\n * const file = await storage.putFromUrl(\n * \"https://example.com/image.jpg\",\n * \"images/downloaded.jpg\"\n * );\n * ```\n */\n public async putFromUrl(\n url: string,\n location: string,\n options?: PutOptions,\n ): Promise<StorageFile> {\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch file from ${url}: ${response.statusText}`);\n }\n\n const buffer = Buffer.from(await response.arrayBuffer());\n return this.put(buffer, location, options);\n }\n\n /**\n * Store a file from base64 data URL\n *\n * @param dataUrl - Data URL (data:image/png;base64,iVBORw0KG...)\n * @param location - Destination path in storage\n * @param options - Optional storage options\n * @returns StorageFile instance\n *\n * @example\n * ```typescript\n * const file = await storage.putFromBase64(\n * \"data:image/png;base64,iVBORw0KGgoAAAANS...\",\n * \"images/upload.png\"\n * );\n * ```\n */\n public async putFromBase64(\n dataUrl: string,\n location: string,\n options?: PutOptions,\n ): Promise<StorageFile> {\n // Parse data URL: data:image/png;base64,iVBORw0KG...\n const matches = dataUrl.match(/^data:([^;]+);base64,(.+)$/);\n\n if (!matches) {\n throw new Error(\"Invalid base64 data URL format. Expected: data:mime/type;base64,<data>\");\n }\n\n const [, mimeType, base64Data] = matches;\n const buffer = Buffer.from(base64Data, \"base64\");\n\n return this.put(buffer, location, {\n ...options,\n mimeType: options?.mimeType || mimeType,\n });\n }\n\n /**\n * Retrieve file contents as a Buffer\n *\n * Downloads the entire file into memory. For large files,\n * consider using `getStream()` instead.\n *\n * @param location - Path to the file in storage\n * @returns Buffer containing file contents\n * @throws Error if file not found\n *\n * @example\n * ```typescript\n * const buffer = await storage.get(\"documents/report.pdf\");\n * const content = buffer.toString(\"utf-8\");\n * ```\n */\n public async get(location: string): Promise<Buffer> {\n return this.activeDriver.get(location);\n }\n\n /**\n * Retrieve file contents as a readable stream\n *\n * Streams file data without loading entire file into memory.\n * Ideal for large files or when piping to a response.\n *\n * @param location - Path to the file in storage\n * @returns Readable stream of file contents\n * @throws Error if file not found\n *\n * @example\n * ```typescript\n * const stream = await storage.getStream(\"videos/large.mp4\");\n * stream.pipe(response.raw);\n * ```\n */\n public async getStream(location: string): Promise<Readable> {\n return this.activeDriver.getStream(location);\n }\n\n /**\n * Delete a file from storage\n *\n * @param location - Path to the file, or a StorageFile instance\n * @returns `true` if deleted, `false` if file not found\n *\n * @example\n * ```typescript\n * // By path\n * await storage.delete(\"temp/old-file.txt\");\n *\n * // From StorageFile instance\n * const file = await storage.put(buffer, \"temp/file.txt\");\n * await storage.delete(file);\n * ```\n */\n public async delete(location: string | StorageFile): Promise<boolean> {\n const path = typeof location === \"string\" ? location : location.path;\n return this.activeDriver.delete(path);\n }\n\n /**\n * Delete multiple files at once\n *\n * Performs batch deletion for efficiency. Returns results for each file\n * including success/failure status.\n *\n * @param locations - Array of file paths to delete\n * @returns Array of delete results with status for each file\n *\n * @example\n * ```typescript\n * const results = await storage.deleteMany([\n * \"temp/file1.txt\",\n * \"temp/file2.txt\",\n * \"temp/file3.txt\"\n * ]);\n *\n * for (const result of results) {\n * console.log(`${result.location}: ${result.deleted ? \"deleted\" : result.error}`);\n * }\n * ```\n */\n public async deleteMany(locations: string[]): Promise<DeleteManyResult[]> {\n return this.activeDriver.deleteMany(locations);\n }\n\n /**\n * Delete a directory\n *\n * @param directoryPath - Path to the directory\n */\n public async deleteDirectory(directoryPath: string): Promise<boolean> {\n return await this.activeDriver.deleteDirectory(directoryPath);\n }\n\n /**\n * Check if a file exists in storage\n *\n * @param location - Path to check\n * @returns `true` if file exists, `false` otherwise\n *\n * @example\n * ```typescript\n * if (await storage.exists(\"config/settings.json\")) {\n * const config = await storage.get(\"config/settings.json\");\n * }\n * ```\n */\n public async exists(location: string): Promise<boolean> {\n return this.activeDriver.exists(location);\n }\n\n /**\n * Copy a file to a new location\n *\n * Creates a copy of the file at the destination path.\n * The original file remains unchanged.\n *\n * @param from - Source path or StorageFile instance\n * @param to - Destination path\n * @returns StorageFile instance at the new location\n *\n * @example\n * ```typescript\n * // Copy by path\n * const backup = await storage.copy(\"documents/report.pdf\", \"backups/report.pdf\");\n *\n * // Copy from StorageFile\n * const original = await storage.file(\"documents/report.pdf\");\n * const backup = await storage.copy(original, \"backups/report.pdf\");\n * ```\n */\n public async copy(from: string | StorageFile, to: string): Promise<StorageFile> {\n const fromPath = typeof from === \"string\" ? from : from.path;\n const data = await this.activeDriver.copy(fromPath, to);\n return StorageFile.fromData(data, this.activeDriver);\n }\n\n /**\n * Move a file to a new location\n *\n * Moves the file to the destination path. The original file\n * is deleted after successful copy.\n *\n * @param from - Source path or StorageFile instance\n * @param to - Destination path\n * @returns StorageFile instance at the new location\n *\n * @example\n * ```typescript\n * // Move by path\n * const file = await storage.move(\"uploads/temp.jpg\", \"images/photo.jpg\");\n *\n * // Move from StorageFile\n * const temp = await storage.file(\"uploads/temp.jpg\");\n * const final = await storage.move(temp, \"images/photo.jpg\");\n * ```\n */\n public async move(from: string | StorageFile, to: string): Promise<StorageFile> {\n const fromPath = typeof from === \"string\" ? from : from.path;\n const data = await this.activeDriver.move(fromPath, to);\n return StorageFile.fromData(data, this.activeDriver);\n }\n\n /**\n * Copy an entire directory recursively\n *\n * Copies all files from the source directory to the destination directory,\n * preserving the directory structure.\n *\n * @param from - Source directory path\n * @param to - Destination directory path\n * @param options - Optional concurrency control\n * @returns Number of files copied\n *\n * @example\n * ```typescript\n * // Copy entire directory\n * const count = await storage.copyDirectory(\"uploads/temp\", \"uploads/final\");\n * console.log(`Copied ${count} files`);\n *\n * // With concurrency limit\n * const count = await storage.copyDirectory(\"large-dir\", \"backup\", {\n * concurrency: 10\n * });\n * ```\n */\n public async copyDirectory(\n from: string,\n to: string,\n options?: { concurrency?: number },\n ): Promise<number> {\n const concurrency = options?.concurrency || 5;\n\n // List all files recursively\n const files = await this.list(from, { recursive: true });\n const filesToCopy = files.filter((f) => !f.isDirectory);\n\n // Copy files in batches for efficiency\n let copied = 0;\n for (let i = 0; i < filesToCopy.length; i += concurrency) {\n const batch = filesToCopy.slice(i, i + concurrency);\n await Promise.all(\n batch.map(async (file) => {\n // Calculate relative path and new destination\n const relativePath = file.path.substring(from.length).replace(/^\\//, \"\");\n const newPath = `${to}/${relativePath}`;\n await this.copy(file.path, newPath);\n copied++;\n }),\n );\n }\n\n return copied;\n }\n\n /**\n * Move an entire directory recursively\n *\n * Moves all files from the source directory to the destination directory,\n * then deletes the source directory.\n *\n * @param from - Source directory path\n * @param to - Destination directory path\n * @param options - Optional concurrency control\n * @returns Number of files moved\n *\n * @example\n * ```typescript\n * const count = await storage.moveDirectory(\"uploads/temp\", \"uploads/final\");\n * console.log(`Moved ${count} files`);\n * ```\n */\n public async moveDirectory(\n from: string,\n to: string,\n options?: { concurrency?: number },\n ): Promise<number> {\n // Copy all files first\n const count = await this.copyDirectory(from, to, options);\n\n // Delete source directory\n await this.deleteDirectory(from);\n\n return count;\n }\n\n /**\n * Empty a directory without deleting the directory itself\n *\n * Deletes all files within the directory but preserves the directory structure.\n *\n * @param path - Directory path to empty\n * @returns Number of files deleted\n *\n * @example\n * ```typescript\n * const count = await storage.emptyDirectory(\"uploads/temp\");\n * console.log(`Deleted ${count} files`);\n * ```\n */\n public async emptyDirectory(path: string): Promise<number> {\n // List all files in directory\n const files = await this.list(path, { recursive: true });\n const filePaths = files.filter((f) => !f.isDirectory).map((f) => f.path);\n\n if (filePaths.length === 0) {\n return 0;\n }\n\n // Delete all files\n await this.deleteMany(filePaths);\n\n return filePaths.length;\n }\n\n /**\n * List files in a directory\n *\n * Returns file information for all files in the specified directory.\n * Supports recursive listing and pagination.\n *\n * @param directory - Directory path (defaults to root)\n * @param options - List options (recursive, limit, cursor)\n * @returns Array of file information objects\n *\n * @example\n * ```typescript\n * // List all files in uploads\n * const files = await storage.list(\"uploads\");\n *\n * // Recursive listing with limit\n * const files = await storage.list(\"uploads\", {\n * recursive: true,\n * limit: 100\n * });\n * ```\n */\n public async list(directory?: string, options?: ListOptions): Promise<StorageFileInfo[]> {\n return this.activeDriver.list(directory || \"\", options);\n }\n\n // ============================================================\n // URL Operations\n // ============================================================\n\n /**\n * Get the public URL for a file\n *\n * Returns the URL where the file can be accessed. For local storage,\n * this is typically a path prefix. For cloud storage, this is the\n * bucket URL or CDN URL.\n *\n * @param location - File path\n * @returns Public URL string\n *\n * @example\n * ```typescript\n * const url = storage.url(\"images/photo.jpg\");\n * // Local: \"/uploads/images/photo.jpg\"\n * // S3: \"https://bucket.s3.amazonaws.com/images/photo.jpg\"\n * ```\n */\n public url(location: string): string {\n return this.activeDriver.url(location);\n }\n\n /**\n * Get a temporary signed URL with expiration\n *\n * Creates a URL that provides temporary access to the file.\n * For cloud storage, this uses presigned URLs.\n * For local storage, this uses HMAC-signed tokens.\n *\n * @param location - File path\n * @param expiresIn - Seconds until URL expires (default: 3600)\n * @returns Signed URL string\n *\n * @example\n * ```typescript\n * // URL valid for 1 hour\n * const url = await storage.temporaryUrl(\"private/document.pdf\");\n *\n * // URL valid for 24 hours\n * const url = await storage.temporaryUrl(\"private/document.pdf\", 86400);\n * ```\n */\n public async temporaryUrl(location: string, expiresIn?: number): Promise<string> {\n return this.activeDriver.temporaryUrl(location, expiresIn);\n }\n\n // ============================================================\n // Metadata Operations\n // ============================================================\n\n /**\n * Get file metadata without downloading the file\n *\n * Retrieves information about a file including size, last modified date,\n * and MIME type without downloading the file contents.\n *\n * @param location - File path\n * @returns File information object\n * @throws Error if file not found\n *\n * @example\n * ```typescript\n * const info = await storage.getInfo(\"documents/report.pdf\");\n * console.log(`Size: ${info.size} bytes`);\n * console.log(`Type: ${info.mimeType}`);\n * console.log(`Modified: ${info.lastModified}`);\n * ```\n */\n public async getInfo(location: string): Promise<StorageFileInfo> {\n return this.activeDriver.getInfo(location);\n }\n\n /**\n * Get file size in bytes\n *\n * Shortcut for `getInfo(location).size`.\n *\n * @param location - File path\n * @returns File size in bytes\n * @throws Error if file not found\n */\n public async size(location: string): Promise<number> {\n return this.activeDriver.size(location);\n }\n\n /**\n * Get a StorageFile instance for OOP-style operations\n *\n * Creates a `StorageFile` wrapper for the specified path,\n * allowing fluent method chaining for file operations.\n *\n * @param location - File path\n * @returns StorageFile instance\n *\n * @example\n * ```typescript\n * const file = await storage.file(\"uploads/image.jpg\");\n *\n * // Properties\n * console.log(file.name); // \"image.jpg\"\n * console.log(file.extension); // \"jpg\"\n *\n * // Operations\n * await file.copy(\"backup/image.jpg\");\n * await file.delete();\n * ```\n */\n public async file(location: string): Promise<StorageFile> {\n return new StorageFile(location, this.activeDriver);\n }\n\n // ============================================================\n // Utilities\n // ============================================================\n\n /**\n * Convert various input types to Buffer\n *\n * @param file - Input file in various formats\n * @returns Buffer containing file contents\n * @internal\n */\n protected async toBuffer(file: UploadedFile | Buffer | string | Readable): Promise<Buffer> {\n // Already a buffer\n if (Buffer.isBuffer(file)) {\n return file;\n }\n\n // Readable stream - collect into buffer\n if (this.isReadable(file)) {\n return this.streamToBuffer(file as Readable);\n }\n\n // String content\n if (typeof file === \"string\") {\n if (await fileExistsAsync(file)) {\n return fs.readFile(file);\n }\n\n return Buffer.from(file);\n }\n\n // UploadedFile\n return (file as UploadedFile).buffer();\n }\n\n /**\n * Check if value is a Readable stream\n *\n * @param value - Value to check\n * @returns True if value is a Readable stream\n * @internal\n */\n protected isReadable(value: unknown): value is Readable {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"pipe\" in value &&\n typeof (value as Readable).pipe === \"function\"\n );\n }\n\n /**\n * Convert a Readable stream to Buffer\n *\n * @param stream - Readable stream\n * @returns Buffer containing stream contents\n * @internal\n */\n protected async streamToBuffer(stream: Readable): Promise<Buffer> {\n const chunks: Buffer[] = [];\n for await (const chunk of stream) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n return Buffer.concat(chunks as unknown as Uint8Array[]);\n }\n\n /**\n * Prepend a prefix to a location path\n *\n * Useful for organizing files into directories.\n *\n * @param prefix - Prefix to add (e.g., \"uploads\")\n * @param location - Original location path\n * @returns Combined path with prefix\n *\n * @example\n * ```typescript\n * storage.prepend(\"uploads\", \"image.jpg\"); // \"uploads/image.jpg\"\n * storage.prepend(\"uploads/\", \"/image.jpg\"); // \"uploads/image.jpg\"\n * ```\n */\n public prepend(prefix: string, location: string): string {\n return `${prefix.replace(/\\/$/, \"\")}/${location.replace(/^\\//, \"\")}`;\n }\n\n /**\n * Append a suffix to a location path (before extension)\n *\n * Useful for creating variants of files (thumbnails, etc.).\n *\n * @param location - Original location path\n * @param suffix - Suffix to add before extension\n * @returns Path with suffix added before extension\n *\n * @example\n * ```typescript\n * storage.append(\"image.jpg\", \"_thumb\"); // \"image_thumb.jpg\"\n * storage.append(\"document.pdf\", \"_v2\"); // \"document_v2.pdf\"\n * ```\n */\n public append(location: string, suffix: string): string {\n const lastDot = location.lastIndexOf(\".\");\n if (lastDot === -1) {\n return `${location}${suffix}`;\n }\n return `${location.substring(0, lastDot)}${suffix}${location.substring(lastDot)}`;\n }\n}\n","import { Context, contextManager } from \"@warlock.js/context\";\nimport type { StorageDriverContract } from \"../types\";\n\nexport type StorageDriverContextStore = {\n driver?: StorageDriverContract;\n prefix?: string;\n metadata?: Record<string, any>;\n};\n\n/**\n * Storage Driver Context\n *\n * Manages the active storage driver and path prefix using AsyncLocalStorage.\n * Allows multi-tenant applications to switch drivers and isolate storage paths per request context.\n *\n * @example\n * ```typescript\n * // Set driver with tenant-specific prefix\n * storageDriverContext.setDriver(storage.getDriver(\"s3\"), {\n * prefix: \"tenant-123\",\n * metadata: { tenantId: \"123\" }\n * });\n *\n * // Or just set prefix for same driver\n * storageDriverContext.setPrefix(\"tenant-456\");\n * ```\n */\nclass StorageDriverContext extends Context<StorageDriverContextStore> {\n /**\n * Get the current storage driver\n */\n public getDriver(): StorageDriverContract | undefined {\n return this.get(\"driver\");\n }\n\n /**\n * Get the current path prefix (e.g., tenant-specific path)\n */\n public getPrefix(): string | undefined {\n return this.get(\"prefix\");\n }\n\n /**\n * Get context metadata (e.g., tenantId)\n */\n public getMetadata(): Record<string, any> | undefined {\n return this.get(\"metadata\");\n }\n\n /**\n * Set the active driver with optional prefix and metadata\n *\n * @param driver - Storage driver to use\n * @param options - Optional prefix and metadata\n */\n public setDriver(\n driver: StorageDriverContract,\n options?: { prefix?: string; metadata?: Record<string, any> },\n ): void {\n this.update({\n driver,\n prefix: options?.prefix,\n metadata: options?.metadata,\n });\n }\n\n /**\n * Set only the path prefix (keeps current driver)\n *\n * Useful for multi-tenant scenarios where you want to isolate\n * storage paths without changing the driver.\n *\n * @param prefix - Path prefix to prepend to all operations\n */\n public setPrefix(prefix: string): void {\n this.update({ prefix });\n }\n\n /**\n * Clear the prefix\n */\n public clearPrefix(): void {\n this.update({ prefix: undefined });\n }\n\n /**\n * Build the initial storage store with defaults\n */\n public buildStore(): StorageDriverContextStore {\n return {\n driver: undefined,\n prefix: undefined,\n metadata: undefined,\n };\n }\n}\n\nexport const storageDriverContext = new StorageDriverContext();\n\ncontextManager.register(\"storage\", storageDriverContext);\n","/**\r\n * MIME type utilities\r\n *\r\n * This module wraps the mime package to avoid type conflicts\r\n * with @types/send which has its own @types/mime dependency.\r\n */\r\nimport mime from \"mime\";\r\n\r\n/**\r\n * Get MIME type from file path or extension\r\n *\r\n * @param path - File path or extension\r\n * @returns MIME type or \"application/octet-stream\" if unknown\r\n */\r\nexport function getMimeType(path: string): string {\r\n return mime.getType(path) || \"application/octet-stream\";\r\n}\r\n\r\n/**\r\n * Common MIME type constants\r\n */\r\nexport const MimeTypes = {\r\n // Images\r\n jpeg: \"image/jpeg\",\r\n png: \"image/png\",\r\n gif: \"image/gif\",\r\n webp: \"image/webp\",\r\n svg: \"image/svg+xml\",\r\n ico: \"image/x-icon\",\r\n\r\n // Documents\r\n pdf: \"application/pdf\",\r\n txt: \"text/plain\",\r\n html: \"text/html\",\r\n css: \"text/css\",\r\n js: \"application/javascript\",\r\n json: \"application/json\",\r\n xml: \"application/xml\",\r\n\r\n // Archives\r\n zip: \"application/zip\",\r\n gzip: \"application/gzip\",\r\n\r\n // Media\r\n mp3: \"audio/mpeg\",\r\n mp4: \"video/mp4\",\r\n webm: \"video/webm\",\r\n ogg: \"audio/ogg\",\r\n\r\n // Binary\r\n binary: \"application/octet-stream\",\r\n} as const;\r\n","import crypto from \"crypto\";\nimport type { Readable } from \"stream\";\nimport { storageDriverContext } from \"../context/storage-driver-context\";\nimport type {\n CloudStorageDriverContract,\n CloudStorageDriverOptions,\n CloudStorageFileData,\n DeleteManyResult,\n FileVisibility,\n ListOptions,\n PresignedOptions,\n PresignedUploadOptions,\n PutOptions,\n StorageDriverType,\n StorageFileInfo,\n} from \"../types\";\nimport { getMimeType } from \"../utils/mime\";\n\n// ============================================================\n// Lazy-loaded S3 SDK Types\n// ============================================================\n\n/**\n * Cached S3 SDK modules (loaded once, reused)\n */\nlet S3Client: typeof import(\"@aws-sdk/client-s3\");\nlet S3Storage: typeof import(\"@aws-sdk/lib-storage\");\nlet S3Presigner: typeof import(\"@aws-sdk/s3-request-presigner\");\n\nlet isModuleExists: boolean | null = null;\n\n/**\n * Installation instructions for S3 SDK packages\n */\nconst S3_INSTALL_INSTRUCTIONS = `\nCloud storage requires the AWS S3 SDK packages.\nInstall them with:\n\n npm install @aws-sdk/client-s3 @aws-sdk/lib-storage @aws-sdk/s3-request-presigner\n\nOr with your preferred package manager:\n\n pnpm add @aws-sdk/client-s3 @aws-sdk/lib-storage @aws-sdk/s3-request-presigner\n yarn add @aws-sdk/client-s3 @aws-sdk/lib-storage @aws-sdk/s3-request-presigner\n`.trim();\n\n/**\n */\nasync function loadS3() {\n try {\n // load @aws-sdk/client-s3\n S3Client = await import(\"@aws-sdk/client-s3\");\n // load @aws-sdk/lib-storage\n S3Storage = await import(\"@aws-sdk/lib-storage\");\n // load @aws-sdk/s3-request-presigner\n S3Presigner = await import(\"@aws-sdk/s3-request-presigner\");\n\n isModuleExists = true;\n } catch {\n isModuleExists = false;\n }\n}\n\nloadS3();\n\n// ============================================================\n// CloudDriver Base Class\n// ============================================================\n\n/**\n * Base abstract class for all S3-compatible cloud storage drivers\n *\n * This class contains all shared logic for S3-compatible storage services\n * including AWS S3, Cloudflare R2, DigitalOcean Spaces, and others.\n *\n * **Important:** S3 SDK packages are lazy-loaded on first use.\n * Users must install them separately:\n * ```\n * npm install @aws-sdk/client-s3 @aws-sdk/lib-storage @aws-sdk/s3-request-presigner\n * ```\n *\n * Subclasses must implement:\n * - `name`: Driver identifier (e.g., \"s3\", \"r2\", \"spaces\")\n * - `url()`: Returns the public URL for a file (provider-specific format)\n */\nexport abstract class CloudDriver<\n TOptions extends Partial<CloudStorageDriverOptions> = CloudStorageDriverOptions,\n> implements CloudStorageDriverContract {\n /**\n * S3-compatible client (lazy-loaded)\n */\n protected client!: InstanceType<typeof import(\"@aws-sdk/client-s3\").S3Client>;\n\n /**\n * Retry configuration\n */\n protected retryConfig: {\n maxRetries: number;\n initialDelayMs: number;\n maxDelayMs: number;\n backoffMultiplier: number;\n };\n\n public constructor(public options: TOptions) {\n if (!isModuleExists) {\n throw new Error(S3_INSTALL_INSTRUCTIONS);\n }\n\n this.client = new S3Client.S3Client({\n region: this.options.region!,\n credentials: {\n accessKeyId: this.options.accessKeyId!,\n secretAccessKey: this.options.secretAccessKey!,\n },\n ...(this.getEndpoint() && { endpoint: this.getEndpoint() }),\n });\n\n // Initialize retry configuration\n this.retryConfig = {\n maxRetries: this.options.retry?.maxRetries ?? 3,\n initialDelayMs: this.options.retry?.initialDelayMs ?? 1000,\n maxDelayMs: this.options.retry?.maxDelayMs ?? 10000,\n backoffMultiplier: this.options.retry?.backoffMultiplier ?? 2,\n };\n }\n\n /**\n * Driver name identifier\n */\n public abstract readonly name: StorageDriverType;\n\n /**\n * Get public URL for file\n * Must be implemented by subclasses with provider-specific format\n */\n public abstract url(location: string): string;\n\n /**\n * Get endpoint URL\n * Can be overridden by subclasses for provider-specific endpoints\n */\n protected getEndpoint(): string | undefined {\n return this.options.endpoint;\n }\n\n // ============================================================\n // Helper Methods\n // ============================================================\n\n /**\n * Apply prefix to location path\n *\n * Priority: context prefix > driver options prefix > no prefix\n * This allows multi-tenant scenarios where context overrides driver config.\n *\n * @param location - Original location path\n * @returns Location with prefix applied if one exists\n */\n public applyPrefix(location: string): string {\n // Check context prefix first (highest priority)\n const contextPrefix = storageDriverContext.getPrefix();\n const prefix = contextPrefix || this.options.prefix;\n\n if (!prefix) {\n return location;\n }\n\n const cleanPrefix = prefix.replace(/\\/+$/, \"\");\n const cleanLocation = location.replace(/^\\/+/, \"\");\n\n // Avoid double-prefixing\n if (cleanLocation.startsWith(cleanPrefix + \"/\") || cleanLocation === cleanPrefix) {\n return cleanLocation;\n }\n\n return `${cleanPrefix}/${cleanLocation}`;\n }\n\n /**\n * Normalize storage path (remove double slashes, sanitize)\n * @internal\n */\n protected normalizePath(path: string): string {\n return path\n .replace(/\\/+/g, \"/\") // Remove multiple slashes\n .replace(/^\\//, \"\") // Remove leading slash\n .trim();\n }\n\n /**\n * Execute an operation with retry logic\n *\n * Retries on transient errors with exponential backoff.\n *\n * @param operation - Async operation to execute\n * @param operationName - Name for logging\n * @returns Result of the operation\n * @internal\n */\n protected async withRetry<T>(\n operation: () => Promise<T>,\n operationName: string = \"operation\",\n ): Promise<T> {\n const { maxRetries, initialDelayMs, backoffMultiplier, maxDelayMs } = this.retryConfig;\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error as Error;\n\n // Don't retry on the last attempt\n if (attempt === maxRetries - 1) {\n break;\n }\n\n // Check if error is retryable\n if (!this.isRetryableError(error)) {\n throw error; // Non-retryable error, fail immediately\n }\n\n // Calculate delay with exponential backoff\n const delayMs = Math.min(initialDelayMs * Math.pow(backoffMultiplier, attempt), maxDelayMs);\n\n // Wait before retrying\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n }\n\n throw new Error(`${operationName} failed after ${maxRetries} attempts: ${lastError?.message}`);\n }\n\n /**\n * Check if an error is retryable\n *\n * Retries on:\n * - Network errors\n * - 5xx server errors\n * - Rate limiting (429)\n * - Timeout errors\n *\n * Does NOT retry on:\n * - 4xx client errors (except 429)\n * - Authentication errors\n * - Not found errors\n *\n * @param error - Error to check\n * @returns true if error is retryable\n * @internal\n */\n protected isRetryableError(error: any): boolean {\n // Network errors\n if (error.code === \"ECONNRESET\" || error.code === \"ETIMEDOUT\" || error.code === \"ENOTFOUND\") {\n return true;\n }\n\n // S3 SDK errors\n if (error.name === \"NetworkingError\" || error.name === \"TimeoutError\") {\n return true;\n }\n\n // HTTP status codes\n const statusCode = error.$metadata?.httpStatusCode || error.statusCode;\n if (statusCode) {\n // 5xx server errors are retryable\n if (statusCode >= 500 && statusCode < 600) {\n return true;\n }\n\n // 429 Too Many Requests is retryable\n if (statusCode === 429) {\n return true;\n }\n }\n\n return false;\n }\n\n // ============================================================\n // Core File Operations\n // ============================================================\n\n /**\n * Put file to cloud storage\n */\n public async put(\n file: Buffer,\n location: string,\n options?: PutOptions,\n ): Promise<CloudStorageFileData> {\n return this.withRetry(async () => {\n const { PutObjectCommand } = S3Client;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const hash = this.calculateHash(file);\n const mimeType = options?.mimeType || this.guessMimeType(location);\n\n const command = new PutObjectCommand({\n Bucket: this.options.bucket,\n Key: location,\n Body: file,\n ContentType: mimeType,\n CacheControl: options?.cacheControl,\n ContentDisposition: options?.contentDisposition,\n Metadata: options?.metadata,\n ACL: options?.visibility === \"public\" ? \"public-read\" : undefined,\n });\n\n const result = await this.client.send(command);\n\n return {\n path: location,\n url: this.url(location),\n size: file.length,\n hash,\n mimeType,\n driver: this.name,\n bucket: this.options.bucket!,\n region: this.options.region!,\n etag: result.ETag,\n versionId: result.VersionId,\n };\n }, \"put\");\n }\n\n /**\n * Put file from a readable stream (for large files)\n * Uses S3 multipart upload for efficient streaming\n */\n public async putStream(\n stream: Readable,\n location: string,\n options?: PutOptions,\n ): Promise<CloudStorageFileData> {\n return this.withRetry(async () => {\n const { Upload } = S3Storage;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const mimeType = options?.mimeType || this.guessMimeType(location);\n\n const upload = new Upload({\n client: this.client,\n params: {\n Bucket: this.options.bucket,\n Key: location,\n Body: stream,\n ContentType: mimeType,\n CacheControl: options?.cacheControl,\n ContentDisposition: options?.contentDisposition,\n Metadata: options?.metadata,\n ACL: options?.visibility === \"public\" ? \"public-read\" : undefined,\n },\n });\n\n const result = await upload.done();\n\n // Get file info for size and hash\n const info = await this.getInfo(location);\n\n return {\n path: location,\n url: this.url(location),\n size: info.size,\n hash: info.etag?.replace(/\"/g, \"\") || \"\",\n mimeType,\n driver: this.name,\n bucket: this.options.bucket!,\n region: this.options.region!,\n etag: result.ETag,\n versionId: result.VersionId,\n };\n }, \"putStream\");\n }\n\n /**\n * Get file contents as Buffer\n */\n public async get(location: string): Promise<Buffer> {\n return this.withRetry(async () => {\n const { GetObjectCommand } = S3Client;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const command = new GetObjectCommand({\n Bucket: this.options.bucket,\n Key: location,\n });\n\n const result = await this.client.send(command);\n\n if (!result.Body) {\n throw new Error(`File not found: ${location}`);\n }\n\n return Buffer.from(await result.Body.transformToByteArray());\n }, \"get\");\n }\n\n /**\n * Get file as a readable stream (for large files)\n */\n public async getStream(location: string): Promise<Readable> {\n return this.withRetry(async () => {\n const { GetObjectCommand } = S3Client;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const command = new GetObjectCommand({\n Bucket: this.options.bucket,\n Key: location,\n });\n\n const result = await this.client.send(command);\n\n if (!result.Body) {\n throw new Error(`File not found: ${location}`);\n }\n\n return result.Body as Readable;\n }, \"getStream\");\n }\n\n /**\n * Delete a file\n */\n public async delete(location: string): Promise<boolean> {\n return this.withRetry(async () => {\n const { DeleteObjectCommand } = S3Client;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const command = new DeleteObjectCommand({\n Bucket: this.options.bucket,\n Key: location,\n });\n\n await this.client.send(command);\n\n return true;\n }, \"delete\");\n }\n\n /**\n * Delete multiple files at once (uses batch delete for efficiency)\n */\n public async deleteMany(locations: string[]): Promise<DeleteManyResult[]> {\n if (locations.length === 0) {\n return [];\n }\n\n return this.withRetry(async () => {\n const { DeleteObjectsCommand } = S3Client;\n\n // Apply storage prefix to all locations\n const prefixedLocations = locations.map((loc) => this.applyPrefix(loc));\n\n const command = new DeleteObjectsCommand({\n Bucket: this.options.bucket,\n Delete: {\n Objects: prefixedLocations.map((Key) => ({ Key })),\n Quiet: false,\n },\n });\n\n const result = await this.client.send(command);\n const results: DeleteManyResult[] = [];\n\n // Process successful deletes\n for (const deleted of result.Deleted || []) {\n if (deleted.Key) {\n results.push({ location: deleted.Key, deleted: true });\n }\n }\n\n // Process errors\n for (const error of result.Errors || []) {\n if (error.Key) {\n results.push({\n location: error.Key,\n deleted: false,\n error: error.Message || \"Unknown error\",\n });\n }\n }\n\n return results;\n }, \"deleteMany\");\n }\n\n /**\n * Delete directory (recursively deletes all objects with matching prefix)\n *\n * S3/R2 doesn't have true directories - only key prefixes.\n * This method lists all objects with the prefix and deletes them in batches.\n *\n * @param directoryPath - Directory prefix to delete\n * @returns true when all objects are deleted\n */\n public async deleteDirectory(directoryPath: string): Promise<boolean> {\n // Apply storage prefix\n directoryPath = this.applyPrefix(directoryPath);\n\n // Ensure directory path ends with / for proper prefix matching\n const prefix = directoryPath.endsWith(\"/\") ? directoryPath : `${directoryPath}/`;\n\n let hasMore = true;\n\n while (hasMore) {\n // List up to 1000 objects (S3/R2 max per request)\n const objects = await this.list(prefix, {\n limit: 1000,\n recursive: true,\n });\n\n if (objects.length === 0) {\n break;\n }\n\n // Filter out directories (we only delete files)\n const filePaths = objects.filter((obj) => !obj.isDirectory).map((obj) => obj.path);\n\n if (filePaths.length === 0) {\n break;\n }\n\n // Delete batch (deleteMany already has prefix applied, so paths already have it)\n // Note: We pass the paths as-is since they already include the prefix from list()\n const results = await this.deleteMany(filePaths);\n\n // Continue if we got full batch (might be more)\n hasMore = objects.length >= 1000;\n }\n\n return true;\n }\n\n /**\n * Check if file exists\n */\n public async exists(location: string): Promise<boolean> {\n // No retry for exists - it should be fast and failure means non-existent\n try {\n const { HeadObjectCommand } = S3Client;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const command = new HeadObjectCommand({\n Bucket: this.options.bucket,\n Key: location,\n });\n\n await this.client.send(command);\n return true;\n } catch {\n return false;\n }\n }\n\n // ============================================================\n // URL Operations\n // ============================================================\n\n /**\n * Get a temporary presigned URL (alias for getPresignedUrl)\n */\n public async temporaryUrl(location: string, expiresIn = 3600): Promise<string> {\n return this.getPresignedUrl(location, { expiresIn });\n }\n\n /**\n * Get presigned URL for downloading\n */\n public async getPresignedUrl(location: string, options?: PresignedOptions): Promise<string> {\n return this.withRetry(async () => {\n const { GetObjectCommand } = S3Client;\n const { getSignedUrl } = S3Presigner;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const command = new GetObjectCommand({\n Bucket: this.options.bucket,\n Key: location,\n });\n\n return getSignedUrl(this.client, command, {\n expiresIn: options?.expiresIn || 3600,\n });\n }, \"getPresignedUrl\");\n }\n\n /**\n * Get presigned URL for uploading\n */\n public async getPresignedUploadUrl(\n location: string,\n options?: PresignedUploadOptions,\n ): Promise<string> {\n return this.withRetry(async () => {\n const { PutObjectCommand } = S3Client;\n const { getSignedUrl } = S3Presigner;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const command = new PutObjectCommand({\n Bucket: this.options.bucket,\n Key: location,\n ContentType: options?.contentType,\n Metadata: options?.metadata,\n });\n\n return getSignedUrl(this.client, command, {\n expiresIn: options?.expiresIn || 3600,\n });\n }, \"getPresignedUploadUrl\");\n }\n\n // ============================================================\n // Metadata Operations\n // ============================================================\n\n /**\n * Get file info/metadata without downloading\n */\n public async getInfo(location: string): Promise<StorageFileInfo> {\n return this.withRetry(async () => {\n const { HeadObjectCommand } = S3Client;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const command = new HeadObjectCommand({\n Bucket: this.options.bucket,\n Key: location,\n });\n\n const result = await this.client.send(command);\n const name = location.split(\"/\").pop() || \"\";\n\n return {\n path: location,\n name,\n size: result.ContentLength || 0,\n isDirectory: false,\n lastModified: result.LastModified,\n mimeType: result.ContentType || this.guessMimeType(location),\n etag: result.ETag,\n storageClass: result.StorageClass,\n };\n }, \"getInfo\");\n }\n\n /**\n * Get file size in bytes (shortcut for getInfo().size)\n */\n public async size(location: string): Promise<number> {\n const info = await this.getInfo(location);\n return info.size;\n }\n\n // ============================================================\n // File Operations\n // ============================================================\n\n /**\n * Copy file to a new location\n */\n public async copy(from: string, to: string): Promise<CloudStorageFileData> {\n return this.withRetry(async () => {\n const { CopyObjectCommand, HeadObjectCommand } = S3Client;\n\n // Apply storage prefix to both paths\n from = this.applyPrefix(from);\n to = this.applyPrefix(to);\n\n const command = new CopyObjectCommand({\n Bucket: this.options.bucket,\n CopySource: `${this.options.bucket}/${from}`,\n Key: to,\n });\n\n const result = await this.client.send(command);\n\n // Get file metadata\n const headCommand = new HeadObjectCommand({\n Bucket: this.options.bucket,\n Key: to,\n });\n const headResult = await this.client.send(headCommand);\n\n return {\n path: to,\n url: this.url(to),\n size: headResult.ContentLength || 0,\n hash: headResult.ETag?.replace(/\"/g, \"\") || \"\",\n mimeType: headResult.ContentType || this.guessMimeType(to),\n driver: this.name,\n bucket: this.options.bucket!,\n region: this.options.region!,\n etag: result.CopyObjectResult?.ETag,\n versionId: result.VersionId,\n };\n }, \"copy\");\n }\n\n /**\n * Move file to a new location\n */\n public async move(from: string, to: string): Promise<CloudStorageFileData> {\n const file = await this.copy(from, to);\n await this.delete(from);\n return file;\n }\n\n /**\n * List files in a directory\n */\n public async list(directory: string, options?: ListOptions): Promise<StorageFileInfo[]> {\n return this.withRetry(async () => {\n const { ListObjectsV2Command } = S3Client;\n\n // Apply storage prefix\n directory = this.applyPrefix(directory);\n\n const command = new ListObjectsV2Command({\n Bucket: this.options.bucket,\n Prefix: directory,\n MaxKeys: options?.limit,\n ContinuationToken: options?.cursor,\n Delimiter: options?.recursive ? undefined : \"/\",\n });\n\n const result = await this.client.send(command);\n const files: StorageFileInfo[] = [];\n\n // Add files\n for (const object of result.Contents || []) {\n if (!object.Key) continue;\n\n files.push({\n path: object.Key,\n name: object.Key.split(\"/\").pop() || \"\",\n size: object.Size || 0,\n isDirectory: false,\n lastModified: object.LastModified,\n etag: object.ETag,\n storageClass: object.StorageClass,\n });\n }\n\n // Add directories\n for (const prefix of result.CommonPrefixes || []) {\n if (!prefix.Prefix) continue;\n\n files.push({\n path: prefix.Prefix,\n name: prefix.Prefix.split(\"/\").filter(Boolean).pop() || \"\",\n size: 0,\n isDirectory: true,\n });\n }\n\n return files;\n }, \"list\");\n }\n\n // ============================================================\n // Cloud-Specific Operations\n // ============================================================\n\n /**\n * Get bucket name\n */\n public getBucket(): string {\n return this.options.bucket!;\n }\n\n /**\n * Get region\n */\n public getRegion(): string {\n return this.options.region!;\n }\n\n /**\n * Set storage class (e.g., STANDARD, GLACIER, etc.)\n */\n public async setStorageClass(location: string, storageClass: string): Promise<void> {\n return this.withRetry(async () => {\n const { CopyObjectCommand } = S3Client;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const command = new CopyObjectCommand({\n Bucket: this.options.bucket,\n CopySource: `${this.options.bucket}/${location}`,\n Key: location,\n StorageClass: storageClass as any,\n MetadataDirective: \"COPY\",\n });\n\n await this.client.send(command);\n }, \"setStorageClass\");\n }\n\n /**\n * Set file visibility (public or private)\n */\n public async setVisibility(location: string, visibility: FileVisibility): Promise<void> {\n return this.withRetry(async () => {\n const { PutObjectAclCommand } = S3Client;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const command = new PutObjectAclCommand({\n Bucket: this.options.bucket,\n Key: location,\n ACL: visibility === \"public\" ? \"public-read\" : \"private\",\n });\n\n await this.client.send(command);\n }, \"setVisibility\");\n }\n\n /**\n * Get file visibility\n */\n public async getVisibility(location: string): Promise<FileVisibility> {\n return this.withRetry(async () => {\n const { GetObjectAclCommand } = S3Client;\n\n // Apply storage prefix\n location = this.applyPrefix(location);\n\n const command = new GetObjectAclCommand({\n Bucket: this.options.bucket,\n Key: location,\n });\n\n const result = await this.client.send(command);\n\n // Check if any grant allows public read\n const hasPublicRead = result.Grants?.some(\n (grant) =>\n grant.Grantee?.URI === \"http://acs.amazonaws.com/groups/global/AllUsers\" &&\n grant.Permission === \"READ\",\n );\n\n return hasPublicRead ? \"public\" : \"private\";\n }, \"getVisibility\");\n }\n\n // ============================================================\n // Utilities\n // ============================================================\n\n /**\n * Calculate SHA-256 hash\n */\n protected calculateHash(buffer: Buffer): string {\n return crypto.createHash(\"sha256\").update(new Uint8Array(buffer)).digest(\"hex\");\n }\n\n /**\n * Guess MIME type from file extension\n */\n protected guessMimeType(location: string): string {\n return getMimeType(location);\n }\n}\n","import type { CloudStorageDriverOptions } from \"../types\";\r\nimport { CloudDriver } from \"./cloud-driver\";\r\n\r\n/**\r\n * DigitalOcean Spaces Storage Driver\r\n *\r\n * Spaces is S3-compatible with a different URL structure.\r\n *\r\n * URL Patterns:\r\n * - With urlPrefix: {urlPrefix}/{key}\r\n * - CDN URL: https://{bucket}.{region}.cdn.digitaloceanspaces.com/{key}\r\n * - Origin URL: https://{bucket}.{region}.digitaloceanspaces.com/{key}\r\n *\r\n * Regions: nyc3, sfo3, ams3, sgp1, fra1, etc.\r\n *\r\n * @example\r\n * ```typescript\r\n * const driver = new DOSpacesDriver({\r\n * bucket: \"my-space\",\r\n * region: \"nyc3\",\r\n * accessKeyId: process.env.DO_SPACES_KEY,\r\n * secretAccessKey: process.env.DO_SPACES_SECRET,\r\n * });\r\n * ```\r\n */\r\nexport class DOSpacesDriver extends CloudDriver<CloudStorageDriverOptions> {\r\n /**\r\n * Driver name\r\n */\r\n public readonly name = \"spaces\";\r\n\r\n /**\r\n * Get Spaces endpoint URL\r\n *\r\n * Spaces endpoint format: https://{region}.digitaloceanspaces.com\r\n */\r\n protected getEndpoint(): string {\r\n return this.options.endpoint || `https://${this.options.region}.digitaloceanspaces.com`;\r\n }\r\n\r\n /**\r\n * Get public URL for file\r\n *\r\n * Note: DO Spaces includes automatic CDN with the `.cdn.` subdomain\r\n */\r\n public url(location: string): string {\r\n // 1. Use urlPrefix if configured\r\n if (this.options.urlPrefix) {\r\n const prefix = this.options.urlPrefix.replace(/\\/+$/, \"\");\r\n return `${prefix}/${location}`;\r\n }\r\n\r\n // 2. Default Spaces CDN URL\r\n return `https://${this.options.bucket}.${this.options.region}.cdn.digitaloceanspaces.com/${location}`;\r\n }\r\n}\r\n","import {\n ensureDirectoryAsync,\n fileExistsAsync,\n removeDirectoryAsync,\n unlinkAsync,\n} from \"@mongez/fs\";\nimport { ltrim } from \"@mongez/reinforcements\";\nimport crypto from \"crypto\";\nimport { createReadStream, createWriteStream } from \"fs\";\nimport { copyFile, readFile, readdir, rename, stat, writeFile } from \"fs/promises\";\nimport { dirname, join } from \"path\";\nimport type { Readable } from \"stream\";\nimport { pipeline } from \"stream/promises\";\nimport { UploadedFile } from \"../../http\";\nimport { storagePath } from \"../../utils/paths\";\nimport { url } from \"../../utils/urls\";\nimport { storageDriverContext } from \"../context/storage-driver-context\";\nimport type {\n DeleteManyResult,\n ListOptions,\n LocalStorageDriverOptions,\n PutOptions,\n StorageDriverContract,\n StorageDriverType,\n StorageFileData,\n StorageFileInfo,\n TemporaryTokenPayload,\n TemporaryTokenValidation,\n} from \"../types\";\nimport { getMimeType } from \"../utils/mime\";\n\n/**\n * Local filesystem storage driver\n *\n * Stores files on the local filesystem with support for:\n * - File operations (put, get, delete, copy, move)\n * - Stream operations for large files\n * - Batch operations\n * - Signed temporary URLs\n */\nexport class LocalDriver implements StorageDriverContract {\n /**\n * Driver name\n */\n public readonly name: StorageDriverType = \"local\";\n\n /**\n * Root path for storage\n */\n protected root: string;\n\n /**\n * URL prefix for file URLs\n */\n protected urlPrefix: string = \"\";\n\n /**\n * URL prefix for temporary file URLs\n */\n protected temporaryUrlPrefix: string;\n\n /**\n * Secret key for signing temporary URLs\n */\n protected signatureKey?: string;\n\n public constructor(public options: LocalStorageDriverOptions = {}) {\n this.root = options.root || storagePath();\n if (options.urlPrefix) {\n this.urlPrefix = options.urlPrefix;\n }\n\n this.temporaryUrlPrefix = options.temporaryUrlPrefix || \"/temp-files\";\n this.signatureKey = options.signatureKey;\n }\n\n // ============================================================\n // Prefix Operations\n // ============================================================\n\n /**\n * Apply prefix to location path\n *\n * Priority: context prefix > driver options prefix > no prefix\n * This allows multi-tenant scenarios where context overrides driver config.\n *\n * @param location - Original location path\n * @returns Location with prefix applied if one exists\n */\n public applyPrefix(location: string): string {\n // Check context prefix first (highest priority)\n const contextPrefix = storageDriverContext.getPrefix();\n const prefix = contextPrefix || this.options.prefix;\n\n if (!prefix) {\n return location;\n }\n\n const cleanPrefix = prefix.replace(/\\/+$/, \"\");\n const cleanLocation = location.replace(/^\\/+/, \"\");\n\n // Avoid double-prefixing\n if (cleanLocation.startsWith(cleanPrefix + \"/\") || cleanLocation === cleanPrefix) {\n return cleanLocation;\n }\n\n return `${cleanPrefix}/${cleanLocation}`;\n }\n\n // ============================================================\n // Core File Operations\n // ============================================================\n\n /**\n * Put file to local storage\n */\n public async put(\n file: Buffer | string | UploadedFile,\n location: string,\n options?: PutOptions,\n ): Promise<StorageFileData> {\n const absolutePath = this.getAbsolutePath(location);\n\n await ensureDirectoryAsync(dirname(absolutePath));\n\n const fileBuffer = await this.toBuffer(file);\n const hash = this.calculateHash(fileBuffer);\n\n await writeFile(absolutePath, new Uint8Array(fileBuffer));\n\n const stats = await stat(absolutePath);\n const mimeType = options?.mimeType || this.guessMimeType(location);\n\n return {\n path: location,\n url: this.url(location),\n size: stats.size,\n hash,\n mimeType,\n driver: this.name,\n };\n }\n\n /**\n * Put file from a readable stream (for large files)\n */\n public async putStream(\n stream: Readable,\n location: string,\n options?: PutOptions,\n ): Promise<StorageFileData> {\n const absolutePath = this.getAbsolutePath(location);\n\n await ensureDirectoryAsync(dirname(absolutePath));\n\n // Create write stream and pipe\n const writeStream = createWriteStream(absolutePath);\n await pipeline(stream, writeStream);\n\n // Calculate hash and get stats\n const fileBuffer = await readFile(absolutePath);\n const hash = this.calculateHash(fileBuffer);\n const stats = await stat(absolutePath);\n const mimeType = options?.mimeType || this.guessMimeType(location);\n\n return {\n path: location,\n url: this.url(location),\n size: stats.size,\n hash,\n mimeType,\n driver: this.name,\n };\n }\n\n /**\n * Get file contents as Buffer\n */\n public async get(location: string): Promise<Buffer> {\n const absolutePath = this.getAbsolutePath(location);\n\n if (!(await fileExistsAsync(absolutePath))) {\n throw new Error(`File not found: ${location}`);\n }\n\n return readFile(absolutePath);\n }\n\n /**\n * Get file as a readable stream (for large files)\n */\n public async getStream(location: string): Promise<Readable> {\n const absolutePath = this.getAbsolutePath(location);\n\n if (!(await fileExistsAsync(absolutePath))) {\n throw new Error(`File not found: ${location}`);\n }\n\n return createReadStream(absolutePath);\n }\n\n /**\n * Delete a file\n */\n public async delete(location: string): Promise<boolean> {\n const absolutePath = this.getAbsolutePath(location);\n\n if (!(await fileExistsAsync(absolutePath))) {\n return false;\n }\n\n await unlinkAsync(absolutePath);\n return true;\n }\n\n /**\n * Delete multiple files at once\n */\n public async deleteMany(locations: string[]): Promise<DeleteManyResult[]> {\n const results: DeleteManyResult[] = [];\n\n for (const location of locations) {\n try {\n const deleted = await this.delete(location);\n results.push({ location, deleted });\n } catch (error) {\n results.push({\n location,\n deleted: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n });\n }\n }\n\n return results;\n }\n\n /**\n * Delete directory\n */\n public async deleteDirectory(directoryPath: string) {\n await removeDirectoryAsync(directoryPath);\n\n return true;\n }\n\n /**\n * Check if file exists\n */\n public async exists(location: string): Promise<boolean> {\n const absolutePath = this.getAbsolutePath(location);\n return Boolean(await fileExistsAsync(absolutePath));\n }\n\n // ============================================================\n // URL Operations\n // ============================================================\n\n /**\n * Get public URL for file\n */\n public url(location: string): string {\n return url(this.urlPrefix + \"/\" + ltrim(location, \"/\"));\n }\n\n /**\n * Get a temporary signed URL that expires\n * Returns a clean URL with encoded token: {temporaryUrlPrefix}/{token}\n *\n * @param location - File path\n * @param expiresIn - Seconds until expiration (default: 3600)\n */\n public async temporaryUrl(location: string, expiresIn = 3600): Promise<string> {\n if (!this.signatureKey) {\n throw new Error(\n \"Temporary URLs require a signatureKey in LocalDriver options. \" +\n \"Configure storage.drivers.local.signatureKey in your config.\",\n );\n }\n\n const token = this.encodeTemporaryToken(location, expiresIn);\n return `${this.temporaryUrlPrefix}/${token}`;\n }\n\n /**\n * Encode a temporary token containing path, expiry, and signature\n *\n * @param location - File path\n * @param expiresIn - Seconds until expiration\n */\n public encodeTemporaryToken(location: string, expiresIn: number): string {\n if (!this.signatureKey) {\n throw new Error(\"Temporary tokens require a signatureKey\");\n }\n\n const exp = Math.floor(Date.now() / 1000) + expiresIn;\n const sig = crypto\n .createHmac(\"sha256\", this.signatureKey)\n .update(`${location}:${exp}`)\n .digest(\"hex\");\n\n const payload: TemporaryTokenPayload = { path: location, exp, sig };\n const json = JSON.stringify(payload);\n\n // Use base64url encoding (URL-safe base64)\n return Buffer.from(json).toString(\"base64url\");\n }\n\n /**\n * Validate a temporary URL token\n * Returns a result object with validation status, file info, and convenience methods\n *\n * @param token - The token from the URL\n */\n public async validateTemporaryToken(token: string): Promise<TemporaryTokenValidation> {\n // Check signature key\n if (!this.signatureKey) {\n return { valid: false, error: \"missing_key\" };\n }\n\n // Decode token\n let payload: TemporaryTokenPayload;\n try {\n const json = Buffer.from(token, \"base64url\").toString(\"utf-8\");\n payload = JSON.parse(json);\n } catch {\n return { valid: false, error: \"invalid_token\" };\n }\n\n // Validate payload structure\n if (!payload.path || !payload.exp || !payload.sig) {\n return { valid: false, error: \"invalid_token\" };\n }\n\n // Check expiration\n const now = Math.floor(Date.now() / 1000);\n if (payload.exp < now) {\n return { valid: false, error: \"expired\" };\n }\n\n // Verify signature\n const expectedSig = crypto\n .createHmac(\"sha256\", this.signatureKey)\n .update(`${payload.path}:${payload.exp}`)\n .digest(\"hex\");\n\n const sigBuffer = Buffer.from(payload.sig, \"hex\");\n const expectedBuffer = Buffer.from(expectedSig, \"hex\");\n\n if (sigBuffer.length !== expectedBuffer.length) {\n return { valid: false, error: \"invalid_signature\" };\n }\n\n const isValidSig = crypto.timingSafeEqual(\n new Uint8Array(sigBuffer),\n new Uint8Array(expectedBuffer),\n );\n\n if (!isValidSig) {\n return { valid: false, error: \"invalid_signature\" };\n }\n\n // Check file exists\n const absolutePath = this.getAbsolutePath(payload.path);\n if (!(await fileExistsAsync(absolutePath))) {\n return { valid: false, error: \"file_not_found\" };\n }\n\n // Build successful result with convenience methods\n const result: TemporaryTokenValidation = {\n valid: true,\n path: payload.path,\n absolutePath,\n expiresAt: new Date(payload.exp * 1000),\n mimeType: this.guessMimeType(payload.path),\n driver: this,\n getFile: () => this.get(payload.path),\n getStream: () => this.getStream(payload.path),\n };\n\n return result;\n }\n\n // ============================================================\n // Metadata Operations\n // ============================================================\n\n /**\n * Get file info/metadata without downloading\n */\n public async getInfo(location: string): Promise<StorageFileInfo> {\n const absolutePath = this.getAbsolutePath(location);\n\n if (!(await fileExistsAsync(absolutePath))) {\n throw new Error(`File not found: ${location}`);\n }\n\n const stats = await stat(absolutePath);\n const name = location.split(\"/\").pop() || \"\";\n\n return {\n path: location,\n name,\n size: stats.size,\n isDirectory: stats.isDirectory(),\n lastModified: stats.mtime,\n mimeType: this.guessMimeType(location),\n };\n }\n\n /**\n * Get file size in bytes (shortcut for getInfo().size)\n */\n public async size(location: string): Promise<number> {\n const absolutePath = this.getAbsolutePath(location);\n\n if (!(await fileExistsAsync(absolutePath))) {\n throw new Error(`File not found: ${location}`);\n }\n\n const stats = await stat(absolutePath);\n return stats.size;\n }\n\n // ============================================================\n // File Operations\n // ============================================================\n\n /**\n * Copy file to a new location\n */\n public async copy(from: string, to: string): Promise<StorageFileData> {\n const fromPath = this.getAbsolutePath(from);\n const toPath = this.getAbsolutePath(to);\n\n if (!(await fileExistsAsync(fromPath))) {\n throw new Error(`Source file not found: ${from}`);\n }\n\n await ensureDirectoryAsync(dirname(toPath));\n await copyFile(fromPath, toPath);\n\n const fileBuffer = await readFile(toPath);\n const hash = this.calculateHash(fileBuffer);\n const stats = await stat(toPath);\n\n return {\n path: to,\n url: this.url(to),\n size: stats.size,\n hash,\n mimeType: this.guessMimeType(to),\n driver: this.name,\n };\n }\n\n /**\n * Move file to a new location\n */\n public async move(from: string, to: string): Promise<StorageFileData> {\n const fromPath = this.getAbsolutePath(from);\n const toPath = this.getAbsolutePath(to);\n\n if (!(await fileExistsAsync(fromPath))) {\n throw new Error(`Source file not found: ${from}`);\n }\n\n await ensureDirectoryAsync(dirname(toPath));\n await rename(fromPath, toPath);\n\n const fileBuffer = await readFile(toPath);\n const hash = this.calculateHash(fileBuffer);\n const stats = await stat(toPath);\n\n return {\n path: to,\n url: this.url(to),\n size: stats.size,\n hash,\n mimeType: this.guessMimeType(to),\n driver: this.name,\n };\n }\n\n /**\n * List files in a directory\n */\n public async list(directory: string, options?: ListOptions): Promise<StorageFileInfo[]> {\n const absolutePath = this.getAbsolutePath(directory);\n const files: StorageFileInfo[] = [];\n\n if (!(await fileExistsAsync(absolutePath))) {\n return files;\n }\n\n const entries = await readdir(absolutePath, { withFileTypes: true });\n\n for (const entry of entries) {\n const entryPath = join(directory, entry.name);\n const entryStats = await stat(this.getAbsolutePath(entryPath));\n\n files.push({\n path: entryPath,\n name: entry.name,\n size: entryStats.size,\n isDirectory: entry.isDirectory(),\n lastModified: entryStats.mtime,\n mimeType: entry.isFile() ? this.guessMimeType(entry.name) : undefined,\n });\n\n // Recursively list subdirectories if requested\n if (options?.recursive && entry.isDirectory()) {\n const subFiles = await this.list(entryPath, options);\n files.push(...subFiles);\n }\n\n // Respect limit\n if (options?.limit && files.length >= options.limit) {\n break;\n }\n }\n\n return files;\n }\n\n // ============================================================\n // Path Operations\n // ============================================================\n\n /**\n * Get absolute filesystem path for a location\n */\n public path(location: string): string {\n return this.getAbsolutePath(location);\n }\n\n /**\n * Get the storage root directory\n */\n public getRoot(): string {\n return this.root;\n }\n\n // ============================================================\n // Utilities\n // ============================================================\n\n /**\n * Get absolute file path\n */\n protected getAbsolutePath(location: string): string {\n const prefixedLocation = this.applyPrefix(location);\n return join(this.root, prefixedLocation);\n }\n\n /**\n * Convert various input types to Buffer\n */\n protected async toBuffer(file: Buffer | string | UploadedFile): Promise<Buffer> {\n if (Buffer.isBuffer(file)) {\n return file;\n }\n\n if (typeof file === \"string\") {\n return readFile(file);\n }\n\n return file.buffer();\n }\n\n /**\n * Calculate SHA-256 hash\n */\n protected calculateHash(buffer: Buffer): string {\n return crypto.createHash(\"sha256\").update(new Uint8Array(buffer)).digest(\"hex\");\n }\n\n /**\n * Guess MIME type from file extension\n */\n protected guessMimeType(location: string): string {\n return getMimeType(location);\n }\n}\n","import type { R2StorageDriverOptions } from \"../types\";\r\nimport { CloudDriver } from \"./cloud-driver\";\r\n\r\n/**\r\n * Cloudflare R2 Storage Driver\r\n *\r\n * R2 is S3-compatible but uses a different URL structure and doesn't require regions.\r\n *\r\n * URL Patterns:\r\n * - With publicDomain: https://{publicDomain}/{key}\r\n * - With urlPrefix: {urlPrefix}/{key}\r\n * - Default public bucket: https://pub-{accountId}.r2.dev/{key}\r\n *\r\n * @example\r\n * ```typescript\r\n * const driver = new R2Driver({\r\n * bucket: \"my-bucket\",\r\n * region: \"auto\", // R2 doesn't use traditional regions\r\n * accessKeyId: process.env.R2_ACCESS_KEY_ID,\r\n * secretAccessKey: process.env.R2_SECRET_ACCESS_KEY,\r\n * accountId: process.env.R2_ACCOUNT_ID,\r\n * publicDomain: \"assets.example.com\", // Optional custom domain\r\n * });\r\n * ```\r\n */\r\nexport class R2Driver extends CloudDriver<R2StorageDriverOptions> {\r\n /**\r\n * Driver name\r\n */\r\n public readonly name = \"r2\";\r\n\r\n /**\r\n * Get R2 endpoint URL\r\n *\r\n * R2 endpoint format: https://{accountId}.r2.cloudflarestorage.com\r\n */\r\n protected getEndpoint(): string {\r\n return this.options.endpoint || `https://${this.options.accountId}.r2.cloudflarestorage.com`;\r\n }\r\n\r\n /**\r\n * Get public URL for file\r\n *\r\n * Priority: urlPrefix > publicDomain > default R2 URL\r\n *\r\n * Note: For R2 public access, you typically need to:\r\n * - Enable public access on the bucket\r\n * - Or use a custom domain through Cloudflare\r\n */\r\n public url(location: string): string {\r\n // 1. Use urlPrefix if configured\r\n if (this.options.urlPrefix) {\r\n const prefix = this.options.urlPrefix.replace(/\\/+$/, \"\");\r\n return `${prefix}/${location}`;\r\n }\r\n\r\n // 2. Use publicDomain if configured\r\n if (this.options.publicDomain) {\r\n const domain = this.options.publicDomain.replace(/\\/+$/, \"\");\r\n return `${domain}/${location}`;\r\n }\r\n\r\n // 3. Fallback to R2 public bucket URL\r\n // Note: Public access must be enabled on the bucket for this to work\r\n return `https://pub-${this.options.accountId}.r2.dev/${location}`;\r\n }\r\n}\r\n","import type { CloudStorageDriverOptions } from \"../types\";\r\nimport { CloudDriver } from \"./cloud-driver\";\r\n\r\n/**\r\n * AWS S3 Storage Driver\r\n *\r\n * URL Pattern: https://{bucket}.s3.{region}.amazonaws.com/{key}\r\n *\r\n * @example\r\n * ```typescript\r\n * const driver = new S3Driver({\r\n * bucket: \"my-bucket\",\r\n * region: \"us-east-1\",\r\n * accessKeyId: process.env.AWS_ACCESS_KEY_ID,\r\n * secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,\r\n * });\r\n * ```\r\n */\r\nexport class S3Driver extends CloudDriver<CloudStorageDriverOptions> {\r\n /**\r\n * Driver name\r\n */\r\n public readonly name = \"s3\";\r\n\r\n /**\r\n * Get public URL for file\r\n *\r\n * URL formats:\r\n * - With urlPrefix: {urlPrefix}/{key}\r\n * - Default: https://{bucket}.s3.{region}.amazonaws.com/{key}\r\n */\r\n public url(location: string): string {\r\n // 1. Use urlPrefix if configured\r\n if (this.options.urlPrefix) {\r\n const prefix = this.options.urlPrefix.replace(/\\/+$/, \"\");\r\n return `${prefix}/${location}`;\r\n }\r\n\r\n // 2. Default S3 URL\r\n return `https://${this.options.bucket}.s3.${this.options.region}.amazonaws.com/${location}`;\r\n }\r\n}\r\n","import events, { type EventSubscription } from \"@mongez/events\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport type { Readable } from \"stream\";\nimport type { UploadedFile } from \"../http\";\nimport { storageConfig } from \"./config\";\nimport { storageDriverContext } from \"./context/storage-driver-context\";\nimport { DOSpacesDriver } from \"./drivers/do-spaces-driver\";\nimport { LocalDriver } from \"./drivers/local-driver\";\nimport { R2Driver } from \"./drivers/r2-driver\";\nimport { S3Driver } from \"./drivers/s3-driver\";\nimport { ScopedStorage } from \"./scoped-storage\";\nimport { StorageFile } from \"./storage-file\";\nimport type {\n CloudStorageDriverContract,\n CloudStorageDriverOptions,\n DeleteManyResult,\n FileVisibility,\n ListOptions,\n LocalStorageDriverOptions,\n PresignedOptions,\n PresignedUploadOptions,\n PutOptions,\n R2StorageDriverOptions,\n StorageCopyEventPayload,\n StorageDriverConfig,\n StorageDriverContract,\n StorageDriverName,\n StorageEventHandler,\n StorageEventPayload,\n StorageEventType,\n StorageFileInfo,\n StorageManagerContract,\n StoragePutEventPayload,\n TemporaryTokenValidation,\n} from \"./types\";\n\n/**\n * Storage Manager\n *\n * Provides a unified interface for file storage operations across multiple\n * drivers (local, S3, R2, DigitalOcean Spaces). Extends `ScopedStorage` to\n * inherit all base operations while adding driver management and events.\n *\n * All operations return `StorageFile` instances for a consistent, rich DX.\n *\n * @example\n * ```typescript\n * // Basic usage (uses default driver)\n * const file = await storage.put(buffer, \"uploads/image.jpg\");\n *\n * // With options\n * const file = await storage.put(buffer, \"uploads/image.jpg\", {\n * mimeType: \"image/jpeg\",\n * cacheControl: \"max-age=31536000\"\n * });\n *\n * // Using specific driver (also returns StorageFile)\n * const file = await storage.use(\"s3\").put(buffer, \"path/to/file\");\n *\n * // Get raw driver for advanced use\n * const driver = storage.driver(\"s3\");\n * const data = await driver.put(buffer, \"path/to/file\"); // Returns StorageFileData\n *\n * // Stream operations for large files\n * const stream = await storage.getStream(\"large-file.zip\");\n * await storage.putStream(readableStream, \"output/file.zip\");\n *\n * // Batch operations\n * const results = await storage.deleteMany([\"file1.txt\", \"file2.txt\"]);\n *\n * // Event hooks\n * storage.on(\"afterPut\", ({ location, file }) => {\n * console.log(`Uploaded ${location}`);\n * });\n * ```\n */\nexport class Storage extends ScopedStorage implements StorageManagerContract {\n /**\n * Registered drivers (cached instances)\n * @internal\n */\n protected drivers = new Map<string, StorageDriverContract>();\n\n /**\n * Driver configurations\n * @internal\n */\n protected configs = new Map<string, StorageDriverConfig>();\n\n /**\n * Default driver name\n * @internal\n */\n protected defaultDriverName!: StorageDriverName;\n\n /**\n * Whether the storage has been initialized\n * @internal\n */\n private initialized = false;\n\n /**\n * Create a new Storage manager instance\n *\n * Uses lazy initialization - driver is resolved on first access.\n */\n public constructor() {\n // Temp placeholder - will be replaced on first access\n super(null as unknown as StorageDriverContract);\n }\n\n /**\n * Ensure storage is initialized (lazy initialization)\n *\n * Called automatically on first driver access.\n */\n public async init(): Promise<void> {\n if (this.initialized) return;\n\n // Mark as initialized FIRST to prevent infinite recursion\n this.initialized = true;\n\n // Get default driver name from config\n\n const defaultName = storageConfig(\"default\", \"local\");\n\n this.defaultDriverName = defaultName as StorageDriverName;\n this.loadDriversFromConfig();\n\n // Now set the actual driver\n this._driver = this.resolveDriver(this.defaultDriverName);\n }\n\n /**\n * Reset storage defaults\n */\n public reset(): void {\n this.initialized = false;\n this.drivers.clear();\n this.configs.clear();\n this.defaultDriverName = null as unknown as StorageDriverName;\n this._driver = null as unknown as StorageDriverContract;\n }\n\n /**\n * Get the currently active driver (context-aware in future)\n *\n * Currently returns the default driver.\n * Will be enhanced to check AsyncLocalStorage context for multi-tenant support.\n *\n * @returns The active storage driver\n */\n public override get activeDriver(): StorageDriverContract {\n // Check context for tenant-specific driver\n const contextDriver = storageDriverContext.getDriver();\n\n if (contextDriver) return contextDriver;\n\n return this._driver;\n }\n\n // ============================================================\n // Driver Management\n // ============================================================\n\n /**\n * Load drivers from configuration\n * @internal\n */\n protected loadDriversFromConfig(): void {\n const drivers = storageConfig<Record<string, StorageDriverConfig>>(\"drivers\", {});\n\n for (const [name, config] of Object.entries(drivers)) {\n this.configs.set(name, config);\n }\n }\n\n /**\n * Get a scoped storage for a specific driver\n *\n * Returns a `ScopedStorage` instance that wraps the specified driver.\n * Operations on the returned instance also return `StorageFile` objects.\n *\n * @param name - Driver name as defined in configuration\n * @returns ScopedStorage instance for the specified driver\n *\n * @example\n * ```typescript\n * // Upload to S3\n * const s3File = await storage.use(\"s3\").put(buffer, \"images/photo.jpg\");\n *\n * // Upload to local\n * const localFile = await storage.use(\"local\").put(buffer, \"temp/file.txt\");\n *\n * // Both return StorageFile with identical API\n * console.log(s3File.url);\n * console.log(localFile.url);\n * ```\n */\n public use(name: StorageDriverName): ScopedStorage {\n return new ScopedStorage(this.getDriver(name));\n }\n\n /**\n * Get a raw driver instance\n *\n * Returns the underlying driver directly for advanced use cases.\n * Unlike `use()`, calling methods on the raw driver returns\n * `StorageFileData` instead of `StorageFile`.\n *\n * @param name - Driver name as defined in configuration\n * @returns Raw driver instance implementing StorageDriverContract\n *\n * @example\n * ```typescript\n * const driver = storage.getDriver(\"s3\");\n * const data = await driver.put(buffer, \"path/to/file\");\n * // data is StorageFileData, not StorageFile\n * ```\n */\n public getDriver(name: StorageDriverName): StorageDriverContract {\n return this.resolveDriver(name);\n }\n\n /**\n * Get root directory of current driver\n */\n public root(apepndedPath?: string): string {\n const rootPath = this.activeDriver.options?.root || \"\";\n\n return path.join(rootPath, apepndedPath || \"\");\n }\n\n /**\n * Use a cloud storage driver with extended cloud capabilities\n *\n * @param name - Cloud driver name (s3, r2, spaces)\n * @returns Driver instance implementing CloudStorageDriverContract\n * @throws Error if driver doesn't support cloud operations\n *\n * @example\n * ```typescript\n * const cloudDriver = storage.useCloud(\"s3\");\n * const presignedUrl = await cloudDriver.getPresignedUrl(\"private/doc.pdf\");\n * ```\n */\n public useCloud(name: StorageDriverName): CloudStorageDriverContract {\n const instance = this.getDriver(name);\n\n if (!this.isCloudDriver(instance)) {\n throw new Error(`Driver \"${name}\" does not support cloud operations`);\n }\n\n return instance as CloudStorageDriverContract;\n }\n\n /**\n * Register a new driver configuration at runtime\n *\n * Allows dynamic driver registration for multi-tenancy or\n * runtime configuration scenarios.\n *\n * @param name - Unique driver name\n * @param config - Driver configuration\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * storage.register(\"tenant-s3\", {\n * driver: \"s3\",\n * bucket: \"tenant-bucket\",\n * region: \"us-east-1\",\n * accessKeyId: process.env.TENANT_AWS_KEY,\n * secretAccessKey: process.env.TENANT_AWS_SECRET\n * });\n *\n * await storage.use(\"tenant-s3\").put(buffer, \"file.txt\");\n * ```\n */\n public register(name: StorageDriverName, config: StorageDriverConfig): this {\n this.configs.set(name, config);\n this.drivers.delete(name); // Clear cached instance\n return this;\n }\n\n /**\n * Set the default driver name\n *\n * @param name - Driver name to use as default\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * storage.setDefault(\"s3\");\n * await storage.put(buffer, \"file.txt\"); // Now uses S3\n * ```\n */\n public setDefault(name: StorageDriverName): this {\n this.defaultDriverName = name;\n this._driver = this.getDriver(name);\n return this;\n }\n\n /**\n * Check if current driver is a cloud driver\n *\n * @returns Promise resolving to true if the current driver supports cloud operations\n */\n public async isCloud(): Promise<boolean> {\n return this.isCloudDriver(this.activeDriver);\n }\n\n /**\n * Check if a driver instance supports cloud operations\n * @internal\n */\n protected isCloudDriver(driver: StorageDriverContract): driver is CloudStorageDriverContract {\n return \"getPresignedUrl\" in driver;\n }\n\n // ============================================================\n // Event System\n // ============================================================\n\n /**\n * Register an event handler\n *\n * Subscribe to storage events for logging, analytics, or side effects.\n *\n * @param event - Event type to listen for\n * @param handler - Handler function\n * @returns Event subscription for unsubscribing\n *\n * @example\n * ```typescript\n * // Log all uploads\n * storage.on(\"afterPut\", ({ location, file }) => {\n * console.log(`Uploaded ${file?.size} bytes to ${location}`);\n * });\n *\n * // Track deletions\n * storage.on(\"afterDelete\", ({ location }) => {\n * analytics.track(\"file_deleted\", { path: location });\n * });\n * ```\n */\n public on<T extends StorageEventPayload = StorageEventPayload>(\n event: StorageEventType,\n handler: StorageEventHandler<T>,\n ): EventSubscription {\n return events.subscribe(`storage.${event}`, handler);\n }\n\n /**\n * Remove all handlers for an event type\n *\n * @param event - Event type to remove handlers for\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * storage.off(\"afterPut\"); // Remove all afterPut handlers\n * ```\n */\n public off(event: StorageEventType): this {\n events.off(`storage.${event}`);\n return this;\n }\n\n /**\n * Emit an event to all registered handlers\n * @internal\n */\n protected async emit<T extends StorageEventPayload>(\n event: StorageEventType,\n payload: T,\n ): Promise<void> {\n await events.triggerAll(`storage.${event}`, payload);\n }\n\n // ============================================================\n // Overridden Operations with Events\n // ============================================================\n\n /**\n * Store a file in storage\n *\n * Extends base `put()` with event emission for beforePut/afterPut hooks.\n *\n * @param file - File content as Buffer, string, UploadedFile, or Readable stream\n * @param location - Destination path\n * @param options - Storage options (mimeType, cacheControl, etc.)\n * @returns StorageFile instance with cached metadata\n */\n public override async put(\n file: UploadedFile | Buffer | string | Readable,\n location: string,\n options?: PutOptions,\n ): Promise<StorageFile> {\n const driver = this.activeDriver;\n const buffer = await this.toBuffer(file);\n\n await this.emit<StoragePutEventPayload>(\"beforePut\", {\n driver: driver.name,\n location,\n timestamp: new Date(),\n size: buffer.length,\n });\n\n const result = await driver.put(buffer, location, options);\n\n await this.emit<StoragePutEventPayload>(\"afterPut\", {\n driver: driver.name,\n location,\n timestamp: new Date(),\n file: result,\n });\n\n return StorageFile.fromData(result, driver);\n }\n\n /**\n * Store a file from a readable stream (for large files)\n *\n * Extends base `putStream()` with event emission.\n *\n * @param stream - Readable stream\n * @param location - Destination path\n * @param options - Storage options\n * @returns StorageFile instance with cached metadata\n */\n public override async putStream(\n stream: Readable | string,\n location: string,\n options?: PutOptions,\n ): Promise<StorageFile> {\n const driver = this.activeDriver;\n\n await this.emit<StoragePutEventPayload>(\"beforePut\", {\n driver: driver.name,\n location,\n timestamp: new Date(),\n });\n\n if (typeof stream === \"string\") {\n stream = fs.createReadStream(stream);\n }\n\n const result = await driver.putStream(stream, location, options);\n\n await this.emit<StoragePutEventPayload>(\"afterPut\", {\n driver: driver.name,\n location,\n timestamp: new Date(),\n file: result,\n });\n\n return StorageFile.fromData(result, driver);\n }\n\n /**\n * Store a file from a URL\n *\n * Downloads content from the URL and stores it at the specified location.\n *\n * @param url - Source URL to download from\n * @param location - Destination path\n * @param options - Storage options\n * @returns StorageFile instance with cached metadata\n *\n * @example\n * ```typescript\n * const file = await storage.putFromUrl(\n * \"https://example.com/image.jpg\",\n * \"downloads/image.jpg\"\n * );\n * ```\n */\n public async putFromUrl(\n url: string,\n location: string,\n options?: PutOptions,\n ): Promise<StorageFile> {\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch file from URL: ${response.statusText}`);\n }\n\n const arrayBuffer = await response.arrayBuffer();\n const buffer = Buffer.from(arrayBuffer);\n const mimeType = options?.mimeType || response.headers.get(\"content-type\") || undefined;\n\n return this.put(buffer, location, { ...options, mimeType });\n }\n\n /**\n * Store a file from base64 encoded string\n *\n * Decodes base64 content (with optional data URL prefix) and stores it.\n *\n * @param base64 - Base64 encoded file content (or data URL)\n * @param location - Destination path\n * @param options - Storage options\n * @returns StorageFile instance with cached metadata\n *\n * @example\n * ```typescript\n * // From plain base64\n * const file = await storage.putFromBase64(base64String, \"images/photo.jpg\");\n *\n * // From data URL (auto-extracts MIME type)\n * const file = await storage.putFromBase64(\n * \"data:image/png;base64,iVBORw0KGgo...\",\n * \"images/photo.png\"\n * );\n * ```\n */\n public async putFromBase64(\n base64: string,\n location: string,\n options?: PutOptions,\n ): Promise<StorageFile> {\n let data = base64;\n let mimeType = options?.mimeType;\n\n if (base64.startsWith(\"data:\")) {\n const match = base64.match(/^data:([^;]+);base64,(.+)$/);\n if (match) {\n mimeType = mimeType || match[1];\n data = match[2];\n }\n }\n\n const buffer = Buffer.from(data, \"base64\");\n return this.put(buffer, location, { ...options, mimeType });\n }\n\n /**\n * Retrieve file contents as Buffer\n *\n * Uses the current driver (with async resolution).\n *\n * @param location - File path\n * @returns Buffer containing file contents\n */\n public override async get(location: string): Promise<Buffer> {\n return this.activeDriver.get(location);\n }\n\n /**\n * Get JSON content from a file\n *\n * Downloads and parses JSON file content.\n *\n * @param location - File path\n * @returns Parsed JSON content\n *\n * @example\n * ```typescript\n * const config = await storage.getJson(\"config/settings.json\");\n * console.log(config.apiKey);\n * ```\n */\n public async getJson(location: string): Promise<any> {\n const buffer = await this.get(location);\n return JSON.parse(buffer.toString());\n }\n\n /**\n * Retrieve a file as a readable stream (for large files)\n *\n * @param location - File path\n * @returns Readable stream of file contents\n */\n public override async getStream(location: string): Promise<Readable> {\n return this.activeDriver.getStream(location);\n }\n\n /**\n * Delete a file\n *\n * Extends base `delete()` with event emission.\n *\n * @param location - File path or StorageFile\n * @returns true if deleted, false if not found\n */\n public override async delete(location: string | StorageFile): Promise<boolean> {\n const driver = this.activeDriver;\n const path = typeof location === \"string\" ? location : location.path;\n\n await this.emit<StorageEventPayload>(\"beforeDelete\", {\n driver: driver.name,\n location: path,\n timestamp: new Date(),\n });\n\n const result = await driver.delete(path);\n\n await this.emit<StorageEventPayload>(\"afterDelete\", {\n driver: driver.name,\n location: path,\n timestamp: new Date(),\n });\n\n return result;\n }\n\n /**\n * Delete multiple files at once\n *\n * @param locations - Array of file paths\n * @returns Array of delete results with status for each file\n */\n public override async deleteMany(locations: string[]): Promise<DeleteManyResult[]> {\n return this.activeDriver.deleteMany(locations);\n }\n\n /**\n * Check if a file exists\n *\n * @param location - File path\n * @returns true if file exists\n */\n public override async exists(location: string): Promise<boolean> {\n return this.activeDriver.exists(location);\n }\n\n /**\n * Copy a file to a new location\n *\n * Extends base `copy()` with event emission.\n *\n * @param from - Source path or StorageFile\n * @param to - Destination path\n * @returns StorageFile instance at destination\n */\n public override async copy(from: string | StorageFile, to: string): Promise<StorageFile> {\n const driver = this.activeDriver;\n const fromPath = typeof from === \"string\" ? from : from.path;\n\n await this.emit<StorageCopyEventPayload>(\"beforeCopy\", {\n driver: driver.name,\n location: to,\n from: fromPath,\n to,\n timestamp: new Date(),\n });\n\n const result = await driver.copy(fromPath, to);\n\n await this.emit<StorageCopyEventPayload>(\"afterCopy\", {\n driver: driver.name,\n location: to,\n from: fromPath,\n to,\n timestamp: new Date(),\n file: result,\n });\n\n return StorageFile.fromData(result, driver);\n }\n\n /**\n * Move a file to a new location\n *\n * Extends base `move()` with event emission.\n *\n * @param from - Source path or StorageFile\n * @param to - Destination path\n * @returns StorageFile instance at destination\n */\n public override async move(from: string | StorageFile, to: string): Promise<StorageFile> {\n const driver = this.activeDriver;\n const fromPath = typeof from === \"string\" ? from : from.path;\n\n await this.emit<StorageCopyEventPayload>(\"beforeMove\", {\n driver: driver.name,\n location: to,\n from: fromPath,\n to,\n timestamp: new Date(),\n });\n\n const result = await driver.move(fromPath, to);\n\n await this.emit<StorageCopyEventPayload>(\"afterMove\", {\n driver: driver.name,\n location: to,\n from: fromPath,\n to,\n timestamp: new Date(),\n file: result,\n });\n\n return StorageFile.fromData(result, driver);\n }\n\n /**\n * List files in a directory\n *\n * @param directory - Directory path (defaults to root)\n * @param options - List options (recursive, limit, etc.)\n * @returns Array of file information objects\n */\n public override async list(\n directory?: string,\n options?: ListOptions,\n ): Promise<StorageFileInfo[]> {\n return this.activeDriver.list(directory || \"\", options);\n }\n\n // ============================================================\n // Metadata Operations\n // ============================================================\n\n /**\n * Get file metadata without downloading\n *\n * @param location - File path\n * @returns File information object\n */\n public override async getInfo(location: string): Promise<StorageFileInfo> {\n return this.activeDriver.getInfo(location);\n }\n\n /**\n * Get file size in bytes\n *\n * @param location - File path\n * @returns File size in bytes\n */\n public override async size(location: string): Promise<number> {\n return this.activeDriver.size(location);\n }\n\n /**\n * Get a StorageFile instance for OOP-style operations\n *\n * @param location - File path\n * @returns StorageFile instance\n */\n public override async file(location: string): Promise<StorageFile> {\n return new StorageFile(location, this.activeDriver);\n }\n\n // ============================================================\n // Path Operations (Local Driver Only)\n // ============================================================\n\n /**\n * Get the absolute filesystem path for a location\n *\n * Only available for local driver.\n *\n * @param location - File path\n * @throws Error if current driver is not a local driver\n * @returns Absolute filesystem path\n */\n public async path(location: string): Promise<string> {\n const driver = this.activeDriver;\n\n if (!(\"path\" in driver) || typeof driver.path !== \"function\") {\n throw new Error(\"path() is only available for local storage drivers\");\n }\n\n return driver.path(location);\n }\n\n // ============================================================\n // Cloud-Specific Operations\n // ============================================================\n\n /**\n * Get a presigned URL for downloading a file\n *\n * Only available for cloud drivers.\n *\n * @param location - File path\n * @param options - Presigned URL options (expiresIn)\n * @throws Error if current driver is not a cloud driver\n * @returns Presigned download URL\n *\n * @example\n * ```typescript\n * const url = await storage.getPresignedUrl(\"private/document.pdf\", {\n * expiresIn: 3600 // 1 hour\n * });\n * ```\n */\n public async getPresignedUrl(location: string, options?: PresignedOptions): Promise<string> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Presigned URLs are only available for cloud storage drivers\");\n }\n\n return driver.getPresignedUrl(location, options);\n }\n\n /**\n * Get a presigned URL for uploading a file directly to cloud storage\n *\n * Only available for cloud drivers.\n *\n * @param location - Destination path\n * @param options - Upload options (expiresIn, contentType, maxSize)\n * @throws Error if current driver is not a cloud driver\n * @returns Presigned upload URL\n *\n * @example\n * ```typescript\n * const uploadUrl = await storage.getPresignedUploadUrl(\"uploads/file.pdf\", {\n * expiresIn: 3600,\n * contentType: \"application/pdf\"\n * });\n *\n * // Client can PUT directly to this URL\n * ```\n */\n public async getPresignedUploadUrl(\n location: string,\n options?: PresignedUploadOptions,\n ): Promise<string> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Presigned upload URLs are only available for cloud storage drivers\");\n }\n\n return driver.getPresignedUploadUrl(location, options);\n }\n\n /**\n * Get the bucket name for cloud storage\n *\n * Only available for cloud drivers.\n *\n * @throws Error if current driver is not a cloud driver\n * @returns Bucket name\n */\n public async getBucket(): Promise<string> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Bucket information is only available for cloud storage drivers\");\n }\n\n return driver.getBucket();\n }\n\n /**\n * Get the region for cloud storage\n *\n * Only available for cloud drivers.\n *\n * @throws Error if current driver is not a cloud driver\n * @returns Region name\n */\n public async getRegion(): Promise<string> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Region information is only available for cloud storage drivers\");\n }\n\n return driver.getRegion();\n }\n\n /**\n * Set storage class for a file (e.g., STANDARD, GLACIER, etc.)\n *\n * Only available for cloud drivers.\n *\n * @param location - File path\n * @param storageClass - Target storage class\n * @throws Error if current driver is not a cloud driver\n */\n public async setStorageClass(location: string, storageClass: string): Promise<void> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Storage class is only available for cloud storage drivers\");\n }\n\n return driver.setStorageClass(location, storageClass);\n }\n\n /**\n * Set file visibility (public or private)\n *\n * Only available for cloud drivers.\n *\n * @param location - File path\n * @param visibility - \"public\" or \"private\"\n * @throws Error if current driver is not a cloud driver\n */\n public async setVisibility(location: string, visibility: FileVisibility): Promise<void> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Visibility is only available for cloud storage drivers\");\n }\n\n return driver.setVisibility(location, visibility);\n }\n\n /**\n * Get file visibility\n *\n * Only available for cloud drivers.\n *\n * @param location - File path\n * @throws Error if current driver is not a cloud driver\n * @returns Current visibility setting\n */\n public async getVisibility(location: string): Promise<FileVisibility> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Visibility is only available for cloud storage drivers\");\n }\n\n return driver.getVisibility(location);\n }\n\n /**\n * Get a temporary signed URL\n *\n * Creates a URL that provides temporary access to the file.\n *\n * @param location - File path\n * @param expiresIn - Seconds until expiration (default: 3600)\n * @returns Signed URL string\n */\n public override async temporaryUrl(location: string, expiresIn?: number): Promise<string> {\n return this.activeDriver.temporaryUrl(location, expiresIn);\n }\n\n /**\n * Validate a temporary URL token\n *\n * For local driver: validates HMAC-signed tokens\n * For cloud drivers: returns invalid (cloud validates via presigned URL)\n *\n * @param token - The token from the temporary URL\n * @returns Validation result with file info and convenience methods\n *\n * @example\n * ```typescript\n * const result = await storage.validateTemporaryToken(token);\n *\n * if (!result.valid) {\n * return response.status(403).send(result.error);\n * }\n *\n * // For local driver - use sendFile for efficiency\n * if (result.absolutePath) {\n * return response.sendFile(result.absolutePath);\n * }\n *\n * // For cloud driver - stream the file\n * const stream = await result.getStream!();\n * stream.pipe(response.raw);\n * ```\n */\n public async validateTemporaryToken(token: string): Promise<TemporaryTokenValidation> {\n // Check if driver supports token validation\n if (\n !(\"validateTemporaryToken\" in this.activeDriver) ||\n typeof this.activeDriver.validateTemporaryToken !== \"function\"\n ) {\n // For cloud drivers, temporary URLs are presigned and validated by the cloud provider\n return {\n valid: false,\n error: \"invalid_token\",\n };\n }\n\n return this.activeDriver.validateTemporaryToken(token);\n }\n\n // ============================================================\n // Configuration Parsing\n // ============================================================\n\n /**\n * Parse config into driver-specific options\n * @internal\n */\n protected parseOptions(\n config: StorageDriverConfig,\n ): LocalStorageDriverOptions | CloudStorageDriverOptions | R2StorageDriverOptions {\n const { driver, ...options } = config;\n\n switch (driver) {\n case \"local\":\n return {\n root: options.root,\n urlPrefix: options.urlPrefix,\n signatureKey: options.signatureKey,\n } satisfies LocalStorageDriverOptions;\n\n case \"s3\":\n this.validateCloudConfig(config, \"s3\");\n return {\n ...options,\n bucket: options.bucket!,\n region: options.region!,\n accessKeyId: options.accessKeyId!,\n secretAccessKey: options.secretAccessKey!,\n endpoint: options.endpoint,\n urlPrefix: options.urlPrefix,\n } satisfies CloudStorageDriverOptions;\n\n case \"r2\":\n this.validateCloudConfig(config, \"r2\");\n if (!options.accountId) {\n throw new Error('R2 driver requires \"accountId\" configuration');\n }\n\n return {\n ...options,\n region: options.region || \"auto\",\n bucket: options.bucket!,\n accessKeyId: options.accessKeyId!,\n secretAccessKey: options.secretAccessKey!,\n endpoint: options.endpoint,\n urlPrefix: options.urlPrefix,\n accountId: options.accountId,\n publicDomain: options.publicDomain,\n } satisfies R2StorageDriverOptions;\n\n case \"spaces\":\n this.validateCloudConfig(config, \"spaces\");\n return {\n ...options,\n bucket: options.bucket!,\n region: options.region!,\n accessKeyId: options.accessKeyId!,\n secretAccessKey: options.secretAccessKey!,\n endpoint: options.endpoint,\n urlPrefix: options.urlPrefix,\n } satisfies CloudStorageDriverOptions;\n\n default:\n throw new Error(`Unknown driver type: ${driver}`);\n }\n }\n\n /**\n * Validate cloud driver configuration has required fields\n * @internal\n */\n protected validateCloudConfig(config: StorageDriverConfig, driverName: string): void {\n const required = [\"bucket\", \"accessKeyId\", \"secretAccessKey\"];\n\n if (driverName !== \"r2\") {\n required.push(\"region\");\n }\n\n for (const field of required) {\n if (!config[field as keyof StorageDriverConfig]) {\n throw new Error(`${driverName.toUpperCase()} driver requires \"${field}\" configuration`);\n }\n }\n }\n\n /**\n * Get or create driver instance from cache\n * @internal\n */\n protected resolveDriver(name: string): StorageDriverContract {\n // Ensure configs are loaded\n\n if (this.drivers.has(name)) {\n return this.drivers.get(name)!;\n }\n\n const config = this.configs.get(name);\n\n if (!config) {\n throw new Error(`Storage driver \"${name}\" is not configured`);\n }\n\n const options = this.parseOptions(config);\n let driver: StorageDriverContract;\n\n switch (config.driver) {\n case \"local\":\n driver = new LocalDriver(options as LocalStorageDriverOptions);\n break;\n case \"s3\":\n driver = new S3Driver(options as CloudStorageDriverOptions);\n break;\n case \"r2\":\n driver = new R2Driver(options as R2StorageDriverOptions);\n break;\n case \"spaces\":\n driver = new DOSpacesDriver(options as CloudStorageDriverOptions);\n break;\n default:\n throw new Error(`Unknown storage driver type: ${config.driver}`);\n }\n\n this.drivers.set(name, driver);\n return driver;\n }\n\n /**\n * Resolve the default driver name (supports async resolver for multi-tenancy)\n * @internal\n */\n protected async resolveDefaultDriver(): Promise<StorageDriverName> {\n const resolver = storageConfig(\"resolver\");\n\n if (resolver) {\n const resolved = await resolver();\n return resolved || this.defaultDriverName;\n }\n\n return this.defaultDriverName;\n }\n}\n\n/**\n * Singleton storage instance\n *\n * Pre-configured storage manager ready for use throughout the application.\n *\n * @example\n * ```typescript\n * import { storage } from \"@warlock.js/core\";\n *\n * const file = await storage.put(buffer, \"uploads/file.txt\");\n * ```\n */\nexport const storage = new Storage();\n","import { config } from \"../config\";\nimport type { UploadsConfigurations } from \"./uploads-types\";\n\n/**\n * Default uploads configuration values\n *\n * These defaults are used when no configuration is provided\n * or when specific keys are missing from the app config.\n */\nexport const UPLOADS_DEFAULTS: UploadsConfigurations = {\n name: \"random\",\n randomLength: 32,\n prefix: {\n as: \"directory\",\n format: \"DD-MM-YYYY\",\n },\n // defaultPrefixFormat: \"DD-MM-YYYY-HH-II-SS\",\n};\n\n/**\n * Get uploads configuration value\n *\n * Retrieves a configuration value from the `uploads` section of app config,\n * falling back to the provided default or the built-in default.\n *\n * @param key - Configuration key to retrieve\n * @param defaultValue - Optional default value if not found\n * @returns The configuration value\n *\n * @example\n * ```typescript\n * const naming = uploadsConfig(\"name\"); // \"random\" or \"original\"\n * const length = uploadsConfig(\"randomLength\", 32);\n * ```\n */\nexport function uploadsConfig<K extends keyof UploadsConfigurations>(\n key: K,\n defaultValue?: UploadsConfigurations[K],\n): UploadsConfigurations[K] {\n const fallback = defaultValue ?? UPLOADS_DEFAULTS[key];\n return config.key(`uploads.${key}`, fallback);\n}\n","import type { MultipartFile } from \"@fastify/multipart\";\r\nimport { Random } from \"@mongez/reinforcements\";\r\nimport dayjs from \"dayjs\";\r\nimport path from \"path\";\r\nimport { Image, type ImageFormat, type ImageTransformOptions } from \"../image\";\r\nimport { storage, type ScopedStorage, type StorageDriverName, type StorageFile } from \"../storage\";\r\nimport { sanitizePath } from \"../utils/paths\";\r\nimport { uploadsConfig } from \"./uploads-config\";\r\nimport type {\r\n FileNamingStrategy,\r\n ImageTransformCallback,\r\n PrefixConfig,\r\n SaveAsOptions,\r\n SaveOptions,\r\n UploadedFileImageOptions,\r\n} from \"./uploads-types\";\r\n\r\ntype UploadedFileMetadata = {\r\n name: string;\r\n mimeType: string;\r\n extension: string;\r\n size: number;\r\n width?: number;\r\n height?: number;\r\n};\r\n\r\n/**\r\n * Options for validating file before saving\r\n */\r\nexport type FileValidationOptions = {\r\n /**\r\n * List of allowed MIME types\r\n *\r\n * @example [\"image/jpeg\", \"image/png\", \"image/webp\"]\r\n */\r\n allowedMimeTypes?: string[];\r\n\r\n /**\r\n * List of allowed file extensions (without dot)\r\n *\r\n * @example [\"jpg\", \"jpeg\", \"png\", \"webp\"]\r\n */\r\n allowedExtensions?: string[];\r\n\r\n /**\r\n * Maximum file size in bytes\r\n *\r\n * @example 5 * 1024 * 1024 // 5MB\r\n */\r\n maxSize?: number;\r\n};\r\n\r\n/**\r\n * UploadedFile - Handles multipart file uploads with storage and image integration\r\n *\r\n * Provides a fluent API for validating, transforming, and saving uploaded files\r\n * to various storage drivers (local, S3, R2, etc.).\r\n *\r\n * @example\r\n * ```typescript\r\n * // Simple save with random name\r\n * const file = await uploadedFile.save(\"avatars\");\r\n *\r\n * // Original name with date prefix\r\n * const file = await uploadedFile.save(\"avatars\", {\r\n * name: \"original\",\r\n * prefix: { format: \"yyyy/mm/dd\", as: \"directory\" }\r\n * });\r\n *\r\n * // With image transformations\r\n * const file = await uploadedFile\r\n * .resize(800, 600)\r\n * .quality(85)\r\n * .format(\"webp\")\r\n * .save(\"avatars\");\r\n *\r\n * // Different storage driver\r\n * const file = await uploadedFile.use(\"s3\").save(\"avatars\");\r\n * ```\r\n */\r\nexport class UploadedFile {\r\n /**\r\n * File buffered content\r\n * @internal\r\n */\r\n protected bufferedFileContent?: Buffer;\r\n\r\n /**\r\n * Upload file hash (SHA-256)\r\n *\r\n * Populated after file is saved.\r\n */\r\n public hash = \"\";\r\n\r\n /**\r\n * Selected storage driver\r\n * @internal\r\n */\r\n protected _storage: ScopedStorage = storage;\r\n\r\n /**\r\n * Saved StorageFile reference\r\n * @internal\r\n */\r\n protected _storageFile?: StorageFile;\r\n\r\n /**\r\n * Queued image options (high-level API)\r\n * @internal\r\n */\r\n protected _imageOptions: UploadedFileImageOptions = {};\r\n\r\n /**\r\n * Full transform options or callback\r\n * @internal\r\n */\r\n protected _transformConfig?: ImageTransformOptions | ImageTransformCallback;\r\n\r\n /**\r\n * Create a new UploadedFile instance\r\n *\r\n * @param fileData - Multipart file data from Fastify\r\n * @throws Error if file data is invalid\r\n */\r\n public constructor(protected readonly fileData: MultipartFile) {\r\n if (!fileData?.filename) {\r\n throw new Error(\"Invalid file data: filename is required\");\r\n }\r\n }\r\n\r\n // ============================================================\r\n // File Properties\r\n // ============================================================\r\n\r\n /**\r\n * Get file name (sanitized)\r\n *\r\n * Returns the original filename with special characters removed/replaced.\r\n */\r\n public get name(): string {\r\n return sanitizePath(this.fileData.filename);\r\n }\r\n\r\n /**\r\n * Get file MIME type\r\n *\r\n * @example \"image/jpeg\", \"application/pdf\"\r\n */\r\n public get mimeType(): string {\r\n return this.fileData.mimetype;\r\n }\r\n\r\n /**\r\n * Get file extension (lowercase, without dot)\r\n *\r\n * @example \"jpg\", \"png\", \"pdf\"\r\n */\r\n public get extension(): string {\r\n return path.extname(this.fileData.filename).replace(\".\", \"\").toLowerCase();\r\n }\r\n\r\n /**\r\n * Get file metadata\r\n */\r\n public async metadata(): Promise<UploadedFileMetadata> {\r\n const data: UploadedFileMetadata = {\r\n name: this.name,\r\n mimeType: this.mimeType,\r\n extension: this.extension,\r\n size: await this.size(),\r\n };\r\n\r\n if (this.isImage) {\r\n const dimensions = await this.dimensions();\r\n data.width = dimensions.width;\r\n data.height = dimensions.height;\r\n }\r\n\r\n return data;\r\n }\r\n\r\n /**\r\n * Get file size in bytes\r\n *\r\n * Buffers the file content if not already buffered.\r\n */\r\n public async size(): Promise<number> {\r\n const file = await this.buffer();\r\n return file.length;\r\n }\r\n\r\n /**\r\n * Get file buffer\r\n *\r\n * Caches the buffer after first call for efficiency.\r\n */\r\n public async buffer(): Promise<Buffer> {\r\n if (this.bufferedFileContent) {\r\n return this.bufferedFileContent;\r\n }\r\n\r\n this.bufferedFileContent = await this.fileData.toBuffer();\r\n return this.bufferedFileContent;\r\n }\r\n\r\n // ============================================================\r\n // File Type Checks\r\n // ============================================================\r\n\r\n /**\r\n * Check if file is an image based on MIME type\r\n */\r\n public get isImage(): boolean {\r\n return this.mimeType.startsWith(\"image\");\r\n }\r\n\r\n /**\r\n * Check if file is a video based on MIME type\r\n */\r\n public get isVideo(): boolean {\r\n return this.mimeType.startsWith(\"video\");\r\n }\r\n\r\n /**\r\n * Check if file is an audio based on MIME type\r\n */\r\n public get isAudio(): boolean {\r\n return this.mimeType.startsWith(\"audio\");\r\n }\r\n\r\n // ============================================================\r\n // Storage Driver Selection\r\n // ============================================================\r\n\r\n /**\r\n * Select a specific storage driver for this upload\r\n *\r\n * Returns this instance for chaining. The driver is used\r\n * when `save()` or `saveAs()` is called.\r\n *\r\n * @param driver - Driver name from storage configuration\r\n * @returns This instance for chaining\r\n *\r\n * @example\r\n * ```typescript\r\n * await file.use(\"s3\").save(\"avatars\");\r\n * await file.use(\"r2\").save(\"cdn/images\");\r\n * ```\r\n */\r\n public use(driver: StorageDriverName): this {\r\n this._storage = storage.use(driver);\r\n return this;\r\n }\r\n\r\n // ============================================================\r\n // High-Level Image Transform API\r\n // ============================================================\r\n\r\n /**\r\n * Resize the image before saving\r\n *\r\n * Only applies to image files. Non-image files ignore this.\r\n *\r\n * @param width - Target width in pixels\r\n * @param height - Optional target height (maintains aspect ratio if omitted)\r\n * @returns This instance for chaining\r\n *\r\n * @example\r\n * ```typescript\r\n * await file.resize(800).save(\"thumbnails\");\r\n * await file.resize(400, 400).save(\"avatars\");\r\n * ```\r\n */\r\n public resize(width: number, height?: number): this {\r\n this._imageOptions.resize = { width, height };\r\n return this;\r\n }\r\n\r\n /**\r\n * Set image output quality\r\n *\r\n * Quality affects file size and visual fidelity.\r\n * Only applies to formats that support quality (JPEG, WebP, AVIF).\r\n *\r\n * @param value - Quality value (1-100)\r\n * @returns This instance for chaining\r\n *\r\n * @example\r\n * ```typescript\r\n * await file.quality(85).save(\"images\");\r\n * ```\r\n */\r\n public quality(value: number): this {\r\n if (value < 1 || value > 100) {\r\n throw new Error(\"Quality must be between 1 and 100\");\r\n }\r\n this._imageOptions.quality = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * Convert image to a specific format\r\n *\r\n * Changes the output format and updates the file extension accordingly.\r\n *\r\n * @param format - Target image format (jpeg, png, webp, avif, etc.)\r\n * @returns This instance for chaining\r\n *\r\n * @example\r\n * ```typescript\r\n * await file.format(\"webp\").save(\"images\");\r\n * await file.resize(800).format(\"avif\").quality(80).save(\"optimized\");\r\n * ```\r\n */\r\n public format(format: ImageFormat): this {\r\n this._imageOptions.format = format;\r\n return this;\r\n }\r\n\r\n /**\r\n * Rotate the image\r\n *\r\n * @param degrees - Rotation angle in degrees (positive = clockwise)\r\n * @returns This instance for chaining\r\n *\r\n * @example\r\n * ```typescript\r\n * await file.rotate(90).save(\"rotated\");\r\n * ```\r\n */\r\n public rotate(degrees: number): this {\r\n this._imageOptions.rotate = degrees;\r\n return this;\r\n }\r\n\r\n /**\r\n * Apply blur effect to the image\r\n *\r\n * @param sigma - Blur intensity (default: 3, minimum: 0.3)\r\n * @returns This instance for chaining\r\n *\r\n * @example\r\n * ```typescript\r\n * await file.blur(5).save(\"blurred\");\r\n * ```\r\n */\r\n public blur(sigma = 3): this {\r\n if (sigma < 0.3) {\r\n throw new Error(\"Blur sigma must be at least 0.3\");\r\n }\r\n this._imageOptions.blur = sigma;\r\n return this;\r\n }\r\n\r\n /**\r\n * Convert image to grayscale (black and white)\r\n *\r\n * @returns This instance for chaining\r\n *\r\n * @example\r\n * ```typescript\r\n * await file.grayscale().save(\"bw-images\");\r\n * ```\r\n */\r\n public grayscale(): this {\r\n this._imageOptions.grayscale = true;\r\n return this;\r\n }\r\n\r\n // ============================================================\r\n // Full Transform Control\r\n // ============================================================\r\n\r\n /**\r\n * Apply full image transformations\r\n *\r\n * Provides complete control over image processing. Can be used with:\r\n * - An options object for predefined transforms\r\n * - A callback function for chained operations\r\n *\r\n * @param config - Transform options or callback function\r\n * @returns This instance for chaining\r\n *\r\n * @example\r\n * ```typescript\r\n * // Using options object\r\n * await file.transform({\r\n * resize: { width: 800, fit: \"inside\" },\r\n * quality: 85\r\n * }).save(\"images\");\r\n *\r\n * // Using callback for full control\r\n * await file.transform(img =>\r\n * img.resize({ width: 800 })\r\n * .watermark(\"logo.png\", { gravity: \"southeast\" })\r\n * .sharpen()\r\n * ).save(\"products\");\r\n * ```\r\n */\r\n public transform(config: ImageTransformOptions | ImageTransformCallback): this {\r\n this._transformConfig = config;\r\n return this;\r\n }\r\n\r\n /**\r\n * Get an Image instance for advanced manipulation\r\n *\r\n * Returns an Image instance from the file buffer for manual processing.\r\n * Use this when you need operations not covered by the fluent API.\r\n *\r\n * @returns Promise resolving to Image instance\r\n *\r\n * @example\r\n * ```typescript\r\n * const img = await file.toImage();\r\n * await img\r\n * .resize({ width: 800 })\r\n * .watermark(\"logo.png\", { gravity: \"southeast\" })\r\n * .save(\"path/to/output.jpg\");\r\n * ```\r\n */\r\n public async toImage(): Promise<Image> {\r\n return new Image(await this.buffer());\r\n }\r\n\r\n // ============================================================\r\n // Image Metadata\r\n // ============================================================\r\n\r\n /**\r\n * Get file width and height (only for images)\r\n *\r\n * @returns Dimensions object, or empty object if not an image\r\n */\r\n public async dimensions(): Promise<{ width?: number; height?: number }> {\r\n if (!this.isImage) {\r\n return {};\r\n }\r\n\r\n return new Image(await this.buffer()).dimensions();\r\n }\r\n\r\n // ============================================================\r\n // Validation\r\n // ============================================================\r\n\r\n /**\r\n * Validate file against the given options\r\n *\r\n * @param options - Validation rules\r\n * @throws Error if validation fails\r\n *\r\n * @example\r\n * ```typescript\r\n * await file.validate({\r\n * allowedMimeTypes: [\"image/jpeg\", \"image/png\"],\r\n * maxSize: 5 * 1024 * 1024 // 5MB\r\n * });\r\n * ```\r\n */\r\n public async validate(options: FileValidationOptions): Promise<void> {\r\n const { allowedMimeTypes, allowedExtensions, maxSize } = options;\r\n\r\n if (allowedMimeTypes && !allowedMimeTypes.includes(this.mimeType)) {\r\n throw new Error(\r\n `Invalid file type: ${this.mimeType}. Allowed types: ${allowedMimeTypes.join(\", \")}`,\r\n );\r\n }\r\n\r\n if (allowedExtensions && !allowedExtensions.includes(this.extension)) {\r\n throw new Error(\r\n `Invalid file extension: ${this.extension}. Allowed extensions: ${allowedExtensions.join(\", \")}`,\r\n );\r\n }\r\n\r\n if (maxSize) {\r\n const fileSize = await this.size();\r\n if (fileSize > maxSize) {\r\n throw new Error(`File too large: ${fileSize} bytes. Maximum allowed: ${maxSize} bytes`);\r\n }\r\n }\r\n }\r\n\r\n // ============================================================\r\n // Save Operations\r\n // ============================================================\r\n\r\n /**\r\n * Save the file to a directory with automatic naming\r\n * Keep in mind to use only relative path to the root of storage\r\n * If you are using local driver\r\n * Uses the configured naming strategy and prefix options to generate\r\n * the final path. Returns a StorageFile for accessing file metadata.\r\n *\r\n * @param directory - Target directory path\r\n * @param options - Save options (name, prefix, driver, validate)\r\n * @returns StorageFile instance with file metadata and operations\r\n *\r\n * @example\r\n * ```typescript\r\n * // Random name (default)\r\n * await file.save(\"avatars\");\r\n * // → avatars/x7k9m2p4.jpg\r\n *\r\n * // Original name\r\n * await file.save(\"avatars\", { name: \"original\" });\r\n * // → avatars/photo.jpg\r\n *\r\n * // With date directory\r\n * await file.save(\"avatars\", {\r\n * prefix: { format: \"yyyy/mm/dd\", as: \"directory\" }\r\n * });\r\n * // → avatars/2025/12/21/x7k9m2p4.jpg\r\n *\r\n * // Original name with datetime prefix\r\n * await file.save(\"avatars\", { name: \"original\", prefix: true });\r\n * // → avatars/21-12-2025-16-45-30-photo.jpg\r\n * ```\r\n */\r\n public async save(directory: string, options?: SaveOptions): Promise<StorageFile> {\r\n // Validate if requested\r\n if (options?.validate) {\r\n await this.validate(options.validate);\r\n }\r\n\r\n // Resolve filename and prefix\r\n const filename = this.resolveFilename(options);\r\n const prefix = this.resolvePrefix(options?.prefix);\r\n const location = this.buildLocation(directory, prefix, filename);\r\n\r\n return this.saveToLocation(location, options?.driver);\r\n }\r\n\r\n /**\r\n * Save the file to an explicit path\r\n *\r\n * Unlike `save()`, this method uses the exact path you provide.\r\n * No automatic naming or prefix is applied.\r\n *\r\n * @param location - Full file path (directory + filename)\r\n * @param options - Save options (driver, validate)\r\n * @returns StorageFile instance with file metadata\r\n *\r\n * @example\r\n * ```typescript\r\n * await file.saveAs(\"avatars/profile-123.png\");\r\n * await file.saveAs(\"products/2025/featured-image.webp\");\r\n * ```\r\n */\r\n public async saveAs(location: string, options?: SaveAsOptions): Promise<StorageFile> {\r\n // Validate if requested\r\n if (options?.validate) {\r\n await this.validate(options.validate);\r\n }\r\n\r\n return this.saveToLocation(location, options?.driver);\r\n }\r\n\r\n /**\r\n * Get the StorageFile reference if file has been saved\r\n *\r\n * Returns undefined if file hasn't been saved yet.\r\n */\r\n public get storageFile(): StorageFile | undefined {\r\n return this._storageFile;\r\n }\r\n\r\n // ============================================================\r\n // Internal Helpers\r\n // ============================================================\r\n\r\n /**\r\n * Execute save to the specified location\r\n * @internal\r\n */\r\n protected async saveToLocation(\r\n location: string,\r\n driver?: StorageDriverName,\r\n ): Promise<StorageFile> {\r\n // Get file content (apply transforms if image)\r\n const content = await this.getProcessedContent();\r\n\r\n // Select storage\r\n const storageInstance = this.resolveStorage(driver);\r\n\r\n // Determine final location (adjust extension if format changed)\r\n const finalLocation = this.adjustLocationForFormat(location);\r\n\r\n // Save to storage\r\n this._storageFile = await storageInstance.put(content, finalLocation, {\r\n mimeType: this.getFinalMimeType(),\r\n });\r\n\r\n // Store hash from StorageFile\r\n const info = await this._storageFile.data();\r\n this.hash = info.hash || \"\";\r\n\r\n return this._storageFile;\r\n }\r\n\r\n /**\r\n * Get processed content (with transforms applied if applicable)\r\n * @internal\r\n */\r\n protected async getProcessedContent(): Promise<Buffer> {\r\n const content = await this.buffer();\r\n\r\n // If not an image or no transforms, return as-is\r\n if (!this.isImage || !this.hasTransforms()) {\r\n return content;\r\n }\r\n\r\n // Create Image and apply transforms\r\n let img = new Image(content);\r\n\r\n // Apply transform callback or options\r\n if (typeof this._transformConfig === \"function\") {\r\n img = this._transformConfig(img);\r\n } else if (this._transformConfig) {\r\n img = img.apply(this._transformConfig);\r\n }\r\n\r\n // Apply high-level options on top\r\n img = this.applyImageOptions(img);\r\n\r\n return img.toBuffer();\r\n }\r\n\r\n /**\r\n * Apply high-level image options\r\n * @internal\r\n */\r\n protected applyImageOptions(img: Image): Image {\r\n const opts = this._imageOptions;\r\n\r\n if (opts.resize) {\r\n img = img.resize({ width: opts.resize.width, height: opts.resize.height });\r\n }\r\n\r\n if (opts.rotate !== undefined) {\r\n img = img.rotate(opts.rotate);\r\n }\r\n\r\n if (opts.blur !== undefined) {\r\n img = img.blur(opts.blur);\r\n }\r\n\r\n if (opts.grayscale) {\r\n img = img.grayscale();\r\n }\r\n\r\n if (opts.quality !== undefined) {\r\n img = img.quality(opts.quality);\r\n }\r\n\r\n if (opts.format) {\r\n img = img.format(opts.format);\r\n }\r\n\r\n return img;\r\n }\r\n\r\n /**\r\n * Check if any transforms are queued\r\n * @internal\r\n */\r\n protected hasTransforms(): boolean {\r\n return this._transformConfig !== undefined || Object.keys(this._imageOptions).length > 0;\r\n }\r\n\r\n /**\r\n * Resolve storage instance to use\r\n * @internal\r\n */\r\n protected resolveStorage(driver?: StorageDriverName): ScopedStorage | typeof storage {\r\n if (driver) {\r\n return storage.use(driver);\r\n }\r\n\r\n return this._storage || storage;\r\n }\r\n\r\n /**\r\n * Resolve the filename based on options and config\r\n * @internal\r\n */\r\n protected resolveFilename(options?: SaveOptions): string {\r\n const namingStrategy: FileNamingStrategy = options?.name ?? uploadsConfig(\"name\") ?? \"random\";\r\n let baseName: string;\r\n\r\n if (namingStrategy === \"original\") {\r\n baseName = path.basename(this.name, path.extname(this.name));\r\n } else if (namingStrategy === \"random\") {\r\n const length = uploadsConfig(\"randomLength\");\r\n baseName = Random.string(length);\r\n } else {\r\n // Custom name - strip extension if provided, we'll add it\r\n baseName = path.basename(namingStrategy, path.extname(namingStrategy));\r\n }\r\n\r\n // Get extension (may be changed by format transform)\r\n const ext = this.getFinalExtension();\r\n\r\n return `${baseName}.${ext}`;\r\n }\r\n\r\n /**\r\n * Resolve prefix based on options and config\r\n * @internal\r\n */\r\n protected resolvePrefix(prefix?: PrefixConfig): string {\r\n // No prefix\r\n if (prefix === false || prefix === undefined) {\r\n const configPrefix = uploadsConfig(\"prefix\");\r\n if (!configPrefix) {\r\n return \"\";\r\n }\r\n // Use config prefix if no explicit prefix provided\r\n prefix = configPrefix;\r\n }\r\n\r\n // Boolean true = use default format\r\n if (prefix === true) {\r\n const format = uploadsConfig(\"defaultPrefixFormat\")!;\r\n return this.formatDatePrefix(format, \"file\");\r\n }\r\n\r\n // String = static prefix\r\n if (typeof prefix === \"string\") {\r\n return prefix;\r\n }\r\n\r\n // PrefixOptions object\r\n const parts: string[] = [];\r\n\r\n // Add date format if specified\r\n if (prefix.format) {\r\n parts.push(this.formatDate(prefix.format));\r\n }\r\n\r\n // Add random string if specified\r\n if (prefix.randomLength) {\r\n parts.push(Random.string(prefix.randomLength));\r\n }\r\n\r\n const combined = parts.join(\"-\");\r\n const as = prefix.as ?? \"file\";\r\n\r\n if (as === \"directory\") {\r\n return combined ? `${combined}/` : \"\";\r\n }\r\n\r\n return combined ? `${combined}-` : \"\";\r\n }\r\n\r\n /**\r\n * Format a date prefix with the given format\r\n * @internal\r\n */\r\n protected formatDatePrefix(format: string, as: \"file\" | \"directory\"): string {\r\n const formatted = this.formatDate(format);\r\n return as === \"directory\" ? `${formatted}/` : `${formatted}-`;\r\n }\r\n\r\n /**\r\n * Format current date using token-based format string\r\n * @internal\r\n */\r\n protected formatDate(format: string): string {\r\n return dayjs().format(format);\r\n }\r\n\r\n /**\r\n * Build final location from directory, prefix, and filename\r\n * @internal\r\n */\r\n protected buildLocation(directory: string, prefix: string, filename: string): string {\r\n // Clean up directory (remove trailing slash)\r\n const dir = directory.replace(/\\/$/, \"\");\r\n\r\n // If prefix ends with /, it's a directory\r\n if (prefix.endsWith(\"/\")) {\r\n return `${dir}/${prefix}${filename}`;\r\n }\r\n\r\n // Otherwise prefix is part of filename\r\n return `${dir}/${prefix}${filename}`;\r\n }\r\n\r\n /**\r\n * Get final extension (accounting for format changes)\r\n * @internal\r\n */\r\n protected getFinalExtension(): string {\r\n if (this._imageOptions.format) {\r\n // Map formats to extensions\r\n const format = this._imageOptions.format;\r\n\r\n if (format === \"jpeg\") return \"jpg\";\r\n\r\n return format;\r\n }\r\n\r\n return this.extension;\r\n }\r\n\r\n /**\r\n * Get final MIME type (accounting for format changes)\r\n * @internal\r\n */\r\n protected getFinalMimeType(): string {\r\n if (this._imageOptions.format) {\r\n const format = this._imageOptions.format;\r\n\r\n if (format === \"jpeg\" || format === \"jpg\") return \"image/jpeg\";\r\n\r\n return `image/${format}`;\r\n }\r\n\r\n return this.mimeType;\r\n }\r\n\r\n /**\r\n * Adjust location to use correct extension if format changed\r\n * @internal\r\n */\r\n protected adjustLocationForFormat(location: string): string {\r\n if (!this._imageOptions.format) {\r\n return location;\r\n }\r\n\r\n const ext = this.getFinalExtension();\r\n const currentExt = path.extname(location);\r\n\r\n if (currentExt) {\r\n return location.replace(currentExt, `.${ext}`);\r\n }\r\n\r\n return `${location}.${ext}`;\r\n }\r\n\r\n // ============================================================\r\n // Serialization\r\n // ============================================================\r\n\r\n /**\r\n * Convert to JSON representation\r\n *\r\n * Includes file metadata and base64 content for serialization.\r\n */\r\n public async toJSON() {\r\n return {\r\n name: this.name,\r\n mimeType: this.mimeType,\r\n extension: this.extension,\r\n size: await this.size(),\r\n isImage: this.isImage,\r\n isVideo: this.isVideo,\r\n isAudio: this.isAudio,\r\n dimensions: this.isImage ? await this.dimensions() : undefined,\r\n base64: (await this.buffer()).toString(\"base64\"),\r\n };\r\n }\r\n}\r\n","import { colors } from \"@mongez/copper\";\r\nimport events from \"@mongez/events\";\r\nimport { trans, transFrom } from \"@mongez/localization\";\r\nimport { Random, except, get, only, rtrim, set, unset } from \"@mongez/reinforcements\";\r\nimport { isEmpty } from \"@mongez/supportive-is\";\r\nimport type { LogLevel } from \"@warlock.js/logger\";\r\nimport { log } from \"@warlock.js/logger\";\r\nimport { BaseValidator, v } from \"@warlock.js/seal\";\r\nimport type { FastifyRequest } from \"fastify\";\r\nimport { type IncomingHttpHeaders } from \"node:http2\";\r\nimport { config } from \"../config/config-getter\";\r\nimport type { Middleware, Route } from \"../router\";\r\nimport { validateAll } from \"../validation/validateAll\";\r\nimport { createRequestStore } from \"./middleware/inject-request-context\";\r\nimport { Response } from \"./response\";\r\nimport type { RequestEvent } from \"./types\";\r\nimport { UploadedFile } from \"./uploaded-file\";\r\n\r\ntype StandardHeaders = {\r\n // copy every declared property from http.IncomingHttpHeaders\r\n // but remove index signatures\r\n [K in keyof IncomingHttpHeaders as string extends K\r\n ? never\r\n : number extends K\r\n ? never\r\n : K]: IncomingHttpHeaders[K];\r\n};\r\n\r\ntype HeaderKeys = keyof StandardHeaders;\r\n\r\nexport class Request<User = any, RequestValidation = any> {\r\n /**\r\n * Fastify Request object\r\n */\r\n public baseRequest!: FastifyRequest;\r\n\r\n /**\r\n * Response Object\r\n */\r\n public response!: Response;\r\n\r\n /**\r\n * Route Object\r\n */\r\n public route!: Route;\r\n\r\n /**\r\n * Parsed Request Payload\r\n */\r\n protected payload: any = {};\r\n\r\n /**\r\n * Current user\r\n */\r\n public user?: User;\r\n\r\n /**\r\n * Decoded access token payload (set by auth middleware)\r\n */\r\n public decodedAccessToken?: any;\r\n\r\n /**\r\n * Current request instance\r\n */\r\n public static current: Request;\r\n\r\n /**\r\n * Translation method\r\n * Type of it is the same as the type of trans function\r\n */\r\n public trans: ReturnType<typeof trans> = trans;\r\n\r\n /**\r\n * Alias to trans method\r\n */\r\n public t: ReturnType<typeof trans> = trans;\r\n\r\n /**\r\n * Dynamic properties index signature\r\n *\r\n * This allows attaching custom properties to the request instance,\r\n * commonly used during validation middleware to attach fetched models.\r\n *\r\n * @example\r\n * // In validation middleware:\r\n * const post = await Post.find(request.int(\"id\"));\r\n * if (!post) return response.notFound();\r\n * request.post = post; // Attach the model to the request\r\n *\r\n * // In route handler:\r\n * const post = request.post;\r\n * // Work with the pre-fetched model\r\n */\r\n [key: string]: any;\r\n\r\n /**\r\n * Locale code\r\n */\r\n protected _locale = \"\";\r\n\r\n /**\r\n * Validated data\r\n */\r\n protected validatedData?: RequestValidation;\r\n\r\n /**\r\n * Request id\r\n */\r\n public id = Random.string(32);\r\n\r\n /**\r\n * Set request handler\r\n */\r\n public setRequest(request: FastifyRequest) {\r\n this.baseRequest = request;\r\n\r\n this.parsePayload();\r\n\r\n const localeCode = this.getLocaleCode();\r\n\r\n this.trans = this.t = transFrom.bind(null, localeCode);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Translate from the given locale code\r\n */\r\n public transFrom(localeCode: string, keyword: string, placeholders?: any) {\r\n return transFrom(localeCode, keyword, placeholders);\r\n }\r\n\r\n /**\r\n * Get current locale code\r\n */\r\n public get locale() {\r\n if (this._locale) return this._locale;\r\n\r\n return this.header(\"translation-locale-code\") || this.localized;\r\n }\r\n\r\n /**\r\n * Set locale code\r\n */\r\n public set locale(localeCode: string) {\r\n this._locale = localeCode;\r\n }\r\n\r\n /**\r\n * Get locale code that will be used for translation\r\n */\r\n public get localized() {\r\n if (this._locale) return this._locale;\r\n\r\n return (this._locale =\r\n this.header(\"locale-code\") ||\r\n this.header(\"locale\") ||\r\n this.query[\"locale\"] ||\r\n this.query[\"locale-code\"]);\r\n }\r\n\r\n /**\r\n * Set locale code\r\n */\r\n public setLocaleCode(localeCode: string) {\r\n this._locale = localeCode;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Get current locale code or return default locale code\r\n */\r\n public getLocaleCode(defaultLocaleCode: string = config.key(\"app.localeCode\") || \"en\") {\r\n return this.locale || defaultLocaleCode;\r\n }\r\n\r\n /**\r\n * Get http protocol\r\n */\r\n public get protocol() {\r\n return this.baseRequest.protocol;\r\n }\r\n\r\n /**\r\n * Validate the given validation schema\r\n */\r\n public async validate(validation: BaseValidator, selectedInputs?: string[]) {\r\n return await v.validate(validation, selectedInputs ? this.only(selectedInputs) : this.all());\r\n }\r\n\r\n /**\r\n * Clear current user\r\n */\r\n public clearCurrentUser() {\r\n this.user = undefined;\r\n }\r\n\r\n /**\r\n * Get value of the given header\r\n */\r\n public header<TCustomHeader extends string = HeaderKeys>(\r\n name: TCustomHeader | HeaderKeys,\r\n defaultValue: any = null,\r\n ) {\r\n return this.baseRequest.headers[name.toLocaleLowerCase()] ?? defaultValue;\r\n }\r\n\r\n /**\r\n * Get the current request domain\r\n */\r\n public get domain() {\r\n return this.baseRequest.hostname.replace(/^www\\./, \"\");\r\n }\r\n\r\n /**\r\n * Get hostname\r\n */\r\n public get hostname() {\r\n return this.domain;\r\n }\r\n\r\n /**\r\n * Get request origin\r\n */\r\n public get origin() {\r\n return this.baseRequest.headers.origin as string;\r\n }\r\n\r\n /**\r\n * Get the domain of the origin\r\n */\r\n public get originDomain() {\r\n const domain = this.origin ? new URL(this.origin).hostname : null;\r\n\r\n if (domain?.startsWith(\"www.\")) {\r\n return domain.replace(/^www\\./, \"\");\r\n }\r\n\r\n return domain;\r\n }\r\n\r\n /**\r\n * Get authorization header value\r\n */\r\n public get authorizationValue(): string {\r\n const authorization = this.header(\"authorization\");\r\n\r\n if (!authorization) return \"\";\r\n\r\n const [type, value] = authorization.split(\" \");\r\n\r\n if (![\"bearer\", \"key\"].includes(type.toLowerCase())) return \"\";\r\n\r\n return value || \"\";\r\n }\r\n\r\n /**\r\n * Get access token from Authorization header\r\n *\r\n * If the Authorization header does not start with `Bearer` value then return null\r\n */\r\n public get accessToken(): string | undefined {\r\n const authorization = this.header(\"authorization\");\r\n\r\n if (!authorization) return;\r\n\r\n const [type, value] = authorization.split(\" \");\r\n\r\n if (type.toLowerCase() !== \"bearer\") return;\r\n\r\n return value;\r\n }\r\n\r\n /**\r\n * Get the authorization header\r\n */\r\n public get authorization() {\r\n return this.header(\"authorization\");\r\n }\r\n\r\n /**\r\n * Get current request method\r\n */\r\n public get method(): string {\r\n return this.baseRequest.method;\r\n }\r\n\r\n /**\r\n * Parse the payload and merge it from the request body, params and query string\r\n */\r\n protected parsePayload() {\r\n this.payload.body = this.parseBody(this.baseRequest.body);\r\n\r\n this.payload.query = this.parseBody(this.baseRequest.query);\r\n this.payload.params = { ...(this.baseRequest.params || {}) };\r\n this.payload.all = {\r\n ...this.payload.body,\r\n ...this.payload.query,\r\n ...this.payload.params,\r\n };\r\n }\r\n\r\n /**\r\n * Parse body payload\r\n */\r\n protected parseBody(data: any) {\r\n try {\r\n if (!data) return {};\r\n\r\n const body: any = {};\r\n\r\n const arrayOfObjectValues: any = {};\r\n\r\n for (let key in data) {\r\n const value = data[key];\r\n\r\n let isArrayKey = false;\r\n\r\n if (key.endsWith(\"[]\")) {\r\n isArrayKey = true;\r\n }\r\n\r\n key = rtrim(key, \"[]\");\r\n\r\n // check if the key is has a square brackets, then convert it into object\r\n // i.e user[email] => user: {email: \"value\"}\r\n // also check if its an array of objects\r\n\r\n if (key.includes(\"[\")) {\r\n // check if its an array of objects\r\n if (key.includes(\"][\")) {\r\n const keyParts = key.split(\"[\");\r\n\r\n const keyName = keyParts[0];\r\n if (!arrayOfObjectValues[keyName]) {\r\n arrayOfObjectValues[keyName] = [];\r\n }\r\n\r\n const keyNameParts = keyParts[1].split(\"]\");\r\n\r\n const index = Number(keyNameParts[0]);\r\n\r\n if (!arrayOfObjectValues[keyName][index]) {\r\n arrayOfObjectValues[keyName][index] = {};\r\n }\r\n\r\n // now get the key after the index\r\n const keyNameParts2 = keyParts[2].split(\"]\");\r\n const keyName2 = keyNameParts2[0];\r\n\r\n arrayOfObjectValues[keyName][index][keyName2] = this.parseValue(value);\r\n\r\n continue;\r\n }\r\n\r\n const keyParts = key.split(\"[\");\r\n const keyName = keyParts[0];\r\n const keyNameParts = keyParts[1].split(\"]\");\r\n\r\n set(\r\n body,\r\n keyName + \".\" + keyNameParts[0],\r\n Array.isArray(value) ? value.map(this.parseValue.bind(this)) : this.parseValue(value),\r\n );\r\n\r\n continue;\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n set(body, key, value.map(this.parseValue.bind(this)));\r\n } else if (isArrayKey) {\r\n if (body[key]) {\r\n body[key].push(this.parseValue(value));\r\n } else {\r\n body[key] = [this.parseValue(value)];\r\n\r\n continue;\r\n }\r\n } else {\r\n set(body, key, this.parseValue(value));\r\n }\r\n }\r\n\r\n // now merge the array of objects into the body\r\n for (const key in arrayOfObjectValues) {\r\n body[key] = arrayOfObjectValues[key];\r\n }\r\n\r\n return body;\r\n } catch (error) {\r\n console.log(error);\r\n this.log(error, \"error\");\r\n }\r\n }\r\n\r\n /**\r\n * Parse the given data\r\n */\r\n protected parseValue(data: any) {\r\n // data.value appears only in the multipart form data\r\n // if it json, then just return the data\r\n if (data?.file) return new UploadedFile(data);\r\n if (data?.value !== undefined && data?.fields && data?.type) {\r\n data = data.value;\r\n }\r\n\r\n if (data === \"false\") return false;\r\n\r\n if (data === \"true\") return true;\r\n\r\n if (data === \"null\") return null;\r\n\r\n if (typeof data === \"string\") return data.trim();\r\n\r\n return data;\r\n }\r\n\r\n /**\r\n * Set route handler\r\n */\r\n public setRoute(route: Route) {\r\n this.route = route;\r\n\r\n // pass the route to the response object\r\n this.response.setRoute(route);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Trigger an http event\r\n */\r\n public trigger(eventName: RequestEvent, ...args: any[]) {\r\n return events.trigger(`request.${eventName}`, ...args, this);\r\n }\r\n\r\n /**\r\n * Listen to the given event\r\n */\r\n public on(eventName: RequestEvent, callback: any) {\r\n return this.subscribe(eventName, callback);\r\n }\r\n\r\n /**\r\n * Make a log message\r\n */\r\n public log(message: any, level: LogLevel = \"info\") {\r\n if (!config.key(\"http.log\")) return;\r\n\r\n log({\r\n module: \"request\",\r\n action: this.route.method + \" \" + this.route.path.replace(\"/*\", \"\") + `:${this.id}`,\r\n message,\r\n type: level,\r\n context: {\r\n request: this,\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Get current request path\r\n */\r\n public get path() {\r\n return this.baseRequest.url;\r\n }\r\n\r\n /**\r\n * {@alias}\r\n */\r\n public get url() {\r\n return this.baseRequest.url;\r\n }\r\n\r\n /**\r\n * Get full url\r\n */\r\n public get fullUrl() {\r\n return this.protocol + \"://\" + this.hostname + this.path;\r\n }\r\n\r\n /**\r\n * Run middleware\r\n */\r\n public async runMiddleware() {\r\n // measure request time\r\n // check for middleware first\r\n const middlewareOutput = await this.executeMiddleware();\r\n\r\n if (middlewareOutput !== undefined) {\r\n // 👇🏻 make sure first its not a response instance\r\n if (middlewareOutput instanceof Response) return middlewareOutput;\r\n // 👇🏻 send the response\r\n return this.response.send(middlewareOutput);\r\n }\r\n\r\n const handler = this.route.handler;\r\n\r\n if (!handler.validation) return;\r\n\r\n // 👇🏻 check for validation using validateAll helper function\r\n const validationOutput = await validateAll(handler.validation, this, this.response);\r\n\r\n return validationOutput;\r\n }\r\n\r\n /**\r\n * Get route handler\r\n */\r\n public getHandler() {\r\n return this.route.handler;\r\n }\r\n\r\n /**\r\n * Get inputs that has been validated only\r\n * You can also pass an array of inputs to get only the validated inputs\r\n */\r\n public validated<Output = RequestValidation>(inputs?: string[]): Output {\r\n if (this.validatedData) {\r\n return inputs ? only(this.validatedData as Output, inputs) : (this.validatedData as Output);\r\n }\r\n\r\n return {} as Output;\r\n }\r\n\r\n /**\r\n * Get inputs that has been validated except the given inputs\r\n */\r\n public validatedExcept(...inputs: string[]): RequestValidation {\r\n return except(this.validated(), inputs);\r\n }\r\n\r\n /**\r\n * Set validated data\r\n */\r\n public setValidatedData(data: RequestValidation) {\r\n this.validatedData = data;\r\n }\r\n\r\n /**\r\n * Execute the request\r\n */\r\n public async execute() {\r\n try {\r\n // call executingAction event\r\n\r\n this.log(\"Executing the request\");\r\n\r\n return await createRequestStore(this, this.response);\r\n } catch (error) {\r\n this.log(error, \"error\");\r\n\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Execute middleware list of current route\r\n */\r\n protected async executeMiddleware() {\r\n // collect all middlewares for current route\r\n const middlewares = this.collectMiddlewares();\r\n\r\n // check if there are no middlewares, then return\r\n if (middlewares.length === 0) return;\r\n\r\n this.log(\"About to execute request middlewares\");\r\n\r\n // trigger the executingMiddleware event\r\n this.trigger(\"executingMiddleware\", middlewares, this.route);\r\n\r\n for (const middleware of middlewares) {\r\n this.log(\"Executing middleware \" + colors.yellowBright(middleware.name));\r\n const output = await middleware(this, this.response);\r\n this.log(\"Executed middleware \" + colors.yellowBright(middleware.name), \"success\");\r\n\r\n if (output !== undefined) {\r\n this.log(\r\n colors.yellow(\"request intercepted by middleware \") + colors.cyanBright(middleware.name),\r\n \"warn\",\r\n );\r\n\r\n this.trigger(\"executedMiddleware\");\r\n\r\n this.log(\"Request middlewares executed\", \"success\");\r\n\r\n return output;\r\n }\r\n }\r\n\r\n this.log(\"Request middlewares executed\", \"success\");\r\n\r\n // trigger the executedMiddleware event\r\n this.trigger(\"executedMiddleware\", middlewares, this.route);\r\n }\r\n\r\n /**\r\n * Collect middlewares for current route\r\n */\r\n protected collectMiddlewares(): Middleware[] {\r\n const middlewaresList: Middleware[] = [];\r\n\r\n // collect route middlewares\r\n if (this.route.middleware) {\r\n middlewaresList.push(...this.route.middleware);\r\n }\r\n\r\n return middlewaresList;\r\n }\r\n\r\n /**\r\n * Get request input value from query string, params or body\r\n */\r\n public input(key: string, defaultValue?: any) {\r\n return get(this.payload.all, key, defaultValue);\r\n }\r\n\r\n /**\r\n * Get email input value, this will lowercase the value\r\n */\r\n public email(key: string = \"email\", defaultValue: string = \"\"): string {\r\n return this.input(key, defaultValue)?.toLowerCase() || defaultValue;\r\n }\r\n\r\n /**\r\n * @alias input\r\n */\r\n public get(key: string, defaultValue?: any) {\r\n return this.input(key, defaultValue);\r\n }\r\n\r\n /**\r\n * Determine if request has input value\r\n */\r\n public has(key: string) {\r\n return get(this.payload.all, key, undefined) !== undefined;\r\n }\r\n\r\n /**\r\n * Set request input value\r\n */\r\n public set(key: string, value: any) {\r\n set(this.payload.all, key, value);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set the given value if the request does not have the input\r\n */\r\n public setDefault(key: string, value: any) {\r\n if (this.has(key)) return this;\r\n\r\n set(this.payload.all, key, value);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Unset request payload keys\r\n */\r\n public unset(...keys: string[]) {\r\n this.payload.all = unset(this.payload.all, keys);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Get request body\r\n */\r\n public get body() {\r\n return this.payload.body;\r\n }\r\n\r\n /**\r\n * Set request body value\r\n */\r\n public setBody(key: string, value: any) {\r\n set(this.payload.body, key, value);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Get body inputs except files\r\n */\r\n public get bodyInputs() {\r\n const inputs = this.payload.body;\r\n\r\n const bodyInputs: any = {};\r\n\r\n for (const key in inputs) {\r\n const value = inputs[key];\r\n\r\n if (value.file && value.fieldname) continue;\r\n\r\n bodyInputs[key] = value;\r\n }\r\n\r\n return bodyInputs;\r\n }\r\n\r\n /**\r\n * Get request file in UploadedFile instance\r\n */\r\n public file(key: string): UploadedFile | undefined {\r\n const file = this.input(key);\r\n\r\n return file;\r\n }\r\n\r\n /**\r\n * Get uploaded files from the request for the given name\r\n * If the given name is not present in the request, return an empty array\r\n */\r\n public files(name: string): UploadedFile[] {\r\n return this.input(name) || [];\r\n }\r\n\r\n /**\r\n * Get request params\r\n */\r\n public get params() {\r\n return this.payload.params;\r\n }\r\n\r\n /**\r\n * Set request params value\r\n */\r\n public setParam(key: string, value: any) {\r\n set(this.payload.params, key, value);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Get request query\r\n */\r\n public get query() {\r\n return this.payload.query;\r\n }\r\n\r\n /**\r\n * Set request query value\r\n */\r\n public setQuery(key: string, value: any) {\r\n set(this.payload.query, key, value);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Get all inputs\r\n */\r\n public all() {\r\n return this.payload.all;\r\n }\r\n\r\n /**\r\n * Get all inputs except params\r\n */\r\n public allExceptParams() {\r\n return {\r\n ...this.payload.query,\r\n ...this.payload.body,\r\n };\r\n }\r\n\r\n /**\r\n * Get all heavy inputs except params\r\n */\r\n public heavyExceptParams() {\r\n const inputs = this.allExceptParams();\r\n\r\n const heavyInputs: any = {};\r\n\r\n for (const key in inputs) {\r\n const value = inputs[key];\r\n\r\n if (isEmpty(value) && value !== null) continue;\r\n\r\n heavyInputs[key] = value;\r\n }\r\n\r\n return heavyInputs;\r\n }\r\n\r\n /**\r\n * Get only heavy inputs, the input with a value\r\n */\r\n public heavy() {\r\n const inputs = this.all();\r\n\r\n const heavyInputs: any = {};\r\n\r\n for (const key in inputs) {\r\n const value = inputs[key];\r\n\r\n if (isEmpty(value) && value !== null) continue;\r\n\r\n heavyInputs[key] = value;\r\n }\r\n\r\n return heavyInputs;\r\n }\r\n\r\n /**\r\n * Get only the given keys from the request data\r\n */\r\n public only(keys: string[]) {\r\n return only(this.all(), keys);\r\n }\r\n\r\n /**\r\n * Pluck the given keys from the request data\r\n */\r\n public pluck(keys: string[]) {\r\n const data = this.only(keys);\r\n\r\n this.unset(...keys);\r\n\r\n return data;\r\n }\r\n\r\n /**\r\n * Get all request inputs except the given keys\r\n */\r\n public except(keys: string[]) {\r\n return except(this.all(), keys);\r\n }\r\n\r\n /**\r\n * Get boolean input value\r\n */\r\n public bool(key: string, defaultValue = false) {\r\n const value = this.input(key, defaultValue);\r\n\r\n if (value === \"true\") {\r\n return true;\r\n }\r\n\r\n if (value === \"false\") {\r\n return false;\r\n }\r\n\r\n if (value === 0) {\r\n return false;\r\n }\r\n\r\n return Boolean(value);\r\n }\r\n\r\n /**\r\n * Get integer input value\r\n */\r\n public int(key: string, defaultValue: number = 0): number {\r\n const value = this.input(key, defaultValue);\r\n\r\n return parseInt(value);\r\n }\r\n\r\n /**\r\n * Shorthand getter to get id param\r\n */\r\n public get idParam() {\r\n return this.int(\"id\");\r\n }\r\n\r\n /**\r\n * Get string input value\r\n */\r\n public string(key: string, defaultValue: string = \"\"): string {\r\n const value = this.input(key, defaultValue);\r\n\r\n return String(value);\r\n }\r\n\r\n /**\r\n * Get float input value\r\n */\r\n public float(key: string, defaultValue: number = 0): number {\r\n const value = this.input(key, defaultValue);\r\n\r\n return parseFloat(value) || 0;\r\n }\r\n\r\n /**\r\n * Get number input value\r\n */\r\n public number(key: string, defaultValue: number = 0): number {\r\n const value = Number(this.input(key, defaultValue));\r\n\r\n return isNaN(value) ? defaultValue : value;\r\n }\r\n\r\n /**\r\n * Get request ip\r\n */\r\n public get ip() {\r\n return this.baseRequest.ip;\r\n }\r\n\r\n /**\r\n * Detect proper ip\r\n */\r\n public detectIp() {\r\n // as the server maybe used behind a proxy\r\n // then we need to check first if there is a forwarded ip\r\n // check for the real-ip header\r\n\r\n const realIp = this.header(\"x-real-ip\");\r\n\r\n if (realIp) return realIp;\r\n\r\n const forwardedIp = this.header(\"x-forwarded-for\");\r\n\r\n return forwardedIp || this.baseRequest.ip;\r\n }\r\n\r\n /**\r\n * An alias to detectIp\r\n */\r\n public get realIp() {\r\n return this.detectIp();\r\n }\r\n\r\n /**\r\n * Get request ips\r\n */\r\n public get ips() {\r\n return this.baseRequest.ips;\r\n }\r\n\r\n /**\r\n * Get request referer\r\n */\r\n public get referer() {\r\n return this.baseRequest.headers.referer;\r\n }\r\n\r\n /**\r\n * Get user agent\r\n */\r\n public get userAgent() {\r\n return this.baseRequest.headers[\"user-agent\"];\r\n }\r\n\r\n /**\r\n * Get request headers\r\n */\r\n public get headers() {\r\n return this.baseRequest.headers;\r\n }\r\n}\r\n","import FindMyWay, { type HTTPMethod, type Instance } from \"find-my-way\";\r\nimport type { Route } from \"./types\";\r\n\r\n/**\r\n * Route Registry\r\n * Manages dynamic route matching using find-my-way for HMR support\r\n */\r\nexport class RouteRegistry {\r\n private router: Instance<any>;\r\n\r\n public constructor() {\r\n this.router = FindMyWay({\r\n ignoreTrailingSlash: true,\r\n caseSensitive: false,\r\n });\r\n }\r\n\r\n /**\r\n * Register all routes from the router's internal list\r\n */\r\n public register(routes: Route[]): void {\r\n // Register each route\r\n for (const route of routes) {\r\n if (route.method === \"all\") {\r\n this.registerRoute({\r\n ...route,\r\n method: \"GET\",\r\n });\r\n\r\n this.registerRoute({\r\n ...route,\r\n method: \"POST\",\r\n });\r\n } else {\r\n this.registerRoute(route);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Register a single route\r\n */\r\n public registerRoute(route: Route): void {\r\n this.router.on(route.method as HTTPMethod, route.path, (req, res, params) => {\r\n // Store the route and params for later use\r\n return { route, params };\r\n });\r\n }\r\n\r\n /**\r\n * Find a matching route for the given method and URL\r\n * @returns Matched route with extracted params, or null if no match\r\n */\r\n public find(\r\n method: string,\r\n url: string,\r\n ): { route: Route; params: Record<string, string> } | null {\r\n // Strip query string from URL (find-my-way expects just the path)\r\n const path = url.split(\"?\")[0];\r\n\r\n const match = this.router.find(method as HTTPMethod, path);\r\n\r\n if (!match) {\r\n return null;\r\n }\r\n\r\n // find-my-way handler expects (req, res, params, store, searchParams)\r\n // We only care about the return value which contains { route, params }\r\n return match.handler(null as any, null as any, match.params, match.store, {});\r\n }\r\n\r\n /**\r\n * Get all registered routes count (for debugging)\r\n */\r\n public getRouteCount(): number {\r\n return this.router\r\n .prettyPrint()\r\n .split(\"\\n\")\r\n .filter((line) => line.trim()).length;\r\n }\r\n}\r\n","import proxy, { type FastifyHttpProxyOptions } from \"@fastify/http-proxy\";\nimport fastifyStatic, { type FastifyStaticOptions } from \"@fastify/static\";\nimport concatRoute from \"@mongez/concat-route\";\nimport { ltrim, merge, toCamelCase, trim } from \"@mongez/reinforcements\";\nimport { isEmpty } from \"@mongez/supportive-is\";\nimport { log } from \"@warlock.js/logger\";\nimport type { FastifyReply, FastifyRequest } from \"fastify\";\nimport { Request } from \"../http/request\";\nimport { Response } from \"../http/response\";\nimport { type FastifyInstance } from \"../http/server\";\nimport { RouteRegistry } from \"./route-registry\";\nimport type {\n GroupedRoutesOptions,\n ResourceMethod,\n Route,\n RouteHandler,\n RouteHandlerType,\n RouteHandlerValidation,\n RouteOptions,\n RouteResource,\n RouterGroupCallback,\n RouterStacks,\n} from \"./types\";\n\nexport class Router {\n /**\n * Routes list\n */\n private routes: Route[] = [];\n\n /**\n * Router Instance\n */\n private static instance: Router;\n\n /**\n * Static paths\n */\n protected staticDirectories: FastifyStaticOptions[] = [];\n\n /**\n * Event listeners\n */\n protected eventListeners: Record<string, ((router: Router, server: FastifyInstance) => void)[]> =\n {};\n\n /**\n * Stacks\n * Stacks will be used for grouping routes to add prefix, name or middleware\n */\n protected stacks: RouterStacks = {\n prefix: [],\n name: [],\n middleware: [],\n };\n\n /**\n * Get router instance\n */\n public static getInstance() {\n if (!Router.instance) {\n Router.instance = new Router();\n }\n\n return Router.instance;\n }\n\n private constructor() {\n //\n }\n\n /**\n * Listen to router before scan\n */\n public beforeScanning(callback: (router: Router, server: FastifyInstance) => void) {\n this.eventListeners.beforeScan = [...(this.eventListeners.beforeScan || []), callback];\n\n return this;\n }\n\n /**\n * Listen to router after scanning\n */\n public afterScanning(callback: (router: Router, server: FastifyInstance) => void) {\n this.eventListeners.afterScanning = [...(this.eventListeners.afterScanning || []), callback];\n\n return this;\n }\n\n /**\n * Redirect path to another path\n */\n public redirect(from: string, to: string, redirectMode: \"temporary\" | \"permanent\" = \"temporary\") {\n return this.get(from, (_request, response) => {\n response.redirect(to, redirectMode === \"temporary\" ? 302 : 301);\n });\n }\n\n /**\n * Server static folder\n */\n public directory(options: FastifyStaticOptions) {\n this.staticDirectories.push(options);\n\n return this;\n }\n\n /**\n * Serve file\n */\n public file(path: string, location: string, cacheTime?: number) {\n return this.get(path, (_request, response) => {\n response.sendFile(location, cacheTime);\n });\n }\n\n /**\n * Serve cached file, it will cache the file to 1 year by default\n */\n public cachedFile(path: string, location: string, cacheTime?: number) {\n return this.get(path, (_request, response) => {\n response.sendCachedFile(location, cacheTime);\n });\n }\n\n /**\n * Serve list of files\n */\n public files(files: Record<string, string>, cacheTime?: number) {\n for (const [path, location] of Object.entries(files)) {\n this.get(path, (_request, response) => {\n response.sendFile(location, cacheTime);\n });\n }\n }\n\n /**\n * Serve list of cached files, it will cache the file to 1 year by default\n */\n public cachedFiles(files: Record<string, string>, cacheTime?: number) {\n for (const [path, location] of Object.entries(files)) {\n this.get(path, (_request, response) => {\n response.sendCachedFile(location, cacheTime);\n });\n }\n }\n\n /**\n * Add proxy route\n */\n public proxy(options: FastifyHttpProxyOptions) {\n this.beforeScanning((_router, server) => {\n server.register(proxy, options);\n });\n\n return this;\n }\n\n /**\n * Add route to routes list\n */\n public add(\n method: Route[\"method\"],\n path: string | string[],\n handler: RouteHandlerType,\n options: RouteOptions = {},\n ) {\n if (Array.isArray(path)) {\n path.forEach((p) => this.add(method, p, handler, options));\n return this;\n }\n\n const prefix = this.stacks.prefix.reduce((path, prefix) => {\n return concatRoute(path, prefix);\n }, \"\");\n\n const name = this.stacks.name.reduceRight(\n (name, prefixName) => {\n return trim(prefixName + \".\" + name, \".\");\n },\n options.name || trim(path.replace(/\\//g, \".\"), \".\"),\n );\n\n path = concatRoute(prefix, path);\n\n const middlewarePrecedence = options.middlewarePrecedence || \"after\";\n\n if (middlewarePrecedence === \"before\") {\n options.middleware = [...(options.middleware || []), ...this.stacks.middleware];\n } else {\n options.middleware = [...this.stacks.middleware, ...(options.middleware || [])];\n }\n\n if (Array.isArray(handler)) {\n const [controller, action] = handler;\n\n if (typeof controller[action] !== \"function\") {\n throw new Error(\n `Invalid controller action \"${action}\" for controller \"${controller.constructor.name}\"`,\n );\n }\n\n handler = controller[action].bind(controller) as RouteHandler;\n\n if (!handler.validation) {\n handler.validation = {};\n if (controller[`${action}ValidationSchema`]) {\n handler.validation.schema = controller[`${action}ValidationSchema`]();\n }\n\n if (controller[`${action}Validate`]) {\n handler.validation.validate = controller[`${action}Validate`];\n }\n }\n }\n\n const routeData: Route = {\n method,\n path,\n handler,\n ...options,\n name,\n rateLimit: options.rateLimit,\n $prefix: prefix || \"/\",\n // it must be a new array to avoid modifying the original array\n $prefixStack: [...this.stacks.prefix],\n // Inject source file from stacks if set\n sourceFile: this.stacks.sourceFile || \"\",\n };\n\n if (routeData.name) {\n // check if the name exists\n const route = this.routes.find((route) => route.name === routeData.name);\n\n if (route) {\n // check again if the route name exists with the same method\n if (route.method === routeData.method) {\n throw new Error(`Route name \"${routeData.name}\" already exists`);\n } else {\n routeData.name += `.${routeData.method.toLowerCase()}`;\n }\n }\n }\n\n this.routes.push(routeData);\n\n return this;\n }\n\n /**\n * Add a request that accepts all methods\n */\n public any(path: string, handler: RouteHandlerType, options: RouteOptions = {}) {\n return this.add(\"all\" as Route[\"method\"], path, handler, options);\n }\n\n /**\n * Add get request method\n */\n public get(path: string, handler: RouteHandlerType, options: RouteOptions = {}) {\n return this.add(\"GET\", path, handler, options);\n }\n\n /**\n * Add post request method\n */\n public post(path: string | string[], handler: RouteHandlerType, options: RouteOptions = {}) {\n return this.add(\"POST\", path, handler, options);\n }\n\n /**\n * Add put request method\n */\n public put(path: string, handler: RouteHandlerType, options: RouteOptions = {}) {\n return this.add(\"PUT\", path, handler, options);\n }\n\n /**\n * Add delete request method\n */\n public delete(path: string | string[], handler: RouteHandlerType, options: RouteOptions = {}) {\n return this.add(\"DELETE\", path, handler, options);\n }\n\n /**\n * Add patch request method\n */\n public patch(path: string, handler: RouteHandlerType, options: RouteOptions = {}) {\n return this.add(\"PATCH\", path, handler, options);\n }\n\n /**\n * Add head request method\n */\n public head(path: string, handler: RouteHandlerType, options: RouteOptions = {}) {\n return this.add(\"HEAD\", path, handler, options);\n }\n\n /**\n * Add options request method\n */\n public options(path: string, handler: RouteHandlerType, options: RouteOptions = {}) {\n return this.add(\"OPTIONS\", path, handler, options);\n }\n\n /**\n * Add full restful resource routes\n * This method will generate the following routes:\n * 1. GET /path: list all resources\n * 2. GET /path/:id: get a single resource\n * 3. POST /path: create a new resource\n * 4. PUT /path/:id: update a resource\n * 5. DELETE /path/:id: delete a resource\n * 6. PATCH /path/:id: update a resource partially\n */\n public restfulResource(\n path: string,\n resource: RouteResource,\n options: RouteOptions & {\n only?: ResourceMethod[];\n except?: ResourceMethod[];\n replace?: Partial<Record<ResourceMethod, RouteHandler>> & {\n bulkDelete?: RouteHandler;\n };\n } = {},\n ) {\n return this.prefix(path, () => {\n path = \"\";\n // get base resource name\n const baseResourceName = options.name || toCamelCase(ltrim(path, \"/\"));\n\n // clone the resource so we don't mess up with it\n const routeResource = resource;\n\n const isAcceptableResource = (type: ResourceMethod) => {\n return Boolean(\n // check if the route is not excluded\n (!options.except || !options.except.includes(type)) &&\n // check if the only option is set and the route is included\n (!options.only || options.only.includes(type)),\n );\n };\n\n if (routeResource.list && isAcceptableResource(\"list\")) {\n const resourceName = baseResourceName + \".list\";\n this.get(path, options.replace?.list || routeResource.list.bind(routeResource), {\n ...options,\n name: resourceName,\n restful: true,\n });\n }\n\n if (routeResource.get && isAcceptableResource(\"get\")) {\n const resourceName = baseResourceName + \".single\";\n\n this.get(path + \"/:id\", options.replace?.get || routeResource.get.bind(routeResource), {\n ...options,\n name: resourceName,\n restful: true,\n });\n }\n\n if (routeResource.create && isAcceptableResource(\"create\")) {\n const resourceName = baseResourceName + \".create\";\n\n const handler = options.replace?.create || this.manageValidation(routeResource, \"create\");\n\n this.post(path, handler, {\n ...options,\n name: resourceName,\n restful: true,\n });\n }\n\n if (routeResource.update && isAcceptableResource(\"update\")) {\n const resourceName = baseResourceName + \".update\";\n\n const handler = options.replace?.update || this.manageValidation(routeResource, \"update\");\n\n this.put(path + \"/:id\", handler, {\n ...options,\n name: resourceName,\n restful: true,\n });\n }\n\n if (routeResource.patch && isAcceptableResource(\"patch\")) {\n const resourceName = baseResourceName + \".patch\";\n\n const handler = options.replace?.patch || this.manageValidation(routeResource, \"patch\");\n\n this.patch(path + \"/:id\", handler, {\n ...options,\n name: resourceName,\n restful: true,\n });\n }\n\n if (routeResource.delete && isAcceptableResource(\"delete\")) {\n const resourceName = baseResourceName + \".delete\";\n\n this.delete(\n path + \"/:id\",\n options.replace?.delete || routeResource.delete.bind(routeResource),\n {\n ...options,\n name: resourceName,\n restful: true,\n },\n );\n }\n\n if (routeResource.bulkDelete && isAcceptableResource(\"delete\")) {\n const resourceName = baseResourceName + \".bulkDelete\";\n\n this.delete(\n path,\n options.replace?.bulkDelete || routeResource.bulkDelete.bind(routeResource),\n {\n ...options,\n name: resourceName,\n restful: true,\n },\n );\n }\n\n return this;\n });\n }\n\n /**\n * Group routes with options\n */\n public group(options: GroupedRoutesOptions, callback: RouterGroupCallback) {\n const {\n prefix,\n // name must always be defined because\n // if there are multiple groups without name\n // they might generate the same route name\n // thus causing an error\n // in this case we need always to make sure that\n // the name is always defined.\n name = prefix ? trim(prefix.replace(/\\//g, \".\"), \".\") : undefined,\n middleware,\n } = options;\n\n if (prefix) {\n this.stacks.prefix.push(prefix);\n }\n\n if (name) {\n this.stacks.name.push(name);\n }\n\n if (middleware) {\n this.stacks.middleware.push(...middleware);\n }\n\n callback();\n\n if (prefix) {\n this.stacks.prefix.pop();\n }\n\n if (name) {\n this.stacks.name.pop();\n }\n\n if (middleware) {\n this.stacks.middleware.splice(\n this.stacks.middleware.length - middleware.length,\n middleware.length,\n );\n }\n\n return this;\n }\n\n /**\n * Add prefix to all routes in the given callback\n */\n public prefix(prefix: string, callback: () => void) {\n return this.group({ prefix }, callback);\n }\n\n /**\n * Wrap route additions with a source file path\n * Used for tracking which routes come from which file (for HMR)\n * @param sourceFile Relative path to the source file (e.g., \"src/app/users/routes.ts\")\n * @param callback Function that adds routes (will have sourceFile injected)\n */\n public async withSourceFile<T = any>(\n sourceFile: string,\n callback: () => T | Promise<T>,\n ): Promise<T | undefined> {\n // Set source file in stacks\n this.stacks.sourceFile = sourceFile;\n\n try {\n // Execute callback (routes added here will have sourceFile injected)\n return await callback();\n } catch (error) {\n console.log(\"Error in withSourceFile\", error);\n } finally {\n // Always clear source file from stacks\n delete this.stacks.sourceFile;\n }\n }\n\n /**\n * Remove all routes that belong to a specific source file\n * Used when reloading routes files via HMR\n * @param sourceFile Relative path to the source file\n */\n public removeRoutesBySourceFile(sourceFile: string): void {\n this.routes = this.routes.filter((route) => route.sourceFile !== sourceFile);\n }\n\n /**\n * Manage validation system for the given resource\n */\n private manageValidation(resource: RouteResource, method: \"create\" | \"update\" | \"patch\") {\n const handler = resource[method]?.bind(resource) as RouteHandler;\n\n const methodValidation = resource?.validation?.[method];\n\n if (method === \"patch\") {\n handler.validation = methodValidation;\n\n if (handler.validation?.validate) {\n handler.validation.validate = handler.validation.validate.bind(resource);\n }\n\n if (resource.validation?.patch) {\n handler.validation = merge(resource.validation.patch, handler.validation);\n }\n\n return handler;\n }\n\n if (!resource.validation || (!methodValidation && !resource.validation.all)) return handler;\n\n if (resource.validation.all) {\n const validationMethods = {\n all: resource?.validation?.all?.validate,\n [method]: methodValidation?.validate,\n };\n\n const validation: RouteHandlerValidation = {};\n\n if (resource.validation.all.schema || methodValidation?.schema) {\n if (!methodValidation?.schema && resource.validation.all.schema) {\n // Case 2: Only all.schema exists - clone it for this method\n validation.schema = resource.validation.all.schema;\n } else if (methodValidation?.schema && resource.validation.all.schema) {\n // Case 3: Both exist - merge them (all is base, method overrides)\n validation.schema = resource.validation.all.schema.merge(methodValidation.schema);\n } else if (methodValidation?.schema && !resource.validation.all.schema) {\n // Case 1: Only method schema exists - use it directly\n validation.schema = methodValidation.schema;\n }\n // Case 4: Neither exists - handled by outer if being false\n }\n\n if (validationMethods.all || validationMethods[method]) {\n validation.validate = async (request: Request, response: Response) => {\n if (validationMethods.all) {\n const output = await validationMethods.all.call(resource, request, response);\n\n if (output) return output;\n }\n\n if (validationMethods[method]) {\n return await validationMethods[method]?.call(resource, request, response);\n }\n\n return;\n };\n }\n\n if (!isEmpty(validation)) {\n handler.validation = validation;\n }\n } else {\n handler.validation = resource.validation[method];\n\n if (handler.validation?.validate) {\n handler.validation.validate = handler.validation.validate.bind(resource);\n }\n }\n\n return handler;\n }\n\n /**\n * Get all routes list\n */\n public list() {\n return this.routes;\n }\n\n /**\n * Register routes to the server\n */\n public scan(server: FastifyInstance) {\n this.eventListeners.beforeScan?.forEach((callback) => callback(this, server));\n\n this.routes.forEach((route) => {\n const requestMethod = route.method.toLowerCase();\n const requestMethodFunction = server[requestMethod].bind(server);\n\n const options = {\n ...route.serverOptions,\n config: {\n ...route.serverOptions?.config,\n ...(route.rateLimit && { rateLimit: route.rateLimit }),\n },\n };\n\n requestMethodFunction(\n route.path,\n options,\n async (baseRequest: FastifyRequest, reply: FastifyReply) => {\n const { output, response } = await this.handleRoute(route)(baseRequest, reply);\n\n return output || response.baseResponse;\n },\n );\n });\n\n for (const directoryOptions of this.staticDirectories) {\n server.register(fastifyStatic, {\n ...directoryOptions,\n decorateReply: false,\n });\n }\n\n this.eventListeners.afterScanning?.forEach((callback) => callback(this, server));\n }\n\n /**\n * Scan routes for the development server\n * Uses wildcard routing with find-my-way for HMR support\n */\n public scanDevServer(server: FastifyInstance) {\n this.eventListeners.beforeScan?.forEach((callback) => callback(this, server));\n\n // Shared handler for wildcard routing\n const wildcardHandler = async (fastifyRequest: FastifyRequest, fastifyReply: FastifyReply) => {\n // Initialize route registry once (will be rebuilt on HMR via rebuildRouteRegistry)\n const routeRegistry = new RouteRegistry();\n\n routeRegistry.register(this.routes);\n // Find matching route using find-my-way\n const match = routeRegistry.find(fastifyRequest.method, fastifyRequest.url);\n\n // No match found - return 404\n if (!match) {\n return fastifyReply.code(404).send({\n error: \"Route not found\",\n path: fastifyRequest.url,\n method: fastifyRequest.method,\n });\n }\n\n // Inject extracted params into the request\n fastifyRequest.params = match.params;\n\n try {\n // Call the matched route handler\n const { output, response } = await this.handleRoute(match.route)(\n fastifyRequest,\n fastifyReply,\n );\n\n return output || response.baseResponse;\n } catch (error) {\n console.log(error);\n throw error;\n }\n };\n\n // Register wildcard route for all methods EXCEPT OPTIONS (to avoid conflict with CORS)\n // OPTIONS is handled by @fastify/cors plugin for preflight requests\n const methods = [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\"] as const;\n for (const method of methods) {\n server.route({\n method,\n url: \"*\",\n handler: wildcardHandler,\n });\n }\n\n // Register static directories\n for (const directoryOptions of this.staticDirectories) {\n server.register(fastifyStatic, {\n ...directoryOptions,\n decorateReply: false,\n });\n }\n\n this.eventListeners.afterScanning?.forEach((callback) => callback(this, server));\n }\n\n /**\n * Get the route path for the given route name\n */\n public route(name: string, params: any = {}) {\n const route = this.routes.find((route) => route.name === name);\n\n if (!route) {\n throw new Error(`Route name \"${name}\" not found`);\n }\n\n let path = route.path;\n\n if (route.path.includes(\":\")) {\n Object.keys(params).forEach((key) => {\n path = path.replace(\":\" + key, params[key]);\n });\n }\n\n return path;\n }\n\n /**\n * Handle the given route\n */\n private handleRoute(route: Route) {\n return async (fastifyRequest: FastifyRequest, fastifyResponse: FastifyReply) => {\n const request = new Request();\n const response = new Response();\n response.setResponse(fastifyResponse);\n request.response = response;\n\n response.request = request;\n\n request.setRequest(fastifyRequest).setRoute(route);\n\n Request.current = request;\n\n log.info({\n module: \"route\",\n action: route.method + \" \" + route.path.replace(\"/*\", \"\"),\n message: `Starting Request: ${request.id}`,\n context: {\n request,\n response,\n },\n });\n\n const result = await request.execute();\n\n return {\n output: result,\n response,\n request,\n };\n };\n }\n}\n\nexport const router = Router.getInstance();\n","import { router } from \"../router/router\";\r\nimport { devLogError, formatModuleNotFoundError } from \"./dev-logger\";\r\nimport { exportAnalyzer } from \"./export-analyzer\";\r\nimport type { FileManager } from \"./file-manager\";\r\nimport type { SpecialFilesCollector } from \"./special-files-collector\";\r\n\r\n/**\r\n * Module Loader\r\n * Dynamically loads and manages application modules (main, routes, events, locales)\r\n * Handles module cache invalidation for HMR\r\n */\r\nexport class ModuleLoader {\r\n /**\r\n * Loaded modules cache\r\n * Maps absolute path to loaded module\r\n */\r\n private readonly loadedModules = new Map<string, any>();\r\n\r\n /**\r\n * Constructor\r\n */\r\n constructor(private readonly specialFilesCollector: SpecialFilesCollector) {}\r\n\r\n /**\r\n * Load all special files in correct order\r\n */\r\n public async loadAll(): Promise<void> {\r\n // Load in specific order\r\n await this.loadLocaleFiles();\r\n await this.loadEventFiles();\r\n await this.loadMainFiles();\r\n await this.loadRouteFiles();\r\n }\r\n\r\n /**\r\n * Load all main.ts files\r\n * Main files are module entry points that run initialization code\r\n * Loaded in parallel as they should be independent\r\n */\r\n public async loadMainFiles(): Promise<void> {\r\n const mainFiles = this.specialFilesCollector.getMainFiles();\r\n\r\n if (mainFiles.length === 0) {\r\n return;\r\n }\r\n\r\n // Load all main files in parallel\r\n for (const file of mainFiles) {\r\n await this.loadModule(file, \"main\");\r\n }\r\n }\r\n\r\n /**\r\n * Load all locale files\r\n * Locale files register translations\r\n * Loaded in parallel as they are independent\r\n */\r\n public async loadLocaleFiles(): Promise<void> {\r\n const localeFiles = this.specialFilesCollector.getLocaleFiles();\r\n\r\n if (localeFiles.length === 0) {\r\n return;\r\n }\r\n\r\n // Load all locale files in parallel\r\n for (const file of localeFiles) {\r\n await this.loadModule(file, \"locale\");\r\n }\r\n }\r\n\r\n /**\r\n * Load all event files\r\n * Event files register event handlers\r\n * Loaded in parallel as they are independent\r\n */\r\n public async loadEventFiles(): Promise<void> {\r\n const eventFiles = this.specialFilesCollector.getEventFiles();\r\n\r\n if (eventFiles.length === 0) {\r\n return;\r\n }\r\n\r\n // Load all event files in parallel\r\n for (const file of eventFiles) {\r\n await this.loadModule(file, \"event\");\r\n }\r\n }\r\n\r\n /**\r\n * Load all route files\r\n * Route files register HTTP routes\r\n * Loaded sequentially as order might matter\r\n */\r\n public async loadRouteFiles(): Promise<void> {\r\n const routeFiles = this.specialFilesCollector.getRouteFiles();\r\n\r\n if (routeFiles.length === 0) {\r\n return;\r\n }\r\n\r\n // Load route files sequentially\r\n // because we are registering the source file, we must load routes sequentially\r\n for (const file of routeFiles) {\r\n await this.loadModule(file, \"route\");\r\n }\r\n }\r\n\r\n /**\r\n * Load a single module\r\n * @param file FileManager instance\r\n * @param type Module type for logging\r\n * @param bustCache Whether to add timestamp for cache busting (for HMR)\r\n */\r\n public async loadModule<T = any>(\r\n file: FileManager,\r\n type: string,\r\n bustCache: boolean = false,\r\n ): Promise<T | undefined> {\r\n if (file.relativePath.endsWith(\".env\")) {\r\n // do nothing\r\n return;\r\n }\r\n\r\n // devLogInfo(`Loading module: ${file.relativePath} (${type})`);\r\n\r\n // Convert to file:// URL for cross-platform compatibility\r\n try {\r\n // For route files, wrap the import with source file tracking\r\n if (type === \"route\") {\r\n return await router.withSourceFile(file.relativePath, async () => {\r\n // Dynamic import the module (routes will be registered with sourceFile)\r\n\r\n const module =\r\n typeof __import !== \"undefined\"\r\n ? await __import(file.cachePath)\r\n : await import(file.cachePathUrl);\r\n\r\n // Store in cache (use source path as key for consistency)\r\n this.loadedModules.set(file.absolutePath, module);\r\n\r\n if (module?.cleanup) {\r\n file.cleanup = module.cleanup;\r\n }\r\n\r\n return module;\r\n });\r\n } else {\r\n // Dynamic import the module\r\n const module =\r\n typeof __import !== \"undefined\"\r\n ? await __import(file.cachePath)\r\n : await import(file.cachePathUrl);\r\n // Store in cache (use source path as key for consistency)\r\n this.loadedModules.set(file.absolutePath, module);\r\n\r\n if (module?.cleanup) {\r\n file.cleanup = module.cleanup;\r\n }\r\n\r\n return module;\r\n }\r\n\r\n // devLogSuccess(\r\n // `Module loaded: ${file.relativePath} (${type}) in ${(performance.now() - now).toFixed(2)}ms`,\r\n // );\r\n } catch (error: any) {\r\n console.log(error);\r\n // Format error message (especially for MODULE_NOT_FOUND)\r\n if (error.code === \"ERR_MODULE_NOT_FOUND\") {\r\n devLogError(formatModuleNotFoundError(error));\r\n } else {\r\n devLogError(`Failed to load ${type}: ${file.relativePath} - ${error?.message || error}`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Perform Clean up the file\r\n */\r\n public cleanupFileModule(file: FileManager): void {\r\n const cleanupFunction = (cleanupFunction: Function | { unsubscribe: () => void }) => {\r\n const fn = (cleanupFunction as { unsubscribe: () => void })?.unsubscribe || cleanupFunction;\r\n fn();\r\n };\r\n\r\n if (file.cleanup) {\r\n Array.isArray(file.cleanup)\r\n ? file.cleanup.forEach((fn) => cleanupFunction(fn))\r\n : cleanupFunction(file.cleanup);\r\n }\r\n }\r\n\r\n /**\r\n * Reload a single module (for HMR)\r\n * @param file FileManager instance\r\n */\r\n public async reloadModule(file: FileManager): Promise<void> {\r\n const moduleType = this.specialFilesCollector.getFileType(file.relativePath);\r\n\r\n this.cleanupFileModule(file);\r\n\r\n if (!moduleType) {\r\n // Not a special file, no need to reload\r\n return;\r\n }\r\n\r\n try {\r\n // For route files, remove old routes before reloading\r\n if (moduleType === \"route\") {\r\n router.removeRoutesBySourceFile(file.relativePath);\r\n }\r\n\r\n // Clear module cache\r\n this.clearModuleCache(file.absolutePath);\r\n __clearModuleVersion(file.cachePath);\r\n exportAnalyzer.clearCache(file.relativePath);\r\n\r\n // Reload the module with cache busting\r\n await this.loadModule(file, moduleType, true);\r\n } catch (error: any) {\r\n // Format error message (especially for MODULE_NOT_FOUND)\r\n if (error.code === \"ERR_MODULE_NOT_FOUND\") {\r\n devLogError(formatModuleNotFoundError(error));\r\n } else {\r\n devLogError(`Failed to reload module: ${error.message || error}`);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Clear module cache for a specific file\r\n * This forces Node.js to re-import the module\r\n * @param absolutePath Absolute path to the module\r\n */\r\n public clearModuleCache(absolutePath: string): void {\r\n // Remove from our cache\r\n this.loadedModules.delete(absolutePath);\r\n }\r\n\r\n /**\r\n * We need a way to cleanup a module execution if it's deleted\r\n */\r\n public cleanupDeletedModule(file: FileManager): void {\r\n this.clearModuleCache(file.absolutePath);\r\n __clearModuleVersion(file.cachePath);\r\n exportAnalyzer.clearCache(file.relativePath);\r\n\r\n if (file.type === \"route\") {\r\n router.removeRoutesBySourceFile(file.relativePath);\r\n }\r\n\r\n this.cleanupFileModule(file);\r\n }\r\n\r\n /**\r\n * Clear module cache for multiple files\r\n * @param absolutePaths Array of absolute paths\r\n */\r\n public clearModuleCacheMultiple(absolutePaths: string[]): void {\r\n for (const path of absolutePaths) {\r\n this.clearModuleCache(path);\r\n }\r\n }\r\n\r\n /**\r\n * Clear all application module cache\r\n * Used for full server restart\r\n */\r\n public clearAllModuleCache(): void {\r\n // Clear all loaded modules\r\n for (const absolutePath of this.loadedModules.keys()) {\r\n this.clearModuleCache(absolutePath);\r\n }\r\n }\r\n\r\n /**\r\n * Get loaded module by path\r\n * @param absolutePath Absolute path to the module\r\n */\r\n public getLoadedModule(absolutePath: string): any | undefined {\r\n return this.loadedModules.get(absolutePath);\r\n }\r\n\r\n /**\r\n * Check if a module is loaded\r\n * @param absolutePath Absolute path to the module\r\n */\r\n public isModuleLoaded(absolutePath: string): boolean {\r\n return this.loadedModules.has(absolutePath);\r\n }\r\n\r\n /**\r\n * Get all loaded module paths\r\n */\r\n public getLoadedModulePaths(): string[] {\r\n return Array.from(this.loadedModules.keys());\r\n }\r\n\r\n /**\r\n * Get statistics about loaded modules\r\n */\r\n public getStats(): {\r\n totalLoaded: number;\r\n mainFiles: number;\r\n routeFiles: number;\r\n eventFiles: number;\r\n localeFiles: number;\r\n } {\r\n return {\r\n totalLoaded: this.loadedModules.size,\r\n mainFiles: this.specialFilesCollector.getMainFiles().length,\r\n routeFiles: this.specialFilesCollector.getRouteFiles().length,\r\n eventFiles: this.specialFilesCollector.getEventFiles().length,\r\n localeFiles: this.specialFilesCollector.getLocaleFiles().length,\r\n };\r\n }\r\n}\r\n","import { getJsonFileAsync } from \"@mongez/fs\";\r\nimport { Path } from \"./path\";\r\n\r\nexport class PackageJsonManager {\r\n /**\r\n * Package.json data\r\n */\r\n public packageJson: any = {};\r\n\r\n /**\r\n * Initialize the package.json manager\r\n */\r\n public async init() {\r\n this.packageJson = await getJsonFileAsync(Path.toAbsolute(\"package.json\"));\r\n }\r\n\r\n /**\r\n * Check if the given path is a package path\r\n */\r\n public isPathPackage(path: string) {\r\n const allPackages = Object.keys(this.packageJson.dependencies || {}).concat(\r\n Object.keys(this.packageJson.devDependencies || {}),\r\n );\r\n\r\n return allPackages.some((packageName) => path.startsWith(packageName));\r\n }\r\n}\r\n\r\nexport const packageJsonManager = new PackageJsonManager();\r\n","import { pathToFileURL } from \"node:url\";\nimport { filesOrchestrator } from \"./files-orchestrator\";\nimport { warlockCachePath } from \"./utils\";\n\n/**\n * Runtime Import Helper\n *\n * This module provides a global __import function that handles cache busting\n * for HMR. Instead of static imports, we transform them to use this helper\n * which appends timestamps to force module reloads.\n *\n * Example transformation:\n * FROM: import { foo } from \"./bar.js\"\n * TO: const { foo } = await __import(\"./bar.js\")\n */\n\n/**\n * Module version registry\n * Maps module paths to their current version timestamp\n */\nconst moduleVersions = new Map<string, number>();\n\n/**\n * Modules currently being loaded\n * Used to detect and handle circular dependencies\n */\nconst loadingModules = new Set<string>();\n\n/**\n * Module import promise cache\n * Maps module paths to their import promises\n * Prevents duplicate imports and handles circular dependencies\n */\nconst modulePromises = new Map<string, Promise<any>>();\n\nfunction normalizePath(modulePath: string) {\n return modulePath.startsWith(\"./\") ? modulePath.slice(2) : modulePath;\n}\n\n/**\n * Get last version of timestamp for a module\n * if not found set it then return it\n */\nfunction useModuleVersion(modulePath: string): number {\n const cleanPath = normalizePath(modulePath);\n\n if (!moduleVersions.has(cleanPath)) {\n moduleVersions.set(cleanPath, Date.now());\n }\n\n return moduleVersions.get(cleanPath)!;\n}\n\n/**\n * Dynamic import with cache busting and circular dependency protection\n *\n * @param modulePath - The relative cache path (e.g., \"./src-app-users-shared-utils.js\")\n * @returns The imported module\n */\nasync function __import(modulePath: string): Promise<any> {\n const cleanPath = normalizePath(modulePath);\n\n // Check if this module is already being loaded (circular dependency detected)\n if (loadingModules.has(cleanPath)) {\n // Return the existing promise - this prevents deadlock\n // The promise should already be cached since we cache it before marking as loading\n const existingPromise = modulePromises.get(cleanPath);\n if (existingPromise) {\n return existingPromise;\n }\n\n // This should rarely happen, but handle the edge case where promise isn't cached yet\n // This can occur in a race condition scenario\n throw new Error(\n `Circular dependency detected: Module \"${cleanPath}\" is being loaded but no promise is cached. This may indicate a timing issue in module loading.`,\n );\n }\n\n // Get the current version timestamp for this module\n const timestamp = useModuleVersion(modulePath);\n\n // Resolve the module path relative to the cache directory\n const absolutePath = warlockCachePath(cleanPath);\n\n // Convert to file:// URL for cross-platform compatibility\n const fileUrl = pathToFileURL(absolutePath).href;\n\n // Append timestamp as query parameter to bust cache\n const moduleUrl = `${fileUrl}?t=${timestamp}`;\n\n // Create the import promise and cache it BEFORE marking as loading\n // This ensures circular dependencies can always find the promise\n const importPromise = import(moduleUrl);\n modulePromises.set(cleanPath, importPromise);\n\n // Mark module as loading AFTER caching the promise\n // This order is critical for circular dependency handling\n loadingModules.add(cleanPath);\n\n try {\n // Wait for the import to complete\n const module = await importPromise;\n\n if (module) {\n const fileManager = Array.from(filesOrchestrator.files.values()).find((fileManager) => {\n return fileManager.cachePath === cleanPath;\n });\n\n if (fileManager) {\n if (module.cleanup) {\n fileManager.cleanup = module.cleanup;\n } else {\n // another workaround is to auto detect if any of the imports has a $cleanup methods\n // if yes, then execute them all\n const cleanups: (() => void)[] = [];\n for (const exportedValue of Object.values(module)) {\n const cleanup = (exportedValue as any)?.$cleanup;\n if (cleanup) {\n cleanups.push(cleanup.bind(exportedValue));\n }\n }\n\n if (cleanups.length > 0) {\n fileManager.cleanup = cleanups;\n }\n }\n }\n }\n\n return module;\n } catch (error) {\n console.log(\"Error while importing\", error);\n\n // Remove from cache on error so it can be retried\n modulePromises.delete(cleanPath);\n throw error;\n } finally {\n // Mark module as no longer loading\n loadingModules.delete(cleanPath);\n }\n}\n\n/**\n * Clear version for a module (reset to default behavior)\n *\n * @param modulePath - The path to the module\n */\nfunction __clearModuleVersion(modulePath: string): void {\n const cleanPath = normalizePath(modulePath);\n\n moduleVersions.delete(cleanPath);\n\n // Clear cached promise if not currently loading\n if (!loadingModules.has(cleanPath)) {\n modulePromises.delete(cleanPath);\n }\n}\n\n/**\n * Clear all module versions and caches\n */\nfunction __clearAllModuleVersions(): void {\n moduleVersions.clear();\n\n // Clear all cached promises that aren't currently loading\n for (const [path] of modulePromises) {\n if (!loadingModules.has(path)) {\n modulePromises.delete(path);\n }\n }\n}\n\n/**\n * Get current version timestamp for a module\n *\n * @param modulePath - The path to the module\n * @returns The timestamp or undefined if not set\n */\nfunction __getModuleVersion(modulePath: string): number | undefined {\n return moduleVersions.get(modulePath);\n}\n\n// Make functions available globally\ndeclare global {\n var __import: (modulePath: string) => Promise<any>;\n var __clearModuleVersion: (modulePath: string) => void;\n var __clearAllModuleVersions: () => void;\n var __getModuleVersion: (modulePath: string) => number | undefined;\n}\n\n// Export for initialization\nexport function initializeRuntimeImportHelper(): void {\n (global as any).__import = __import;\n (global as any).__clearModuleVersion = __clearModuleVersion;\n (global as any).__clearAllModuleVersions = __clearAllModuleVersions;\n (global as any).__getModuleVersion = __getModuleVersion;\n}\n","import { FileManager } from \"./file-manager\";\r\n\r\n/**\r\n * Special File Types\r\n */\r\nexport type SpecialFileType = \"config\" | \"main\" | \"route\" | \"event\" | \"locale\";\r\n\r\n/**\r\n * Special Files Collector\r\n * Detects and categorizes special files in the project\r\n * Provides query APIs for accessing special files by type\r\n */\r\nexport class SpecialFilesCollector {\r\n /**\r\n * Categorized special files\r\n */\r\n private readonly configFiles = new Map<string, FileManager>();\r\n private readonly mainFiles = new Map<string, FileManager>();\r\n private readonly routeFiles = new Map<string, FileManager>();\r\n private readonly eventFiles = new Map<string, FileManager>();\r\n private readonly localeFiles = new Map<string, FileManager>();\r\n\r\n /**\r\n * Collect special files from all tracked files\r\n * @param files Map of all tracked files\r\n */\r\n public collect(files: Map<string, FileManager>): void {\r\n // Clear existing collections\r\n this.configFiles.clear();\r\n this.mainFiles.clear();\r\n this.routeFiles.clear();\r\n this.eventFiles.clear();\r\n this.localeFiles.clear();\r\n\r\n // Categorize each file\r\n for (const [relativePath, fileManager] of files) {\r\n this.categorizeFile(relativePath, fileManager);\r\n }\r\n }\r\n\r\n /**\r\n * Categorize a single file\r\n * @param relativePath Relative path of the file\r\n * @param fileManager FileManager instance\r\n */\r\n private categorizeFile(relativePath: string, fileManager: FileManager): void {\r\n // Config files: src/config/**/*.{ts,tsx}\r\n if (this.isConfigFile(relativePath)) {\r\n this.configFiles.set(relativePath, fileManager);\r\n return;\r\n }\r\n\r\n // Main files: src/app/**/main.{ts,tsx}\r\n if (this.isMainFile(relativePath)) {\r\n this.mainFiles.set(relativePath, fileManager);\r\n return;\r\n }\r\n\r\n // Route files: src/app/**/routes.{ts,tsx}\r\n if (this.isRouteFile(relativePath)) {\r\n this.routeFiles.set(relativePath, fileManager);\r\n return;\r\n }\r\n\r\n // Event files: src/app/**/events/**/*.{ts,tsx}\r\n if (this.isEventFile(relativePath)) {\r\n this.eventFiles.set(relativePath, fileManager);\r\n return;\r\n }\r\n\r\n // Locale files: src/app/**/utils/locales.{ts,tsx}\r\n if (this.isLocaleFile(relativePath)) {\r\n this.localeFiles.set(relativePath, fileManager);\r\n return;\r\n }\r\n }\r\n\r\n /**\r\n * Check if file is a config file\r\n * Pattern: src/config/$config.ts\r\n */\r\n private isConfigFile(path: string): boolean {\r\n return /^src\\/config\\/.*\\.(ts|tsx)$/.test(path);\r\n }\r\n\r\n /**\r\n * Check if file is a main file\r\n * Pattern: src/app/$module/main.ts\r\n */\r\n private isMainFile(path: string): boolean {\r\n return (\r\n /^src\\/app\\/[^/]+\\/main\\.(ts|tsx)$/.test(path) ||\r\n [\"src/app/main.ts\", \"src/app/main.tsx\"].includes(path)\r\n );\r\n }\r\n\r\n /**\r\n * Check if file is a route file\r\n * Pattern: src/app/$module/routes.ts\r\n */\r\n private isRouteFile(path: string): boolean {\r\n return /^src\\/app\\/[^/]+\\/routes\\.(ts|tsx)$/.test(path);\r\n }\r\n\r\n /**\r\n * Check if file is an event file\r\n * Pattern: src/app/$module/events/$event.ts\r\n */\r\n private isEventFile(path: string): boolean {\r\n return /^src\\/app\\/[^/]+\\/events\\/[^/]+\\.(ts|tsx)$/.test(path);\r\n }\r\n\r\n /**\r\n * Check if file is a locale file\r\n * Pattern: src/app/$module/utils/locales.ts\r\n */\r\n private isLocaleFile(path: string): boolean {\r\n return /^src\\/app\\/[^/]+\\/utils\\/locales\\.(ts|tsx)$/.test(path);\r\n }\r\n\r\n /**\r\n * Add a new file to the appropriate collection\r\n * @param fileManager FileManager instance\r\n */\r\n public addFile(fileManager: FileManager): void {\r\n const relativePath = fileManager.relativePath;\r\n this.categorizeFile(relativePath, fileManager);\r\n }\r\n\r\n /**\r\n * Remove a file from all collections\r\n * @param relativePath Relative path of the file\r\n */\r\n public removeFile(relativePath: string): void {\r\n this.configFiles.delete(relativePath);\r\n this.mainFiles.delete(relativePath);\r\n this.routeFiles.delete(relativePath);\r\n this.eventFiles.delete(relativePath);\r\n this.localeFiles.delete(relativePath);\r\n }\r\n\r\n /**\r\n * Update a file in the collections\r\n * @param fileManager FileManager instance\r\n */\r\n public updateFile(fileManager: FileManager): void {\r\n const relativePath = fileManager.relativePath;\r\n\r\n // Remove from all collections first\r\n this.removeFile(relativePath);\r\n\r\n // Re-categorize\r\n this.categorizeFile(relativePath, fileManager);\r\n }\r\n\r\n /**\r\n * Get all config files\r\n * @returns Array of FileManager instances\r\n */\r\n public getConfigFiles(): FileManager[] {\r\n return Array.from(this.configFiles.values());\r\n }\r\n\r\n /**\r\n * Get all main files\r\n * Sort order does not matter here\r\n * @TODO later we can allow export const priority from the main file itself\r\n * @returns Array of FileManager instances\r\n */\r\n public getMainFiles(): FileManager[] {\r\n return Array.from(this.mainFiles.values());\r\n }\r\n\r\n /**\r\n * Get all route files\r\n * Sorted alphabetically by path\r\n * @returns Array of FileManager instances\r\n */\r\n public getRouteFiles(): FileManager[] {\r\n const routeFiles = Array.from(this.routeFiles.values());\r\n\r\n return routeFiles.sort((a, b) => {\r\n const pathA = a.relativePath;\r\n const pathB = b.relativePath;\r\n return pathA.localeCompare(pathB);\r\n });\r\n }\r\n\r\n /**\r\n * Get all event files\r\n * @returns Array of FileManager instances\r\n */\r\n public getEventFiles(): FileManager[] {\r\n return Array.from(this.eventFiles.values());\r\n }\r\n\r\n /**\r\n * Get all locale files\r\n * @returns Array of FileManager instances\r\n */\r\n public getLocaleFiles(): FileManager[] {\r\n return Array.from(this.localeFiles.values());\r\n }\r\n\r\n /**\r\n * Get statistics about collected special files\r\n */\r\n public getStats(): Record<SpecialFileType, number> {\r\n return {\r\n config: this.configFiles.size,\r\n main: this.mainFiles.size,\r\n route: this.routeFiles.size,\r\n event: this.eventFiles.size,\r\n locale: this.localeFiles.size,\r\n };\r\n }\r\n\r\n /**\r\n * Check if a file is a special file\r\n * @param relativePath Relative path of the file\r\n * @returns Special file type or null\r\n */\r\n public getFileType(relativePath: string): SpecialFileType | null {\r\n if (this.configFiles.has(relativePath)) return \"config\";\r\n if (this.mainFiles.has(relativePath)) return \"main\";\r\n if (this.routeFiles.has(relativePath)) return \"route\";\r\n if (this.eventFiles.has(relativePath)) return \"event\";\r\n if (this.localeFiles.has(relativePath)) return \"locale\";\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Clear all collections\r\n */\r\n public clear(): void {\r\n this.configFiles.clear();\r\n this.mainFiles.clear();\r\n this.routeFiles.clear();\r\n this.eventFiles.clear();\r\n this.localeFiles.clear();\r\n }\r\n}\r\n","import { colors } from \"@mongez/copper\";\nimport { unlinkAsync } from \"@mongez/fs\";\nimport { init } from \"es-module-lexer\";\nimport { warlockConfigManager } from \"../warlock-config/warlock-config.manager\";\nimport { DependencyGraph } from \"./dependency-graph\";\nimport { devLogDim, devLogSuccess } from \"./dev-logger\";\nimport { FileEventHandler } from \"./file-event-handler\";\nimport { FileManager } from \"./file-manager\";\nimport { FileOperations } from \"./file-operations\";\nimport { FilesWatcher } from \"./files-watcher\";\nimport { FILE_PROCESSING_BATCH_SIZE } from \"./flags\";\nimport { EslintHealthChecker } from \"./health-checker/checkers/eslint-health-checker\";\nimport { TypescriptHealthChecker } from \"./health-checker/checkers/typescript-health-checker\";\nimport { FilesHealthcareManager } from \"./health-checker/files-healthcare.manager\";\nimport { ManifestManager } from \"./manifest-manager\";\nimport { ModuleLoader } from \"./module-loader\";\nimport { packageJsonManager } from \"./package-json-manager\";\nimport { Path } from \"./path\";\nimport { initializeRuntimeImportHelper } from \"./runtime-import-helper\";\nimport { SpecialFilesCollector } from \"./special-files-collector\";\nimport { tsconfigManager } from \"./tsconfig-manager\";\nimport { createFreshWarlockDirectory, getFilesFromDirectory, warlockCachePath } from \"./utils\";\n\nexport class FilesOrchestrator {\n public readonly filesWatcher = new FilesWatcher();\n public readonly files = new Map<string, FileManager>();\n private readonly manifest = new ManifestManager(this.files);\n private readonly dependencyGraph = new DependencyGraph();\n private readonly healthCheckerManager = new FilesHealthcareManager(this.files);\n public readonly fileOperations: FileOperations;\n private readonly eventHandler: FileEventHandler;\n public readonly specialFilesCollector = new SpecialFilesCollector();\n public readonly moduleLoader = new ModuleLoader(this.specialFilesCollector);\n\n /**\n * Creates the FilesOrchestrator instance\n *\n * Initializes all subsystems:\n * - FileOperations for file lifecycle management\n * - FileEventHandler for processing file system events\n */\n public constructor() {\n // Create file operations with all dependencies\n this.fileOperations = new FileOperations(\n this.files,\n this.dependencyGraph,\n this.manifest,\n this.specialFilesCollector,\n );\n\n // Create event handler with all required dependencies\n this.eventHandler = new FileEventHandler(\n this.fileOperations,\n this.manifest,\n this.dependencyGraph,\n this.files,\n );\n }\n\n /**\n * Parse and add the given file to files list\n */\n public async add(relativePath: string): Promise<FileManager> {\n return this.fileOperations.addFile(relativePath);\n }\n\n /**\n * Add then load the file through the modules load\n */\n public async load<T>(relativePath: string, type = \"other\") {\n const fileManager = await this.add(relativePath);\n\n return this.moduleLoader.loadModule<T>(fileManager, fileManager.type || type);\n }\n\n /**\n * Get the dependency graph\n * Provides read-only access to the dependency graph for external use\n */\n public getDependencyGraph(): DependencyGraph {\n return this.dependencyGraph;\n }\n\n /**\n * Get invalidation chain for a file\n * Returns all files that need to be reloaded when the given file changes\n */\n public getInvalidationChain(file: string): string[] {\n return this.dependencyGraph.getInvalidationChain(file);\n }\n\n /**\n * Get all tracked files\n */\n public getFiles(): Map<string, FileManager> {\n return this.files;\n }\n\n /**\n * Get health checker manager\n */\n public getHealthCheckerManager(): FilesHealthcareManager {\n return this.healthCheckerManager;\n }\n\n /**\n * Initialize the files orchestrator\n */\n public async init() {\n // Initialize es-module-lexer (it's a promise, not a function)\n await init;\n\n // Initialize configuration managers\n await Promise.all([tsconfigManager.init(), packageJsonManager.init()]);\n\n // Initialize runtime import helper (for HMR cache busting)\n initializeRuntimeImportHelper();\n }\n\n /**\n * Initialize all development server features\n *\n * This is the main initialization sequence that:\n * 1. Discovers all TypeScript/JavaScript files in the project\n * 2. Reconciles filesystem state with cached manifest\n * 3. Builds the dependency graph for HMR\n * 4. Persists file metadata to manifest\n *\n * Each file is fully processed (including import transforms) during\n * reconciliation because transforms compute cache paths deterministically\n * and don't depend on other files being processed first.\n *\n * @example\n * ```typescript\n * await filesOrchestrator.init();\n * await filesOrchestrator.initiaizeAll();\n * await filesOrchestrator.watchFiles();\n * ```\n */\n public async initiaizeAll() {\n const [filesInFilesystem, manifestExists] = await Promise.all([\n this.getAllFilesFromFilesystem(),\n this.manifest.init(),\n ]);\n\n // STEP 1: Reconcile filesystem with manifest\n // Each file is fully processed (transpile + transform + save)\n if (!manifestExists) {\n // No manifest = fresh start, process all files\n await this.processAllFilesFresh(filesInFilesystem);\n } else {\n // Manifest exists = reconcile differences\n await this.reconcileFiles(filesInFilesystem);\n }\n\n // STEP 2: Build dependency graph from all processed files\n this.dependencyGraph.build(this.files);\n\n // STEP 3: Update dependents in FileManager instances\n this.updateFileDependents();\n\n // STEP 4: Sync all files to manifest and save\n this.syncFilesToManifest();\n await this.manifest.save();\n }\n\n /**\n * Check the health of the given files\n */\n public async checkHealth(files: { added: string[]; changed: string[]; deleted: string[] }) {\n const filesToCheck = files.added\n .concat(files.changed)\n .map((file) => this.files.get(Path.toRelative(file)))\n .filter((file) => !!file);\n\n const filesToDelete = files.deleted\n .map((file) => this.files.get(Path.toRelative(file)))\n .filter((file) => !!file);\n\n await this.healthCheckerManager.onFileChanges(filesToCheck);\n\n this.healthCheckerManager.removeFiles(filesToDelete);\n\n this.healthCheckerManager.checkFiles(filesToCheck);\n }\n\n /**\n * Check health state for all files\n */\n public async startCheckingHealth(): Promise<void> {\n devLogDim(\"Started File Health Checks in the background.\");\n const typescriptHealthChecker = new TypescriptHealthChecker();\n const eslintHealthChecker = new EslintHealthChecker();\n\n await this.healthCheckerManager\n .setHealthCheckers([typescriptHealthChecker, eslintHealthChecker])\n .initialize(); // Initialize workers\n\n await this.healthCheckerManager.validateAllFiles();\n }\n\n /**\n * Get all TypeScript/JavaScript files from the filesystem\n * This always scans the actual filesystem, ignoring any cached data\n * @returns Array of relative file paths\n */\n public async getAllFilesFromFilesystem(): Promise<string[]> {\n const absolutePaths = await getFilesFromDirectory();\n // Convert to relative paths for consistency throughout the system\n return absolutePaths.map((absPath) => Path.toRelative(absPath));\n }\n\n /**\n * Process all files fresh (no manifest exists)\n *\n * This happens on first run or when manifest is deleted.\n * Each file is fully processed including import transforms.\n *\n * @param filePaths Array of relative file paths\n */\n public async processAllFilesFresh(filePaths: string[]) {\n devLogDim(`processing ${filePaths.length} files...`);\n\n // Ensure .warlock directory exists\n await createFreshWarlockDirectory();\n\n const BATCH_SIZE = FILE_PROCESSING_BATCH_SIZE;\n\n for (let i = 0; i < filePaths.length; i += BATCH_SIZE) {\n const batch = filePaths.slice(i, i + BATCH_SIZE);\n\n await Promise.all(\n batch.map(async (relativePath) => {\n const absolutePath = Path.toAbsolute(relativePath);\n const fileManager = new FileManager(absolutePath, this.files, this.fileOperations);\n this.files.set(relativePath, fileManager);\n // Full processing (transforms work because cache paths are deterministic)\n await fileManager.process();\n }),\n );\n }\n\n devLogSuccess(`processed ${filePaths.length} files`);\n }\n\n /**\n * Reconcile filesystem state with manifest data\n * This handles: new files, deleted files, and changed files\n */\n private async reconcileFiles(filesInFilesystem: string[]) {\n const filesInManifest = new Set(this.manifest.getAllFilePaths());\n const filesInFilesystemSet = new Set(filesInFilesystem);\n\n // Find new files (in filesystem but not in manifest)\n const newFiles = filesInFilesystem.filter((file) => !filesInManifest.has(file));\n\n // Find deleted files (in manifest but not in filesystem)\n const deletedFiles = Array.from(filesInManifest).filter(\n (file) => !filesInFilesystemSet.has(file),\n );\n\n // Find existing files (in both)\n const existingFiles = filesInFilesystem.filter((file) => filesInManifest.has(file));\n\n if (newFiles.length > 0 || deletedFiles.length > 0) {\n const newText = newFiles.length > 0 ? colors.green(newFiles.length) : 0;\n const deletedText = deletedFiles.length > 0 ? colors.red(deletedFiles.length) : 0;\n const existingText = existingFiles.length > 0 ? colors.blue(existingFiles.length) : 0;\n devLogDim(`reconciling: ${newText} new, ${deletedText} deleted, ${existingText} existing`);\n }\n\n // Process new files\n await this.processNewFiles(newFiles);\n\n // Remove deleted files\n await this.processDeletedFiles(deletedFiles);\n\n // Process existing files (check for changes)\n await this.processExistingFiles(existingFiles);\n }\n\n /**\n * Process newly discovered files (in filesystem but not in manifest)\n *\n * Each file is fully processed including import transforms.\n *\n * @param filePaths Array of relative file paths\n */\n private async processNewFiles(filePaths: string[]) {\n if (filePaths.length === 0) return;\n\n const BATCH_SIZE = FILE_PROCESSING_BATCH_SIZE;\n\n for (let i = 0; i < filePaths.length; i += BATCH_SIZE) {\n const batch = filePaths.slice(i, i + BATCH_SIZE);\n\n await Promise.all(\n batch.map(async (relativePath) => {\n const absolutePath = Path.toAbsolute(relativePath);\n const fileManager = new FileManager(absolutePath, this.files, this.fileOperations);\n this.files.set(relativePath, fileManager);\n // Full processing\n await fileManager.process();\n }),\n );\n }\n }\n\n /**\n * Remove deleted files from tracking\n * @param filePaths Array of relative file paths\n */\n private async processDeletedFiles(filePaths: string[]) {\n if (filePaths.length === 0) return;\n\n for (const relativePath of filePaths) {\n // Get file info from manifest before deletion\n const manifestEntry = this.manifest.getFile(relativePath);\n\n if (manifestEntry) {\n // Delete cache file\n try {\n await unlinkAsync(warlockCachePath(manifestEntry.cachePath));\n } catch (error) {\n // Cache file might not exist, ignore\n }\n }\n\n // Remove from manifest\n this.manifest.removeFile(relativePath);\n\n // Remove from files map\n this.files.delete(relativePath);\n }\n }\n\n /**\n * Process existing files (check if they changed since last run)\n *\n * For unchanged files, loads from cache.\n * For changed files, reprocesses fully.\n *\n * @param filePaths Array of relative file paths\n */\n private async processExistingFiles(filePaths: string[]) {\n if (filePaths.length === 0) return;\n\n const BATCH_SIZE = FILE_PROCESSING_BATCH_SIZE;\n\n for (let i = 0; i < filePaths.length; i += BATCH_SIZE) {\n const batch = filePaths.slice(i, i + BATCH_SIZE);\n\n await Promise.all(\n batch.map(async (relativePath) => {\n const manifestData = this.manifest.getFile(relativePath);\n const absolutePath = Path.toAbsolute(relativePath);\n const fileManager = new FileManager(absolutePath, this.files, this.fileOperations);\n this.files.set(relativePath, fileManager);\n // Initialize with manifest (uses cache if unchanged, reprocesses if changed)\n await fileManager.init(manifestData);\n }),\n );\n }\n }\n\n /**\n * Update dependents in all FileManager instances from dependency graph\n */\n private updateFileDependents() {\n for (const [relativePath, fileManager] of this.files) {\n const dependents = this.dependencyGraph.getDependents(relativePath);\n fileManager.dependents = dependents;\n }\n }\n\n /**\n * Sync all FileManager instances to manifest\n * Uses relative paths as keys for portability\n */\n private syncFilesToManifest() {\n for (const [relativePath, fileManager] of this.files) {\n this.manifest.setFile(relativePath, fileManager.toManifest());\n }\n }\n\n /**\n * Start file watcher to detect changes during development\n */\n public async watchFiles() {\n devLogSuccess(\"watching for file changes\");\n\n // Connect file watcher to event handler\n this.filesWatcher.onFileChange((absolutePath) => {\n this.eventHandler.handleFileChange(absolutePath);\n });\n\n this.filesWatcher.onFileAdd((absolutePath) => {\n this.eventHandler.handleFileAdd(absolutePath);\n });\n\n this.filesWatcher.onFileDelete((absolutePath) => {\n this.eventHandler.handleFileDelete(absolutePath);\n });\n\n // Get watch config from warlock.config.ts (if loaded)\n const watchConfig = warlockConfigManager.get(\"devServer\")?.watch;\n\n await this.filesWatcher.watch(watchConfig);\n }\n}\n\nexport const filesOrchestrator = new FilesOrchestrator();\n","import config from \"@mongez/config\";\nimport { colors } from \"@mongez/copper\";\nimport { pathToFileURL } from \"node:url\";\nimport type { FileManager } from \"../dev2-server/file-manager\";\nimport { warlockCachePath } from \"../dev2-server/utils\";\nimport { configSpecialHandlers } from \"./config-special-handlers\";\n\n/**\n * Special Config Handler\n * A function that handles special configuration loading\n */\nexport type SpecialConfigHandler = (configValue: any) => void | Promise<void>;\n\n/**\n * Config Loader\n * Dynamically loads all configuration files and registers them with @mongez/config\n * Supports special handlers for configs that require additional processing\n */\nexport class ConfigLoader {\n /**\n * Load all configuration files\n * @param configFiles Array of config FileManager instances\n */\n public async loadAll(configFiles: FileManager[]): Promise<void> {\n if (configFiles.length === 0) {\n return;\n }\n\n // Load all configs in parallel\n // await Promise.all(\n // configFiles.map(async file => {\n // await this.loadConfig(file);\n // }),\n // );\n for (const file of configFiles) {\n await this.loadConfig(file);\n }\n }\n\n /**\n * Load a single configuration file\n * @param file FileManager instance for the config file\n * @param bustCache Whether to bust the cache (add timestamp to URL)\n */\n public async loadConfig(file: FileManager, bustCache: boolean = false): Promise<void> {\n const configName = this.getConfigName(file.relativePath);\n // devLogInfo(`Loading configuration file: ${configName}`);\n\n try {\n // Convert absolute path to file:// URL for cross-platform compatibility\n let fileUrl =\n typeof __import !== \"undefined\"\n ? file.cachePath\n : pathToFileURL(warlockCachePath(file.cachePath)).href;\n\n // Add timestamp for cache busting (forces re-import for HMR)\n if (bustCache && typeof __import === \"undefined\") {\n const timestamp = Date.now();\n fileUrl += `?t=${timestamp}`;\n }\n\n // Dynamic import the config file\n\n const configModule =\n typeof __import !== \"undefined\" ? await __import(fileUrl) : await import(fileUrl);\n\n // Get the default export (the config value)\n const configValue = configModule.default;\n\n if (configValue === undefined) {\n console.log(\n colors.red(`config error: `),\n `Config file ${colors.yellow(file.relativePath)} does not have a default export`,\n );\n return;\n }\n\n // Store in @mongez/config\n // @mongez/config automatically handles nested access (e.g., config.get(\"database.host\"))\n config.set(configName, configValue);\n\n // devLogInfo(`Configuration file loaded: ${file.relativePath}`);\n\n // Handle special configs if handler is registered\n await configSpecialHandlers.execute(configName, configValue);\n // devLogInfo(`Special configuration handled: ${configName}`);\n } catch (error) {\n throw error; // Abort on config errors\n }\n }\n\n /**\n * Reload a configuration file (for HMR)\n * @param file FileManager instance for the config file\n */\n public async reloadConfig(file: FileManager): Promise<void> {\n // Reload the config with cache busting (adds timestamp to URL)\n await this.loadConfig(file, true);\n }\n\n /**\n * Extract config name from file path\n * Examples:\n * src/config/database.ts → \"database\"\n * src/config/payment/stripe.ts → \"payment.stripe\"\n */\n private getConfigName(relativePath: string): string {\n // Extract the part after \"src/config/\"\n const match = relativePath.match(/^src\\/config\\/(.+)\\.(ts|tsx)$/);\n\n if (!match) {\n throw new Error(`Invalid config file path: ${relativePath}`);\n }\n\n return match[1];\n }\n}\n","import { FileManager } from \"../dev2-server/file-manager\";\r\nimport { ConfigLoader } from \"./config-loader\";\r\n\r\nexport class ConfigManager {\r\n /**\r\n * Config loader instance\r\n */\r\n public loader = new ConfigLoader();\r\n\r\n /**\r\n * Constructor\r\n */\r\n public constructor() {\r\n //\r\n }\r\n\r\n /**\r\n * Load all config files\r\n */\r\n public async loadAll(files: FileManager[]) {\r\n return this.loader.loadAll(files);\r\n }\r\n\r\n /**\r\n * Reload a config file\r\n */\r\n public async reload(file: FileManager) {\r\n return this.loader.reloadConfig(file);\r\n }\r\n}\r\n\r\nexport const configManager = new ConfigManager();\r\n","import { filesOrchestrator } from \"../dev2-server/files-orchestrator\";\r\nimport { Path } from \"../dev2-server/path\";\r\nimport { getCertainFilesFromDirectory, getFilesFromDirectory } from \"../dev2-server/utils\";\r\nimport { srcPath } from \"../utils\";\r\nimport { configManager } from \"./config-manager\";\r\n\r\n/**\r\n * Load config files\r\n * either config file names (without extensions) or true to load all config files\r\n */\r\nexport async function loadConfigFiles(config: string[] | true) {\r\n let relativePaths: string[] = [];\r\n if (config === true) {\r\n const configFilesAbsulatePaths = await getFilesFromDirectory(srcPath(\"config\"));\r\n relativePaths = configFilesAbsulatePaths.map((path) => Path.toRelative(path));\r\n } else {\r\n // define only the given config files\r\n const configFilesAbsulatePaths = await getCertainFilesFromDirectory(srcPath(\"config\"), config);\r\n relativePaths = configFilesAbsulatePaths.map((path) => Path.toRelative(path));\r\n }\r\n\r\n const configFiles = await Promise.all(\r\n relativePaths.map((relativePath) => filesOrchestrator.add(relativePath)),\r\n );\r\n\r\n filesOrchestrator.specialFilesCollector.collect(filesOrchestrator.files);\r\n\r\n await configManager.loadAll(configFiles);\r\n}\r\n","import { Path } from \"../path\";\r\nimport type { Connector } from \"./types\";\r\n\r\n/**\r\n * Base Connector Class\r\n * Provides common functionality for all connectors\r\n */\r\nexport abstract class BaseConnector implements Connector {\r\n /**\r\n * Connector name\r\n */\r\n public abstract readonly name: string;\r\n\r\n /**\r\n * Initialization priority\r\n */\r\n public abstract readonly priority: number;\r\n\r\n /**\r\n * Files that trigger restart when changed\r\n * Use relative paths\r\n */\r\n protected abstract readonly watchedFiles: string[];\r\n\r\n /**\r\n * Whether the connector is currently active\r\n */\r\n protected active: boolean = false;\r\n\r\n /**\r\n * Check if connector is active\r\n */\r\n public isActive(): boolean {\r\n return this.active;\r\n }\r\n\r\n /**\r\n * Initialize the connector\r\n */\r\n public abstract start(): Promise<void>;\r\n\r\n /**\r\n * Restart the connector\r\n */\r\n public async restart(): Promise<void> {\r\n await this.shutdown();\r\n await this.start();\r\n }\r\n\r\n /**\r\n * Shutdown the connector\r\n */\r\n public abstract shutdown(): Promise<void>;\r\n\r\n /**\r\n * Determine if connector should restart based on changed files\r\n */\r\n public shouldRestart(changedFiles: string[]): boolean {\r\n // Check if any changed file matches watched files\r\n return changedFiles.some(file => this.isWatchedFile(file));\r\n }\r\n\r\n /**\r\n * Check if a file is watched by this connector\r\n */\r\n protected isWatchedFile(file: string): boolean {\r\n const relativePath = Path.toRelative(file);\r\n\r\n return this.watchedFiles.some(watchedFile => {\r\n // Exact match\r\n if (watchedFile === relativePath) {\r\n return true;\r\n }\r\n\r\n // Pattern match (e.g., \"config/*.ts\")\r\n if (watchedFile.includes(\"*\")) {\r\n const pattern = new RegExp(\r\n \"^\" + watchedFile.replace(/\\*/g, \".*\") + \"$\",\r\n );\r\n return pattern.test(relativePath);\r\n }\r\n\r\n return false;\r\n });\r\n }\r\n}\r\n","import config from \"@mongez/config\";\r\nimport { cache } from \"@warlock.js/cache\";\r\nimport { BaseConnector } from \"./base-connector\";\r\nimport { ConnectorPriority } from \"./types\";\r\n\r\n/**\r\n * Cache Connector\r\n * Manages cache engine connection lifecycle\r\n */\r\nexport class CacheConnector extends BaseConnector {\r\n public readonly name = \"cache\";\r\n public readonly priority = ConnectorPriority.CACHE;\r\n\r\n /**\r\n * Files that trigger cache restart\r\n */\r\n protected readonly watchedFiles = [\".env\", \"src/config/cache.ts\", \"src/config/cache.tsx\"];\r\n\r\n /**\r\n * Initialize cache connection\r\n */\r\n public async start(): Promise<void> {\r\n const cacheConfig = config.get(\"cache\");\r\n\r\n if (!cacheConfig) return;\r\n\r\n cache.setCacheConfigurations(cacheConfig);\r\n\r\n await cache.init();\r\n\r\n this.active = true;\r\n }\r\n\r\n /**\r\n * Shutdown cache connection\r\n */\r\n public async shutdown(): Promise<void> {\r\n if (!this.active) {\r\n return;\r\n }\r\n\r\n // TODO: Implement actual cache disconnection\r\n // - Close all active connections\r\n // - Clean up resources\r\n\r\n this.active = false;\r\n }\r\n}\r\n","import config from \"@mongez/config\";\r\nimport { connectToDatabase, dataSourceRegistry } from \"@warlock.js/cascade\";\r\nimport { BaseConnector } from \"./base-connector\";\r\nimport { ConnectorPriority } from \"./types\";\r\n\r\n/**\r\n * Database Connector\r\n * Manages database connection lifecycle using @warlock.js/cascade\r\n */\r\nexport class DatabaseConnector extends BaseConnector {\r\n public readonly name = \"database\";\r\n public readonly priority = ConnectorPriority.DATABASE;\r\n\r\n /**\r\n * Files that trigger database restart\r\n */\r\n protected readonly watchedFiles = [\".env\", \"src/config/database.ts\", \"src/config/database.tsx\"];\r\n\r\n /**\r\n * Initialize database connection\r\n */\r\n public async start(): Promise<void> {\r\n const databaseConfig = config.get(\"database\");\r\n\r\n if (!databaseConfig) {\r\n return;\r\n }\r\n\r\n try {\r\n await connectToDatabase(databaseConfig);\r\n this.active = true;\r\n } catch (error) {\r\n console.error(\"Failed to connect to database:\", error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Shutdown database connection\r\n */\r\n public async shutdown(): Promise<void> {\r\n if (!this.active) {\r\n return;\r\n }\r\n\r\n try {\r\n // Disconnect all registered data sources\r\n const dataSources = dataSourceRegistry.getAllDataSources();\r\n\r\n for (const dataSource of dataSources) {\r\n if (dataSource.driver.isConnected) {\r\n await dataSource.driver.disconnect();\r\n }\r\n }\r\n\r\n this.active = false;\r\n } catch (error) {\r\n console.error(\"Failed to disconnect from database:\", error);\r\n throw error;\r\n }\r\n }\r\n}\r\n","import type { FastifyCorsOptions } from \"@fastify/cors\";\r\nimport fastifyMultipart from \"@fastify/multipart\";\r\nimport config from \"@mongez/config\";\r\nimport { rootPath } from \"../utils\";\r\nimport type { FastifyInstance } from \"./server\";\r\n\r\nconst defaultCorsOptions: FastifyCorsOptions = {\r\n origin: \"*\",\r\n methods: \"*\",\r\n};\r\n\r\nexport async function registerHttpPlugins(server: FastifyInstance) {\r\n // 👇🏻 register rate-limit plugin\r\n server.register(import(\"@fastify/rate-limit\"), {\r\n // max requests per time window\r\n max: config.get(\"http.rateLimit.max\", 60),\r\n // maximum time that is will allow max requests\r\n timeWindow: config.get(\"http.rateLimit.duration\", 60 * 1000),\r\n });\r\n\r\n // 👇🏻 register cors plugin\r\n const corsOptions: FastifyCorsOptions | undefined = {\r\n ...config.get(\"http.cors\", {}),\r\n ...defaultCorsOptions,\r\n };\r\n\r\n server.register(import(\"@fastify/cors\"), corsOptions);\r\n\r\n // 👇🏻 import multipart plugin\r\n server.register(fastifyMultipart, {\r\n attachFieldsToBody: true,\r\n limits: {\r\n // file size could be up to 10MB\r\n fileSize: config.get(\"http.fileUploadLimit\", 10 * 1024 * 1024),\r\n },\r\n });\r\n\r\n server.register(import(\"@fastify/static\"), {\r\n root: rootPath(\"public\"),\r\n prefix: \"/public/\",\r\n });\r\n}\r\n","import Fastify from \"fastify\";\r\n\r\nexport type FastifyInstance = ReturnType<typeof Fastify>;\r\n\r\n// Instantiate Fastify server\r\nlet server: FastifyInstance | undefined = undefined;\r\n\r\nexport function startServer() {\r\n return (server = Fastify({\r\n trustProxy: true,\r\n // logger: true,\r\n bodyLimit: 200 * 1024 * 1024 * 1024, // 200GB\r\n }));\r\n}\r\n\r\n/**\r\n * Expose the server to be publicly accessible\r\n */\r\nexport function getServer() {\r\n return server;\r\n}\r\n","import config from \"@mongez/config\";\r\nimport { registerHttpPlugins } from \"../../http/plugins\";\r\nimport { getServer, startServer } from \"../../http/server\";\r\nimport { router } from \"../../router/router\";\r\nimport { environment } from \"../../utils\";\r\nimport { setBaseUrl } from \"../../utils/urls\";\r\nimport { devLogError, devLogInfo, devLogSuccess } from \"../dev-logger\";\r\nimport { BaseConnector } from \"./base-connector\";\r\nimport { ConnectorPriority } from \"./types\";\r\n\r\n/**\r\n * HTTP Connector\r\n * Manages HTTP server (Fastify) lifecycle\r\n */\r\nexport class HttpConnector extends BaseConnector {\r\n public readonly name = \"http\";\r\n public readonly priority = ConnectorPriority.HTTP;\r\n\r\n /**\r\n * Files that trigger HTTP server restart\r\n * Note: routes.ts changes will be handled by HMR with wildcard routing\r\n */\r\n protected readonly watchedFiles = [\"src/config/http.ts\", \"src/config/http.tsx\"];\r\n\r\n /**\r\n * Initialize HTTP server\r\n */\r\n public async start(): Promise<void> {\r\n const httpConfig = config.get(\"http\");\r\n\r\n if (!httpConfig) return;\r\n\r\n const port = httpConfig.port;\r\n devLogInfo(\"Starting http server on port \" + port);\r\n\r\n const server = startServer();\r\n\r\n await registerHttpPlugins(server);\r\n\r\n if (environment() === \"development\") {\r\n router.scanDevServer(server);\r\n } else {\r\n router.scan(server);\r\n }\r\n\r\n try {\r\n // 👇🏻 We can use the url of the server\r\n await server.listen({\r\n port,\r\n host: httpConfig.host || \"localhost\",\r\n });\r\n\r\n const baseUrl = config.get(\"app.baseUrl\");\r\n\r\n // update base url\r\n setBaseUrl(baseUrl);\r\n\r\n devLogSuccess(`Server is listening on ${baseUrl}`);\r\n } catch (error) {\r\n devLogError(\"Error while starting http server\", error);\r\n\r\n process.exit(1); // stop the process, exit with error\r\n }\r\n\r\n this.active = true;\r\n }\r\n\r\n /**\r\n * Shutdown HTTP server\r\n */\r\n public async shutdown(): Promise<void> {\r\n if (!this.active) {\r\n return;\r\n }\r\n\r\n const server = getServer();\r\n\r\n server?.close();\r\n\r\n this.active = false;\r\n }\r\n\r\n /**\r\n * Override shouldRestart to handle routes.ts specially\r\n * routes.ts changes should NOT restart the server (use HMR instead)\r\n */\r\n public shouldRestart(changedFiles: string[]): boolean {\r\n // Only restart for config changes, not routes\r\n return changedFiles.some((file) => {\r\n const relativePath = file.replace(/\\\\/g, \"/\");\r\n return relativePath === \"src/config/http.ts\" || relativePath === \"src/config/http.tsx\";\r\n });\r\n }\r\n}\r\n","import { storage } from \"../../storage\";\nimport { BaseConnector } from \"./base-connector\";\nimport { ConnectorPriority } from \"./types\";\n\n/**\n * Cache Connector\n * Manages cache engine connection lifecycle\n */\nexport class StorageConnector extends BaseConnector {\n public readonly name = \"storage\";\n public readonly priority = ConnectorPriority.STORAGE;\n\n /**\n * Files that trigger cache restart\n */\n protected readonly watchedFiles = [\".env\", \"src/config/storage.ts\", \"src/config/storage.tsx\"];\n\n /**\n * Initialize cache connection\n */\n public async start(): Promise<void> {\n await storage.init();\n\n this.active = true;\n }\n\n /**\n * Shutdown cache connection\n */\n public async shutdown(): Promise<void> {\n if (!this.active) {\n return;\n }\n\n storage.reset();\n\n this.active = false;\n }\n}\n","import { colors } from \"@mongez/copper\";\r\nimport { devServeLog } from \"../dev-logger\";\r\nimport { CacheConnector } from \"./cache-connector\";\r\nimport { DatabaseConnector } from \"./database-connector\";\r\nimport { HttpConnector } from \"./http-connector\";\r\nimport { StorageConnector } from \"./storage.connector\";\r\nimport type { Connector, ConnectorName } from \"./types\";\r\n\r\nexport class ConnectorsManager {\r\n /**\r\n * Connectors lsit\r\n */\r\n private readonly connectors: Connector[] = [];\r\n\r\n /**\r\n * Constructor\r\n */\r\n public constructor() {\r\n this.register(new HttpConnector());\r\n this.register(new DatabaseConnector());\r\n this.register(new CacheConnector());\r\n this.register(new StorageConnector());\r\n }\r\n\r\n /**\r\n * Register a connector\r\n */\r\n public register(connector: Connector): void {\r\n this.connectors.push(connector);\r\n // sort connectors by priority\r\n this.connectors.sort((a, b) => a.priority - b.priority);\r\n }\r\n\r\n /**\r\n * Get all connectors\r\n */\r\n public list(): Connector[] {\r\n return this.connectors;\r\n }\r\n\r\n /**\r\n * start all connectors\r\n */\r\n public async start(connectorsNames?: ConnectorName[]): Promise<void> {\r\n for (const connector of this.connectors) {\r\n if (connectorsNames && !connectorsNames.includes(connector.name)) continue;\r\n\r\n await connector.start();\r\n }\r\n }\r\n\r\n /**\r\n * Shutdown all connectors\r\n */\r\n public async shutdown(): Promise<void> {\r\n for (const connector of this.connectors) {\r\n try {\r\n await connector.shutdown();\r\n } catch (error) {\r\n devServeLog(colors.redBright(`❌ Failed to shutdown ${connector.name}: ${error}`));\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Shutdown connectors on process kill\r\n *\r\n * Handles graceful shutdown for both Unix and Windows:\r\n * - SIGINT: Ctrl+C on Unix, also caught on Windows but unreliable in child processes\r\n * - SIGTERM: Termination signal (Unix primarily)\r\n * - beforeExit: Fires when Node.js empties its event loop (more reliable on Windows)\r\n */\r\n public shutdownOnProcessKill(): void {\r\n let isShuttingDown = false;\r\n\r\n const gracefulShutdown = async (signal: string) => {\r\n if (isShuttingDown) return;\r\n isShuttingDown = true;\r\n\r\n console.log(`\\nExiting...`);\r\n await this.shutdown();\r\n process.exit(0);\r\n };\r\n\r\n // Unix signals\r\n process.on(\"SIGINT\", () => gracefulShutdown(\"SIGINT\"));\r\n process.on(\"SIGTERM\", () => gracefulShutdown(\"SIGTERM\"));\r\n\r\n // Windows-specific: handle when process is about to exit\r\n // This is more reliable on Windows for spawned child processes\r\n if (process.platform === \"win32\") {\r\n // Handle Ctrl+C on Windows specifically\r\n process.on(\"SIGHUP\", () => gracefulShutdown(\"SIGHUP\"));\r\n }\r\n }\r\n}\r\n\r\nexport const connectorsManager = new ConnectorsManager();\r\n","import { getJsonFileAsync, putJsonFileAsync, unlinkAsync } from \"@mongez/fs\";\r\nimport { warlockPath } from \"../utils\";\r\n\r\n/**\r\n * Stored option metadata in manifest\r\n */\r\nexport type ManifestCommandOption = {\r\n name: string;\r\n text: string;\r\n alias?: string;\r\n description?: string;\r\n type?: \"string\" | \"boolean\" | \"number\";\r\n required?: boolean;\r\n defaultValue?: string | boolean | number;\r\n};\r\n\r\n/**\r\n * Command metadata stored in commands.json\r\n */\r\nexport type ManifestCommandData = {\r\n relativePath?: string;\r\n source: \"framework\" | \"plugin\" | \"project\";\r\n description?: string;\r\n alias?: string;\r\n options?: ManifestCommandOption[];\r\n};\r\n\r\ntype ManifestCommandsJson = {\r\n commands: Record<string, ManifestCommandData>;\r\n};\r\n\r\nexport class ManifestManager {\r\n /**\r\n * commands json\r\n */\r\n protected _commandsJson?: ManifestCommandsJson;\r\n\r\n /**\r\n * Check if commands json is changed\r\n */\r\n protected _hasChanges = false;\r\n\r\n /**\r\n * Whether commands json is loaded\r\n */\r\n protected _isLoaded = false;\r\n\r\n /**\r\n * Get if commands json has changes\r\n */\r\n public get hasChanges() {\r\n return this._hasChanges;\r\n }\r\n\r\n /**\r\n * Check if commands json is loaded\r\n */\r\n public get isCommandLoaded() {\r\n return this._isLoaded;\r\n }\r\n\r\n /**\r\n * Load commands.json file\r\n */\r\n public async loadCommands(): Promise<ManifestCommandsJson | undefined> {\r\n // now try to locate it in .warlock folder\r\n if (this._isLoaded) return this._commandsJson;\r\n\r\n try {\r\n this._commandsJson = await getJsonFileAsync(warlockPath(\"commands.json\"));\r\n\r\n this._isLoaded = true;\r\n\r\n return this._commandsJson;\r\n } catch {\r\n return;\r\n }\r\n }\r\n\r\n /**\r\n * Get commands json content\r\n */\r\n public get commandsJson() {\r\n return this._commandsJson;\r\n }\r\n\r\n /**\r\n * Save commands in commands.json file\r\n */\r\n public async saveCommands() {\r\n await putJsonFileAsync(warlockPath(\"commands.json\"), this._commandsJson);\r\n\r\n this._isLoaded = true;\r\n this._hasChanges = false;\r\n }\r\n\r\n /**\r\n * Add command info to commands list (But do not save commands)\r\n */\r\n public addCommandToList(name: string, command: ManifestCommandsJson[\"commands\"][string]) {\r\n if (!this._commandsJson) {\r\n this._commandsJson = {\r\n commands: {},\r\n };\r\n }\r\n\r\n this._commandsJson.commands[name] = command;\r\n\r\n this._hasChanges = true;\r\n }\r\n\r\n /**\r\n * Clear commands cache\r\n */\r\n public clearCommandsCache() {\r\n this._commandsJson = undefined;\r\n this._hasChanges = false;\r\n this._isLoaded = false;\r\n }\r\n\r\n /**\r\n * Remove commands.json file\r\n */\r\n public async removeCommandsFile() {\r\n try {\r\n await unlinkAsync(warlockPath(\"commands.json\"));\r\n } catch {\r\n // do nothing\r\n }\r\n }\r\n}\r\n\r\nexport const manifestManager = new ManifestManager();\r\n","import { colors } from \"@mongez/copper\";\r\nimport { getJsonFileAsync } from \"@mongez/fs\";\r\nimport path from \"path\";\r\nimport { Environment } from \"../utils\";\r\n\r\nexport function isMatchingCommandName(commandName: string, targetingCommandName: string) {\r\n return commandName.split(\" \")[0] === targetingCommandName;\r\n}\r\n\r\n/**\r\n * Cached version string\r\n */\r\nlet cachedVersion: string | null = null;\r\n\r\n/**\r\n * Get the framework version from package.json (cached)\r\n */\r\nexport async function getWarlockVersion(): Promise<string> {\r\n if (cachedVersion) return cachedVersion;\r\n\r\n const frameworkPackageJson = await getJsonFileAsync(\r\n path.join(import.meta.dirname, \"./../../package.json\"),\r\n );\r\n\r\n const version = frameworkPackageJson.version.replace(/\\^|\\~/g, \"\");\r\n cachedVersion = version;\r\n return version;\r\n}\r\n\r\n/**\r\n * Display the Warlock.js version banner\r\n */\r\nexport async function displayWarlockVersionInTerminal() {\r\n const version = await getWarlockVersion();\r\n console.log(`⚡ ${colors.bold(\"Warlock.js\")} ${colors.greenBright(`v${version}`)}`);\r\n}\r\n\r\ntype StartBannerOptions = {\r\n environment: Environment;\r\n};\r\n\r\nfunction getTextColorMethod(environment: Environment) {\r\n switch (environment) {\r\n case \"development\":\r\n return colors.yellowBright;\r\n case \"production\":\r\n return colors.greenBright;\r\n case \"test\":\r\n return colors.blueBright;\r\n default:\r\n return colors.whiteBright;\r\n }\r\n}\r\n\r\n/**\r\n * Display CLI startup banner\r\n */\r\nexport async function displayStartupBanner({ environment }: StartBannerOptions) {\r\n const version = await getWarlockVersion();\r\n const textColorMethod = getTextColorMethod(environment);\r\n console.log(` ⚡ ${colors.bold(textColorMethod(\"Warlock.js\"))} ${colors.dim(`v${version}`)}`);\r\n console.log();\r\n}\r\n\r\n/**\r\n * Display command execution header\r\n */\r\nexport function displayExecutingCommand(commandName: string) {\r\n console.log(` ${colors.cyan(\"›\")} Running ${colors.bold(colors.white(commandName))}...`);\r\n console.log();\r\n}\r\n\r\n/**\r\n * Display command not found error with optional suggestions\r\n */\r\nexport function displayCommandNotFound(commandName: string, suggestions?: string[]) {\r\n console.log();\r\n console.log(` ${colors.red(\"✖\")} Command ${colors.magenta(commandName)} not found`);\r\n\r\n if (suggestions && suggestions.length > 0) {\r\n console.log();\r\n console.log(` ${colors.yellow(\"Did you mean?\")}`);\r\n suggestions.forEach((suggestion) => {\r\n console.log(` ${colors.cyan(\"→\")} ${colors.white(suggestion)}`);\r\n });\r\n }\r\n\r\n console.log();\r\n console.log(\r\n ` ${colors.dim(\"Run\")} ${colors.cyan(\"warlock --help\")} ${colors.dim(\"to see available commands\")}`,\r\n );\r\n console.log();\r\n}\r\n\r\n/**\r\n * Display missing command error\r\n */\r\nexport function displayMissingCommand() {\r\n console.log();\r\n console.log(` ${colors.red(\"✖\")} No command specified`);\r\n console.log(\r\n ` ${colors.dim(\"Run\")} ${colors.cyan(\"warlock --help\")} ${colors.dim(\"to see available commands\")}`,\r\n );\r\n console.log();\r\n}\r\n\r\n/**\r\n * Display command success message\r\n */\r\nexport function displayCommandSuccess(commandName: string, durationMs?: number) {\r\n const duration = durationMs ? colors.dim(` (${durationMs}ms)`) : \"\";\r\n console.log();\r\n console.log(\r\n ` ${colors.green(\"✔\")} ${colors.bold(commandName)} completed successfully${duration}`,\r\n );\r\n console.log();\r\n}\r\n\r\n/**\r\n * Display command error message\r\n */\r\nexport function displayCommandError(commandName: string, error: Error) {\r\n console.log();\r\n console.log(` ${colors.red(\"✖\")} ${colors.bold(commandName)} failed`);\r\n console.log(` ${colors.dim(error.message)}`);\r\n console.log();\r\n}\r\n\r\n/**\r\n * Display missing required options error\r\n */\r\nexport function displayMissingOptions(options: { name: string; text: string }[]) {\r\n console.log();\r\n console.log(` ${colors.red(\"✖\")} Missing required options:`);\r\n options.forEach((opt) => {\r\n console.log(` ${colors.yellow(opt.text)} ${colors.dim(`(--${opt.name})`)}`);\r\n });\r\n console.log();\r\n}\r\n\r\n/**\r\n * Command info for help display\r\n */\r\nexport type HelpCommandInfo = {\r\n name: string;\r\n alias?: string;\r\n description?: string;\r\n source: \"framework\" | \"plugin\" | \"project\";\r\n};\r\n\r\n/**\r\n * Display global help with all commands grouped by source\r\n */\r\nexport async function displayHelp(commands: HelpCommandInfo[]) {\r\n const version = await getWarlockVersion();\r\n\r\n console.log();\r\n console.log(\r\n ` ⚡ ${colors.bold(colors.yellowBright(\"Warlock.js\"))} CLI ${colors.dim(`v${version}`)}`,\r\n );\r\n console.log();\r\n console.log(\r\n ` ${colors.bold(\"Usage:\")} ${colors.cyan(\"warlock\")} ${colors.dim(\"<command>\")} ${colors.dim(\"[options]\")}`,\r\n );\r\n console.log();\r\n\r\n // Group by source\r\n const grouped: Record<string, HelpCommandInfo[]> = {\r\n framework: [],\r\n plugin: [],\r\n project: [],\r\n };\r\n\r\n commands.forEach((cmd) => {\r\n grouped[cmd.source]?.push(cmd);\r\n });\r\n\r\n // Display each group\r\n const groupLabels: Record<string, string> = {\r\n framework: \"Framework Commands\",\r\n plugin: \"Plugin Commands\",\r\n project: \"Project Commands\",\r\n };\r\n\r\n for (const [source, cmds] of Object.entries(grouped)) {\r\n if (cmds.length === 0) continue;\r\n\r\n console.log(` ${colors.bold(colors.white(groupLabels[source]))}`);\r\n console.log();\r\n\r\n // Find max name length for alignment\r\n const maxLen = Math.max(...cmds.map((c) => c.name.length + (c.alias ? c.alias.length + 4 : 0)));\r\n\r\n cmds.forEach((cmd) => {\r\n const aliasStr = cmd.alias ? colors.dim(` (${cmd.alias})`) : \"\";\r\n const nameWithAlias = cmd.name + (cmd.alias ? ` (${cmd.alias})` : \"\");\r\n const padding = \" \".repeat(maxLen - nameWithAlias.length + 2);\r\n // const desc = cmd.description || colors.dim(\"No description\");\r\n const desc = cmd.description || \"\";\r\n console.log(` ${colors.cyan(cmd.name)}${aliasStr}${padding}${desc}`);\r\n });\r\n console.log();\r\n }\r\n\r\n // Display global flags\r\n console.log(` ${colors.bold(colors.white(\"Global Flags\"))}`);\r\n console.log();\r\n\r\n const globalFlags = [\r\n { flag: \"--help, -h\", description: \"Show help for a command\" },\r\n { flag: \"--version, -v\", description: \"Show Warlock version\" },\r\n { flag: \"--no-cache\", description: \"Force reload without cache\" },\r\n { flag: \"--warm-cache\", description: \"Pre-cache all project commands\" },\r\n ];\r\n\r\n const maxFlagLen = Math.max(...globalFlags.map((f) => f.flag.length));\r\n\r\n globalFlags.forEach(({ flag, description }) => {\r\n const padding = \" \".repeat(maxFlagLen - flag.length + 2);\r\n console.log(` ${colors.yellow(flag)}${padding}${description}`);\r\n });\r\n console.log();\r\n\r\n console.log(\r\n ` ${colors.dim(\"Run\")} ${colors.cyan(\"warlock <command> --help\")} ${colors.dim(\"for command-specific help\")}`,\r\n );\r\n console.log();\r\n}\r\n\r\n/**\r\n * Display help for a specific command\r\n */\r\nexport function displayCommandHelp(command: {\r\n name: string;\r\n alias?: string;\r\n description?: string;\r\n options?: { name: string; text: string; description?: string; required?: boolean }[];\r\n}) {\r\n console.log();\r\n console.log(\r\n ` ${colors.bold(colors.cyan(command.name))}${command.alias ? colors.dim(` (${command.alias})`) : \"\"}`,\r\n );\r\n\r\n if (command.description) {\r\n console.log(` ${command.description}`);\r\n }\r\n console.log();\r\n\r\n if (command.options && command.options.length > 0) {\r\n console.log(` ${colors.bold(\"Options:\")}`);\r\n console.log();\r\n\r\n const maxLen = Math.max(...command.options.map((o) => o.text.length));\r\n\r\n command.options.forEach((opt) => {\r\n const padding = \" \".repeat(maxLen - opt.text.length + 2);\r\n const required = opt.required ? colors.red(\" (required)\") : \"\";\r\n const desc = opt.description || \"\";\r\n console.log(` ${colors.green(opt.text)}${padding}${desc}${required}`);\r\n });\r\n console.log();\r\n } else {\r\n console.log(` ${colors.dim(\"No options available\")}`);\r\n console.log();\r\n }\r\n}\r\n","import { filesOrchestrator } from \"../dev2-server/files-orchestrator\";\r\nimport { Path } from \"../dev2-server/path\";\r\nimport { getFilesFromDirectory } from \"../dev2-server/utils\";\r\nimport { srcPath } from \"../utils\";\r\nimport { CLICommand } from \"./cli-command\";\r\nimport { isMatchingCommandName } from \"./cli-commands.utils\";\r\n\r\nexport class CLICommandsLoader {\r\n /**\r\n * Locate command by name\r\n */\r\n public async locate(commandName: string): Promise<CLICommand | undefined> {\r\n const files = await getFilesFromDirectory(srcPath(\"app\"), \"**/commands/*.{ts,tsx}\");\r\n // now convert them into relative paths\r\n const relativeFiles = files.map((path) => Path.toRelative(path));\r\n\r\n for (const relativeFile of relativeFiles) {\r\n const command = await this.load(relativeFile);\r\n if (command) {\r\n command.$relativePath(relativeFile);\r\n if (isMatchingCommandName(command.name, commandName)) {\r\n return command;\r\n }\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n /**\r\n * Scan all project commands and return them\r\n * Used for warm cache functionality\r\n */\r\n public async scanAll(): Promise<CLICommand[]> {\r\n const files = await getFilesFromDirectory(srcPath(\"app\"), \"**/commands/*.{ts,tsx}\");\r\n const relativeFiles = files.map((path) => Path.toRelative(path));\r\n const commands: CLICommand[] = [];\r\n\r\n for (const relativeFile of relativeFiles) {\r\n const command = await this.load(relativeFile);\r\n if (command) {\r\n command.$relativePath(relativeFile);\r\n commands.push(command);\r\n }\r\n }\r\n\r\n return commands;\r\n }\r\n\r\n /**\r\n * Load command from a relative path\r\n */\r\n public async load(relativePath: string): Promise<CLICommand | undefined> {\r\n const output = await filesOrchestrator.load<{ default: CLICommand }>(relativePath);\r\n\r\n return output?.default;\r\n }\r\n}\r\n\r\nexport const cliCommandsLoader = new CLICommandsLoader();\r\n","import { colors } from \"@mongez/copper\";\nimport { fileExistsAsync } from \"@mongez/fs\";\nimport { execSync } from \"node:child_process\";\nimport { CommandActionData } from \"../cli/types\";\nimport { rootPath } from \"../utils\";\n\nconst featuresMap: Record<\n string,\n {\n dependencies: Record<string, string>;\n devDependencies?: Record<string, string>;\n description: string;\n }\n> = {\n react: {\n description:\n \"Installs React and React dom for SSR rendering, useful for sending mails using React components as well\",\n dependencies: {\n react: \"^19.2.3\",\n \"react-dom\": \"^19.2.3\",\n },\n devDependencies: {\n \"@types/react\": \"^19.2.7\",\n \"@types/react-dom\": \"^19.2.3\",\n },\n },\n image: {\n description: \"Installs sharp for image processing\",\n dependencies: {\n sharp: \"^0.34.5\",\n },\n },\n mail: {\n description: \"Installs nodemailer for sending emails\",\n dependencies: {\n nodemailer: \"^6.9.14\",\n },\n devDependencies: {\n \"@types/nodemailer\": \"^7.0.4\",\n },\n },\n mongodb: {\n description: \"Installs mongodb driver for database driver (Cascade Package)\",\n dependencies: {\n mongodb: \"^7.0.0\",\n },\n },\n scheduler: {\n description: \"Installs warlock scheduler for scheduling tasks\",\n dependencies: {\n \"@warlock.js/scheduler\": \"~4.0.0\",\n },\n },\n swagger: {\n description: \"Installs warlock swagger for API documentation\",\n dependencies: {\n \"@warlock.js/swagger\": \"~4.0.0\",\n },\n },\n postman: {\n description: \"Installs warlock postman for API documentation\",\n dependencies: {\n \"@warlock.js/postman\": \"~4.0.0\",\n },\n },\n postgress: {\n description: \"Installs pg for Postgress database (Cascade Package)\",\n dependencies: {\n pg: \"^8.11.0\",\n },\n },\n mysql: {\n description: \"Installs mysql2 for MySQL database driver (Cascade Package)\",\n dependencies: {\n mysql2: \"^3.5.0\",\n },\n },\n redis: {\n description: \"Installs redis for Redis cache driver (Cache Package)\",\n dependencies: {\n redis: \"^4.6.13\",\n },\n },\n s3: {\n description: \"Installs AWS SDK for Cloud storage (Storage Package)\",\n dependencies: {\n \"@aws-sdk/client-s3\": \"^3.955.0\",\n \"@aws-sdk/lib-storage\": \"^3.955.0\",\n \"@aws-sdk/s3-request-presigner\": \"^3.955.0\",\n },\n },\n};\n\nconst allowedFeatures = Object.keys(featuresMap);\n\ntype PackageManager = \"yarn\" | \"pnpm\" | \"npm\";\n\nexport async function addCommandAction(options: CommandActionData) {\n const features = options.args;\n const { packageManager, list } = options.options;\n\n if (list) {\n console.log(\"Available Features:\");\n\n for (const feature of allowedFeatures) {\n console.log(\n `- ${colors.yellowBright(feature)}: ${colors.green(featuresMap[feature].description)}`,\n );\n }\n\n process.exit(0);\n }\n\n validateFeatures(features);\n\n const packageManagerCommand = await getPackageManagerCommand(packageManager as PackageManager);\n\n const dependencies: Record<string, string> = {};\n const devDependencies: Record<string, string> = {};\n\n for (const feature of features) {\n const featurePackages = featuresMap[feature as keyof typeof featuresMap];\n Object.assign(dependencies, featurePackages.dependencies);\n if (featurePackages.devDependencies) {\n Object.assign(devDependencies, featurePackages.devDependencies);\n }\n }\n\n // TODO: to reduce time of execution, check packages that are already installed\n\n // install dependencies\n if (Object.keys(dependencies).length > 0) {\n console.log(`Installing dependencies ${colors.magenta(Object.keys(dependencies).join(\", \"))}`);\n execSync(`${packageManagerCommand} ${Object.keys(dependencies).join(\" \")}`, {\n cwd: process.cwd(),\n stdio: \"inherit\",\n });\n\n console.log(\n `Dependencies installed successfully ${colors.green(Object.keys(dependencies).join(\", \"))}`,\n );\n }\n\n // install dev dependencies\n if (Object.keys(devDependencies).length > 0) {\n console.log(\n `Installing dev dependencies ${colors.magenta(Object.keys(devDependencies).join(\", \"))}`,\n );\n execSync(`${packageManagerCommand} ${Object.keys(devDependencies).join(\" \")}`, {\n cwd: process.cwd(),\n stdio: \"inherit\",\n });\n\n console.log(\n `Dev dependencies installed successfully ${colors.green(Object.keys(devDependencies).join(\", \"))}`,\n );\n }\n}\n\nfunction validateFeatures(features: string[]) {\n for (const feature of features) {\n if (!allowedFeatures.includes(feature)) {\n console.log(\n `Feature ${colors.redBright(feature)} is not allowed, allowed features are: ${colors.green(allowedFeatures.join(\", \"))}`,\n );\n process.exit(1);\n }\n }\n}\n\nasync function getPackageManagerCommand(packageManager?: PackageManager) {\n if (!packageManager) {\n // try to detect it through checking lock files\n packageManager = await detectPackageManager();\n }\n\n if (packageManager === \"npm\") {\n return \"npm install\";\n }\n\n if (packageManager === \"yarn\") {\n return \"yarn add\";\n }\n\n if (packageManager === \"pnpm\") {\n return \"pnpm add\";\n }\n}\n\nasync function detectPackageManager() {\n if (await fileExistsAsync(rootPath(\"package-lock.json\"))) {\n return \"npm\";\n }\n\n if (await fileExistsAsync(rootPath(\"yarn.lock\"))) {\n return \"yarn\";\n }\n\n if (await fileExistsAsync(rootPath(\"pnpm-lock.yaml\"))) {\n return \"pnpm\";\n }\n}\n","import type {\r\n CLICommandAction,\r\n CLICommandOption,\r\n CLICommandOptions,\r\n CLICommandPreload,\r\n CLICommandSource,\r\n CommandActionData,\r\n ResolvedCLICommandOption,\r\n} from \"./types\";\r\n\r\nexport class CLICommand {\r\n /**\r\n * Command source\r\n */\r\n public commandSource?: CLICommandSource;\r\n\r\n /**\r\n * Command action\r\n */\r\n public commandAction?: CLICommandAction;\r\n\r\n /**\r\n * Command pre action\r\n * This will be executed before loading preloaders\r\n */\r\n public commandPreAction?: CLICommandAction;\r\n\r\n /**\r\n * Command preload\r\n */\r\n public commandPreload?: CLICommandPreload;\r\n\r\n /**\r\n * Command description\r\n */\r\n public commandDescription?: string;\r\n\r\n /**\r\n * Command options\r\n */\r\n public commandOptions: ResolvedCLICommandOption[] = [];\r\n\r\n /**\r\n * Command relative path\r\n * Available only for project commands\r\n * Auto injected by the framework itself\r\n */\r\n public commandRelativePath?: string;\r\n\r\n /**\r\n * Determine if the command is persistent\r\n */\r\n public isPersistent: boolean = false;\r\n\r\n /**\r\n * Command alias (short name)\r\n */\r\n public commandAlias?: string;\r\n\r\n /**\r\n * Constructor\r\n */\r\n public constructor(\r\n public name: string,\r\n description?: string,\r\n ) {\r\n if (description) {\r\n this.commandDescription = description;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Add command source\r\n */\r\n public source(source: CLICommandSource): this {\r\n this.commandSource = source;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set command description\r\n */\r\n public description(description: string): this {\r\n this.commandDescription = description;\r\n return this;\r\n }\r\n\r\n /**\r\n * Determine if the command is persistent\r\n */\r\n public persistent(isPersistent = true): this {\r\n this.isPersistent = isPersistent;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set command alias (short name)\r\n * @example .alias(\"m\") for \"migrate\"\r\n */\r\n public alias(alias: string): this {\r\n this.commandAlias = alias;\r\n return this;\r\n }\r\n\r\n /**\r\n * Command action\r\n */\r\n public action(action: CLICommandAction): this {\r\n this.commandAction = action;\r\n return this;\r\n }\r\n\r\n /**\r\n * Command pre action\r\n * This will be executed before loading preloaders\r\n */\r\n public preAction(action: CLICommandAction): this {\r\n this.commandPreAction = action;\r\n return this;\r\n }\r\n\r\n /**\r\n * Add command options\r\n */\r\n public options(options: CLICommandOption[]): this {\r\n options.map((option) => this.option(option));\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Add command relative path\r\n */\r\n public $relativePath(relativePath: string) {\r\n this.commandRelativePath = relativePath;\r\n return this;\r\n }\r\n\r\n /**\r\n * Add command option\r\n */\r\n public option(option: CLICommandOption): this;\r\n public option(name: string, description?: string, options?: Omit<CLICommandOption, \"name\">): this;\r\n public option(\r\n ...args: [CLICommandOption] | [string, string?, Omit<CLICommandOption, \"name\">?]\r\n ): this {\r\n let option: CLICommandOption;\r\n if (args.length === 1) {\r\n option = args[0] as CLICommandOption;\r\n } else {\r\n option = {\r\n text: args[0],\r\n description: args[1],\r\n ...args[2],\r\n name: \"\",\r\n };\r\n }\r\n\r\n this.commandOptions.push(this.parseOption(option));\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Parse option name and alias if exists\r\n *\r\n * Supports formats:\r\n * - \"--port, -p\" → name: \"port\", alias: \"p\"\r\n * - \"-p, --port\" → name: \"port\", alias: \"p\"\r\n * - \"--port\" → name: \"port\", alias: undefined\r\n * - \"-p\" → name: \"p\", alias: undefined\r\n */\r\n protected parseOption(option: CLICommandOption): ResolvedCLICommandOption {\r\n const text = option.text.trim();\r\n\r\n // Split by comma to check for alias\r\n const parts = text.split(\",\").map((part) => part.trim());\r\n\r\n let name = \"\";\r\n let alias = \"\";\r\n\r\n if (parts.length === 1) {\r\n // Single option: \"--port\" or \"-p\"\r\n name = this.extractOptionName(parts[0]);\r\n } else if (parts.length === 2) {\r\n // Two options: \"--port, -p\" or \"-p, --port\"\r\n const first = parts[0];\r\n const second = parts[1];\r\n\r\n // Determine which is the long form (name) and which is short (alias)\r\n if (first.startsWith(\"--\")) {\r\n name = this.extractOptionName(first);\r\n alias = this.extractOptionName(second);\r\n } else {\r\n name = this.extractOptionName(second);\r\n alias = this.extractOptionName(first);\r\n }\r\n }\r\n\r\n if (alias === \"h\" || name === \"help\") {\r\n throw new Error(\"Help option is not allowed, it's reserved for displaying command help\");\r\n }\r\n\r\n return {\r\n ...option,\r\n name,\r\n alias,\r\n };\r\n }\r\n\r\n /**\r\n * Extract option name from text (removes -- or -)\r\n *\r\n * @example\r\n * extractOptionName(\"--port\") → \"port\"\r\n * extractOptionName(\"-p\") → \"p\"\r\n * extractOptionName(\"--port=3000\") → \"port\"\r\n */\r\n private extractOptionName(text: string): string {\r\n // Remove leading dashes\r\n let name = text.replace(/^-+/, \"\");\r\n\r\n // Remove value assignment if exists (e.g., \"--port=3000\" → \"port\")\r\n const equalIndex = name.indexOf(\"=\");\r\n if (equalIndex !== -1) {\r\n name = name.slice(0, equalIndex);\r\n }\r\n\r\n // Remove angle brackets if exists (e.g., \"--port <number>\" → \"port\")\r\n const spaceIndex = name.indexOf(\" \");\r\n if (spaceIndex !== -1) {\r\n name = name.slice(0, spaceIndex);\r\n }\r\n\r\n return name.trim();\r\n }\r\n\r\n /**\r\n * Command preload\r\n */\r\n public preload(options: CLICommandPreload) {\r\n this.commandPreload = options;\r\n return this;\r\n }\r\n\r\n /**\r\n * Execute the command\r\n */\r\n public async execute(data: CommandActionData) {\r\n if (!this.commandAction) {\r\n throw new Error(`Command \"${this.name}\" has no action defined`);\r\n }\r\n\r\n await this.commandAction(data);\r\n }\r\n}\r\n\r\nexport function command(options: CLICommandOptions) {\r\n const commandInstnace = new CLICommand(options.name, options.description);\r\n\r\n if (options.preload) {\r\n commandInstnace.preload(options.preload);\r\n }\r\n\r\n if (options.persistent) {\r\n commandInstnace.persistent(options.persistent);\r\n }\r\n\r\n if (options.alias) {\r\n commandInstnace.alias(options.alias);\r\n }\r\n\r\n commandInstnace.action(options.action);\r\n\r\n if (options.options) {\r\n commandInstnace.options(options.options);\r\n }\r\n\r\n if (options.preAction) {\r\n commandInstnace.preAction(options.preAction);\r\n }\r\n\r\n return commandInstnace;\r\n}\r\n","import { addCommandAction } from \"../../generations/add-command.action\";\nimport { command } from \"../cli-command\";\n\nexport const addCommand = command({\n name: \"add <features...>\",\n description: \"Add new feature(s) to the project\",\n action: addCommandAction,\n options: [\n {\n text: \"--package-manager -pm\",\n description: \"Package manager to use, if not passed, it will be detected automatically\",\n },\n {\n text: \"--list, -l\",\n description: \"List available features\",\n },\n ],\n});\n","import type { OnLoadArgs, OnResolveArgs, PluginBuild } from \"esbuild\";\n\nexport const nativeNodeModulesPlugin = {\n name: \"native-node-modules\",\n setup(build: PluginBuild) {\n build.onResolve({ filter: /\\.node$/, namespace: \"file\" }, (args: OnResolveArgs) => ({\n path: require.resolve(args.path, { paths: [args.resolveDir] }),\n namespace: \"node-file\",\n }));\n\n build.onLoad({ filter: /.*/, namespace: \"node-file\" }, (args: OnLoadArgs) => ({\n contents: `\n import path from ${JSON.stringify(args.path)}\n try { module.exports = require(path) }\n catch {}\n `,\n }));\n\n build.onResolve({ filter: /\\.node$/, namespace: \"node-file\" }, (args: OnResolveArgs) => ({\n path: args.path,\n namespace: \"file\",\n }));\n\n const opts = build.initialOptions;\n opts.loader = opts.loader || {};\n opts.loader[\".node\"] = \"file\";\n },\n};\n","import { colors } from \"@mongez/copper\";\nimport { ensureDirectoryAsync, putFileAsync, removeDirectoryAsync } from \"@mongez/fs\";\nimport esbuild from \"esbuild\";\nimport glob from \"fast-glob\";\nimport path from \"path\";\nimport { appPath, warlockPath } from \"../utils\";\nimport { WarlockConfig } from \"../warlock-config/types\";\nimport { warlockConfigManager } from \"../warlock-config/warlock-config.manager\";\nimport { nativeNodeModulesPlugin } from \"./esbuild-plugins\";\n\n/**\n * Production Builder\n * Generates production-ready files and bundles them for deployment\n * Build options are loaded from warlock.config.ts\n */\nexport class ProductionBuilder {\n private options!: Required<WarlockConfig[\"build\"]>;\n private readonly productionDir = warlockPath(\"production\");\n\n /**\n * Main build entry point\n */\n public async build(): Promise<void> {\n console.log(colors.cyan(\"🚀 Building for production...\\n\"));\n\n // Step 1: Initialize options from config\n await this.initializeOptions();\n\n // Step 2: Generate combined files\n await this.generateCombinedFiles();\n\n // Step 3: Generate entry point\n await this.generateEntryPoint();\n\n // Step 4: Bundle with esbuild\n await this.bundle();\n\n // Step 5: Remove production folder\n await removeDirectoryAsync(this.productionDir);\n\n console.log(colors.green(\"\\n✅ Build complete!\"));\n console.log(`Start production server by running ${colors.cyan(\"warlock start\")}`);\n }\n\n /**\n * Initialize options from warlock.config.ts\n */\n private async initializeOptions(): Promise<void> {\n this.options = warlockConfigManager.get(\"build\") as Required<WarlockConfig[\"build\"]>;\n\n // Ensure production directory exists\n await ensureDirectoryAsync(this.productionDir);\n }\n\n /**\n * Track which special files were generated\n */\n private generatedFiles = {\n locales: false,\n events: false,\n main: false,\n routes: false,\n };\n\n /**\n * Generate all combined files\n */\n private async generateCombinedFiles(): Promise<void> {\n console.log(colors.yellow(\" Generating production files...\"));\n\n // Generate bootstrap.ts file\n await this.generateBootstrap();\n\n // Generate config loader\n await this.generateConfigLoader();\n\n // Generate special files and track which ones have content\n const [locales, events, main, routes] = await Promise.all([\n this.generateLocales(),\n this.generateEvents(),\n this.generateMain(),\n this.generateRoutes(),\n ]);\n\n this.generatedFiles = { locales, events, main, routes };\n }\n\n /**\n * Generate bootstrap.ts - ensures bootstrap() runs first and sets production environment\n */\n private async generateBootstrap(): Promise<void> {\n const content = `import { bootstrap, setEnvironment } from \"@warlock.js/core\";\n\n// Set production environment\nsetEnvironment(\"production\");\n\n// Bootstrap the application\nbootstrap();\n`;\n await putFileAsync(path.join(this.productionDir, \"bootstrap.ts\"), content);\n }\n\n /**\n * Glob for module files matching a pattern\n * Returns relative paths from .warlock/production/ to src/app/\n */\n private async globModule(fileName: string): Promise<string[]> {\n const pattern = `**/${fileName}.{ts,tsx}`;\n const appDirectory = appPath();\n\n const files = await glob(pattern, {\n cwd: appDirectory,\n absolute: false,\n });\n\n // Convert to relative paths from .warlock/production/ to src/app/\n // e.g., \"users/main\" -> \"../../src/app/users/main\"\n return files.map((file) => \"../../src/app/\" + file.replace(/\\.(ts|tsx)$/, \"\"));\n }\n\n /**\n * Glob for files in a specific directory pattern\n * Returns relative paths from .warlock/production/ to src/app/\n */\n private async globModuleDirectory(directory: string): Promise<string[]> {\n const pattern = `**/${directory}/*.{ts,tsx}`;\n const appDirectory = appPath();\n\n const files = await glob(pattern, {\n cwd: appDirectory,\n absolute: false,\n });\n\n return files.map((file) => \"../../src/app/\" + file.replace(/\\.(ts|tsx)$/, \"\"));\n }\n\n /**\n * Generate config-loader.ts\n */\n private async generateConfigLoader(): Promise<void> {\n const configDirectory = path.join(process.cwd(), \"src/config\");\n\n const files = await glob(\"*.{ts,tsx}\", {\n cwd: configDirectory,\n absolute: false,\n });\n\n const configNames = files.map((f) => f.replace(/\\.(ts|tsx)$/, \"\"));\n\n const imports: string[] = [\n 'import config from \"@mongez/config\";',\n 'import { configSpecialHandlers } from \"@warlock.js/core\";',\n ];\n const configImports: string[] = [];\n const configSetCalls: string[] = [];\n const executors: string[] = [];\n\n for (const configName of configNames) {\n const varName = `${configName}Config`;\n configImports.push(`import ${varName} from \"../../src/config/${configName}\";`);\n configSetCalls.push(`config.set(\"${configName}\", ${varName});`);\n executors.push(`await configSpecialHandlers.execute(\"${configName}\", ${varName});`);\n }\n\n const content = [\n ...imports,\n \"\",\n \"// Config imports\",\n ...configImports,\n \"\",\n \"// Register configs\",\n ...configSetCalls,\n \"\",\n \"// Special handlers\",\n ...executors,\n \"\",\n ].join(\"\\n\");\n\n await putFileAsync(path.join(this.productionDir, \"config-loader.ts\"), content);\n }\n\n /**\n * Generate locales.ts (only if there are locale files)\n * @returns true if file was generated with content\n */\n private async generateLocales(): Promise<boolean> {\n const files = await this.globModule(\"utils/locales\");\n if (files.length === 0) return false;\n await this.generateImportsFile(files, \"locales.ts\");\n return true;\n }\n\n /**\n * Generate events.ts (only if there are event files)\n * @returns true if file was generated with content\n */\n private async generateEvents(): Promise<boolean> {\n const files = await this.globModuleDirectory(\"events\");\n if (files.length === 0) return false;\n await this.generateImportsFile(files, \"events.ts\");\n return true;\n }\n\n /**\n * Generate main.ts (only if there are main files)\n * @returns true if file was generated with content\n */\n private async generateMain(): Promise<boolean> {\n const files = await this.globModule(\"main\");\n if (files.length === 0) return false;\n await this.generateImportsFile(files, \"main.ts\");\n return true;\n }\n\n /**\n * Generate routes.ts (only if there are route files)\n * @returns true if file was generated with content\n */\n private async generateRoutes(): Promise<boolean> {\n const files = await this.globModule(\"routes\");\n if (files.length === 0) return false;\n await this.generateImportsFile(files, \"routes.ts\");\n return true;\n }\n\n /**\n * Generate a file with imports from all given files\n */\n private async generateImportsFile(importPaths: string[], outputFile: string): Promise<void> {\n const imports = importPaths.map((importPath) => `import \"${importPath}\";`);\n const content = imports.join(\"\\n\") + \"\\n\";\n await putFileAsync(path.join(this.productionDir, outputFile), content);\n }\n\n /**\n * Generate the main entry point (app.ts)\n */\n private async generateEntryPoint(): Promise<void> {\n console.log(colors.yellow(\" Generating entry point...\"));\n\n // Build imports based on which files were generated\n const imports: string[] = [\n \"// 1. Bootstrap (loads .env, initializes framework)\",\n 'import \"./bootstrap\";',\n \"\",\n \"// 2. Load configs\",\n 'import \"./config-loader\";',\n ];\n\n // Add special files in correct order (only if they have content)\n imports.push(\"\", \"// 3. Load special files in order\");\n\n if (this.generatedFiles.events) {\n imports.push('import \"./events\";');\n }\n if (this.generatedFiles.locales) {\n imports.push('import \"./locales\";');\n }\n if (this.generatedFiles.main) {\n imports.push('import \"./main\";');\n }\n if (this.generatedFiles.routes) {\n imports.push('import \"./routes\";');\n }\n\n // Start connectors at the end\n imports.push(\n \"\",\n \"// 4. Start connectors (database, cache, http)\",\n 'import { connectorsManager } from \"@warlock.js/core\";',\n \"await connectorsManager.start();\",\n `connectorsManager.shutdownOnProcessKill();`,\n );\n\n const content = imports.join(\"\\n\") + \"\\n\";\n await putFileAsync(path.join(this.productionDir, \"app.ts\"), content);\n }\n\n /**\n * Bundle with esbuild\n */\n private async bundle(): Promise<void> {\n console.log(colors.magenta(\" Bundling with esbuild...\"));\n\n const entryPoint = path.join(this.productionDir, \"app.ts\");\n const outfile = path.resolve(this.options!.outDirectory!, this.options!.outFile!);\n\n await ensureDirectoryAsync(this.options!.outDirectory!);\n\n await esbuild.build({\n platform: \"node\",\n entryPoints: [entryPoint],\n bundle: true,\n packages: \"external\",\n minify: this.options!.minify,\n sourcemap: this.options!.sourcemap === true ? \"linked\" : this.options!.sourcemap,\n format: \"esm\",\n target: [\"esnext\"],\n outfile,\n plugins: [nativeNodeModulesPlugin],\n });\n }\n}\n","import { ProductionBuilder } from \"./production-builder\";\n\n/**\n * Build the application for production\n * Options are loaded from warlock.config.ts\n */\nexport async function buildAppProduction() {\n const builder = new ProductionBuilder();\n await builder.build();\n}\n","import { buildAppProduction } from \"../../production/build-app-production\";\nimport { command } from \"../cli-command\";\n\nexport const buildCommand = command({\n name: \"build\",\n description: \"Build the project for production\",\n action: buildAppProduction,\n preload: {\n warlockConfig: true,\n },\n});\n","import { loadEnv } from \"@mongez/dotenv\";\nimport { configManager } from \"../config/config-manager\";\nimport { connectorsManager } from \"./connectors/connectors-manager\";\nimport type { DependencyGraph } from \"./dependency-graph\";\nimport { devLogHMR } from \"./dev-logger\";\nimport { exportAnalyzer } from \"./export-analyzer\";\nimport { FileManager } from \"./file-manager\";\nimport type { ModuleLoader } from \"./module-loader\";\nimport type { SpecialFilesCollector } from \"./special-files-collector\";\n/**\n * LayerExecutor handles the execution of file reloads based on their layer type\n *\n * Strategy:\n * 1. Determine reload type (FSR or HMR) based on invalidation chain\n * 2. For FSR: Restart connectors if needed, reload special files\n * 3. For HMR: Clear module cache, reload affected modules\n */\nexport class LayerExecutor {\n public constructor(\n private readonly dependencyGraph: DependencyGraph,\n private readonly specialFilesCollector: SpecialFilesCollector,\n private readonly moduleLoader: ModuleLoader,\n ) {}\n\n /**\n * Execute batch reload for multiple changed files\n * @param changedPaths Array of relative paths that changed\n * @param filesMap Map of all FileManager instances\n */\n public async executeBatchReload(\n changedPaths: string[],\n filesMap: Map<string, FileManager>,\n deletedFiles: string[],\n ): Promise<void> {\n if (changedPaths.length === 0) {\n if (deletedFiles.length > 0) {\n deletedFiles.forEach((file) => {\n const fileSystem = filesMap.get(file);\n if (fileSystem) {\n this.moduleLoader.cleanupDeletedModule(fileSystem);\n }\n });\n }\n return;\n }\n\n // Build combined invalidation chain for all changed files\n const allInvalidatedFiles = new Set<string>();\n const fsrFiles: string[] = [];\n const hmrFiles: string[] = [];\n\n for (const relativePath of changedPaths) {\n const fileManager = filesMap.get(relativePath);\n if (!fileManager) continue;\n\n // Get invalidation chain for this file\n const invalidationChain = this.dependencyGraph.getInvalidationChain(relativePath);\n\n // Add to combined set\n invalidationChain.forEach((file) => allInvalidatedFiles.add(file));\n\n // Determine strategy for this file\n const strategy = this.determineReloadStrategy(invalidationChain, filesMap);\n\n if (strategy === \"FSR\") {\n fsrFiles.push(relativePath);\n } else {\n hmrFiles.push(relativePath);\n }\n }\n\n try {\n hmrFiles.forEach((file) => {\n const dependentCount = this.dependencyGraph.getInvalidationChain(file).length - 1;\n const fileSystem = filesMap.get(file);\n if (fileSystem) {\n this.moduleLoader.clearModuleCache(fileSystem.absolutePath);\n this.moduleLoader.cleanupFileModule(fileSystem);\n __clearModuleVersion(fileSystem.cachePath);\n exportAnalyzer.clearCache(fileSystem.relativePath);\n }\n\n devLogHMR(file, dependentCount > 0 ? dependentCount : undefined);\n });\n } catch (error) {\n console.log(\"ERRor in devLogHMR: \", error);\n }\n\n try {\n // Execute reload once for all files\n const invalidationChain = Array.from(allInvalidatedFiles);\n\n // if (fsrFiles.length > 0) {\n // // If any file requires FSR, do FSR for all\n // const firstFsrFile = filesMap.get(fsrFiles[0])!;\n // await this.executeFullServerRestart(firstFsrFile, invalidationChain, filesMap);\n // } else {\n // // All files are HMR\n // }\n const firstHmrFile = filesMap.get(hmrFiles[0])!;\n await this.executeHotModuleReplacement(firstHmrFile, invalidationChain, filesMap, hmrFiles);\n } catch (error) {\n console.log(\"Error in execute HotModuleReplacement: \", error);\n }\n\n try {\n deletedFiles.forEach((file) => {\n const fileSystem = filesMap.get(file);\n if (fileSystem) {\n this.moduleLoader.cleanupDeletedModule(fileSystem);\n }\n });\n } catch (error) {\n console.log(\"ERRor in deleteFiles: \", error);\n }\n }\n\n /**\n * Determine if we need FSR or HMR\n * FSR is needed if ANY file in the invalidation chain is FSR layer\n */\n private determineReloadStrategy(\n invalidationChain: string[],\n filesMap: Map<string, FileManager>,\n ): \"FSR\" | \"HMR\" {\n for (const relativePath of invalidationChain) {\n const file = filesMap.get(relativePath);\n if (file && file.layer === \"FSR\") {\n return \"FSR\";\n }\n }\n return \"HMR\";\n }\n\n /**\n * Execute Full Server Restart\n * This happens when config, routes, or other FSR layer files change\n */\n private async executeFullServerRestart(\n changedFile: FileManager,\n invalidationChain: string[],\n filesMap: Map<string, FileManager>,\n ): Promise<void> {\n // Step 1: Handle config files specially\n const configFiles = invalidationChain\n .map((path) => filesMap.get(path))\n .filter((file): file is FileManager => file !== undefined && file.type === \"config\");\n\n if (configFiles.length > 0) {\n // Reload config files first\n for (const configFile of configFiles) {\n await configManager.reload(configFile);\n }\n\n // Restart only affected connectors\n await this.restartAffectedConnectors(invalidationChain);\n\n // Clear module cache for invalidation chain\n await this.clearModuleCacheForChain(invalidationChain, filesMap);\n\n // Reload special files if affected\n await this.reloadAffectedSpecialFiles(invalidationChain);\n return;\n }\n\n // Step 2: For non-config FSR (routes, etc.), restart all connectors\n await this.restartAffectedConnectors(invalidationChain);\n\n // Step 3: Clear module cache for invalidation chain\n await this.clearModuleCacheForChain(invalidationChain, filesMap);\n\n // Step 4: Reload special files if affected\n await this.reloadAffectedSpecialFiles(invalidationChain);\n }\n\n /**\n * Execute Hot Module Replacement\n * This happens when only HMR layer files (controllers, services, etc.) change\n */\n private async executeHotModuleReplacement(\n changedFile: FileManager,\n invalidationChain: string[],\n filesMap: Map<string, FileManager>,\n hmrFiles: string[],\n ): Promise<void> {\n // Step 1: Clear module cache for invalidation chain\n await this.clearModuleCacheForChain(invalidationChain, filesMap);\n\n // Step 2: Reload affected modules\n await this.reloadAffectedModules(invalidationChain, filesMap);\n\n await this.restartAffectedConnectors(hmrFiles);\n }\n\n /**\n * Restart connectors that are affected by the changed files\n */\n private async restartAffectedConnectors(affectedFiles: string[]): Promise<void> {\n const connectorsToRestart = connectorsManager\n .list()\n .filter((connector) => connector.shouldRestart(affectedFiles));\n\n if (connectorsToRestart.length === 0) {\n return;\n }\n\n // Restart in priority order\n for (const connector of connectorsToRestart) {\n connector.restart();\n }\n }\n\n /**\n * Clear Node.js module cache for the invalidation chain\n * and re-process files to pick up export changes\n */\n private async clearModuleCacheForChain(\n invalidationChain: string[],\n filesMap: Map<string, FileManager>,\n ): Promise<void> {\n for (const relativePath of invalidationChain) {\n const file = filesMap.get(relativePath);\n if (file) {\n this.moduleLoader.clearModuleCache(file.absolutePath);\n\n // Update module version for HMR cache busting\n __clearModuleVersion(`./${file.cachePath}`);\n\n // Clear export analyzer cache for proper re-export transformation\n exportAnalyzer.clearCache(file.relativePath);\n\n // Re-process the file to pick up export changes\n // This is crucial for files that re-export from changed dependencies\n // Skip saving to cache since we'll reload the module anyway\n await file.process({ force: true, saveToCache: true });\n }\n }\n }\n\n /**\n * Reload special files that are affected by the change\n * This includes main, routes, events, locales\n * Special files are reloaded if they are in the invalidation chain OR if they depend on files in the chain\n */\n private async reloadAffectedSpecialFiles(invalidationChain: string[]): Promise<void> {\n // Helper to check if a file is affected (either in chain or depends on chain)\n const isAffected = (file: FileManager): boolean => {\n // Direct match: file itself is in the chain\n if (invalidationChain.includes(file.relativePath)) {\n return true;\n }\n // Indirect match: file depends on something in the chain\n for (const dep of file.dependencies) {\n if (invalidationChain.includes(dep)) {\n return true;\n }\n }\n return false;\n };\n\n // Check which special files are affected\n const affectedMainFiles = this.specialFilesCollector.getMainFiles().filter(isAffected);\n\n const affectedRouteFiles = this.specialFilesCollector.getRouteFiles().filter(isAffected);\n\n const affectedEventFiles = this.specialFilesCollector.getEventFiles().filter(isAffected);\n\n const affectedLocaleFiles = this.specialFilesCollector.getLocaleFiles().filter(isAffected);\n\n // Reload affected special files\n if (affectedMainFiles.length > 0) {\n for (const file of affectedMainFiles) {\n await this.moduleLoader.reloadModule(file);\n }\n }\n\n if (affectedLocaleFiles.length > 0) {\n for (const file of affectedLocaleFiles) {\n await this.moduleLoader.reloadModule(file);\n }\n }\n\n if (affectedEventFiles.length > 0) {\n for (const file of affectedEventFiles) {\n await this.moduleLoader.reloadModule(file);\n }\n }\n\n if (affectedRouteFiles.length > 0) {\n for (const file of affectedRouteFiles) {\n await this.moduleLoader.reloadModule(file);\n }\n }\n }\n\n /**\n * Reload affected modules (for HMR)\n * Special files (main, routes, events, locales) need to be actively reloaded\n * Other files will be loaded on next import\n */\n private async reloadAffectedModules(\n invalidationChain: string[],\n filesMap: Map<string, FileManager>,\n ): Promise<void> {\n // Helper to check if a file is affected (either in chain or depends on chain)\n const isAffected = (file: FileManager): boolean => {\n // Direct match: file itself is in the chain\n if (invalidationChain.includes(file.relativePath)) {\n return true;\n }\n // Indirect match: file depends on something in the chain\n for (const dep of file.dependencies) {\n if (invalidationChain.includes(dep)) {\n return true;\n }\n }\n return false;\n };\n\n const isEnvFileAffected = invalidationChain.some((path) => path.endsWith(\".env\"));\n\n if (isEnvFileAffected) {\n await loadEnv();\n }\n\n // Check which special files are affected\n const affectedMainFiles = this.specialFilesCollector.getMainFiles().filter(isAffected);\n\n const affectedConfigFiles = this.specialFilesCollector\n .getConfigFiles()\n .filter((file) => (isEnvFileAffected ? true : isAffected(file)));\n\n const affectedRouteFiles = this.specialFilesCollector.getRouteFiles().filter(isAffected);\n\n const affectedEventFiles = this.specialFilesCollector.getEventFiles().filter(isAffected);\n\n const affectedLocaleFiles = this.specialFilesCollector.getLocaleFiles().filter(isAffected);\n\n const hasSpecialFiles =\n affectedMainFiles.length > 0 ||\n affectedRouteFiles.length > 0 ||\n affectedEventFiles.length > 0 ||\n affectedLocaleFiles.length > 0 ||\n affectedConfigFiles.length > 0;\n\n // For future me:\n // why we are only allowing special files?\n // because they act as entry points\n // so for example of a service file is changed\n // but not called within a controller that's called\n // within a router, then it's useless to reload it\n // since it will not be executed.\n if (!hasSpecialFiles) {\n // however, we could just reload the last file in the chain\n // since it's the main dependent file instead of reloading all of them.\n const lastFileInChain = invalidationChain[invalidationChain.length - 1];\n const file = filesMap.get(lastFileInChain);\n if (!file) {\n return;\n }\n await this.moduleLoader.reloadModule(file);\n return;\n }\n\n if (affectedConfigFiles.length > 0) {\n for (const file of affectedConfigFiles) {\n await configManager.reload(file);\n }\n }\n\n // Reload special files\n if (affectedMainFiles.length > 0) {\n for (const file of affectedMainFiles) {\n await this.moduleLoader.reloadModule(file);\n }\n }\n\n if (affectedLocaleFiles.length > 0) {\n for (const file of affectedLocaleFiles) {\n await this.moduleLoader.reloadModule(file);\n }\n }\n\n if (affectedEventFiles.length > 0) {\n for (const file of affectedEventFiles) {\n await this.moduleLoader.reloadModule(file);\n }\n }\n\n if (affectedRouteFiles.length > 0) {\n for (const file of affectedRouteFiles) {\n await this.moduleLoader.reloadModule(file);\n }\n }\n }\n}\n","import { env } from \"@mongez/dotenv\";\nimport { ensureDirectoryAsync } from \"@mongez/fs\";\nimport { spawn } from \"child_process\";\nimport { constants } from \"fs\";\nimport { access, readFile, writeFile } from \"fs/promises\";\nimport { join, resolve } from \"path\";\nimport ts from \"typescript\";\nimport { warlockPath } from \"../utils\";\nimport { devLogError, devLogInfo, devLogSuccess, devServeLog } from \"./dev-logger\";\nimport { filesOrchestrator } from \"./files-orchestrator\";\nimport { Path } from \"./path\";\n\n/**\n * Typings manifest structure for tracking file hashes\n */\ntype TypingsManifest = {\n version: string;\n lastBuildTime: number;\n storage: {\n sourceHash: string;\n drivers: string[];\n } | null;\n config: Record<\n string,\n {\n sourceHash: string;\n typeName: string | null;\n importSource: string | null;\n keys: string[];\n }\n >;\n};\n\n/**\n * TypeGenerator - Generates TypeScript type definitions from config files\n *\n * Parses source config files using the TypeScript Compiler API to extract\n * keys and generate module augmentation types for IDE autocomplete.\n *\n * Uses manifest-based reconciliation to only regenerate when source files change.\n */\nexport class TypeGenerator {\n /**\n * Output directory for generated typings\n */\n private outputDir = warlockPath(\"typings\");\n\n /**\n * Path to typings manifest file\n */\n private manifestPath = join(this.outputDir, \"typings-manifest.json\");\n\n /**\n * Cached manifest data\n */\n private manifest: TypingsManifest | null = null;\n\n /**\n * Cache for config type info and keys\n */\n private configCache = new Map<\n string,\n {\n sourceHash: string;\n typeName: string | null;\n importSource: string | null;\n keys: string[];\n }\n >();\n\n /**\n * Generate all framework type definitions\n *\n * Uses manifest-based reconciliation:\n * - If output files don't exist: full regeneration\n * - If files exist: only regenerate changed configs\n */\n public async generateAll(): Promise<void> {\n await this.ensureOutputDir();\n\n const storageFile = join(this.outputDir, \"storage.d.ts\");\n const configFile = join(this.outputDir, \"config.d.ts\");\n\n const [manifestExists, storageExists, configExists] = await Promise.all([\n this.exists(this.manifestPath),\n this.exists(storageFile),\n this.exists(configFile),\n ]);\n\n if (!manifestExists || !storageExists || !configExists) {\n // Full regeneration (first run or files deleted)\n await this.fullGeneration();\n } else {\n // Load manifest for hash comparison\n await this.loadManifest();\n // Reconciliation: only regenerate changed files\n await this.reconcile();\n }\n\n await this.saveManifest();\n }\n\n /**\n * Full regeneration of all type files\n */\n private async fullGeneration(): Promise<void> {\n // Generate storage types\n const storageConfigPath = await this.findConfigFile(\"storage\");\n if (storageConfigPath) {\n this.generateStorageTypes(storageConfigPath);\n }\n\n // Generate config types\n await this.generateConfigTypes();\n }\n\n /**\n * Reconcile: only regenerate changed files\n */\n private async reconcile(): Promise<void> {\n const files = filesOrchestrator.getFiles();\n let storageChanged = false;\n let configChanged = false;\n let unchangedCount = 0;\n\n // Check storage config\n for (const [path, fileManager] of files) {\n if (path.startsWith(\"src/config/storage\")) {\n const manifestEntry = this.manifest?.storage;\n if (!manifestEntry || manifestEntry.sourceHash !== fileManager.hash) {\n storageChanged = true;\n await this.generateStorageTypes(path);\n }\n break;\n }\n }\n\n // Check config files\n for (const [path, fileManager] of files) {\n if (!path.startsWith(\"src/config/\")) continue;\n if (path.includes(\"index\")) continue;\n\n // Extract config name (remove dir prefix and extension)\n const configName = path.replace(\"src/config/\", \"\").replace(/\\.[^.]+$/, \"\");\n\n const manifestEntry = this.manifest?.config[configName];\n\n if (!manifestEntry || manifestEntry.sourceHash !== fileManager.hash) {\n // File changed or new - regenerate\n configChanged = true;\n const info = await this.extractConfigInfo(fileManager.absolutePath, configName);\n\n this.configCache.set(configName, {\n sourceHash: fileManager.hash,\n typeName: info.typeName,\n importSource: info.importSource,\n keys: info.keys,\n });\n } else {\n // Unchanged - load from manifest\n unchangedCount++;\n this.configCache.set(configName, manifestEntry);\n }\n }\n\n if (configChanged) {\n await this.writeConfigTypesFromCache();\n } else {\n devLogInfo(`Config types unchanged (${unchangedCount} configs cached)`);\n }\n }\n\n /**\n * Generate storage driver name types\n */\n public async generateStorageTypes(configPath: string): Promise<void> {\n try {\n const driverKeys = await this.extractStorageDriverKeys(configPath);\n\n if (driverKeys.length === 0) {\n devServeLog(\"⚠️ No storage drivers found in config\");\n return;\n }\n\n // Get file hash from filesOrchestrator\n const fileManager = filesOrchestrator.getFiles().get(configPath);\n const sourceHash = fileManager?.hash || \"\";\n\n // Update manifest\n if (!this.manifest) {\n this.manifest = this.createEmptyManifest();\n }\n this.manifest.storage = {\n sourceHash,\n drivers: driverKeys,\n };\n\n const interfaceContent = driverKeys.map((k) => ` ${k}: true;`).join(\"\\n\");\n\n const content = `// Auto-generated by Warlock.js - DO NOT EDIT\n// Generated from: ${configPath}\n// Regenerates on dev-server start and when storage config changes\n\nimport \"@warlock.js/core\";\n\ndeclare module \"@warlock.js/core\" {\n interface StorageDriverRegistry {\n${interfaceContent}\n }\n}\n`;\n\n const outputPath = join(this.outputDir, \"storage.d.ts\");\n await writeFile(outputPath, content, \"utf-8\");\n\n devLogSuccess(`Generated storage types: ${driverKeys.join(\", \")}`);\n } catch (error) {\n devServeLog(`⚠️ Failed to generate storage types: ${error}`);\n }\n }\n\n /**\n * Check if a file change should trigger type regeneration\n */\n public shouldRegenerateTypes(changedPath: string): boolean {\n return changedPath.includes(\"src/config/\") || changedPath.includes(\"config/\");\n }\n\n /**\n * Handle file change - uses incremental update via cache\n */\n public async handleFileChange(changedPath: string): Promise<void> {\n if (!this.shouldRegenerateTypes(changedPath)) {\n return;\n }\n\n // Regenerate storage types if storage config changed\n if (changedPath.includes(\"config/storage\")) {\n await this.generateStorageTypes(changedPath);\n await this.saveManifest();\n return;\n }\n\n // Extract config name from path\n const match = changedPath.match(/config\\/([^/]+)\\.[^.]+$/);\n if (!match) {\n return;\n }\n\n const configName = match[1];\n if (configName === \"index\") return;\n\n devLogInfo(`Config changed: ${configName}, updating...`);\n\n // Get file manager for hash\n const fileManager = filesOrchestrator.getFiles().get(changedPath);\n const sourceHash = fileManager?.hash || Date.now().toString();\n\n // Update only the changed config in cache (use optimized combined extraction)\n const configDir = join(process.cwd(), \"src/config\");\n const configPath = join(configDir, `${configName}.ts`);\n\n const info = await this.extractConfigInfo(configPath, configName);\n\n this.configCache.set(configName, {\n sourceHash,\n typeName: info.typeName,\n importSource: info.importSource,\n keys: info.keys,\n });\n\n // Regenerate config.d.ts from cache\n await this.writeConfigTypesFromCache();\n await this.saveManifest();\n }\n\n /**\n * Generate config types - populates cache and writes file\n */\n public async generateConfigTypes(): Promise<void> {\n try {\n const files = filesOrchestrator.getFiles();\n\n // Clear and repopulate cache\n this.configCache.clear();\n\n for (const [path, fileManager] of files) {\n if (!path.startsWith(\"src/config/\")) continue;\n if (path.includes(\"index\")) continue;\n\n // Extract config name\n const configName = path.replace(\"src/config/\", \"\").replace(/\\.[^.]+$/, \"\");\n\n // Use optimized combined extraction (single ts.createProgram call)\n const info = await this.extractConfigInfo(fileManager.absolutePath, configName);\n\n this.configCache.set(configName, {\n sourceHash: fileManager.hash,\n typeName: info.typeName,\n importSource: info.importSource,\n keys: info.keys,\n });\n }\n\n await this.writeConfigTypesFromCache();\n } catch (error) {\n devServeLog(`⚠️ Failed to generate config types: ${error}`);\n }\n }\n\n /**\n * Write config.d.ts from cached data\n */\n private async writeConfigTypesFromCache(): Promise<void> {\n const configTypeInfos: Array<{\n name: string;\n typeName: string | null;\n importSource: string | null;\n }> = [];\n const allKeys: string[] = [];\n\n // Update manifest config section\n if (!this.manifest) {\n this.manifest = this.createEmptyManifest();\n }\n this.manifest.config = {};\n\n for (const [name, data] of this.configCache) {\n configTypeInfos.push({\n name,\n typeName: data.typeName,\n importSource: data.importSource,\n });\n allKeys.push(...data.keys);\n\n // Store in manifest\n this.manifest.config[name] = data;\n }\n\n // Group imports by source\n const imports = new Map<string, Set<string>>();\n for (const info of configTypeInfos) {\n if (info.typeName && info.importSource) {\n if (!imports.has(info.importSource)) {\n imports.set(info.importSource, new Set());\n }\n imports.get(info.importSource)!.add(info.typeName);\n }\n }\n\n const importStatements = Array.from(imports.entries())\n .map(([source, types]) => `import type { ${Array.from(types).join(\", \")} } from \"${source}\";`)\n .join(\"\\n\");\n\n const configEntries = configTypeInfos\n .map((info) => ` ${info.name}: ${info.typeName || \"unknown\"};`)\n .join(\"\\n\");\n\n const keyEntries = allKeys.map((key) => ` \"${key}\": true;`).join(\"\\n\");\n\n const content = `// Auto-generated by Warlock.js - DO NOT EDIT\n// Regenerates on dev-server start and when config files change\n\n${importStatements}\nimport \"@warlock.js/core\";\n\ndeclare module \"@warlock.js/core\" {\n interface ConfigRegistry {\n${configEntries}\n }\n\n interface ConfigKeyRegistry {\n${keyEntries}\n }\n}\n`;\n\n const outputPath = join(this.outputDir, \"config.d.ts\");\n await writeFile(outputPath, content, \"utf-8\");\n\n devLogSuccess(\n `Generated config types: ${this.configCache.size} configs, ${allKeys.length} keys`,\n );\n }\n\n // ============================================================\n // Manifest Management\n // ============================================================\n\n /**\n * Load manifest from disk\n */\n private async loadManifest(): Promise<boolean> {\n try {\n if (await this.exists(this.manifestPath)) {\n const content = await readFile(this.manifestPath, \"utf-8\");\n this.manifest = JSON.parse(content);\n return true;\n }\n } catch {\n // Manifest corrupted or missing\n }\n this.manifest = null;\n return false;\n }\n\n /**\n * Save manifest to disk\n */\n private async saveManifest(): Promise<void> {\n if (!this.manifest) {\n this.manifest = this.createEmptyManifest();\n }\n this.manifest.lastBuildTime = Date.now();\n\n await writeFile(this.manifestPath, JSON.stringify(this.manifest, null, 2), \"utf-8\");\n }\n\n /**\n * Create empty manifest structure\n */\n private createEmptyManifest(): TypingsManifest {\n return {\n version: \"1.0.0\",\n lastBuildTime: Date.now(),\n storage: null,\n config: {},\n };\n }\n\n // ============================================================\n // Type Extraction Methods\n // ============================================================\n\n /**\n * Extract BOTH type info AND keys in a single pass\n *\n * This is optimized to create ts.createProgram() only ONCE per file\n * instead of twice (once for type extraction, once for keys).\n * This reduces parsing time by ~50%.\n *\n * @param configPath Absolute path to the config file\n * @param configName Config name (e.g., \"auth\", \"notifications\")\n * @returns Combined result with type info and keys\n */\n private async extractConfigInfo(\n configPath: string,\n configName: string,\n ): Promise<{\n typeName: string | null;\n importSource: string | null;\n keys: string[];\n }> {\n if (!(await this.exists(configPath))) {\n return { typeName: null, importSource: null, keys: [] };\n }\n\n // Create program ONCE (this is the expensive operation)\n const program = ts.createProgram([configPath], {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n moduleResolution: ts.ModuleResolutionKind.NodeJs,\n });\n\n const sourceFile = program.getSourceFile(configPath);\n if (!sourceFile) {\n return { typeName: null, importSource: null, keys: [] };\n }\n\n // === Type Info Extraction ===\n const importedTypes = new Map<string, string>();\n const localExportedTypes = new Set<string>();\n let foundTypeName: string | null = null;\n\n // === Keys Extraction ===\n const keys: string[] = [];\n\n const visitForTypes = (node: ts.Node): void => {\n // Collect imported types\n if (ts.isImportDeclaration(node)) {\n const moduleSpecifier = node.moduleSpecifier;\n if (ts.isStringLiteral(moduleSpecifier)) {\n const source = moduleSpecifier.text;\n const importClause = node.importClause;\n if (importClause?.namedBindings && ts.isNamedImports(importClause.namedBindings)) {\n for (const element of importClause.namedBindings.elements) {\n importedTypes.set(element.name.text, source);\n }\n }\n }\n }\n\n // Collect locally exported types\n if (ts.isTypeAliasDeclaration(node)) {\n const modifiers = ts.getModifiers(node);\n if (modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword)) {\n localExportedTypes.add(node.name.text);\n }\n }\n\n // Collect locally exported interfaces\n if (ts.isInterfaceDeclaration(node)) {\n const modifiers = ts.getModifiers(node);\n if (modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword)) {\n localExportedTypes.add(node.name.text);\n }\n }\n\n // Find type used on config variable + extract keys\n if (ts.isVariableDeclaration(node)) {\n // Type info\n if (node.type && ts.isTypeReferenceNode(node.type)) {\n foundTypeName = node.type.typeName.getText(sourceFile);\n }\n\n // Keys extraction\n if (node.initializer && ts.isObjectLiteralExpression(node.initializer)) {\n const visitKeys = (objNode: ts.ObjectLiteralExpression, prefix: string): void => {\n for (const prop of objNode.properties) {\n if (ts.isPropertyAssignment(prop) && prop.name) {\n const keyName = prop.name.getText(sourceFile);\n const fullKey = prefix ? `${prefix}.${keyName}` : keyName;\n keys.push(fullKey);\n if (ts.isObjectLiteralExpression(prop.initializer)) {\n visitKeys(prop.initializer, fullKey);\n }\n }\n }\n };\n visitKeys(node.initializer, configName);\n }\n }\n\n ts.forEachChild(node, visitForTypes);\n };\n\n ts.forEachChild(sourceFile, visitForTypes);\n\n // Resolve type info\n let typeName: string | null = null;\n let importSource: string | null = null;\n\n if (foundTypeName) {\n if (importedTypes.has(foundTypeName)) {\n typeName = foundTypeName;\n importSource = importedTypes.get(foundTypeName)!;\n } else if (localExportedTypes.has(foundTypeName)) {\n typeName = foundTypeName;\n const relativePath = Path.toRelative(configPath).replace(/\\.(ts|tsx)$/, \"\");\n importSource = `../../${relativePath}`;\n }\n }\n\n return { typeName, importSource, keys };\n }\n\n /**\n * Extract driver keys from storage config\n */\n private async extractStorageDriverKeys(configPath: string): Promise<string[]> {\n const absolutePath = resolve(configPath);\n\n if (!(await this.exists(absolutePath))) {\n devServeLog(`⚠️ Storage config not found: ${absolutePath}`);\n return [];\n }\n\n const program = ts.createProgram([absolutePath], {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n moduleResolution: ts.ModuleResolutionKind.NodeJs,\n });\n\n const sourceFile = program.getSourceFile(absolutePath);\n\n if (!sourceFile) {\n devServeLog(`⚠️ Could not parse storage config: ${absolutePath}`);\n return [];\n }\n\n const keys: string[] = [];\n\n const visit = (node: ts.Node): void => {\n if (ts.isPropertyAssignment(node)) {\n const propName = node.name.getText(sourceFile);\n\n if (propName === \"drivers\" && ts.isObjectLiteralExpression(node.initializer)) {\n for (const prop of node.initializer.properties) {\n if (ts.isPropertyAssignment(prop) || ts.isShorthandPropertyAssignment(prop)) {\n const keyName = prop.name?.getText(sourceFile);\n\n if (keyName) {\n keys.push(keyName);\n }\n }\n }\n }\n }\n\n ts.forEachChild(node, visit);\n };\n\n ts.forEachChild(sourceFile, visit);\n\n return keys;\n }\n\n /**\n * Find a config file by name\n */\n private async findConfigFile(configName: string): Promise<string | undefined> {\n const possiblePaths = [`src/config/${configName}.ts`, `config/${configName}.ts`];\n\n for (const path of possiblePaths) {\n const fullPath = join(process.cwd(), path);\n\n if (await this.exists(fullPath)) {\n return path;\n }\n }\n\n try {\n const files = filesOrchestrator.getFiles();\n\n for (const [filePath] of files) {\n if (filePath.includes(`config/${configName}`)) {\n return filePath;\n }\n }\n } catch {\n // Files orchestrator not initialized yet\n }\n\n return undefined;\n }\n\n /**\n * Ensure output directory exists\n */\n private async ensureOutputDir(): Promise<void> {\n await ensureDirectoryAsync(this.outputDir);\n }\n\n /**\n * Check if a path exists (async wrapper)\n */\n private async exists(path: string): Promise<boolean> {\n try {\n await access(path, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Execute generateAll command using spawn\n */\n public async executeGenerateAllCommand(): Promise<void> {\n devLogInfo(\"Checking for types generation\");\n const isDevServeCore = env(\"DEV_SERVER_CORE\");\n const childProcess = spawn(\n isDevServeCore ? \"yarn\" : \"npx\",\n [isDevServeCore ? \"cli\" : \"warlock\", \"generate.typings\"],\n {\n // const childProcess = spawn(\"yarn\", [\"cli\", \"generate.typings\"], {\n stdio: \"inherit\",\n cwd: process.cwd(),\n shell: true, // Required on Windows to find yarn in PATH\n },\n );\n\n childProcess.on(\"exit\", (code) => {\n if (code === 0) {\n devLogSuccess(\"Types generated successfully\");\n } else {\n devLogError(\"Failed to generate types\");\n }\n });\n }\n\n /**\n * Execute a typings generator for the given files\n */\n public async executeTypingsGenerator(upcomingFiles: string[]): Promise<void> {\n const uniqueFiles = Array.from(new Set(upcomingFiles));\n\n const configFilesOnly = uniqueFiles.filter((file) =>\n Path.normalize(file).includes(\"src/config/\"),\n );\n\n if (configFilesOnly.length === 0) return;\n\n const files = configFilesOnly.map((file) => \"./\" + Path.toRelative(file));\n\n const isDevServeCore = env(\"DEV_SERVER_CORE\");\n\n const childProcess = spawn(\n isDevServeCore ? \"yarn\" : \"npx\",\n [isDevServeCore ? \"cli\" : \"warlock\", \"generate.typings\"],\n {\n stdio: \"inherit\",\n cwd: process.cwd(),\n shell: true, // Required on Windows to find yarn in PATH\n },\n );\n\n childProcess.on(\"exit\", (code) => {\n if (code === 0) {\n devLogSuccess(\"Types generated successfully\");\n } else {\n devLogError(\"Failed to generate types\");\n }\n });\n }\n}\n\n/**\n * Singleton instance for use throughout dev-server\n */\nexport const typeGenerator = new TypeGenerator();\n","import { colors } from \"@mongez/copper\";\nimport events from \"@mongez/events\";\nimport { getFileAsync } from \"@mongez/fs\";\nimport { connectorsManager } from \"./connectors/connectors-manager\";\nimport { devLogReady, devLogSection, devServeLog } from \"./dev-logger\";\nimport { filesOrchestrator } from \"./files-orchestrator\";\nimport { LayerExecutor } from \"./layer-executor\";\nimport { ModuleLoader } from \"./module-loader\";\nimport { typeGenerator } from \"./type-generator\";\n\n/**\n * Development Server\n * Main coordinator for the dev server\n * Manages file system, connectors, and hot reloading\n */\nexport class DevelopmentServer {\n /**\n * Module loader - dynamically loads application modules\n */\n private moduleLoader?: ModuleLoader;\n\n /**\n * Layer executor - handles HMR and FSR execution\n */\n private layerExecutor?: LayerExecutor;\n\n /**\n * Whether the server is currently running\n */\n private running: boolean = false;\n\n public constructor() {\n devLogSection(\"Starting Development Server...\");\n }\n\n /**\n * Initialize and start the development server\n */\n public async start(): Promise<void> {\n try {\n const now = performance.now();\n\n // STEP 1: Initialize file system (discover and process files)\n await filesOrchestrator.init();\n await filesOrchestrator.initiaizeAll();\n\n // Start file watcher\n await filesOrchestrator.watchFiles();\n\n // devLogInfo(\"Initializing special files...\");\n // STEP 3: Collect special files\n filesOrchestrator.specialFilesCollector.collect(filesOrchestrator.getFiles());\n\n // devLogInfo(\"Setting up event listeners...\");\n // STEP 6: Setup event listeners\n this.setupEventListeners();\n\n // STEP 7: Load application modules\n // devLogInfo(\"Loading application modules...\");\n await filesOrchestrator.moduleLoader.loadAll();\n\n // STEP 9: Initialize layer executor\n // devLogInfo(\"Initializing layer executor...\");\n this.layerExecutor = new LayerExecutor(\n filesOrchestrator.getDependencyGraph(),\n filesOrchestrator.specialFilesCollector,\n filesOrchestrator.moduleLoader,\n );\n\n // Mark as running\n this.running = true;\n\n const duration = performance.now() - now;\n\n devLogReady(`Development Server is ready in ${colors.greenBright(parseDuration(duration))}`);\n\n // Generate type definitions in background (non-blocking)\n // Runs after server ready for fast startup\n // typeGenerator.generateAll();\n typeGenerator.executeGenerateAllCommand();\n // Start health checks (non-blocking)\n filesOrchestrator.startCheckingHealth();\n } catch (error) {\n devServeLog(colors.redBright(`❌ Failed to start Development Server: ${error}`));\n await this.shutdown();\n throw error;\n }\n }\n\n /**\n * Setup event listeners for file changes\n */\n private setupEventListeners(): void {\n // Listen to batch completion events from FileEventHandler\n events.on(\n \"dev-server:batch-complete\",\n (batch: { added: string[]; changed: string[]; deleted: string[] }) => {\n this.handleBatchComplete(batch);\n },\n );\n }\n\n /**\n * Handle batch completion event\n * Triggered when a batch of files has been processed\n */\n private async handleBatchComplete(batch: {\n added: string[];\n changed: string[];\n deleted: string[];\n }): Promise<void> {\n // Only execute reload if server is running (skip during initial startup)\n if (!this.running || !this.layerExecutor) {\n return;\n }\n\n if (batch.changed.length > 0) {\n // if they are the same, then ignore the trigger\n batch.changed = (\n await Promise.all(\n batch.changed.map(async (relativePath) => {\n const file = filesOrchestrator.files.get(relativePath);\n\n if (!file) return null;\n\n const content = await getFileAsync(file.absolutePath);\n if (content.trim() === file.source) {\n return null;\n }\n\n file.source = content;\n\n return relativePath;\n }),\n )\n ).filter((file) => file !== null);\n }\n\n // Get all changed files (added + changed + deleted)\n const allChangedPaths = [...batch.added, ...batch.changed, ...batch.deleted];\n\n if (allChangedPaths.length === 0) {\n return;\n }\n\n // Delegate to layer executor for batch reload\n try {\n await this.layerExecutor.executeBatchReload(\n [...batch.added, ...batch.changed],\n filesOrchestrator.getFiles(),\n batch.deleted,\n );\n\n // Regenerate types if config files changed\n typeGenerator.executeTypingsGenerator([...batch.added, ...batch.changed]);\n\n filesOrchestrator.checkHealth({\n added: batch.added,\n changed: batch.changed,\n deleted: batch.deleted,\n });\n } catch (error) {\n devServeLog(colors.redBright(`❌ Failed to execute batch reload: ${error}`));\n }\n }\n\n /**\n * Gracefully shutdown the development server\n */\n public async shutdown(): Promise<void> {\n console.log(\"Shutting down...\");\n\n if (!this.running) {\n return;\n }\n\n devServeLog(colors.redBright(\"🛑 Shutting down Development Server...\"));\n\n this.running = false;\n\n // Shutdown connectors in reverse priority order\n await connectorsManager.shutdown();\n\n devServeLog(colors.greenBright(\"✅ Development Server stopped\"));\n }\n\n /**\n * Check if server is running\n */\n public isRunning(): boolean {\n return this.running;\n }\n\n /**\n * Get module loader\n */\n public getModuleLoader(): ModuleLoader | undefined {\n return this.moduleLoader;\n }\n}\n\nfunction parseDuration(diffInMilliseconds: number): string {\n if (diffInMilliseconds < 1000) {\n return `${diffInMilliseconds.toFixed(2)}ms`;\n }\n\n if (diffInMilliseconds > 60_000) {\n return `${(diffInMilliseconds / 60_000).toFixed(2)}m`;\n }\n\n return `${(diffInMilliseconds / 1000).toFixed(2)}s`;\n}\n","import { DevelopmentServer } from \"./development-server\";\n\n/**\n * Start the development server\n * Main entry point for the dev server\n */\nexport async function startDevelopmentServer() {\n const devServer = new DevelopmentServer();\n\n // Handle graceful shutdown\n process.on(\"SIGINT\", async () => {\n console.log(\"\\n\\n📡 Received SIGINT signal\");\n await devServer.shutdown();\n process.exit(0);\n });\n\n process.on(\"SIGTERM\", async () => {\n console.log(\"\\n\\n📡 Received SIGTERM signal\");\n await devServer.shutdown();\n process.exit(0);\n });\n\n // Start the server\n await devServer.start();\n\n return devServer;\n}\n","import { startDevelopmentServer } from \"../../dev2-server/start-development-server\";\r\nimport { command } from \"../cli-command\";\r\nimport { displayStartupBanner } from \"../cli-commands.utils\";\r\n\r\nexport const devServerCommand = command({\r\n name: \"dev\",\r\n description: \"Start development server\",\r\n persistent: true,\r\n preload: {\r\n config: true, // load all config\r\n bootstrap: true,\r\n connectors: true, // load all connectors\r\n },\r\n preAction: async () => {\r\n await displayStartupBanner({ environment: \"development\" });\r\n },\r\n action: async () => {\r\n await startDevelopmentServer();\r\n },\r\n}).option(\"--fresh\", \"Start Fresh Development server\");\r\n","import { colors } from \"@mongez/copper\";\nimport { Migration, migrationRunner } from \"@warlock.js/cascade\";\nimport dayjs from \"dayjs\";\nimport path from \"path\";\nimport { CommandActionData } from \"../cli/types\";\nimport { filesOrchestrator } from \"../dev2-server/files-orchestrator\";\nimport { Path } from \"../dev2-server/path\";\nimport { getFilesFromDirectory } from \"../dev2-server/utils\";\nimport { srcPath } from \"../utils\";\n\nasync function listMigrationsAction() {\n const createdMigrations = await migrationRunner.getExecutedMigrations();\n\n console.log(`\\nTotal Executed Migrations: ${colors.green(createdMigrations.length)}\\n`);\n\n if (createdMigrations.length === 0) {\n console.log(colors.gray(\" No migrations have been executed yet.\\n\"));\n return;\n }\n\n // Display each migration as a block\n for (const migration of createdMigrations) {\n const executedAt = dayjs(migration.executedAt).format(\"DD-MM-YYYY hh:mm:ss A\");\n const createdAt = migration.createdAt\n ? dayjs(migration.createdAt).format(\"DD-MM-YYYY hh:mm:ss A\")\n : null;\n\n // Migration name with checkmark icon\n console.log(` ${colors.green(\"✔\")} ${colors.cyanBright(migration.name)}`);\n\n // Executed date\n console.log(` ${colors.gray(\"Executed:\")} ${colors.white(executedAt)}`);\n\n // Created date (if available)\n if (createdAt) {\n console.log(` ${colors.gray(\"Created:\")} ${colors.yellow(createdAt)}`);\n }\n\n console.log(\"\"); // Empty line between migrations\n }\n}\n\nasync function allMigrationsFilesAction() {\n // get all available migration files in the project\n const files = (await migrationFiles()).map((path) => Path.toRelative(path));\n console.log(`Total Migration Files: ${colors.green(files.length)}`);\n\n for (const file of files) {\n console.log(colors.yellowBright(file));\n }\n}\n\n/**\n * If path is provided, then run the migration runner against that file only\n * If fresh is provided, then rollback all migrations and run all migrations\n * If rollback is provided, then run the migration runner against all files in reverse order\n */\nexport async function migrateAction(options: CommandActionData) {\n const { fresh, path, rollback, all, list } = options.options;\n\n console.log(options);\n\n if (list) {\n return await listMigrationsAction();\n }\n\n if (all) {\n return await allMigrationsFilesAction();\n }\n\n if (path) {\n await loadMigrationFile(Path.toAbsolute(path as string));\n } else {\n await loadAllMigrations();\n }\n\n if (fresh && rollback) {\n console.log(colors.redBright(\"You can't use --fresh and --rollback together\"));\n process.exit(1);\n }\n\n if (rollback || fresh) {\n await migrationRunner.rollbackAll();\n }\n\n if (rollback) return;\n\n await migrationRunner.runAll();\n}\n\nasync function loadMigrationFile(absPath: string) {\n const relativePath = Path.toRelative(absPath);\n\n const loadedModule = await filesOrchestrator.load<typeof Migration>(relativePath);\n\n if (!loadedModule?.default) {\n throw new Error(`${Path.toRelative(absPath)} must have a default export`);\n }\n\n const MigrationClass = loadedModule.default;\n\n if (!MigrationClass.migrationName) {\n MigrationClass.migrationName = path\n .basename(absPath)\n .split(\".\")[0]\n .replace(\"-migration\", \"\")\n .replace(\"_migration\", \"\");\n }\n\n migrationRunner.register(MigrationClass);\n}\n\n/**\n *\n * @returns List of absolute paths to migration files\n */\nasync function migrationFiles() {\n const migrationFiles = await getFilesFromDirectory(srcPath(\"app\"), \"*/models/*/migrations/*\");\n const separateMigrationsFolderFIles = await getFilesFromDirectory(\n srcPath(\"app\"),\n \"*/migrations/*\",\n );\n\n const migrations = [...migrationFiles, ...separateMigrationsFolderFIles];\n\n return migrations;\n}\n\nasync function loadAllMigrations() {\n const migrations = await migrationFiles();\n\n for (const migrationFile of migrations) {\n await loadMigrationFile(migrationFile);\n }\n}\n","import { migrateAction } from \"../../database/migrate-action\";\nimport { command } from \"../cli-command\";\n\nexport const migrateCommand = command({\n action: migrateAction,\n name: \"migrate\",\n description: \"Run database migrations\",\n preload: {\n config: [\"database\", \"log\"],\n env: true,\n connectors: [\"database\"],\n },\n options: [\n {\n text: \"--fresh, -f\",\n description: \"Drop all tables and re-run migrations\",\n type: \"boolean\",\n },\n {\n text: \"--rollback, -r\",\n description: \"Rollback migrations, drop all tables\",\n type: \"boolean\",\n },\n {\n text: \"--path, -p\",\n description: \"Migration file path, if not provided, all migrations will be wroking\",\n type: \"string\",\n },\n {\n text: \"--list, -l\",\n description: \"List all executed migrations\",\n type: \"boolean\",\n },\n {\n text: \"--all, -a\",\n description: \"List all migrations files in the app\",\n type: \"boolean\",\n },\n ],\n});\n","export const seedsTableName = \"_seeds\";\n","import { Migration } from \"@warlock.js/cascade\";\nimport { seedsTableName } from \"./utils\";\n\nexport class SeedsTableMigration extends Migration {\n public static migrationName = \"seeds-table-migration\";\n public static table = seedsTableName;\n\n public up() {\n this.createTableIfNotExists();\n\n this.int(\"id\").unique().autoIncrement();\n this.string(\"name\").unique();\n this.int(\"runCount\").defaultTo(0);\n this.dateTime(\"createdAt\").defaultToNow();\n this.dateTime(\"firstRunAt\").defaultToNow();\n this.dateTime(\"lastRunAt\").defaultToNow();\n this.int(\"totalRecordsCreated\").defaultTo(0);\n this.int(\"lastRunRecordsCreated\").defaultTo(0);\n }\n\n public down() {\n this.dropTableIfExists(seedsTableName);\n }\n}\n","import { colors } from \"@mongez/copper\";\nimport {\n type DataSource,\n type DriverContract,\n dataSourceRegistry,\n migrationRunner,\n} from \"@warlock.js/cascade\";\nimport { Seeder } from \"./seeder\";\nimport { SeedsTableMigration } from \"./seeds-table-migration\";\nimport { SeederMetadata, SeedResult } from \"./types\";\nimport { seedsTableName } from \"./utils\";\n\nexport type SeedersManagerOptions = {\n datasource?: DataSource;\n};\n\nexport class SeedersManager {\n public seeders: Seeder[] = [];\n\n protected datasource?: DataSource;\n\n public constructor(protected options?: SeedersManagerOptions) {\n this.datasource = options?.datasource ?? dataSourceRegistry.get();\n }\n\n /**\n * Register new seeder\n */\n public register(...seeders: Seeder[]) {\n this.seeders.push(...seeders);\n return this;\n }\n\n /**\n * Initialize before running\n */\n protected async init() {\n if (!(await this.driver.blueprint.tableExists(seedsTableName))) {\n await migrationRunner.run(SeedsTableMigration);\n }\n }\n\n /**\n * Run seeders\n */\n public async run() {\n await this.init();\n this.prepareSeeders();\n\n console.log(`🌱 Running ${this.seeders.length} seeder(s)...\\n`);\n\n let successCount = 0;\n let skippedCount = 0;\n let failedCount = 0;\n\n for (const seeder of this.seeders) {\n // Check if already executed\n if (seeder.once && (await this.seederIsExecutedBefore(seeder))) {\n console.log(`⏭️ Skipping ${colors.yellow(seeder.name)} (already executed)`);\n skippedCount++;\n continue;\n }\n\n try {\n console.log(`🔄 Running ${colors.green(seeder.name)}...`);\n const startTime = Date.now();\n\n const result = await seeder.run();\n\n const duration = Date.now() - startTime;\n if (result) {\n await this.storeSeedsResults(seeder, result);\n }\n\n console.log(\n `✅ ${colors.green(seeder.name)} completed (${duration}ms, ${result?.recordsCreated ?? 0} records)\\n`,\n );\n successCount++;\n } catch (error) {\n const err = error as Error;\n console.error(`❌ ${colors.red(seeder.name)} failed:`, err.message);\n console.error(err.stack);\n failedCount++;\n\n // Re-throw to stop execution (or continue to next seed based on your preference)\n throw error;\n }\n }\n\n // Summary\n console.log(\"\\n\" + \"=\".repeat(50));\n console.log(`✅ Success: ${successCount}`);\n\n if (skippedCount > 0) console.log(`⏭️ Skipped: ${skippedCount}`);\n\n if (failedCount > 0) console.log(`❌ Failed: ${failedCount}`);\n\n console.log(\"=\".repeat(50));\n }\n\n /**\n * Prepare seeders to order by the seeder order\n * Also keep an eye on the dependsOn for each seeder to make sure\n * they are ordered correctly\n */\n public prepareSeeders() {\n this.seeders.sort((a, b) => {\n const orderA = a.order ?? Number.MAX_SAFE_INTEGER;\n const orderB = b.order ?? Number.MAX_SAFE_INTEGER;\n return orderA - orderB;\n });\n\n // TODO: Handle dependsOn resolution\n // This is more complex - needs topological sort\n }\n\n /**\n * Store seed results in db\n */\n public async storeSeedsResults(seeder: Seeder, result: SeedResult) {\n const oldResult = await this.getMetadata(seeder);\n\n // log with an emoji icon at beginning of text no of total craeted records\n console.log(`📊 Total records created: ${result.recordsCreated}`);\n\n if (oldResult) {\n // Update existing record - use query builder with WHERE clause\n await this.driver\n .queryBuilder(seedsTableName)\n .where(\"name\", seeder.name)\n .update({\n runCount: oldResult.runCount + 1,\n lastRunAt: new Date(),\n totalRecordsCreated: oldResult.totalRecordsCreated + result.recordsCreated,\n lastRunRecordsCreated: result.recordsCreated,\n });\n\n // now display total created records so far\n console.log(\n `📊 Total records created so far: ${oldResult.totalRecordsCreated + result.recordsCreated}`,\n );\n } else {\n // Insert new record\n await this.driver.insert(seedsTableName, {\n name: seeder.name,\n createdAt: new Date(),\n firstRunAt: new Date(),\n lastRunAt: new Date(),\n runCount: 1,\n totalRecordsCreated: result.recordsCreated,\n lastRunRecordsCreated: result.recordsCreated,\n });\n }\n }\n\n /**\n * Get seed info from database\n */\n protected getMetadata(seeder: Seeder): Promise<SeederMetadata> {\n const driver = this.datasource.driver;\n\n return driver.queryBuilder(seedsTableName).where(\"name\", seeder.name).first();\n }\n\n /**\n * Get driver instance\n */\n protected get driver(): DriverContract {\n return this.datasource.driver;\n }\n\n /**\n * Check if seeder has been executed before\n */\n protected async seederIsExecutedBefore(seeder: Seeder) {\n return !!(await this.getMetadata(seeder));\n }\n}\n","import { DataSource, dataSourceRegistry } from \"@warlock.js/cascade\";\nimport { CommandActionData } from \"../cli/types\";\nimport { filesOrchestrator } from \"../dev2-server/files-orchestrator\";\nimport { Path } from \"../dev2-server/path\";\nimport { getFilesFromDirectory } from \"../dev2-server/utils\";\nimport { srcPath } from \"../utils\";\nimport { Seeder } from \"./seeds/seeder\";\nimport { SeedersManager } from \"./seeds/seeders.manager\";\n\nasync function clearAllTables(datasource: DataSource) {\n const tables = await datasource.driver.blueprint.getTables();\n\n for (const table of tables) {\n await datasource.driver.blueprint.truncateTable(table);\n }\n}\n\nexport async function seedCommandAction(options: CommandActionData) {\n const { path, fresh } = options.options;\n\n const datasource = dataSourceRegistry.get();\n\n if (fresh) {\n await clearAllTables(datasource);\n }\n\n const seeds = path\n ? [await loadSeedFile(Path.toAbsolute(path as string))]\n : await listSeedsFiles();\n\n const seedersManager = new SeedersManager();\n\n seedersManager.register(...seeds);\n\n await seedersManager.run();\n}\n\nasync function listSeedsFiles() {\n const seedsFiles = await getFilesFromDirectory(srcPath(\"app\"), \"*/seeds/*.ts\");\n\n const seeds = [];\n\n for (const seedFile of seedsFiles) {\n const seed = await loadSeedFile(seedFile);\n seeds.push(seed);\n }\n\n return seeds;\n}\n\nasync function loadSeedFile(absPath: string): Promise<Seeder> {\n const relativePath = Path.toRelative(absPath);\n const seedImport = await filesOrchestrator.load<{ default: Seeder }>(relativePath);\n\n if (!seedImport || !seedImport.default) {\n throw new Error(`Seeder file ${relativePath} does not export a default seeder.`);\n }\n\n return seedImport.default;\n}\n","import { seedCommandAction } from \"../../database/seed-command-action\";\nimport { command } from \"../cli-command\";\n\nexport const seedCommand = command({\n action: seedCommandAction,\n name: \"seed\",\n description: \"Run database seeds\",\n preload: {\n config: [\"database\", \"log\"],\n env: true,\n connectors: [\"database\"],\n },\n options: [\n {\n text: \"--fresh, -f\",\n description: \"Drop all tables records and run seeds\",\n type: \"boolean\",\n },\n ],\n});\n","import { spawn } from \"child_process\";\nimport path from \"path\";\nimport { warlockConfigManager } from \"../../warlock-config/warlock-config.manager\";\nimport { command } from \"../cli-command\";\nimport { displayStartupBanner } from \"../cli-commands.utils\";\n\nexport const startProductionCommand = command({\n name: \"start\",\n description: \"Start production server\",\n persistent: true,\n preload: {\n warlockConfig: true,\n },\n preAction: async () => {\n displayStartupBanner({ environment: \"production\" });\n },\n action: async () => {\n const buildConfig = warlockConfigManager.get(\"build\");\n\n const outDir = buildConfig?.outDirectory || \"dist\";\n const outFile = buildConfig?.outFile || \"app.js\";\n const entryPath = path.resolve(outDir, outFile);\n\n // Build node args\n const nodeArgs: string[] = [];\n\n // Enable source maps if configured\n if (buildConfig?.sourcemap !== false) {\n nodeArgs.push(\"--enable-source-maps\");\n }\n\n // Add entry file\n nodeArgs.push(entryPath);\n\n // Pass through any additional flags after \"start\" command\n // process.argv = [node, cli.ts, start, ...extra]\n const startIndex = process.argv.findIndex((arg) => arg === \"start\");\n if (startIndex !== -1 && startIndex < process.argv.length - 1) {\n const extraArgs = process.argv.slice(startIndex + 1);\n nodeArgs.push(...extraArgs);\n }\n\n console.log(`🚀 Starting production server...\\n`);\n\n // Spawn child process\n // On Windows, we need to be careful with signals - the console sends Ctrl+C\n // to all processes in the group, so we just need to not interfere\n const child = spawn(\"node\", nodeArgs, {\n stdio: \"inherit\",\n cwd: process.cwd(),\n env: process.env,\n // Important: keep child in same process group for proper signal handling\n detached: false,\n });\n\n // Track if we're shutting down to prevent double-exit\n let isShuttingDown = false;\n\n // Forward signals to child (needed for SIGTERM, helpful for explicit forwarding)\n const forwardSignal = (signal: NodeJS.Signals) => {\n if (isShuttingDown) return;\n isShuttingDown = true;\n\n // Send signal to child\n child.kill(signal);\n };\n\n // On SIGTERM, forward it (SIGTERM doesn't auto-propagate like SIGINT on Windows)\n process.on(\"SIGTERM\", () => forwardSignal(\"SIGTERM\"));\n\n // On SIGINT (Ctrl+C), mark as shutting down but let child handle it naturally\n // On Windows, Ctrl+C is sent to both processes, so child already gets it\n process.on(\"SIGINT\", () => {\n isShuttingDown = true;\n // Give child a chance to exit gracefully before we do anything\n });\n\n // Exit with child's exit code\n child.on(\"exit\", (code) => {\n process.exit(code ?? 0);\n });\n },\n});\n","import { filesOrchestrator } from \"../../dev2-server/files-orchestrator\";\nimport { Path } from \"../../dev2-server/path\";\nimport { typeGenerator } from \"../../dev2-server/type-generator\";\nimport { getFilesFromDirectory } from \"../../dev2-server/utils\";\nimport { srcPath } from \"../../utils\";\nimport { command } from \"../cli-command\";\n\nexport const typingsGeneratorCommand = command({\n name: \"generate.typings\",\n description: \"Generate type definitions for the project\",\n options: [\n {\n text: \"--files, -f\",\n description:\n \"Files to generate typings for, if not passed, it will generate typings for all files\",\n },\n ],\n action: async ({ options }) => {\n const configFilesPaths: string[] = [];\n if (options.files) {\n const files = String(options.files)\n .split(\",\")\n .map((file) => {\n if (file.startsWith(\"./\")) {\n return Path.toAbsolute(file);\n }\n\n return file;\n });\n\n if (files?.length) {\n configFilesPaths.push(...files);\n }\n }\n\n if (configFilesPaths.length === 0) {\n // grab all config files\n const configFiles = await getFilesFromDirectory(srcPath(\"config\"));\n configFilesPaths.push(...configFiles);\n }\n\n const results = await Promise.allSettled(\n configFilesPaths.map((path) => filesOrchestrator.add(Path.toRelative(path))),\n );\n\n const failed = results.filter((r) => r.status === \"rejected\");\n\n if (failed.length) {\n console.warn(`Failed to process ${failed.length} files`);\n }\n\n await typeGenerator.generateAll();\n },\n});\n","import { addCommand } from \"./commands/add.command\";\r\nimport { buildCommand } from \"./commands/build.command\";\r\nimport { devServerCommand } from \"./commands/dev-server.command\";\r\nimport { migrateCommand } from \"./commands/migrate.command\";\r\nimport { seedCommand } from \"./commands/seed.command\";\r\nimport { startProductionCommand } from \"./commands/start-production.command\";\r\nimport { typingsGeneratorCommand } from \"./commands/typings-generator.command\";\r\n\r\nexport const frameworkCommands = [\r\n devServerCommand,\r\n buildCommand,\r\n startProductionCommand,\r\n typingsGeneratorCommand,\r\n\r\n // database commands\r\n migrateCommand,\r\n seedCommand,\r\n\r\n // generation/installation commands\r\n addCommand,\r\n];\r\n","import { toCamelCase } from \"@mongez/reinforcements\";\r\n\r\nexport type ParsedCliArgs = {\r\n name: string;\r\n args: string[];\r\n options: Record<string, string | boolean>;\r\n};\r\n\r\n/**\r\n * Parse CLI arguments from process.argv\r\n *\r\n * @example\r\n * parseCliArgs([\"node\", \"warlock\", \"migrate\", \"--rollback\", \"file.ts\"])\r\n * // Returns: { command: \"migrate\", args: [\"file.ts\"], options: { rollback: true } }\r\n *\r\n * @example\r\n * parseCliArgs([\"node\", \"warlock\", \"dev\", \"--port=3000\", \"--fresh\"])\r\n * // Returns: { command: \"dev\", args: [], options: { port: \"3000\", fresh: true } }\r\n */\r\nexport function parseCliArgs(argv: string[]): ParsedCliArgs {\r\n // Command is at index 2 (after \"node\" and script path)\r\n // But if index 2 starts with \"-\", it's an option, not a command\r\n const potentialCommand = argv[2] || \"\";\r\n const isFirstArgOption = potentialCommand.startsWith(\"-\");\r\n const command = isFirstArgOption ? \"\" : potentialCommand;\r\n const args: string[] = [];\r\n const options: Record<string, string | boolean> = {};\r\n\r\n // Parse arguments starting from index 3 (or 2 if first arg was an option)\r\n const startIndex = isFirstArgOption ? 2 : 3;\r\n for (let i = startIndex; i < argv.length; i++) {\r\n const arg = argv[i];\r\n\r\n if (arg.startsWith(\"--\")) {\r\n // Long option: --key or --key=value\r\n const withoutDashes = arg.slice(2);\r\n const equalIndex = withoutDashes.indexOf(\"=\");\r\n\r\n if (equalIndex !== -1) {\r\n // --key=value format\r\n const key = toCamelCase(withoutDashes.slice(0, equalIndex));\r\n const value = withoutDashes.slice(equalIndex + 1);\r\n options[key] = value;\r\n } else {\r\n // --key format (check if next arg is a value)\r\n const key = toCamelCase(withoutDashes);\r\n const nextArg = argv[i + 1];\r\n\r\n // If next arg exists and doesn't start with -, treat it as value\r\n if (nextArg && !nextArg.startsWith(\"-\")) {\r\n options[key] = nextArg;\r\n i++; // Skip next arg\r\n } else {\r\n options[key] = true;\r\n }\r\n }\r\n } else if (arg.startsWith(\"-\") && arg.length > 1) {\r\n // Short option: -f, -t=value, or -abc (multiple flags)\r\n const flags = arg.slice(1);\r\n const equalIndex = flags.indexOf(\"=\");\r\n\r\n if (equalIndex !== -1) {\r\n // -t=value format\r\n const key = toCamelCase(flags.slice(0, equalIndex));\r\n const value = flags.slice(equalIndex + 1);\r\n options[key] = value;\r\n } else if (flags.length === 1) {\r\n // Single flag: -f\r\n const nextArg = argv[i + 1];\r\n\r\n if (nextArg && !nextArg.startsWith(\"-\")) {\r\n options[toCamelCase(flags)] = nextArg;\r\n i++; // Skip next arg\r\n } else {\r\n options[toCamelCase(flags)] = true;\r\n }\r\n } else {\r\n // Multiple flags: -abc becomes { a: true, b: true, c: true }\r\n for (const flag of flags) {\r\n options[toCamelCase(flag)] = true;\r\n }\r\n }\r\n } else {\r\n // Positional argument\r\n args.push(arg);\r\n }\r\n }\r\n\r\n return { name: command, args, options };\r\n}\r\n","/**\n * String similarity utilities for CLI command suggestions\n * Uses Levenshtein distance algorithm for fuzzy matching\n */\n\n/**\n * Calculate the Levenshtein distance between two strings\n * Lower distance = more similar\n *\n * @param str1 - First string\n * @param str2 - Second string\n * @returns Distance (number of edits required to transform str1 to str2)\n */\nexport function levenshteinDistance(str1: string, str2: string): number {\n const s1 = str1.toLowerCase();\n const s2 = str2.toLowerCase();\n\n const len1 = s1.length;\n const len2 = s2.length;\n\n // Create matrix\n const matrix: number[][] = Array.from({ length: len1 + 1 }, (_, i) =>\n Array.from({ length: len2 + 1 }, (_, j) => (i === 0 ? j : j === 0 ? i : 0)),\n );\n\n // Fill matrix\n for (let i = 1; i <= len1; i++) {\n for (let j = 1; j <= len2; j++) {\n const cost = s1[i - 1] === s2[j - 1] ? 0 : 1;\n matrix[i][j] = Math.min(\n matrix[i - 1][j] + 1, // deletion\n matrix[i][j - 1] + 1, // insertion\n matrix[i - 1][j - 1] + cost, // substitution\n );\n }\n }\n\n return matrix[len1][len2];\n}\n\n/**\n * Suggestion result with similarity score\n */\nexport type Suggestion = {\n /** The suggested value */\n value: string;\n /** Distance score (lower = more similar) */\n distance: number;\n};\n\n/**\n * Find similar strings from a list\n *\n * @param input - The input string to find matches for\n * @param candidates - List of candidate strings\n * @param maxDistance - Maximum distance to consider (default: 3)\n * @param maxResults - Maximum number of results to return (default: 3)\n * @returns Array of suggestions sorted by similarity\n *\n * @example\n * ```typescript\n * findSimilar(\"biuld\", [\"build\", \"dev\", \"start\", \"test\"])\n * // Returns: [{ value: \"build\", distance: 1 }]\n * ```\n */\nexport function findSimilar(\n input: string,\n candidates: string[],\n maxDistance: number = 3,\n maxResults: number = 3,\n): Suggestion[] {\n const results: Suggestion[] = [];\n\n for (const candidate of candidates) {\n const distance = levenshteinDistance(input, candidate);\n\n if (distance <= maxDistance && distance > 0) {\n results.push({ value: candidate, distance });\n }\n }\n\n // Sort by distance (most similar first)\n results.sort((a, b) => a.distance - b.distance);\n\n return results.slice(0, maxResults);\n}\n\n/**\n * Check if a string starts with any of the given prefixes\n * Useful for command name matching\n */\nexport function startsWithAny(str: string, prefixes: string[]): boolean {\n return prefixes.some((prefix) => str.toLowerCase().startsWith(prefix.toLowerCase()));\n}\n","import { colors } from \"@mongez/copper\";\r\nimport { loadEnv } from \"@mongez/dotenv\";\r\nimport { ensureDirectoryAsync } from \"@mongez/fs\";\r\nimport { bootstrap } from \"../bootstrap\";\r\nimport { loadConfigFiles } from \"../config/load-config-files\";\r\nimport { connectorsManager } from \"../dev2-server/connectors/connectors-manager\";\r\nimport { filesOrchestrator } from \"../dev2-server/files-orchestrator\";\r\nimport { manifestManager } from \"../manifest/manifest-manager\";\r\nimport { warlockPath } from \"../utils\";\r\nimport { warlockConfigManager } from \"../warlock-config/warlock-config.manager\";\r\nimport { CLICommand } from \"./cli-command\";\r\nimport {\r\n displayCommandError,\r\n displayCommandHelp,\r\n displayCommandNotFound,\r\n displayCommandSuccess,\r\n displayExecutingCommand,\r\n displayHelp,\r\n displayMissingCommand,\r\n displayMissingOptions,\r\n displayWarlockVersionInTerminal,\r\n type HelpCommandInfo,\r\n isMatchingCommandName,\r\n} from \"./cli-commands.utils\";\r\nimport { cliCommandsLoader } from \"./commands-loader\";\r\nimport { frameworkCommands } from \"./framework-cli-commands\";\r\nimport { parseCliArgs } from \"./parse-cli-args\";\r\nimport { findSimilar } from \"./string-similarity\";\r\nimport { CommandActionData, ResolvedCLICommandOption } from \"./types\";\r\n\r\nexport class CLICommandsManager {\r\n /**\r\n * List of commands\r\n */\r\n public commands: CLICommand[] = [];\r\n\r\n /**\r\n * Commands map (name -> command)\r\n */\r\n public commandsMap: Map<string, CLICommand> = new Map();\r\n\r\n /**\r\n * Alias map (alias -> command name)\r\n */\r\n public aliasMap: Map<string, string> = new Map();\r\n\r\n /**\r\n * Register the given commands\r\n */\r\n public register(...commands: CLICommand[]): this {\r\n this.commands.push(...commands);\r\n\r\n commands.forEach((command) => {\r\n const commandKey = command.name.split(\" \")[0];\r\n\r\n manifestManager.addCommandToList(command.name, {\r\n relativePath: command.commandRelativePath,\r\n source: command.commandSource || \"project\",\r\n description: command.commandDescription,\r\n alias: command.commandAlias,\r\n options: command.commandOptions.length > 0 ? command.commandOptions : undefined,\r\n });\r\n\r\n this.commandsMap.set(commandKey, command);\r\n\r\n // Register alias if exists\r\n if (command.commandAlias) {\r\n this.aliasMap.set(command.commandAlias, commandKey);\r\n }\r\n });\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Get command by name or alias\r\n */\r\n public getCommand(name: string): CLICommand | undefined {\r\n // First try direct lookup\r\n let command = this.commandsMap.get(name);\r\n if (command) return command;\r\n\r\n // Try alias lookup\r\n const realName = this.aliasMap.get(name);\r\n if (realName) {\r\n return this.commandsMap.get(realName);\r\n }\r\n\r\n return;\r\n }\r\n\r\n /**\r\n * Get all command names and aliases\r\n * Used for fuzzy matching suggestions\r\n */\r\n public getAllCommandNames(): string[] {\r\n const names: string[] = [];\r\n\r\n // Add all command names\r\n for (const name of this.commandsMap.keys()) {\r\n names.push(name);\r\n }\r\n\r\n // Add all aliases\r\n for (const alias of this.aliasMap.keys()) {\r\n names.push(alias);\r\n }\r\n\r\n // Also include cached commands from manifest\r\n const manifestCommands = manifestManager.commandsJson?.commands || {};\r\n for (const name of Object.keys(manifestCommands)) {\r\n const baseName = name.split(\" \")[0];\r\n if (!names.includes(baseName)) {\r\n names.push(baseName);\r\n }\r\n const alias = manifestCommands[name].alias;\r\n if (alias && !names.includes(alias)) {\r\n names.push(alias);\r\n }\r\n }\r\n\r\n return names;\r\n }\r\n\r\n /**\r\n * Start the cli manager\r\n */\r\n public async start() {\r\n const { name, options, args } = parseCliArgs(process.argv);\r\n\r\n if (options.noCache) {\r\n manifestManager.clearCommandsCache();\r\n // remove the commands.json file as wel\r\n await manifestManager.removeCommandsFile();\r\n }\r\n\r\n if (options.version || options.v) {\r\n await displayWarlockVersionInTerminal();\r\n process.exit(0);\r\n }\r\n\r\n // Try to load from manifest first (fastest path)\r\n await manifestManager.loadCommands();\r\n\r\n // Register framework commands first (needed for help)\r\n this.register(\r\n ...frameworkCommands.map((command) => {\r\n if (!command.commandSource) {\r\n command.commandSource = \"framework\";\r\n }\r\n return command;\r\n }),\r\n );\r\n\r\n await ensureDirectoryAsync(warlockPath(\"cache\"));\r\n\r\n const isHelpCommand = options.help || options.h;\r\n\r\n // Handle global help (no command)\r\n if (!name && isHelpCommand) {\r\n await this.showGlobalHelp();\r\n process.exit(0);\r\n }\r\n\r\n // Handle warm cache\r\n if (options.warmCache) {\r\n await this.warmCache();\r\n process.exit(0);\r\n }\r\n\r\n if (!name) {\r\n displayMissingCommand();\r\n process.exit(1);\r\n }\r\n\r\n const command = await this.lazyGetCommand(name);\r\n\r\n if (manifestManager.hasChanges) {\r\n await manifestManager.saveCommands();\r\n }\r\n\r\n if (!command) {\r\n // Find similar commands for suggestions\r\n const allCommandNames = this.getAllCommandNames();\r\n const suggestions = findSimilar(name, allCommandNames).map((s) => s.value);\r\n\r\n displayCommandNotFound(name, suggestions);\r\n process.exit(1);\r\n }\r\n\r\n // Handle command-specific help\r\n if (isHelpCommand) {\r\n displayCommandHelp({\r\n name: command.name,\r\n alias: command.commandAlias,\r\n description: command.commandDescription,\r\n options: command.commandOptions,\r\n });\r\n process.exit(0);\r\n }\r\n\r\n await this.execute(command, {\r\n options,\r\n args,\r\n });\r\n }\r\n\r\n /**\r\n * Show global help with all commands\r\n * Uses manifest if available for fast display\r\n */\r\n protected async showGlobalHelp() {\r\n if (\r\n manifestManager.isCommandLoaded &&\r\n Object.keys(manifestManager.commandsJson?.commands || {}).length > 0\r\n ) {\r\n // Use manifest directly - no need to load command files\r\n const helpCommands: HelpCommandInfo[] = Object.entries(\r\n manifestManager.commandsJson?.commands || {},\r\n ).map(([name, cmd]) => ({\r\n name,\r\n alias: cmd.alias,\r\n description: cmd.description,\r\n source: cmd.source,\r\n }));\r\n\r\n await displayHelp(helpCommands);\r\n return;\r\n }\r\n\r\n // Fallback: No manifest, build from registered commands\r\n // This happens on first run before warm-cache\r\n await this.loadPluginsCommands();\r\n\r\n const projectCommands = await cliCommandsLoader.scanAll();\r\n\r\n this.register(...projectCommands);\r\n\r\n await manifestManager.saveCommands();\r\n\r\n // Build help info from registered commands\r\n const helpCommands: HelpCommandInfo[] = this.commands.map((cmd) => ({\r\n name: cmd.name,\r\n alias: cmd.commandAlias,\r\n description: cmd.commandDescription,\r\n source: cmd.commandSource || \"project\",\r\n }));\r\n\r\n await displayHelp(helpCommands);\r\n }\r\n\r\n /**\r\n * Warm cache - scan all project commands and save to manifest\r\n */\r\n protected async warmCache() {\r\n console.log();\r\n console.log(` ${colors.cyan(\"›\")} Scanning project commands...`);\r\n\r\n const projectCommands = await cliCommandsLoader.scanAll();\r\n\r\n this.register(...projectCommands);\r\n\r\n await manifestManager.saveCommands();\r\n\r\n console.log(\r\n ` ${colors.green(\"✔\")} Cached ${colors.bold(String(projectCommands.length))} project commands`,\r\n );\r\n console.log();\r\n }\r\n\r\n /**\r\n * Load plugins commands\r\n */\r\n protected async loadPluginsCommands() {\r\n await warlockConfigManager.load();\r\n\r\n if (warlockConfigManager.isLoaded) {\r\n this.register(\r\n ...(warlockConfigManager.get(\"cli\")?.commands || []).map((command) => {\r\n if (!command.commandSource) {\r\n command.commandSource = \"plugin\";\r\n }\r\n return command;\r\n }),\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Try to find the command based on the given command name or alias\r\n */\r\n protected async lazyGetCommand(name: string) {\r\n // first step, try to find it directly through current commands\r\n let command = this.getCommand(name);\r\n if (command) {\r\n return command;\r\n }\r\n\r\n // second step, try to find it through warlock config commands\r\n await this.loadPluginsCommands();\r\n\r\n command = this.getCommand(name);\r\n\r\n if (command) {\r\n return command;\r\n }\r\n\r\n // third step, try to find it through project commands\r\n await this.loadProjectCommands(name);\r\n\r\n command = this.getCommand(name);\r\n if (command) {\r\n return command;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Load project commands\r\n */\r\n protected async loadProjectCommands(name: string) {\r\n // first get the commands.json contents as an object\r\n const jsonCommandsFile = await manifestManager.loadCommands();\r\n\r\n if (jsonCommandsFile) {\r\n // Check by name or alias\r\n for (const fullCommandName in jsonCommandsFile.commands) {\r\n const cmdMeta = jsonCommandsFile.commands[fullCommandName];\r\n\r\n // Match by name or alias\r\n if (isMatchingCommandName(fullCommandName, name) || cmdMeta.alias === name) {\r\n const commandPath = cmdMeta.relativePath;\r\n if (commandPath) {\r\n const executedCommand = await cliCommandsLoader.load(commandPath);\r\n\r\n if (executedCommand) {\r\n executedCommand.$relativePath(commandPath);\r\n this.register(executedCommand);\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n const command = await cliCommandsLoader.locate(name);\r\n\r\n if (command) {\r\n this.register(command);\r\n return;\r\n }\r\n }\r\n\r\n /**\r\n * Validate required options\r\n */\r\n protected validateOptions(\r\n command: CLICommand,\r\n options: Record<string, string | boolean | number>,\r\n ): ResolvedCLICommandOption[] {\r\n const missing: ResolvedCLICommandOption[] = [];\r\n\r\n command.commandOptions.forEach((opt) => {\r\n if (opt.required) {\r\n // Check if option is provided by name or alias\r\n const hasOption =\r\n options[opt.name] !== undefined || (opt.alias && options[opt.alias] !== undefined);\r\n if (!hasOption) {\r\n missing.push(opt);\r\n }\r\n }\r\n });\r\n\r\n return missing;\r\n }\r\n\r\n /**\r\n * Apply default values to options\r\n */\r\n protected applyDefaultOptions(\r\n command: CLICommand,\r\n options: Record<string, string | boolean | number>,\r\n ): Record<string, string | boolean | number> {\r\n const result = { ...options };\r\n\r\n command.commandOptions.forEach((opt) => {\r\n if (opt.defaultValue !== undefined) {\r\n const hasOption =\r\n result[opt.name] !== undefined || (opt.alias && result[opt.alias] !== undefined);\r\n if (!hasOption) {\r\n result[opt.name] = opt.defaultValue;\r\n }\r\n }\r\n\r\n if (opt.alias !== undefined && result[opt.alias] && result[opt.name] === undefined) {\r\n result[opt.name] = result[opt.alias];\r\n }\r\n });\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Execute the given command\r\n */\r\n public async execute(command: CLICommand, data: CommandActionData) {\r\n const startTime = Date.now();\r\n\r\n // Validate required options\r\n const missingOptions = this.validateOptions(command, data.options);\r\n if (missingOptions.length > 0) {\r\n displayMissingOptions(missingOptions);\r\n process.exit(1);\r\n }\r\n\r\n // Apply default values\r\n data.options = this.applyDefaultOptions(command, data.options);\r\n\r\n displayExecutingCommand(command.name);\r\n\r\n if (command.commandPreAction) {\r\n await command.commandPreAction(data);\r\n }\r\n\r\n // load preloaders\r\n if (command.commandPreload) {\r\n await this.loadPreloaders(command);\r\n }\r\n\r\n try {\r\n await command.execute(data);\r\n\r\n if (!command.isPersistent) {\r\n displayCommandSuccess(command.name, Date.now() - startTime);\r\n\r\n process.exit(0);\r\n }\r\n } catch (error) {\r\n displayCommandError(command.name, error as Error);\r\n if (!command.isPersistent) {\r\n process.exit(1);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Load preloaders\r\n */\r\n protected async loadPreloaders(command: CLICommand) {\r\n const preloaders = command.commandPreload || {};\r\n\r\n await warlockConfigManager.load();\r\n // if (preloaders.warlockConfig) {\r\n // }\r\n\r\n if (preloaders.env && !preloaders.bootstrap) {\r\n await loadEnv();\r\n } else if (preloaders.bootstrap) {\r\n bootstrap();\r\n }\r\n\r\n // Load configuration files\r\n if (preloaders.config) {\r\n await filesOrchestrator.init();\r\n await loadConfigFiles(preloaders.config);\r\n }\r\n\r\n // Initialize connectors\r\n if (preloaders.connectors) {\r\n await connectorsManager.start(\r\n preloaders.connectors === true ? undefined : preloaders.connectors,\r\n );\r\n }\r\n }\r\n}\r\n","import { CLICommandsManager } from \"./cli-commands.manager\";\r\n\r\nconst commandsManager = new CLICommandsManager();\r\nawait commandsManager.start();\r\n"]}