@warlock.js/core 4.1.14 → 4.2.0

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 (785) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/LICENSE +21 -0
  3. package/esm/application/app.d.mts +1 -1
  4. package/esm/application/app.d.mts.map +1 -1
  5. package/esm/application/app.mjs +1 -1
  6. package/esm/application/app.mjs.map +1 -1
  7. package/esm/application/application-config-types.d.mts +1 -1
  8. package/esm/application/application-config-types.d.mts.map +1 -1
  9. package/esm/application/application.d.mts +1 -1
  10. package/esm/application/application.d.mts.map +1 -1
  11. package/esm/application/application.mjs +1 -1
  12. package/esm/application/application.mjs.map +1 -1
  13. package/esm/benchmark/benchmark-snapshots.d.mts +1 -1
  14. package/esm/benchmark/benchmark-snapshots.d.mts.map +1 -1
  15. package/esm/benchmark/benchmark-snapshots.mjs +1 -1
  16. package/esm/benchmark/benchmark-snapshots.mjs.map +1 -1
  17. package/esm/benchmark/benchmark.d.mts +1 -1
  18. package/esm/benchmark/benchmark.d.mts.map +1 -1
  19. package/esm/benchmark/benchmark.mjs +1 -1
  20. package/esm/benchmark/benchmark.mjs.map +1 -1
  21. package/esm/benchmark/channels/console.channel.d.mts +1 -1
  22. package/esm/benchmark/channels/console.channel.d.mts.map +1 -1
  23. package/esm/benchmark/channels/console.channel.mjs +1 -1
  24. package/esm/benchmark/channels/console.channel.mjs.map +1 -1
  25. package/esm/benchmark/channels/noop.channel.d.mts +1 -1
  26. package/esm/benchmark/channels/noop.channel.d.mts.map +1 -1
  27. package/esm/benchmark/channels/noop.channel.mjs +1 -1
  28. package/esm/benchmark/channels/noop.channel.mjs.map +1 -1
  29. package/esm/benchmark/profiler.d.mts +1 -1
  30. package/esm/benchmark/profiler.d.mts.map +1 -1
  31. package/esm/benchmark/profiler.mjs +1 -1
  32. package/esm/benchmark/profiler.mjs.map +1 -1
  33. package/esm/benchmark/types.d.mts +1 -1
  34. package/esm/benchmark/types.d.mts.map +1 -1
  35. package/esm/bootstrap/setup.d.mts +1 -1
  36. package/esm/bootstrap/setup.d.mts.map +1 -1
  37. package/esm/bootstrap/setup.mjs +1 -1
  38. package/esm/bootstrap/setup.mjs.map +1 -1
  39. package/esm/bootstrap.d.mts +1 -1
  40. package/esm/bootstrap.d.mts.map +1 -1
  41. package/esm/bootstrap.mjs +1 -1
  42. package/esm/bootstrap.mjs.map +1 -1
  43. package/esm/cache/database-cache-driver.d.mts +1 -1
  44. package/esm/cache/database-cache-driver.d.mts.map +1 -1
  45. package/esm/cache/database-cache-driver.mjs +1 -1
  46. package/esm/cache/database-cache-driver.mjs.map +1 -1
  47. package/esm/cache/index.mjs +1 -1
  48. package/esm/cache/index.mjs.map +1 -1
  49. package/esm/cli/cli-command.d.mts +1 -1
  50. package/esm/cli/cli-command.d.mts.map +1 -1
  51. package/esm/cli/cli-command.mjs +1 -1
  52. package/esm/cli/cli-command.mjs.map +1 -1
  53. package/esm/cli/types.d.mts +1 -1
  54. package/esm/cli/types.d.mts.map +1 -1
  55. package/esm/config/config-getter.d.mts +1 -1
  56. package/esm/config/config-getter.d.mts.map +1 -1
  57. package/esm/config/config-getter.mjs +1 -1
  58. package/esm/config/config-getter.mjs.map +1 -1
  59. package/esm/config/config-handlers.d.mts +1 -1
  60. package/esm/config/config-handlers.d.mts.map +1 -1
  61. package/esm/config/config-handlers.mjs +1 -1
  62. package/esm/config/config-handlers.mjs.map +1 -1
  63. package/esm/config/config-loader.d.mts +1 -1
  64. package/esm/config/config-loader.d.mts.map +1 -1
  65. package/esm/config/config-loader.mjs +1 -1
  66. package/esm/config/config-loader.mjs.map +1 -1
  67. package/esm/config/config-manager.mjs +1 -1
  68. package/esm/config/config-manager.mjs.map +1 -1
  69. package/esm/config/config-special-handlers.d.mts +1 -1
  70. package/esm/config/config-special-handlers.d.mts.map +1 -1
  71. package/esm/config/config-special-handlers.mjs +1 -1
  72. package/esm/config/config-special-handlers.mjs.map +1 -1
  73. package/esm/config/load-config-files.mjs +1 -1
  74. package/esm/config/load-config-files.mjs.map +1 -1
  75. package/esm/config/types.d.mts +1 -1
  76. package/esm/config/types.d.mts.map +1 -1
  77. package/esm/connectors/access-connector.d.mts +39 -0
  78. package/esm/connectors/access-connector.d.mts.map +1 -0
  79. package/esm/connectors/access-connector.mjs +54 -0
  80. package/esm/connectors/access-connector.mjs.map +1 -0
  81. package/esm/connectors/base-connector.d.mts +1 -1
  82. package/esm/connectors/base-connector.d.mts.map +1 -1
  83. package/esm/connectors/base-connector.mjs +1 -1
  84. package/esm/connectors/base-connector.mjs.map +1 -1
  85. package/esm/connectors/cache-connector.d.mts +1 -1
  86. package/esm/connectors/cache-connector.d.mts.map +1 -1
  87. package/esm/connectors/cache-connector.mjs +1 -1
  88. package/esm/connectors/cache-connector.mjs.map +1 -1
  89. package/esm/connectors/connectors-manager.d.mts +1 -1
  90. package/esm/connectors/connectors-manager.d.mts.map +1 -1
  91. package/esm/connectors/connectors-manager.mjs +5 -1
  92. package/esm/connectors/connectors-manager.mjs.map +1 -1
  93. package/esm/connectors/database-connector.d.mts +1 -1
  94. package/esm/connectors/database-connector.d.mts.map +1 -1
  95. package/esm/connectors/database-connector.mjs +1 -1
  96. package/esm/connectors/database-connector.mjs.map +1 -1
  97. package/esm/connectors/herald-connector.d.mts +1 -1
  98. package/esm/connectors/herald-connector.d.mts.map +1 -1
  99. package/esm/connectors/herald-connector.mjs +2 -2
  100. package/esm/connectors/herald-connector.mjs.map +1 -1
  101. package/esm/connectors/http-connector.d.mts +1 -1
  102. package/esm/connectors/http-connector.d.mts.map +1 -1
  103. package/esm/connectors/http-connector.mjs +3 -1
  104. package/esm/connectors/http-connector.mjs.map +1 -1
  105. package/esm/connectors/index.d.mts +2 -0
  106. package/esm/connectors/index.mjs +2 -0
  107. package/esm/connectors/logger-connector.d.mts +1 -1
  108. package/esm/connectors/logger-connector.d.mts.map +1 -1
  109. package/esm/connectors/logger-connector.mjs +1 -1
  110. package/esm/connectors/logger-connector.mjs.map +1 -1
  111. package/esm/connectors/mail-connector.d.mts +1 -1
  112. package/esm/connectors/mail-connector.d.mts.map +1 -1
  113. package/esm/connectors/mail-connector.mjs +1 -1
  114. package/esm/connectors/mail-connector.mjs.map +1 -1
  115. package/esm/connectors/notifications-connector.d.mts +38 -0
  116. package/esm/connectors/notifications-connector.d.mts.map +1 -0
  117. package/esm/connectors/notifications-connector.mjs +51 -0
  118. package/esm/connectors/notifications-connector.mjs.map +1 -0
  119. package/esm/connectors/socket-connector.d.mts +1 -1
  120. package/esm/connectors/socket-connector.d.mts.map +1 -1
  121. package/esm/connectors/socket-connector.mjs +1 -1
  122. package/esm/connectors/socket-connector.mjs.map +1 -1
  123. package/esm/connectors/storage.connector.d.mts +1 -1
  124. package/esm/connectors/storage.connector.d.mts.map +1 -1
  125. package/esm/connectors/storage.connector.mjs +1 -1
  126. package/esm/connectors/storage.connector.mjs.map +1 -1
  127. package/esm/connectors/types.d.mts +5 -3
  128. package/esm/connectors/types.d.mts.map +1 -1
  129. package/esm/connectors/types.mjs +3 -1
  130. package/esm/connectors/types.mjs.map +1 -1
  131. package/esm/container/index.d.mts +1 -1
  132. package/esm/container/index.d.mts.map +1 -1
  133. package/esm/container/index.mjs +1 -1
  134. package/esm/container/index.mjs.map +1 -1
  135. package/esm/database/models/database-log/database-log.d.mts +1 -1
  136. package/esm/database/models/database-log/database-log.d.mts.map +1 -1
  137. package/esm/database/models/database-log/database-log.mjs +1 -1
  138. package/esm/database/models/database-log/database-log.mjs.map +1 -1
  139. package/esm/database/seeds/seeder.d.mts +1 -1
  140. package/esm/database/seeds/seeder.d.mts.map +1 -1
  141. package/esm/database/seeds/seeder.mjs +1 -1
  142. package/esm/database/seeds/seeder.mjs.map +1 -1
  143. package/esm/database/seeds/types.d.mts +1 -1
  144. package/esm/database/seeds/types.d.mts.map +1 -1
  145. package/esm/database/utils.d.mts +1 -1
  146. package/esm/database/utils.d.mts.map +1 -1
  147. package/esm/database/utils.mjs +1 -1
  148. package/esm/database/utils.mjs.map +1 -1
  149. package/esm/dev-server/create-worker.mjs +1 -1
  150. package/esm/dev-server/create-worker.mjs.map +1 -1
  151. package/esm/dev-server/dependency-graph.d.mts +1 -1
  152. package/esm/dev-server/dependency-graph.d.mts.map +1 -1
  153. package/esm/dev-server/dependency-graph.mjs +1 -1
  154. package/esm/dev-server/dependency-graph.mjs.map +1 -1
  155. package/esm/dev-server/dev-logger.mjs +2 -13
  156. package/esm/dev-server/dev-logger.mjs.map +1 -1
  157. package/esm/dev-server/events.mjs +1 -1
  158. package/esm/dev-server/events.mjs.map +1 -1
  159. package/esm/dev-server/file-event-handler.mjs +1 -1
  160. package/esm/dev-server/file-event-handler.mjs.map +1 -1
  161. package/esm/dev-server/file-manager.d.mts +1 -1
  162. package/esm/dev-server/file-manager.d.mts.map +1 -1
  163. package/esm/dev-server/file-manager.mjs +1 -1
  164. package/esm/dev-server/file-manager.mjs.map +1 -1
  165. package/esm/dev-server/file-operations.d.mts +1 -1
  166. package/esm/dev-server/file-operations.d.mts.map +1 -1
  167. package/esm/dev-server/file-operations.mjs +1 -1
  168. package/esm/dev-server/file-operations.mjs.map +1 -1
  169. package/esm/dev-server/files-orchestrator.d.mts +1 -1
  170. package/esm/dev-server/files-orchestrator.d.mts.map +1 -1
  171. package/esm/dev-server/files-orchestrator.mjs +1 -1
  172. package/esm/dev-server/files-orchestrator.mjs.map +1 -1
  173. package/esm/dev-server/files-watcher.d.mts +1 -1
  174. package/esm/dev-server/files-watcher.d.mts.map +1 -1
  175. package/esm/dev-server/files-watcher.mjs +1 -1
  176. package/esm/dev-server/files-watcher.mjs.map +1 -1
  177. package/esm/dev-server/flags.mjs +1 -1
  178. package/esm/dev-server/flags.mjs.map +1 -1
  179. package/esm/dev-server/health-checker/checkers/base-health-checker.d.mts +1 -1
  180. package/esm/dev-server/health-checker/checkers/base-health-checker.d.mts.map +1 -1
  181. package/esm/dev-server/health-checker/checkers/base-health-checker.mjs +1 -1
  182. package/esm/dev-server/health-checker/checkers/base-health-checker.mjs.map +1 -1
  183. package/esm/dev-server/health-checker/checkers/eslint-health-checker.d.mts +1 -1
  184. package/esm/dev-server/health-checker/checkers/eslint-health-checker.d.mts.map +1 -1
  185. package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs +1 -1
  186. package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs.map +1 -1
  187. package/esm/dev-server/health-checker/checkers/typescript-health-checker.d.mts +1 -1
  188. package/esm/dev-server/health-checker/checkers/typescript-health-checker.d.mts.map +1 -1
  189. package/esm/dev-server/health-checker/checkers/typescript-health-checker.mjs +1 -1
  190. package/esm/dev-server/health-checker/checkers/typescript-health-checker.mjs.map +1 -1
  191. package/esm/dev-server/health-checker/file-health-checker.contract.d.mts +1 -1
  192. package/esm/dev-server/health-checker/file-health-checker.contract.d.mts.map +1 -1
  193. package/esm/dev-server/health-checker/file-health-result.d.mts +1 -1
  194. package/esm/dev-server/health-checker/file-health-result.d.mts.map +1 -1
  195. package/esm/dev-server/health-checker/file-health-result.mjs +1 -1
  196. package/esm/dev-server/health-checker/file-health-result.mjs.map +1 -1
  197. package/esm/dev-server/health-checker/files-healthcare.manager.d.mts +1 -1
  198. package/esm/dev-server/health-checker/files-healthcare.manager.d.mts.map +1 -1
  199. package/esm/dev-server/health-checker/files-healthcare.manager.mjs +1 -1
  200. package/esm/dev-server/health-checker/files-healthcare.manager.mjs.map +1 -1
  201. package/esm/dev-server/health-checker/workers/eslint-health.worker.mjs +1 -1
  202. package/esm/dev-server/health-checker/workers/eslint-health.worker.mjs.map +1 -1
  203. package/esm/dev-server/health-checker/workers/ts-health.worker.mjs +1 -1
  204. package/esm/dev-server/health-checker/workers/ts-health.worker.mjs.map +1 -1
  205. package/esm/dev-server/loader/build-transpile-init.mjs +1 -1
  206. package/esm/dev-server/loader/build-transpile-init.mjs.map +1 -1
  207. package/esm/dev-server/loader/register-loader.mjs +1 -1
  208. package/esm/dev-server/loader/register-loader.mjs.map +1 -1
  209. package/esm/dev-server/loader/transpile-cache.mjs +2 -164
  210. package/esm/dev-server/loader/transpile-cache.mjs.map +1 -1
  211. package/esm/dev-server/manifest-manager.d.mts +1 -1
  212. package/esm/dev-server/manifest-manager.d.mts.map +1 -1
  213. package/esm/dev-server/manifest-manager.mjs +1 -1
  214. package/esm/dev-server/manifest-manager.mjs.map +1 -1
  215. package/esm/dev-server/module-loader.d.mts +1 -1
  216. package/esm/dev-server/module-loader.d.mts.map +1 -1
  217. package/esm/dev-server/module-loader.mjs +1 -1
  218. package/esm/dev-server/module-loader.mjs.map +1 -1
  219. package/esm/dev-server/package-json-manager.mjs +1 -1
  220. package/esm/dev-server/package-json-manager.mjs.map +1 -1
  221. package/esm/dev-server/parse-imports.mjs +1 -1
  222. package/esm/dev-server/parse-imports.mjs.map +1 -1
  223. package/esm/dev-server/path.mjs +1 -1
  224. package/esm/dev-server/path.mjs.map +1 -1
  225. package/esm/dev-server/special-files-collector.d.mts +1 -1
  226. package/esm/dev-server/special-files-collector.d.mts.map +1 -1
  227. package/esm/dev-server/special-files-collector.mjs +1 -1
  228. package/esm/dev-server/special-files-collector.mjs.map +1 -1
  229. package/esm/dev-server/tsconfig-manager.mjs +1 -1
  230. package/esm/dev-server/tsconfig-manager.mjs.map +1 -1
  231. package/esm/dev-server/types.d.mts +1 -1
  232. package/esm/dev-server/types.d.mts.map +1 -1
  233. package/esm/dev-server/utils.mjs +1 -1
  234. package/esm/dev-server/utils.mjs.map +1 -1
  235. package/esm/encryption/encrypt.d.mts +1 -1
  236. package/esm/encryption/encrypt.d.mts.map +1 -1
  237. package/esm/encryption/encrypt.mjs +1 -1
  238. package/esm/encryption/encrypt.mjs.map +1 -1
  239. package/esm/encryption/hash.d.mts +1 -1
  240. package/esm/encryption/hash.d.mts.map +1 -1
  241. package/esm/encryption/hash.mjs +1 -1
  242. package/esm/encryption/hash.mjs.map +1 -1
  243. package/esm/encryption/password.d.mts +1 -1
  244. package/esm/encryption/password.d.mts.map +1 -1
  245. package/esm/encryption/password.mjs +1 -1
  246. package/esm/encryption/password.mjs.map +1 -1
  247. package/esm/encryption/types.d.mts +1 -1
  248. package/esm/encryption/types.d.mts.map +1 -1
  249. package/esm/http/config.d.mts +1 -1
  250. package/esm/http/config.d.mts.map +1 -1
  251. package/esm/http/config.mjs +1 -1
  252. package/esm/http/config.mjs.map +1 -1
  253. package/esm/http/context/request-context.d.mts +1 -1
  254. package/esm/http/context/request-context.d.mts.map +1 -1
  255. package/esm/http/context/request-context.mjs +1 -1
  256. package/esm/http/context/request-context.mjs.map +1 -1
  257. package/esm/http/createHttpApplication.d.mts +1 -1
  258. package/esm/http/createHttpApplication.d.mts.map +1 -1
  259. package/esm/http/createHttpApplication.mjs +1 -1
  260. package/esm/http/createHttpApplication.mjs.map +1 -1
  261. package/esm/http/database/RequestLog.d.mts +1 -1
  262. package/esm/http/database/RequestLog.d.mts.map +1 -1
  263. package/esm/http/database/RequestLog.mjs +1 -1
  264. package/esm/http/database/RequestLog.mjs.map +1 -1
  265. package/esm/http/error-codes.d.mts +1 -1
  266. package/esm/http/error-codes.d.mts.map +1 -1
  267. package/esm/http/error-codes.mjs +1 -1
  268. package/esm/http/error-codes.mjs.map +1 -1
  269. package/esm/http/errors/errors.d.mts +1 -1
  270. package/esm/http/errors/errors.d.mts.map +1 -1
  271. package/esm/http/errors/errors.mjs +1 -1
  272. package/esm/http/errors/errors.mjs.map +1 -1
  273. package/esm/http/events.d.mts +1 -1
  274. package/esm/http/events.d.mts.map +1 -1
  275. package/esm/http/events.mjs +1 -1
  276. package/esm/http/events.mjs.map +1 -1
  277. package/esm/http/middleware/cache-response-middleware.d.mts +1 -1
  278. package/esm/http/middleware/cache-response-middleware.d.mts.map +1 -1
  279. package/esm/http/middleware/cache-response-middleware.mjs +1 -1
  280. package/esm/http/middleware/cache-response-middleware.mjs.map +1 -1
  281. package/esm/http/middleware/concurrency-limit.middleware.d.mts +1 -1
  282. package/esm/http/middleware/concurrency-limit.middleware.d.mts.map +1 -1
  283. package/esm/http/middleware/concurrency-limit.middleware.mjs +1 -1
  284. package/esm/http/middleware/concurrency-limit.middleware.mjs.map +1 -1
  285. package/esm/http/middleware/idempotency.middleware.d.mts +1 -1
  286. package/esm/http/middleware/idempotency.middleware.d.mts.map +1 -1
  287. package/esm/http/middleware/idempotency.middleware.mjs +1 -1
  288. package/esm/http/middleware/idempotency.middleware.mjs.map +1 -1
  289. package/esm/http/middleware/inject-request-context.d.mts +1 -1
  290. package/esm/http/middleware/inject-request-context.d.mts.map +1 -1
  291. package/esm/http/middleware/inject-request-context.mjs +1 -1
  292. package/esm/http/middleware/inject-request-context.mjs.map +1 -1
  293. package/esm/http/middleware/ip-filter.middleware.d.mts +1 -1
  294. package/esm/http/middleware/ip-filter.middleware.d.mts.map +1 -1
  295. package/esm/http/middleware/ip-filter.middleware.mjs +1 -1
  296. package/esm/http/middleware/ip-filter.middleware.mjs.map +1 -1
  297. package/esm/http/middleware/maintenance.middleware.d.mts +1 -1
  298. package/esm/http/middleware/maintenance.middleware.d.mts.map +1 -1
  299. package/esm/http/middleware/maintenance.middleware.mjs +1 -1
  300. package/esm/http/middleware/maintenance.middleware.mjs.map +1 -1
  301. package/esm/http/middleware/max-body-size.middleware.d.mts +1 -1
  302. package/esm/http/middleware/max-body-size.middleware.d.mts.map +1 -1
  303. package/esm/http/middleware/max-body-size.middleware.mjs +1 -1
  304. package/esm/http/middleware/max-body-size.middleware.mjs.map +1 -1
  305. package/esm/http/middleware/middleware-list.d.mts +1 -1
  306. package/esm/http/middleware/middleware-list.d.mts.map +1 -1
  307. package/esm/http/middleware/middleware-list.mjs +1 -1
  308. package/esm/http/middleware/middleware-list.mjs.map +1 -1
  309. package/esm/http/middleware/rate-limit.middleware.d.mts +1 -1
  310. package/esm/http/middleware/rate-limit.middleware.d.mts.map +1 -1
  311. package/esm/http/middleware/rate-limit.middleware.mjs +1 -1
  312. package/esm/http/middleware/rate-limit.middleware.mjs.map +1 -1
  313. package/esm/http/middleware/utils/cidr-match.d.mts +1 -1
  314. package/esm/http/middleware/utils/cidr-match.d.mts.map +1 -1
  315. package/esm/http/middleware/utils/cidr-match.mjs +1 -1
  316. package/esm/http/middleware/utils/cidr-match.mjs.map +1 -1
  317. package/esm/http/middleware/utils/idempotency-key.d.mts +1 -1
  318. package/esm/http/middleware/utils/idempotency-key.d.mts.map +1 -1
  319. package/esm/http/middleware/utils/idempotency-key.mjs +1 -1
  320. package/esm/http/middleware/utils/idempotency-key.mjs.map +1 -1
  321. package/esm/http/middleware/utils/parse-size.d.mts +1 -1
  322. package/esm/http/middleware/utils/parse-size.d.mts.map +1 -1
  323. package/esm/http/middleware/utils/parse-size.mjs +1 -1
  324. package/esm/http/middleware/utils/parse-size.mjs.map +1 -1
  325. package/esm/http/plugins.d.mts +1 -1
  326. package/esm/http/plugins.d.mts.map +1 -1
  327. package/esm/http/plugins.mjs +1 -1
  328. package/esm/http/plugins.mjs.map +1 -1
  329. package/esm/http/request-controller.d.mts +1 -1
  330. package/esm/http/request-controller.d.mts.map +1 -1
  331. package/esm/http/request-controller.mjs +1 -1
  332. package/esm/http/request-controller.mjs.map +1 -1
  333. package/esm/http/request.d.mts +1 -1
  334. package/esm/http/request.d.mts.map +1 -1
  335. package/esm/http/request.mjs +1 -1
  336. package/esm/http/request.mjs.map +1 -1
  337. package/esm/http/response.d.mts +4 -4
  338. package/esm/http/response.d.mts.map +1 -1
  339. package/esm/http/response.mjs +1 -1
  340. package/esm/http/response.mjs.map +1 -1
  341. package/esm/http/server.d.mts +1 -1
  342. package/esm/http/server.d.mts.map +1 -1
  343. package/esm/http/server.mjs +1 -1
  344. package/esm/http/server.mjs.map +1 -1
  345. package/esm/http/types.d.mts +1 -1
  346. package/esm/http/types.d.mts.map +1 -1
  347. package/esm/http/uploaded-file.d.mts +1 -1
  348. package/esm/http/uploaded-file.d.mts.map +1 -1
  349. package/esm/http/uploaded-file.mjs +1 -1
  350. package/esm/http/uploaded-file.mjs.map +1 -1
  351. package/esm/http/uploads-config.d.mts +1 -1
  352. package/esm/http/uploads-config.d.mts.map +1 -1
  353. package/esm/http/uploads-config.mjs +1 -1
  354. package/esm/http/uploads-config.mjs.map +1 -1
  355. package/esm/http/uploads-types.d.mts +1 -1
  356. package/esm/http/uploads-types.d.mts.map +1 -1
  357. package/esm/image/image.d.mts +1 -1
  358. package/esm/image/image.d.mts.map +1 -1
  359. package/esm/image/image.mjs +1 -1
  360. package/esm/image/image.mjs.map +1 -1
  361. package/esm/index.d.mts +5 -2
  362. package/esm/index.mjs +6 -2
  363. package/esm/logger/logger.d.mts +1 -1
  364. package/esm/logger/logger.d.mts.map +1 -1
  365. package/esm/logger/logger.mjs +1 -1
  366. package/esm/logger/logger.mjs.map +1 -1
  367. package/esm/logger/types.d.mts +1 -1
  368. package/esm/logger/types.d.mts.map +1 -1
  369. package/esm/mail/config.d.mts +1 -1
  370. package/esm/mail/config.d.mts.map +1 -1
  371. package/esm/mail/config.mjs +1 -1
  372. package/esm/mail/config.mjs.map +1 -1
  373. package/esm/mail/events.d.mts +1 -1
  374. package/esm/mail/events.d.mts.map +1 -1
  375. package/esm/mail/events.mjs +1 -1
  376. package/esm/mail/events.mjs.map +1 -1
  377. package/esm/mail/mail.d.mts +1 -1
  378. package/esm/mail/mail.d.mts.map +1 -1
  379. package/esm/mail/mail.mjs +1 -1
  380. package/esm/mail/mail.mjs.map +1 -1
  381. package/esm/mail/mailer-pool.d.mts +1 -1
  382. package/esm/mail/mailer-pool.d.mts.map +1 -1
  383. package/esm/mail/mailer-pool.mjs +1 -1
  384. package/esm/mail/mailer-pool.mjs.map +1 -1
  385. package/esm/mail/react-mail.d.mts +1 -1
  386. package/esm/mail/react-mail.d.mts.map +1 -1
  387. package/esm/mail/react-mail.mjs +1 -1
  388. package/esm/mail/react-mail.mjs.map +1 -1
  389. package/esm/mail/send-mail.d.mts +1 -1
  390. package/esm/mail/send-mail.d.mts.map +1 -1
  391. package/esm/mail/send-mail.mjs +1 -1
  392. package/esm/mail/send-mail.mjs.map +1 -1
  393. package/esm/mail/test-mailbox.d.mts +1 -1
  394. package/esm/mail/test-mailbox.d.mts.map +1 -1
  395. package/esm/mail/test-mailbox.mjs +1 -1
  396. package/esm/mail/test-mailbox.mjs.map +1 -1
  397. package/esm/mail/types.d.mts +1 -1
  398. package/esm/mail/types.d.mts.map +1 -1
  399. package/esm/mail/types.mjs +1 -1
  400. package/esm/mail/types.mjs.map +1 -1
  401. package/esm/react/index.d.mts +1 -1
  402. package/esm/react/index.d.mts.map +1 -1
  403. package/esm/react/index.mjs +1 -1
  404. package/esm/react/index.mjs.map +1 -1
  405. package/esm/repositories/adapters/cascade/cascade-adapter.d.mts +1 -1
  406. package/esm/repositories/adapters/cascade/cascade-adapter.d.mts.map +1 -1
  407. package/esm/repositories/adapters/cascade/cascade-adapter.mjs +1 -1
  408. package/esm/repositories/adapters/cascade/cascade-adapter.mjs.map +1 -1
  409. package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts +1 -1
  410. package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts.map +1 -1
  411. package/esm/repositories/adapters/cascade/cascade-query-builder.mjs +1 -1
  412. package/esm/repositories/adapters/cascade/cascade-query-builder.mjs.map +1 -1
  413. package/esm/repositories/adapters/cascade/filter-applicator.mjs +1 -1
  414. package/esm/repositories/adapters/cascade/filter-applicator.mjs.map +1 -1
  415. package/esm/repositories/contracts/query-builder.contract.d.mts +1 -1
  416. package/esm/repositories/contracts/query-builder.contract.d.mts.map +1 -1
  417. package/esm/repositories/contracts/repository-adapter.contract.d.mts +1 -1
  418. package/esm/repositories/contracts/repository-adapter.contract.d.mts.map +1 -1
  419. package/esm/repositories/contracts/types.d.mts +1 -1
  420. package/esm/repositories/contracts/types.d.mts.map +1 -1
  421. package/esm/repositories/repository.manager.d.mts +1 -1
  422. package/esm/repositories/repository.manager.d.mts.map +1 -1
  423. package/esm/repositories/repository.manager.mjs +1 -1
  424. package/esm/repositories/repository.manager.mjs.map +1 -1
  425. package/esm/resource/define-resource.d.mts +1 -1
  426. package/esm/resource/define-resource.d.mts.map +1 -1
  427. package/esm/resource/define-resource.mjs +1 -1
  428. package/esm/resource/define-resource.mjs.map +1 -1
  429. package/esm/resource/register-resource.d.mts +1 -1
  430. package/esm/resource/register-resource.d.mts.map +1 -1
  431. package/esm/resource/register-resource.mjs +1 -1
  432. package/esm/resource/register-resource.mjs.map +1 -1
  433. package/esm/resource/resource-field-builder.d.mts +1 -1
  434. package/esm/resource/resource-field-builder.d.mts.map +1 -1
  435. package/esm/resource/resource-field-builder.mjs +1 -1
  436. package/esm/resource/resource-field-builder.mjs.map +1 -1
  437. package/esm/resource/resource.d.mts +1 -1
  438. package/esm/resource/resource.d.mts.map +1 -1
  439. package/esm/resource/resource.mjs +1 -1
  440. package/esm/resource/resource.mjs.map +1 -1
  441. package/esm/resource/types.d.mts +1 -1
  442. package/esm/resource/types.d.mts.map +1 -1
  443. package/esm/restful/restful.d.mts +1 -1
  444. package/esm/restful/restful.d.mts.map +1 -1
  445. package/esm/restful/restful.mjs +1 -1
  446. package/esm/restful/restful.mjs.map +1 -1
  447. package/esm/router/route-builder.d.mts +1 -1
  448. package/esm/router/route-builder.d.mts.map +1 -1
  449. package/esm/router/route-builder.mjs +1 -1
  450. package/esm/router/route-builder.mjs.map +1 -1
  451. package/esm/router/route-registry.mjs +1 -1
  452. package/esm/router/route-registry.mjs.map +1 -1
  453. package/esm/router/router.d.mts +1 -1
  454. package/esm/router/router.d.mts.map +1 -1
  455. package/esm/router/router.mjs +1 -1
  456. package/esm/router/router.mjs.map +1 -1
  457. package/esm/router/types.d.mts +1 -1
  458. package/esm/router/types.d.mts.map +1 -1
  459. package/esm/socket/types.d.mts +1 -1
  460. package/esm/socket/types.d.mts.map +1 -1
  461. package/esm/socket/utils.d.mts +1 -1
  462. package/esm/socket/utils.d.mts.map +1 -1
  463. package/esm/socket/utils.mjs +1 -1
  464. package/esm/socket/utils.mjs.map +1 -1
  465. package/esm/storage/config.d.mts +1 -1
  466. package/esm/storage/config.d.mts.map +1 -1
  467. package/esm/storage/config.mjs +1 -1
  468. package/esm/storage/config.mjs.map +1 -1
  469. package/esm/storage/context/storage-driver-context.d.mts +1 -1
  470. package/esm/storage/context/storage-driver-context.d.mts.map +1 -1
  471. package/esm/storage/context/storage-driver-context.mjs +1 -1
  472. package/esm/storage/context/storage-driver-context.mjs.map +1 -1
  473. package/esm/storage/drivers/cloud-driver.d.mts +1 -1
  474. package/esm/storage/drivers/cloud-driver.d.mts.map +1 -1
  475. package/esm/storage/drivers/cloud-driver.mjs +1 -1
  476. package/esm/storage/drivers/cloud-driver.mjs.map +1 -1
  477. package/esm/storage/drivers/do-spaces-driver.d.mts +1 -1
  478. package/esm/storage/drivers/do-spaces-driver.d.mts.map +1 -1
  479. package/esm/storage/drivers/do-spaces-driver.mjs +1 -1
  480. package/esm/storage/drivers/do-spaces-driver.mjs.map +1 -1
  481. package/esm/storage/drivers/local-driver.d.mts +1 -1
  482. package/esm/storage/drivers/local-driver.d.mts.map +1 -1
  483. package/esm/storage/drivers/local-driver.mjs +1 -1
  484. package/esm/storage/drivers/local-driver.mjs.map +1 -1
  485. package/esm/storage/drivers/r2-driver.d.mts +1 -1
  486. package/esm/storage/drivers/r2-driver.d.mts.map +1 -1
  487. package/esm/storage/drivers/r2-driver.mjs +1 -1
  488. package/esm/storage/drivers/r2-driver.mjs.map +1 -1
  489. package/esm/storage/drivers/s3-driver.d.mts +1 -1
  490. package/esm/storage/drivers/s3-driver.d.mts.map +1 -1
  491. package/esm/storage/drivers/s3-driver.mjs +1 -1
  492. package/esm/storage/drivers/s3-driver.mjs.map +1 -1
  493. package/esm/storage/scoped-storage.d.mts +1 -1
  494. package/esm/storage/scoped-storage.d.mts.map +1 -1
  495. package/esm/storage/scoped-storage.mjs +1 -1
  496. package/esm/storage/scoped-storage.mjs.map +1 -1
  497. package/esm/storage/storage-file.d.mts +1 -1
  498. package/esm/storage/storage-file.d.mts.map +1 -1
  499. package/esm/storage/storage-file.mjs +1 -1
  500. package/esm/storage/storage-file.mjs.map +1 -1
  501. package/esm/storage/storage.d.mts +1 -1
  502. package/esm/storage/storage.d.mts.map +1 -1
  503. package/esm/storage/storage.mjs +1 -1
  504. package/esm/storage/storage.mjs.map +1 -1
  505. package/esm/storage/types.d.mts +1 -1
  506. package/esm/storage/types.d.mts.map +1 -1
  507. package/esm/storage/utils/mime.d.mts +1 -1
  508. package/esm/storage/utils/mime.d.mts.map +1 -1
  509. package/esm/storage/utils/mime.mjs +1 -1
  510. package/esm/storage/utils/mime.mjs.map +1 -1
  511. package/esm/tests/start-http-development-server.d.mts +1 -1
  512. package/esm/tests/start-http-development-server.d.mts.map +1 -1
  513. package/esm/tests/start-http-development-server.mjs +4 -2
  514. package/esm/tests/start-http-development-server.mjs.map +1 -1
  515. package/esm/tests/test-helpers.d.mts +1 -1
  516. package/esm/tests/test-helpers.d.mts.map +1 -1
  517. package/esm/tests/test-helpers.mjs +1 -1
  518. package/esm/tests/test-helpers.mjs.map +1 -1
  519. package/esm/tests/vitest-setup.d.mts +1 -1
  520. package/esm/tests/vitest-setup.d.mts.map +1 -1
  521. package/esm/tests/vitest-setup.mjs +1 -1
  522. package/esm/tests/vitest-setup.mjs.map +1 -1
  523. package/esm/use-cases/types.d.mts +1 -1
  524. package/esm/use-cases/types.d.mts.map +1 -1
  525. package/esm/use-cases/use-case-broadcast.d.mts +1 -1
  526. package/esm/use-cases/use-case-broadcast.d.mts.map +1 -1
  527. package/esm/use-cases/use-case-broadcast.mjs +1 -1
  528. package/esm/use-cases/use-case-broadcast.mjs.map +1 -1
  529. package/esm/use-cases/use-case-events.d.mts +1 -1
  530. package/esm/use-cases/use-case-events.d.mts.map +1 -1
  531. package/esm/use-cases/use-case-events.mjs +1 -1
  532. package/esm/use-cases/use-case-events.mjs.map +1 -1
  533. package/esm/use-cases/use-case-pipeline.d.mts +1 -1
  534. package/esm/use-cases/use-case-pipeline.d.mts.map +1 -1
  535. package/esm/use-cases/use-case-pipeline.mjs +1 -1
  536. package/esm/use-cases/use-case-pipeline.mjs.map +1 -1
  537. package/esm/use-cases/use-case.d.mts +1 -1
  538. package/esm/use-cases/use-case.d.mts.map +1 -1
  539. package/esm/use-cases/use-case.errors.d.mts +1 -1
  540. package/esm/use-cases/use-case.errors.d.mts.map +1 -1
  541. package/esm/use-cases/use-case.errors.mjs +1 -1
  542. package/esm/use-cases/use-case.errors.mjs.map +1 -1
  543. package/esm/use-cases/use-case.mjs +1 -1
  544. package/esm/use-cases/use-case.mjs.map +1 -1
  545. package/esm/use-cases/use-cases-registry.d.mts +1 -1
  546. package/esm/use-cases/use-cases-registry.d.mts.map +1 -1
  547. package/esm/use-cases/use-cases-registry.mjs +1 -1
  548. package/esm/use-cases/use-cases-registry.mjs.map +1 -1
  549. package/esm/utils/app-log.d.mts +1 -1
  550. package/esm/utils/app-log.d.mts.map +1 -1
  551. package/esm/utils/app-log.mjs +1 -1
  552. package/esm/utils/app-log.mjs.map +1 -1
  553. package/esm/utils/database-log.d.mts +1 -1
  554. package/esm/utils/database-log.d.mts.map +1 -1
  555. package/esm/utils/database-log.mjs +1 -1
  556. package/esm/utils/database-log.mjs.map +1 -1
  557. package/esm/utils/environment.d.mts +1 -1
  558. package/esm/utils/environment.d.mts.map +1 -1
  559. package/esm/utils/environment.mjs +1 -1
  560. package/esm/utils/environment.mjs.map +1 -1
  561. package/esm/utils/framework-vesion.mjs +2 -11
  562. package/esm/utils/framework-vesion.mjs.map +1 -1
  563. package/esm/utils/get-localized.d.mts +1 -1
  564. package/esm/utils/get-localized.d.mts.map +1 -1
  565. package/esm/utils/get-localized.mjs +1 -1
  566. package/esm/utils/get-localized.mjs.map +1 -1
  567. package/esm/utils/paths.d.mts +1 -1
  568. package/esm/utils/paths.d.mts.map +1 -1
  569. package/esm/utils/paths.mjs +1 -1
  570. package/esm/utils/paths.mjs.map +1 -1
  571. package/esm/utils/promise-all-object.d.mts +1 -1
  572. package/esm/utils/promise-all-object.d.mts.map +1 -1
  573. package/esm/utils/promise-all-object.mjs +1 -1
  574. package/esm/utils/promise-all-object.mjs.map +1 -1
  575. package/esm/utils/queue.d.mts +1 -1
  576. package/esm/utils/queue.d.mts.map +1 -1
  577. package/esm/utils/queue.mjs +1 -1
  578. package/esm/utils/queue.mjs.map +1 -1
  579. package/esm/utils/sleep.d.mts +1 -1
  580. package/esm/utils/sleep.d.mts.map +1 -1
  581. package/esm/utils/sleep.mjs +1 -1
  582. package/esm/utils/sleep.mjs.map +1 -1
  583. package/esm/utils/sluggable.d.mts +1 -1
  584. package/esm/utils/sluggable.d.mts.map +1 -1
  585. package/esm/utils/sluggable.mjs +1 -1
  586. package/esm/utils/sluggable.mjs.map +1 -1
  587. package/esm/utils/to-json.d.mts +1 -1
  588. package/esm/utils/to-json.d.mts.map +1 -1
  589. package/esm/utils/to-json.mjs +1 -1
  590. package/esm/utils/to-json.mjs.map +1 -1
  591. package/esm/utils/types.d.mts +1 -1
  592. package/esm/utils/types.d.mts.map +1 -1
  593. package/esm/utils/urls.d.mts +1 -1
  594. package/esm/utils/urls.d.mts.map +1 -1
  595. package/esm/utils/urls.mjs +1 -1
  596. package/esm/utils/urls.mjs.map +1 -1
  597. package/esm/validation/database/exists-except-current-id.d.mts +1 -1
  598. package/esm/validation/database/exists-except-current-id.d.mts.map +1 -1
  599. package/esm/validation/database/exists-except-current-id.mjs +1 -1
  600. package/esm/validation/database/exists-except-current-id.mjs.map +1 -1
  601. package/esm/validation/database/exists-except-current-user.d.mts +1 -1
  602. package/esm/validation/database/exists-except-current-user.d.mts.map +1 -1
  603. package/esm/validation/database/exists-except-current-user.mjs +1 -1
  604. package/esm/validation/database/exists-except-current-user.mjs.map +1 -1
  605. package/esm/validation/database/types.d.mts +1 -1
  606. package/esm/validation/database/types.d.mts.map +1 -1
  607. package/esm/validation/database/unique-except-current-id.d.mts +1 -1
  608. package/esm/validation/database/unique-except-current-id.d.mts.map +1 -1
  609. package/esm/validation/database/unique-except-current-id.mjs +1 -1
  610. package/esm/validation/database/unique-except-current-id.mjs.map +1 -1
  611. package/esm/validation/database/unique-except-current-user.d.mts +1 -1
  612. package/esm/validation/database/unique-except-current-user.d.mts.map +1 -1
  613. package/esm/validation/database/unique-except-current-user.mjs +1 -1
  614. package/esm/validation/database/unique-except-current-user.mjs.map +1 -1
  615. package/esm/validation/file/file.d.mts +1 -1
  616. package/esm/validation/file/file.d.mts.map +1 -1
  617. package/esm/validation/file/file.mjs +1 -1
  618. package/esm/validation/file/file.mjs.map +1 -1
  619. package/esm/validation/init.mjs +1 -1
  620. package/esm/validation/init.mjs.map +1 -1
  621. package/esm/validation/plugins/database-plugin.mjs +1 -1
  622. package/esm/validation/plugins/database-plugin.mjs.map +1 -1
  623. package/esm/validation/plugins/file-plugin.mjs +1 -1
  624. package/esm/validation/plugins/file-plugin.mjs.map +1 -1
  625. package/esm/validation/plugins/localized-plugin.mjs +1 -1
  626. package/esm/validation/plugins/localized-plugin.mjs.map +1 -1
  627. package/esm/validation/types.d.mts +1 -1
  628. package/esm/validation/types.d.mts.map +1 -1
  629. package/esm/validation/validateAll.mjs +1 -1
  630. package/esm/validation/validateAll.mjs.map +1 -1
  631. package/esm/validation/validators/file-validator.d.mts +1 -1
  632. package/esm/validation/validators/file-validator.d.mts.map +1 -1
  633. package/esm/validation/validators/file-validator.mjs +1 -1
  634. package/esm/validation/validators/file-validator.mjs.map +1 -1
  635. package/esm/vite/index.mjs +3 -0
  636. package/esm/vite/lower-stage3-decorators.d.mts +53 -0
  637. package/esm/vite/lower-stage3-decorators.d.mts.map +1 -0
  638. package/esm/vite/lower-stage3-decorators.mjs +63 -0
  639. package/esm/vite/lower-stage3-decorators.mjs.map +1 -0
  640. package/esm/warlock-config/default-configurations.mjs +1 -1
  641. package/esm/warlock-config/default-configurations.mjs.map +1 -1
  642. package/esm/warlock-config/define-config.d.mts +1 -1
  643. package/esm/warlock-config/define-config.d.mts.map +1 -1
  644. package/esm/warlock-config/define-config.mjs +1 -1
  645. package/esm/warlock-config/define-config.mjs.map +1 -1
  646. package/esm/warlock-config/index.d.mts +1 -1
  647. package/esm/warlock-config/index.mjs +1 -1
  648. package/esm/warlock-config/types.d.mts +1 -1
  649. package/esm/warlock-config/types.d.mts.map +1 -1
  650. package/esm/warlock-config/warlock-config.manager.d.mts +20 -2
  651. package/esm/warlock-config/warlock-config.manager.d.mts.map +1 -1
  652. package/esm/warlock-config/warlock-config.manager.mjs +39 -2
  653. package/esm/warlock-config/warlock-config.manager.mjs.map +1 -1
  654. package/llms-full.txt +66 -4
  655. package/llms.txt +1 -0
  656. package/package.json +9 -33
  657. package/skills/lower-stage3-decorators/SKILL.md +54 -0
  658. package/skills/run-app/SKILL.md +2 -0
  659. package/skills/test-http/SKILL.md +3 -2
  660. package/skills/test-service/SKILL.md +3 -2
  661. package/bin/warlock.js +0 -3
  662. package/esm/_virtual/_rolldown/runtime.mjs +0 -7
  663. package/esm/cli/cli-commands.manager.mjs +0 -290
  664. package/esm/cli/cli-commands.manager.mjs.map +0 -1
  665. package/esm/cli/cli-commands.utils.mjs +0 -217
  666. package/esm/cli/cli-commands.utils.mjs.map +0 -1
  667. package/esm/cli/commands/add.command.mjs +0 -27
  668. package/esm/cli/commands/add.command.mjs.map +0 -1
  669. package/esm/cli/commands/build.command.mjs +0 -14
  670. package/esm/cli/commands/build.command.mjs.map +0 -1
  671. package/esm/cli/commands/create-database.command.mjs +0 -24
  672. package/esm/cli/commands/create-database.command.mjs.map +0 -1
  673. package/esm/cli/commands/dev-server.command.mjs +0 -48
  674. package/esm/cli/commands/dev-server.command.mjs.map +0 -1
  675. package/esm/cli/commands/drop-tables.command.mjs +0 -23
  676. package/esm/cli/commands/drop-tables.command.mjs.map +0 -1
  677. package/esm/cli/commands/generate/generate.command.mjs +0 -201
  678. package/esm/cli/commands/generate/generate.command.mjs.map +0 -1
  679. package/esm/cli/commands/generate/generators/column-dsl-parser.mjs +0 -49
  680. package/esm/cli/commands/generate/generators/column-dsl-parser.mjs.map +0 -1
  681. package/esm/cli/commands/generate/generators/controller.generator.mjs +0 -48
  682. package/esm/cli/commands/generate/generators/controller.generator.mjs.map +0 -1
  683. package/esm/cli/commands/generate/generators/migration.generator.mjs +0 -81
  684. package/esm/cli/commands/generate/generators/migration.generator.mjs.map +0 -1
  685. package/esm/cli/commands/generate/generators/model.generator.mjs +0 -60
  686. package/esm/cli/commands/generate/generators/model.generator.mjs.map +0 -1
  687. package/esm/cli/commands/generate/generators/module.generator.mjs +0 -113
  688. package/esm/cli/commands/generate/generators/module.generator.mjs.map +0 -1
  689. package/esm/cli/commands/generate/generators/repository.generator.mjs +0 -42
  690. package/esm/cli/commands/generate/generators/repository.generator.mjs.map +0 -1
  691. package/esm/cli/commands/generate/generators/resource.generator.mjs +0 -42
  692. package/esm/cli/commands/generate/generators/resource.generator.mjs.map +0 -1
  693. package/esm/cli/commands/generate/generators/service.generator.mjs +0 -42
  694. package/esm/cli/commands/generate/generators/service.generator.mjs.map +0 -1
  695. package/esm/cli/commands/generate/templates/stubs.mjs +0 -514
  696. package/esm/cli/commands/generate/templates/stubs.mjs.map +0 -1
  697. package/esm/cli/commands/generate/utils/name-parser.mjs +0 -69
  698. package/esm/cli/commands/generate/utils/name-parser.mjs.map +0 -1
  699. package/esm/cli/commands/generate/utils/path-resolver.mjs +0 -56
  700. package/esm/cli/commands/generate/utils/path-resolver.mjs.map +0 -1
  701. package/esm/cli/commands/generate/utils/prompt.mjs +0 -28
  702. package/esm/cli/commands/generate/utils/prompt.mjs.map +0 -1
  703. package/esm/cli/commands/generate/utils/writer.mjs +0 -60
  704. package/esm/cli/commands/generate/utils/writer.mjs.map +0 -1
  705. package/esm/cli/commands/migrate.command.mjs +0 -60
  706. package/esm/cli/commands/migrate.command.mjs.map +0 -1
  707. package/esm/cli/commands/seed.command.mjs +0 -41
  708. package/esm/cli/commands/seed.command.mjs.map +0 -1
  709. package/esm/cli/commands/start-production.command.mjs +0 -50
  710. package/esm/cli/commands/start-production.command.mjs.map +0 -1
  711. package/esm/cli/commands/storage-put.action.mjs +0 -75
  712. package/esm/cli/commands/storage-put.action.mjs.map +0 -1
  713. package/esm/cli/commands/storage-put.command.mjs +0 -46
  714. package/esm/cli/commands/storage-put.command.mjs.map +0 -1
  715. package/esm/cli/commands/typings-generator.command.mjs +0 -38
  716. package/esm/cli/commands/typings-generator.command.mjs.map +0 -1
  717. package/esm/cli/commands-loader.mjs +0 -50
  718. package/esm/cli/commands-loader.mjs.map +0 -1
  719. package/esm/cli/framework-cli-commands.mjs +0 -37
  720. package/esm/cli/framework-cli-commands.mjs.map +0 -1
  721. package/esm/cli/parse-cli-args.mjs +0 -62
  722. package/esm/cli/parse-cli-args.mjs.map +0 -1
  723. package/esm/cli/start.d.mts +0 -1
  724. package/esm/cli/start.mjs +0 -8
  725. package/esm/cli/start.mjs.map +0 -1
  726. package/esm/cli/string-similarity.mjs +0 -56
  727. package/esm/cli/string-similarity.mjs.map +0 -1
  728. package/esm/database/create-database-action.mjs +0 -32
  729. package/esm/database/create-database-action.mjs.map +0 -1
  730. package/esm/database/drop-tables-action.mjs +0 -35
  731. package/esm/database/drop-tables-action.mjs.map +0 -1
  732. package/esm/database/migrate-action.mjs +0 -99
  733. package/esm/database/migrate-action.mjs.map +0 -1
  734. package/esm/database/seed-command-action.mjs +0 -74
  735. package/esm/database/seed-command-action.mjs.map +0 -1
  736. package/esm/database/seeds/seeders.manager.mjs +0 -129
  737. package/esm/database/seeds/seeders.manager.mjs.map +0 -1
  738. package/esm/database/seeds/seeds-table-migration.mjs +0 -31
  739. package/esm/database/seeds/seeds-table-migration.mjs.map +0 -1
  740. package/esm/database/seeds/utils.mjs +0 -6
  741. package/esm/database/seeds/utils.mjs.map +0 -1
  742. package/esm/dev-server/development-server.mjs +0 -115
  743. package/esm/dev-server/development-server.mjs.map +0 -1
  744. package/esm/dev-server/health-checker/workers/eslint-health.worker.d.mts +0 -1
  745. package/esm/dev-server/health-checker/workers/ts-health.worker.d.mts +0 -1
  746. package/esm/dev-server/layer-executor.mjs +0 -114
  747. package/esm/dev-server/layer-executor.mjs.map +0 -1
  748. package/esm/dev-server/loader/hook-thread.d.mts +0 -48
  749. package/esm/dev-server/loader/hook-thread.d.mts.map +0 -1
  750. package/esm/dev-server/loader/hook-thread.mjs +0 -47
  751. package/esm/dev-server/loader/hook-thread.mjs.map +0 -1
  752. package/esm/dev-server/loader/load-hook.d.mts +0 -58
  753. package/esm/dev-server/loader/load-hook.d.mts.map +0 -1
  754. package/esm/dev-server/loader/load-hook.mjs +0 -86
  755. package/esm/dev-server/loader/load-hook.mjs.map +0 -1
  756. package/esm/dev-server/loader/own-resolver.mjs +0 -69
  757. package/esm/dev-server/loader/own-resolver.mjs.map +0 -1
  758. package/esm/dev-server/loader/resolve-capture.mjs +0 -43
  759. package/esm/dev-server/loader/resolve-capture.mjs.map +0 -1
  760. package/esm/dev-server/loader/resolve-hook.d.mts +0 -41
  761. package/esm/dev-server/loader/resolve-hook.d.mts.map +0 -1
  762. package/esm/dev-server/loader/resolve-hook.mjs +0 -87
  763. package/esm/dev-server/loader/resolve-hook.mjs.map +0 -1
  764. package/esm/dev-server/loader/source-slug.mjs +0 -22
  765. package/esm/dev-server/loader/source-slug.mjs.map +0 -1
  766. package/esm/dev-server/loader/version-registry.mjs +0 -45
  767. package/esm/dev-server/loader/version-registry.mjs.map +0 -1
  768. package/esm/dev-server/start-development-server.mjs +0 -63
  769. package/esm/dev-server/start-development-server.mjs.map +0 -1
  770. package/esm/dev-server/type-generator.mjs +0 -453
  771. package/esm/dev-server/type-generator.mjs.map +0 -1
  772. package/esm/generations/add-command.action.mjs +0 -376
  773. package/esm/generations/add-command.action.mjs.map +0 -1
  774. package/esm/generations/stubs.mjs +0 -103
  775. package/esm/generations/stubs.mjs.map +0 -1
  776. package/esm/manifest/manifest-manager.mjs +0 -79
  777. package/esm/manifest/manifest-manager.mjs.map +0 -1
  778. package/esm/production/build-app-production.mjs +0 -14
  779. package/esm/production/build-app-production.mjs.map +0 -1
  780. package/esm/production/esbuild-plugins.mjs +0 -37
  781. package/esm/production/esbuild-plugins.mjs.map +0 -1
  782. package/esm/production/production-builder.mjs +0 -264
  783. package/esm/production/production-builder.mjs.map +0 -1
  784. package/esm/production/resolve-build-config.mjs +0 -28
  785. package/esm/production/resolve-build-config.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"uploads-types.d.mts","names":[],"sources":["../../../../../../@warlock.js/core/src/http/uploads-types.ts"],"mappings":";;;;;;;;;AAyBA;;;;;;;;AAiCI;AAWJ;;;;AAA2D;AAS3D;;;KArDY,aAAA;EAqDkB;AAoB9B;;;;;;;;;;;;EA3DE,MAAA;EAyFA;;;;;AAOgC;AAQlC;;EA9FE,YAAA;EA8F0B;AAAgB;AAiB5C;;;;;EAtGE,EAAA;AAAA;;AAsGwD;AAS1D;;;;AAAiF;AAgBjF;KApHY,YAAA,sBAAkC,aAAa;;;;;;;;KAS/C,kBAAA;AAyIS;AAQrB;;;;;;;;;;;;;;AA6BW;;;AArCU,KArHT,WAAA;;;;;;;;;;EAUV,IAAA,GAAO,kBAAA;;;;;;;;;;EAWP,MAAA,GAAS,YAAA;;;;;;;;EAST,MAAA,GAAS,iBAAA;;;;;;EAOT,QAAA,GAAW,qBAAA;AAAA;;;;;;KAQD,aAAA,GAAgB,IAAI,CAAC,WAAA;;;;;;;;;;;;;;;;KAiBrB,sBAAA,IAA0B,GAAA,EAAK,KAAA,KAAU,KAAK;;;;;;;;KAS9C,oBAAA,GAAuB,qBAAA,GAAwB,sBAAsB;;;;;;;;;;;;;;;KAgBrE,qBAAA;;;;;;EAMV,IAAA;;;;;;EAOA,YAAA;;;;;;;;;EAUA,MAAA,GAAS,YAAY;;;;;;EAOrB,mBAAA;AAAA;;;;;;KAQU,wBAAA;;;;EAIV,MAAA;IAAW,KAAA;IAAe,MAAA;EAAA;;;;EAK1B,OAAA;;;;EAKA,MAAA,GAAS,WAAW;;;;EAKpB,MAAA;;;;EAKA,IAAA;;;;EAKA,SAAA;AAAA"}
1
+ {"version":3,"file":"uploads-types.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/http/uploads-types.ts"],"mappings":";;;;;;;;;AAyBA;;;;;;;;AAiCI;AAWJ;;;;AAA2D;AAS3D;;;KArDY,aAAA;EAqDkB;AAoB9B;;;;;;;;;;;;EA3DE,MAAA;EAyFA;;;;;AAOgC;AAQlC;;EA9FE,YAAA;EA8F0B;AAAgB;AAiB5C;;;;;EAtGE,EAAA;AAAA;;AAsGwD;AAS1D;;;;AAAiF;AAgBjF;KApHY,YAAA,sBAAkC,aAAa;;;;;;;;KAS/C,kBAAA;AAyIS;AAQrB;;;;;;;;;;;;;;AA6BW;;;AArCU,KArHT,WAAA;;;;;;;;;;EAUV,IAAA,GAAO,kBAAA;;;;;;;;;;EAWP,MAAA,GAAS,YAAA;;;;;;;;EAST,MAAA,GAAS,iBAAA;;;;;;EAOT,QAAA,GAAW,qBAAA;AAAA;;;;;;KAQD,aAAA,GAAgB,IAAI,CAAC,WAAA;;;;;;;;;;;;;;;;KAiBrB,sBAAA,IAA0B,GAAA,EAAK,KAAA,KAAU,KAAK;;;;;;;;KAS9C,oBAAA,GAAuB,qBAAA,GAAwB,sBAAsB;;;;;;;;;;;;;;;KAgBrE,qBAAA;;;;;;EAMV,IAAA;;;;;;EAOA,YAAA;;;;;;;;;EAUA,MAAA,GAAS,YAAY;;;;;;EAOrB,mBAAA;AAAA;;;;;;KAQU,wBAAA;;;;EAIV,MAAA;IAAW,KAAA;IAAe,MAAA;EAAA;;;;EAK1B,OAAA;;;;EAKA,MAAA,GAAS,WAAW;;;;EAKpB,MAAA;;;;EAKA,IAAA;;;;EAKA,SAAA;AAAA"}
@@ -1,6 +1,6 @@
1
1
  import sharp, { FormatEnum } from "sharp";
2
2
 
3
- //#region ../../@warlock.js/core/src/image/image.d.ts
3
+ //#region ../@warlock.js/core/src/image/image.d.ts
4
4
  type ImageFormat = keyof FormatEnum;
5
5
  type ImageInput = string | Buffer | Uint8Array | ArrayBuffer;
6
6
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"image.d.mts","names":[],"sources":["../../../../../../@warlock.js/core/src/image/image.ts"],"mappings":"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"}
1
+ {"version":3,"file":"image.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/image/image.ts"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { http } from "@mongez/http";
2
2
 
3
- //#region ../../@warlock.js/core/src/image/image.ts
3
+ //#region ../@warlock.js/core/src/image/image.ts
4
4
  /**
5
5
  * Installation instructions for sharp
6
6
  */
@@ -1 +1 @@
1
- {"version":3,"file":"image.mjs","names":[],"sources":["../../../../../../@warlock.js/core/src/image/image.ts"],"sourcesContent":["import { http } from \"@mongez/http\";\r\nimport type sharp from \"sharp\";\r\nimport type { FormatEnum } from \"sharp\";\r\n\r\n// ============================================================\r\n// Eager-loaded Sharp Module\r\n// ============================================================\r\n\r\n/**\r\n * Installation instructions for sharp\r\n */\r\nconst SHARP_INSTALL_INSTRUCTIONS = `\r\nImage processing requires the sharp package.\r\nInstall it with:\r\n\r\n warlock add image\r\n\r\nOr manually:\r\n\r\n npm install sharp\r\n pnpm add sharp\r\n yarn add sharp\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 sharp function (loaded at import time)\r\n */\r\nlet sharpFn: typeof sharp;\r\n\r\n/**\r\n * Eagerly load sharp module at import time\r\n */\r\nasync function loadSharpModule() {\r\n try {\r\n const module = await import(\"sharp\");\r\n sharpFn = 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\nloadSharpModule();\r\n\r\n// ============================================================\r\n// Types\r\n// ============================================================\r\n\r\nexport type ImageFormat = keyof FormatEnum;\r\n\r\nexport type ImageInput = string | Buffer | Uint8Array | ArrayBuffer;\r\n\r\n/**\r\n * Watermark configuration for deferred execution\r\n */\r\nexport type WatermarkConfig = {\r\n image: ImageInput | Image;\r\n options: sharp.OverlayOptions;\r\n};\r\n\r\n/**\r\n * Operation descriptor for deferred pipeline execution.\r\n * All operations are stored and executed at save/toBuffer time.\r\n */\r\ntype ImageOperation =\r\n | { type: \"resize\"; options: sharp.ResizeOptions }\r\n | { type: \"crop\"; options: sharp.Region }\r\n | { type: \"rotate\"; angle: number }\r\n | { type: \"flip\" }\r\n | { type: \"flop\" }\r\n | { type: \"blur\"; sigma: number }\r\n | { type: \"sharpen\"; options?: sharp.SharpenOptions }\r\n | { type: \"blackAndWhite\" }\r\n | { type: \"opacity\"; value: number }\r\n | { type: \"negate\"; options?: sharp.NegateOptions }\r\n | { type: \"tint\"; color: sharp.Color }\r\n | { type: \"trim\"; options?: sharp.TrimOptions }\r\n | { type: \"watermark\"; config: WatermarkConfig }\r\n | { type: \"watermarks\"; configs: WatermarkConfig[] };\r\n\r\n/**\r\n * Transformation options that can be applied in batch via `apply()` method.\r\n *\r\n * **Execution Order (when using apply()):**\r\n * 1. resize - Resize first to work with correct dimensions\r\n * 2. crop - Crop after resize to extract the desired region\r\n * 3. rotate - Rotation after sizing\r\n * 4. flip/flop - Mirror operations\r\n * 5. blackAndWhite/grayscale - Color space conversion\r\n * 6. blur - Blur effect\r\n * 7. sharpen - Sharpen effect\r\n * 8. tint - Color overlay\r\n * 9. negate - Invert colors\r\n * 10. opacity - Transparency (applied via composite)\r\n * 11. format/quality - Applied on save/export\r\n */\r\nexport type ImageTransformOptions = {\r\n /**\r\n * Output quality (1-100), applied based on final format\r\n */\r\n quality?: number;\r\n /**\r\n * Output format (jpeg, png, webp, avif, etc.)\r\n */\r\n format?: ImageFormat;\r\n /**\r\n * Resize options\r\n */\r\n resize?: sharp.ResizeOptions;\r\n /**\r\n * Crop/extract region\r\n */\r\n crop?: sharp.Region;\r\n /**\r\n * Rotation angle in degrees\r\n */\r\n rotate?: number;\r\n /**\r\n * Flip vertically (top to bottom)\r\n */\r\n flip?: boolean;\r\n /**\r\n * Flop horizontally (left to right)\r\n */\r\n flop?: boolean;\r\n /**\r\n * Convert to black and white\r\n */\r\n blackAndWhite?: boolean;\r\n /**\r\n * Alias for blackAndWhite\r\n */\r\n grayscale?: boolean;\r\n /**\r\n * Blur sigma (must be >= 0.3)\r\n */\r\n blur?: number;\r\n /**\r\n * Sharpen options\r\n */\r\n sharpen?: sharp.SharpenOptions | boolean;\r\n /**\r\n * Tint color\r\n */\r\n tint?: sharp.Color;\r\n /**\r\n * Negate/invert colors\r\n */\r\n negate?: sharp.NegateOptions | boolean;\r\n /**\r\n * Opacity (0-100)\r\n */\r\n opacity?: number;\r\n /**\r\n * Trim options\r\n */\r\n trim?: sharp.TrimOptions | boolean;\r\n /**\r\n * Single watermark\r\n */\r\n watermark?: WatermarkConfig;\r\n /**\r\n * Multiple watermarks\r\n */\r\n watermarks?: WatermarkConfig[];\r\n};\r\n\r\n/**\r\n * Internal options stored for deferred application\r\n */\r\ntype InternalOptions = {\r\n quality?: number;\r\n format?: ImageFormat;\r\n};\r\n\r\n/**\r\n * Image manipulation class with deferred pipeline execution.\r\n *\r\n * **Important:** This class requires the `sharp` package to be installed.\r\n * Install it with: `warlock add image` or `npm install sharp`\r\n *\r\n * Sharp is lazy-loaded on the first async operation (save, toBuffer, etc.),\r\n * so the constructor and all chainable methods remain synchronous.\r\n *\r\n * All operations are synchronous and stored as descriptors.\r\n * The pipeline is executed only when calling output methods:\r\n * - `save()` - Save to file\r\n * - `toBuffer()` - Get as buffer\r\n * - `toBase64()` - Get as base64 string\r\n * - `toDataUrl()` - Get as data URL\r\n *\r\n * @example\r\n * ```typescript\r\n * // All chaining is synchronous - single await at the end\r\n * await new Image(\"photo.jpg\")\r\n * .resize({ width: 800 })\r\n * .watermark(\"logo.png\", { gravity: \"southeast\" })\r\n * .quality(85)\r\n * .save(\"output.jpg\");\r\n * ```\r\n */\r\nexport class Image {\r\n /**\r\n * Image options that will be applied on save/export\r\n */\r\n protected options: InternalOptions = {};\r\n\r\n /**\r\n * Deferred operations pipeline\r\n */\r\n protected operations: ImageOperation[] = [];\r\n\r\n /**\r\n * Cached metadata to avoid repeated async calls\r\n */\r\n protected cachedMetadata: sharp.Metadata | null = null;\r\n\r\n /**\r\n * Whether the pipeline has been executed\r\n */\r\n protected pipelineExecuted = false;\r\n\r\n /**\r\n * Sharp image object\r\n */\r\n public readonly image: sharp.Sharp;\r\n\r\n /**\r\n * Formats that support quality option\r\n */\r\n protected static readonly QUALITY_FORMATS = [\"jpeg\", \"jpg\", \"webp\", \"avif\", \"tiff\", \"heif\"];\r\n\r\n /**\r\n * Constructor\r\n */\r\n public constructor(image: ImageInput | sharp.Sharp) {\r\n if (moduleExists === false) {\r\n throw new Error(`sharp is not installed.\\n\\n${SHARP_INSTALL_INSTRUCTIONS}`);\r\n }\r\n\r\n // Check if it's already a sharp instance\r\n if (image instanceof Object && \"clone\" in image && typeof image.clone === \"function\") {\r\n this.image = image as sharp.Sharp;\r\n } else {\r\n this.image = sharpFn(image as ImageInput);\r\n }\r\n }\r\n\r\n /**\r\n * Create image instance from file path\r\n */\r\n public static fromFile(path: string): Image {\r\n return new Image(path);\r\n }\r\n\r\n /**\r\n * Create image instance from buffer\r\n */\r\n public static fromBuffer(buffer: Buffer): Image {\r\n return new Image(buffer);\r\n }\r\n\r\n /**\r\n * Create image instance from url\r\n */\r\n public static async fromUrl(url: string): Promise<Image> {\r\n const { data, error } = await http.get<ArrayBuffer>(url, {\r\n responseType: \"arrayBuffer\",\r\n });\r\n\r\n if (error || !data) {\r\n throw new Error(\r\n `Failed to load image from URL \"${url}\": ${error?.message ?? \"Empty response received\"}`,\r\n );\r\n }\r\n\r\n return new Image(Buffer.from(data));\r\n }\r\n\r\n /**\r\n * Add an operation to the deferred pipeline\r\n */\r\n protected addOperation(operation: ImageOperation): this {\r\n this.operations.push(operation);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Apply multiple transformations at once with a predefined execution order.\r\n *\r\n * This method ensures transformations are applied in a logical order:\r\n * resize → crop → rotate → flip/flop → colorspace → effects → opacity → format\r\n *\r\n * For custom ordering, use individual chained methods instead.\r\n */\r\n public apply(options: ImageTransformOptions): this {\r\n // 1. Resize first to work with correct dimensions\r\n if (options.resize) {\r\n this.resize(options.resize);\r\n }\r\n\r\n // 2. Crop after resize\r\n if (options.crop) {\r\n this.crop(options.crop);\r\n }\r\n\r\n // 3. Rotation\r\n if (options.rotate !== undefined) {\r\n this.rotate(options.rotate);\r\n }\r\n\r\n // 4. Mirror operations\r\n if (options.flip) {\r\n this.flip();\r\n }\r\n\r\n if (options.flop) {\r\n this.flop();\r\n }\r\n\r\n // 5. Color space conversion\r\n if (options.blackAndWhite || options.grayscale) {\r\n this.blackAndWhite();\r\n }\r\n\r\n // 6. Blur effect\r\n if (options.blur !== undefined) {\r\n this.blur(options.blur);\r\n }\r\n\r\n // 7. Sharpen effect\r\n if (options.sharpen) {\r\n const sharpenOptions = typeof options.sharpen === \"boolean\" ? undefined : options.sharpen;\r\n this.sharpen(sharpenOptions);\r\n }\r\n\r\n // 8. Tint color\r\n if (options.tint) {\r\n this.tint(options.tint);\r\n }\r\n\r\n // 9. Negate/invert\r\n if (options.negate) {\r\n const negateOptions = typeof options.negate === \"boolean\" ? undefined : options.negate;\r\n this.negate(negateOptions);\r\n }\r\n\r\n // 10. Trim edges\r\n if (options.trim) {\r\n const trimOptions = typeof options.trim === \"boolean\" ? undefined : options.trim;\r\n this.trim(trimOptions);\r\n }\r\n\r\n // 11. Watermarks\r\n if (options.watermark) {\r\n this.watermark(options.watermark.image, options.watermark.options);\r\n }\r\n\r\n if (options.watermarks) {\r\n this.watermarks(options.watermarks);\r\n }\r\n\r\n // 12. Opacity (applied via composite)\r\n if (options.opacity !== undefined) {\r\n this.opacity(options.opacity);\r\n }\r\n\r\n // 13. Store format/quality for deferred application\r\n if (options.format) {\r\n this.format(options.format);\r\n }\r\n\r\n if (options.quality !== undefined) {\r\n this.quality(options.quality);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set image opacity (0-100)\r\n */\r\n public opacity(value: number): this {\r\n if (value < 0 || value > 100) {\r\n throw new Error(\"Opacity must be between 0 and 100\");\r\n }\r\n\r\n return this.addOperation({ type: \"opacity\", value });\r\n }\r\n\r\n /**\r\n * Convert image to black and white\r\n */\r\n public blackAndWhite(): this {\r\n return this.addOperation({ type: \"blackAndWhite\" });\r\n }\r\n\r\n /**\r\n * Alias for blackAndWhite\r\n */\r\n public grayscale(): this {\r\n return this.blackAndWhite();\r\n }\r\n\r\n /**\r\n * Get image dimensions (cached after first call)\r\n */\r\n public async dimensions(): Promise<{\r\n width: number | undefined;\r\n height: number | undefined;\r\n }> {\r\n const metadata = await this.metadata();\r\n\r\n return { width: metadata.width, height: metadata.height };\r\n }\r\n\r\n /**\r\n * Get image metadata (cached after first call)\r\n *\r\n * The metadata is cached to avoid repeated async operations.\r\n * Use `refreshMetadata()` to force a fresh fetch.\r\n */\r\n public async metadata(): Promise<sharp.Metadata> {\r\n if (!this.cachedMetadata) {\r\n this.cachedMetadata = await this.image.metadata();\r\n }\r\n\r\n return this.cachedMetadata;\r\n }\r\n\r\n /**\r\n * Force refresh of cached metadata\r\n *\r\n * Call this after transformations if you need updated metadata.\r\n */\r\n public async refreshMetadata(): Promise<sharp.Metadata> {\r\n this.cachedMetadata = await this.image.metadata();\r\n\r\n return this.cachedMetadata;\r\n }\r\n\r\n /**\r\n * Clear cached metadata\r\n */\r\n public clearMetadataCache(): this {\r\n this.cachedMetadata = null;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Resize image\r\n */\r\n public resize(options: sharp.ResizeOptions): this {\r\n if (typeof options.width !== \"undefined\" && !options.width) {\r\n delete options.width;\r\n }\r\n\r\n if (typeof options.height !== \"undefined\" && !options.height) {\r\n delete options.height;\r\n }\r\n\r\n return this.addOperation({ type: \"resize\", options });\r\n }\r\n\r\n /**\r\n * Crop/extract a region from the image\r\n */\r\n public crop(options: sharp.Region): this {\r\n return this.addOperation({ type: \"crop\", options });\r\n }\r\n\r\n /**\r\n * Set image quality (1-100)\r\n * Quality is stored and applied when saving/exporting\r\n * based on the final format.\r\n */\r\n public quality(quality: number): this {\r\n if (quality < 1 || quality > 100) {\r\n throw new Error(\"Quality must be between 1 and 100\");\r\n }\r\n\r\n this.options.quality = quality;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Execute the deferred pipeline - apply all stored operations\r\n */\r\n protected async executePipeline(): Promise<sharp.Sharp> {\r\n if (this.pipelineExecuted) {\r\n return this.image;\r\n }\r\n\r\n for (const operation of this.operations) {\r\n await this.executeOperation(this.image, operation);\r\n }\r\n\r\n await this.applyFormatAndQuality(this.image);\r\n\r\n this.pipelineExecuted = true;\r\n\r\n return this.image;\r\n }\r\n\r\n /**\r\n * Execute a single operation\r\n */\r\n protected async executeOperation(image: sharp.Sharp, operation: ImageOperation): Promise<void> {\r\n switch (operation.type) {\r\n case \"resize\":\r\n image.resize(operation.options);\r\n break;\r\n\r\n case \"crop\":\r\n image.extract(operation.options);\r\n break;\r\n\r\n case \"rotate\":\r\n image.rotate(operation.angle);\r\n break;\r\n\r\n case \"flip\":\r\n image.flip();\r\n break;\r\n\r\n case \"flop\":\r\n image.flop();\r\n break;\r\n\r\n case \"blur\":\r\n image.blur(operation.sigma);\r\n break;\r\n\r\n case \"sharpen\":\r\n image.sharpen(operation.options);\r\n break;\r\n\r\n case \"blackAndWhite\":\r\n image.toColourspace(\"b-w\");\r\n break;\r\n\r\n case \"opacity\": {\r\n const alpha = Math.round((operation.value / 100) * 255);\r\n const alphaPixel = Buffer.from([255, 255, 255, alpha]);\r\n image.composite([\r\n {\r\n blend: \"dest-in\",\r\n input: alphaPixel,\r\n },\r\n ]);\r\n break;\r\n }\r\n\r\n case \"negate\":\r\n image.negate(operation.options);\r\n break;\r\n\r\n case \"tint\":\r\n image.tint(operation.color);\r\n break;\r\n\r\n case \"trim\":\r\n image.trim(operation.options);\r\n break;\r\n\r\n case \"watermark\": {\r\n const buffer = await this.resolveImageBuffer(operation.config.image);\r\n image.composite([\r\n {\r\n input: buffer,\r\n ...operation.config.options,\r\n },\r\n ]);\r\n break;\r\n }\r\n\r\n case \"watermarks\": {\r\n const buffers = await Promise.all(\r\n operation.configs.map((config) => this.resolveImageBuffer(config.image)),\r\n );\r\n image.composite(\r\n operation.configs.map((config, index) => ({\r\n input: buffers[index],\r\n ...config.options,\r\n })),\r\n );\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Resolve an image input to a buffer\r\n */\r\n protected async resolveImageBuffer(input: ImageInput | Image): Promise<Buffer> {\r\n if (input instanceof Image) {\r\n // For Image instances, get buffer without applying options (raw buffer)\r\n return input.image.toBuffer();\r\n }\r\n\r\n // For other inputs (path, buffer, etc.), create temp sharp instance\r\n const tempImage = sharpFn(input);\r\n\r\n return tempImage.toBuffer();\r\n }\r\n\r\n /**\r\n * Apply format and quality options.\r\n * If no format is explicitly set, preserves the original format and applies\r\n * quality appropriately based on the format type.\r\n */\r\n protected async applyFormatAndQuality(image: sharp.Sharp): Promise<void> {\r\n const { quality, format } = this.options;\r\n\r\n if (format) {\r\n // Explicit format specified\r\n const formatOptions = quality ? { quality } : undefined;\r\n image.toFormat(format, formatOptions);\r\n return;\r\n }\r\n\r\n if (quality === undefined) {\r\n // No quality or format set, nothing to apply\r\n return;\r\n }\r\n\r\n // Quality is set but no format specified - detect original format\r\n const metadata = await this.metadata();\r\n const originalFormat = metadata.format;\r\n\r\n if (!originalFormat) {\r\n // Cannot detect format, default to webp with quality\r\n image.webp({ quality });\r\n return;\r\n }\r\n\r\n // Apply quality based on original format\r\n if (Image.QUALITY_FORMATS.includes(originalFormat)) {\r\n // Format supports quality option\r\n image.toFormat(originalFormat as ImageFormat, { quality });\r\n } else if (originalFormat === \"png\") {\r\n // PNG uses compressionLevel (0-9) instead of quality\r\n // Map quality 1-100 to compressionLevel 9-0 (higher quality = lower compression)\r\n const compressionLevel = Math.round(9 - (quality / 100) * 9);\r\n image.png({ compressionLevel });\r\n } else if (originalFormat === \"gif\") {\r\n // GIF doesn't support quality, just preserve format\r\n image.gif();\r\n }\r\n // Unknown format: preserve as-is (no quality applied)\r\n }\r\n\r\n /**\r\n * Save to file\r\n */\r\n public async save(path: string): Promise<sharp.OutputInfo> {\r\n const image = await this.executePipeline();\r\n\r\n return image.toFile(path);\r\n }\r\n\r\n /**\r\n * Convert to webp and save to file\r\n */\r\n public async saveAsWebp(path: string): Promise<sharp.OutputInfo> {\r\n // Override format to webp\r\n this.options.format = \"webp\";\r\n const image = await this.executePipeline();\r\n\r\n return image.toFile(path);\r\n }\r\n\r\n /**\r\n * Change the file format\r\n */\r\n public format(format: ImageFormat): this {\r\n this.options.format = format;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Add watermark (deferred - executed at save time)\r\n */\r\n public watermark(image: ImageInput | Image, options: sharp.OverlayOptions = {}): this {\r\n return this.addOperation({\r\n type: \"watermark\",\r\n config: { image, options },\r\n });\r\n }\r\n\r\n /**\r\n * Add multiple watermarks (deferred - executed at save time)\r\n */\r\n public watermarks(configs: WatermarkConfig[]): this {\r\n return this.addOperation({\r\n type: \"watermarks\",\r\n configs,\r\n });\r\n }\r\n\r\n /**\r\n * Rotate image\r\n */\r\n public rotate(angle: number): this {\r\n return this.addOperation({ type: \"rotate\", angle });\r\n }\r\n\r\n /**\r\n * Flip image vertically (top to bottom)\r\n */\r\n public flip(): this {\r\n return this.addOperation({ type: \"flip\" });\r\n }\r\n\r\n /**\r\n * Flop image horizontally (left to right)\r\n */\r\n public flop(): this {\r\n return this.addOperation({ type: \"flop\" });\r\n }\r\n\r\n /**\r\n * Blur image\r\n */\r\n public blur(sigma: number): this {\r\n if (sigma < 0.3) {\r\n throw new Error(\"Blur sigma must be at least 0.3\");\r\n }\r\n\r\n return this.addOperation({ type: \"blur\", sigma });\r\n }\r\n\r\n /**\r\n * Convert to base64\r\n */\r\n public async toBase64(): Promise<string> {\r\n const image = await this.executePipeline();\r\n const buffer = await image.toBuffer();\r\n\r\n return buffer.toString(\"base64\");\r\n }\r\n\r\n /**\r\n * Convert to data URL (base64 with mime type prefix)\r\n */\r\n public async toDataUrl(): Promise<string> {\r\n const metadata = await this.metadata();\r\n const format = this.options.format || metadata.format || \"png\";\r\n const mimeType = `image/${format === \"jpg\" ? \"jpeg\" : format}`;\r\n const base64 = await this.toBase64();\r\n\r\n return `data:${mimeType};base64,${base64}`;\r\n }\r\n\r\n /**\r\n * Sharpen image\r\n */\r\n public sharpen(options?: sharp.SharpenOptions): this {\r\n return this.addOperation({ type: \"sharpen\", options });\r\n }\r\n\r\n /**\r\n * Negate/invert image colors\r\n */\r\n public negate(options?: sharp.NegateOptions): this {\r\n return this.addOperation({ type: \"negate\", options });\r\n }\r\n\r\n /**\r\n * Tint image with a color\r\n */\r\n public tint(color: sharp.Color): this {\r\n return this.addOperation({ type: \"tint\", color });\r\n }\r\n\r\n /**\r\n * Trim edges from the image\r\n */\r\n public trim(options?: sharp.TrimOptions): this {\r\n return this.addOperation({ type: \"trim\", options });\r\n }\r\n\r\n /**\r\n * Convert to buffer\r\n */\r\n public async toBuffer(): Promise<Buffer> {\r\n const image = await this.executePipeline();\r\n\r\n return image.toBuffer();\r\n }\r\n\r\n /**\r\n * Clone the image for separate transformations\r\n */\r\n public clone(): Image {\r\n const clonedImage = new Image(this.image.clone());\r\n clonedImage.options = { ...this.options };\r\n clonedImage.operations = [...this.operations];\r\n clonedImage.cachedMetadata = this.cachedMetadata ? { ...this.cachedMetadata } : null;\r\n\r\n return clonedImage;\r\n }\r\n\r\n /**\r\n * Get the current stored options\r\n */\r\n public getOptions(): Readonly<InternalOptions> {\r\n return { ...this.options };\r\n }\r\n\r\n /**\r\n * Get the pending operations count\r\n */\r\n public getPendingOperationsCount(): number {\r\n return this.operations.length;\r\n }\r\n\r\n /**\r\n * Reset all stored options\r\n */\r\n public resetOptions(): this {\r\n this.options = {};\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Clear all pending operations\r\n */\r\n public clearOperations(): this {\r\n this.operations = [];\r\n this.pipelineExecuted = false;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Reset the image to its initial state (clear operations and options)\r\n */\r\n public reset(): this {\r\n this.operations = [];\r\n this.options = {};\r\n this.pipelineExecuted = false;\r\n this.cachedMetadata = null;\r\n\r\n return this;\r\n }\r\n}\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"image.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/image/image.ts"],"sourcesContent":["import { http } from \"@mongez/http\";\r\nimport type sharp from \"sharp\";\r\nimport type { FormatEnum } from \"sharp\";\r\n\r\n// ============================================================\r\n// Eager-loaded Sharp Module\r\n// ============================================================\r\n\r\n/**\r\n * Installation instructions for sharp\r\n */\r\nconst SHARP_INSTALL_INSTRUCTIONS = `\r\nImage processing requires the sharp package.\r\nInstall it with:\r\n\r\n warlock add image\r\n\r\nOr manually:\r\n\r\n npm install sharp\r\n pnpm add sharp\r\n yarn add sharp\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 sharp function (loaded at import time)\r\n */\r\nlet sharpFn: typeof sharp;\r\n\r\n/**\r\n * Eagerly load sharp module at import time\r\n */\r\nasync function loadSharpModule() {\r\n try {\r\n const module = await import(\"sharp\");\r\n sharpFn = 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\nloadSharpModule();\r\n\r\n// ============================================================\r\n// Types\r\n// ============================================================\r\n\r\nexport type ImageFormat = keyof FormatEnum;\r\n\r\nexport type ImageInput = string | Buffer | Uint8Array | ArrayBuffer;\r\n\r\n/**\r\n * Watermark configuration for deferred execution\r\n */\r\nexport type WatermarkConfig = {\r\n image: ImageInput | Image;\r\n options: sharp.OverlayOptions;\r\n};\r\n\r\n/**\r\n * Operation descriptor for deferred pipeline execution.\r\n * All operations are stored and executed at save/toBuffer time.\r\n */\r\ntype ImageOperation =\r\n | { type: \"resize\"; options: sharp.ResizeOptions }\r\n | { type: \"crop\"; options: sharp.Region }\r\n | { type: \"rotate\"; angle: number }\r\n | { type: \"flip\" }\r\n | { type: \"flop\" }\r\n | { type: \"blur\"; sigma: number }\r\n | { type: \"sharpen\"; options?: sharp.SharpenOptions }\r\n | { type: \"blackAndWhite\" }\r\n | { type: \"opacity\"; value: number }\r\n | { type: \"negate\"; options?: sharp.NegateOptions }\r\n | { type: \"tint\"; color: sharp.Color }\r\n | { type: \"trim\"; options?: sharp.TrimOptions }\r\n | { type: \"watermark\"; config: WatermarkConfig }\r\n | { type: \"watermarks\"; configs: WatermarkConfig[] };\r\n\r\n/**\r\n * Transformation options that can be applied in batch via `apply()` method.\r\n *\r\n * **Execution Order (when using apply()):**\r\n * 1. resize - Resize first to work with correct dimensions\r\n * 2. crop - Crop after resize to extract the desired region\r\n * 3. rotate - Rotation after sizing\r\n * 4. flip/flop - Mirror operations\r\n * 5. blackAndWhite/grayscale - Color space conversion\r\n * 6. blur - Blur effect\r\n * 7. sharpen - Sharpen effect\r\n * 8. tint - Color overlay\r\n * 9. negate - Invert colors\r\n * 10. opacity - Transparency (applied via composite)\r\n * 11. format/quality - Applied on save/export\r\n */\r\nexport type ImageTransformOptions = {\r\n /**\r\n * Output quality (1-100), applied based on final format\r\n */\r\n quality?: number;\r\n /**\r\n * Output format (jpeg, png, webp, avif, etc.)\r\n */\r\n format?: ImageFormat;\r\n /**\r\n * Resize options\r\n */\r\n resize?: sharp.ResizeOptions;\r\n /**\r\n * Crop/extract region\r\n */\r\n crop?: sharp.Region;\r\n /**\r\n * Rotation angle in degrees\r\n */\r\n rotate?: number;\r\n /**\r\n * Flip vertically (top to bottom)\r\n */\r\n flip?: boolean;\r\n /**\r\n * Flop horizontally (left to right)\r\n */\r\n flop?: boolean;\r\n /**\r\n * Convert to black and white\r\n */\r\n blackAndWhite?: boolean;\r\n /**\r\n * Alias for blackAndWhite\r\n */\r\n grayscale?: boolean;\r\n /**\r\n * Blur sigma (must be >= 0.3)\r\n */\r\n blur?: number;\r\n /**\r\n * Sharpen options\r\n */\r\n sharpen?: sharp.SharpenOptions | boolean;\r\n /**\r\n * Tint color\r\n */\r\n tint?: sharp.Color;\r\n /**\r\n * Negate/invert colors\r\n */\r\n negate?: sharp.NegateOptions | boolean;\r\n /**\r\n * Opacity (0-100)\r\n */\r\n opacity?: number;\r\n /**\r\n * Trim options\r\n */\r\n trim?: sharp.TrimOptions | boolean;\r\n /**\r\n * Single watermark\r\n */\r\n watermark?: WatermarkConfig;\r\n /**\r\n * Multiple watermarks\r\n */\r\n watermarks?: WatermarkConfig[];\r\n};\r\n\r\n/**\r\n * Internal options stored for deferred application\r\n */\r\ntype InternalOptions = {\r\n quality?: number;\r\n format?: ImageFormat;\r\n};\r\n\r\n/**\r\n * Image manipulation class with deferred pipeline execution.\r\n *\r\n * **Important:** This class requires the `sharp` package to be installed.\r\n * Install it with: `warlock add image` or `npm install sharp`\r\n *\r\n * Sharp is lazy-loaded on the first async operation (save, toBuffer, etc.),\r\n * so the constructor and all chainable methods remain synchronous.\r\n *\r\n * All operations are synchronous and stored as descriptors.\r\n * The pipeline is executed only when calling output methods:\r\n * - `save()` - Save to file\r\n * - `toBuffer()` - Get as buffer\r\n * - `toBase64()` - Get as base64 string\r\n * - `toDataUrl()` - Get as data URL\r\n *\r\n * @example\r\n * ```typescript\r\n * // All chaining is synchronous - single await at the end\r\n * await new Image(\"photo.jpg\")\r\n * .resize({ width: 800 })\r\n * .watermark(\"logo.png\", { gravity: \"southeast\" })\r\n * .quality(85)\r\n * .save(\"output.jpg\");\r\n * ```\r\n */\r\nexport class Image {\r\n /**\r\n * Image options that will be applied on save/export\r\n */\r\n protected options: InternalOptions = {};\r\n\r\n /**\r\n * Deferred operations pipeline\r\n */\r\n protected operations: ImageOperation[] = [];\r\n\r\n /**\r\n * Cached metadata to avoid repeated async calls\r\n */\r\n protected cachedMetadata: sharp.Metadata | null = null;\r\n\r\n /**\r\n * Whether the pipeline has been executed\r\n */\r\n protected pipelineExecuted = false;\r\n\r\n /**\r\n * Sharp image object\r\n */\r\n public readonly image: sharp.Sharp;\r\n\r\n /**\r\n * Formats that support quality option\r\n */\r\n protected static readonly QUALITY_FORMATS = [\"jpeg\", \"jpg\", \"webp\", \"avif\", \"tiff\", \"heif\"];\r\n\r\n /**\r\n * Constructor\r\n */\r\n public constructor(image: ImageInput | sharp.Sharp) {\r\n if (moduleExists === false) {\r\n throw new Error(`sharp is not installed.\\n\\n${SHARP_INSTALL_INSTRUCTIONS}`);\r\n }\r\n\r\n // Check if it's already a sharp instance\r\n if (image instanceof Object && \"clone\" in image && typeof image.clone === \"function\") {\r\n this.image = image as sharp.Sharp;\r\n } else {\r\n this.image = sharpFn(image as ImageInput);\r\n }\r\n }\r\n\r\n /**\r\n * Create image instance from file path\r\n */\r\n public static fromFile(path: string): Image {\r\n return new Image(path);\r\n }\r\n\r\n /**\r\n * Create image instance from buffer\r\n */\r\n public static fromBuffer(buffer: Buffer): Image {\r\n return new Image(buffer);\r\n }\r\n\r\n /**\r\n * Create image instance from url\r\n */\r\n public static async fromUrl(url: string): Promise<Image> {\r\n const { data, error } = await http.get<ArrayBuffer>(url, {\r\n responseType: \"arrayBuffer\",\r\n });\r\n\r\n if (error || !data) {\r\n throw new Error(\r\n `Failed to load image from URL \"${url}\": ${error?.message ?? \"Empty response received\"}`,\r\n );\r\n }\r\n\r\n return new Image(Buffer.from(data));\r\n }\r\n\r\n /**\r\n * Add an operation to the deferred pipeline\r\n */\r\n protected addOperation(operation: ImageOperation): this {\r\n this.operations.push(operation);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Apply multiple transformations at once with a predefined execution order.\r\n *\r\n * This method ensures transformations are applied in a logical order:\r\n * resize → crop → rotate → flip/flop → colorspace → effects → opacity → format\r\n *\r\n * For custom ordering, use individual chained methods instead.\r\n */\r\n public apply(options: ImageTransformOptions): this {\r\n // 1. Resize first to work with correct dimensions\r\n if (options.resize) {\r\n this.resize(options.resize);\r\n }\r\n\r\n // 2. Crop after resize\r\n if (options.crop) {\r\n this.crop(options.crop);\r\n }\r\n\r\n // 3. Rotation\r\n if (options.rotate !== undefined) {\r\n this.rotate(options.rotate);\r\n }\r\n\r\n // 4. Mirror operations\r\n if (options.flip) {\r\n this.flip();\r\n }\r\n\r\n if (options.flop) {\r\n this.flop();\r\n }\r\n\r\n // 5. Color space conversion\r\n if (options.blackAndWhite || options.grayscale) {\r\n this.blackAndWhite();\r\n }\r\n\r\n // 6. Blur effect\r\n if (options.blur !== undefined) {\r\n this.blur(options.blur);\r\n }\r\n\r\n // 7. Sharpen effect\r\n if (options.sharpen) {\r\n const sharpenOptions = typeof options.sharpen === \"boolean\" ? undefined : options.sharpen;\r\n this.sharpen(sharpenOptions);\r\n }\r\n\r\n // 8. Tint color\r\n if (options.tint) {\r\n this.tint(options.tint);\r\n }\r\n\r\n // 9. Negate/invert\r\n if (options.negate) {\r\n const negateOptions = typeof options.negate === \"boolean\" ? undefined : options.negate;\r\n this.negate(negateOptions);\r\n }\r\n\r\n // 10. Trim edges\r\n if (options.trim) {\r\n const trimOptions = typeof options.trim === \"boolean\" ? undefined : options.trim;\r\n this.trim(trimOptions);\r\n }\r\n\r\n // 11. Watermarks\r\n if (options.watermark) {\r\n this.watermark(options.watermark.image, options.watermark.options);\r\n }\r\n\r\n if (options.watermarks) {\r\n this.watermarks(options.watermarks);\r\n }\r\n\r\n // 12. Opacity (applied via composite)\r\n if (options.opacity !== undefined) {\r\n this.opacity(options.opacity);\r\n }\r\n\r\n // 13. Store format/quality for deferred application\r\n if (options.format) {\r\n this.format(options.format);\r\n }\r\n\r\n if (options.quality !== undefined) {\r\n this.quality(options.quality);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set image opacity (0-100)\r\n */\r\n public opacity(value: number): this {\r\n if (value < 0 || value > 100) {\r\n throw new Error(\"Opacity must be between 0 and 100\");\r\n }\r\n\r\n return this.addOperation({ type: \"opacity\", value });\r\n }\r\n\r\n /**\r\n * Convert image to black and white\r\n */\r\n public blackAndWhite(): this {\r\n return this.addOperation({ type: \"blackAndWhite\" });\r\n }\r\n\r\n /**\r\n * Alias for blackAndWhite\r\n */\r\n public grayscale(): this {\r\n return this.blackAndWhite();\r\n }\r\n\r\n /**\r\n * Get image dimensions (cached after first call)\r\n */\r\n public async dimensions(): Promise<{\r\n width: number | undefined;\r\n height: number | undefined;\r\n }> {\r\n const metadata = await this.metadata();\r\n\r\n return { width: metadata.width, height: metadata.height };\r\n }\r\n\r\n /**\r\n * Get image metadata (cached after first call)\r\n *\r\n * The metadata is cached to avoid repeated async operations.\r\n * Use `refreshMetadata()` to force a fresh fetch.\r\n */\r\n public async metadata(): Promise<sharp.Metadata> {\r\n if (!this.cachedMetadata) {\r\n this.cachedMetadata = await this.image.metadata();\r\n }\r\n\r\n return this.cachedMetadata;\r\n }\r\n\r\n /**\r\n * Force refresh of cached metadata\r\n *\r\n * Call this after transformations if you need updated metadata.\r\n */\r\n public async refreshMetadata(): Promise<sharp.Metadata> {\r\n this.cachedMetadata = await this.image.metadata();\r\n\r\n return this.cachedMetadata;\r\n }\r\n\r\n /**\r\n * Clear cached metadata\r\n */\r\n public clearMetadataCache(): this {\r\n this.cachedMetadata = null;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Resize image\r\n */\r\n public resize(options: sharp.ResizeOptions): this {\r\n if (typeof options.width !== \"undefined\" && !options.width) {\r\n delete options.width;\r\n }\r\n\r\n if (typeof options.height !== \"undefined\" && !options.height) {\r\n delete options.height;\r\n }\r\n\r\n return this.addOperation({ type: \"resize\", options });\r\n }\r\n\r\n /**\r\n * Crop/extract a region from the image\r\n */\r\n public crop(options: sharp.Region): this {\r\n return this.addOperation({ type: \"crop\", options });\r\n }\r\n\r\n /**\r\n * Set image quality (1-100)\r\n * Quality is stored and applied when saving/exporting\r\n * based on the final format.\r\n */\r\n public quality(quality: number): this {\r\n if (quality < 1 || quality > 100) {\r\n throw new Error(\"Quality must be between 1 and 100\");\r\n }\r\n\r\n this.options.quality = quality;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Execute the deferred pipeline - apply all stored operations\r\n */\r\n protected async executePipeline(): Promise<sharp.Sharp> {\r\n if (this.pipelineExecuted) {\r\n return this.image;\r\n }\r\n\r\n for (const operation of this.operations) {\r\n await this.executeOperation(this.image, operation);\r\n }\r\n\r\n await this.applyFormatAndQuality(this.image);\r\n\r\n this.pipelineExecuted = true;\r\n\r\n return this.image;\r\n }\r\n\r\n /**\r\n * Execute a single operation\r\n */\r\n protected async executeOperation(image: sharp.Sharp, operation: ImageOperation): Promise<void> {\r\n switch (operation.type) {\r\n case \"resize\":\r\n image.resize(operation.options);\r\n break;\r\n\r\n case \"crop\":\r\n image.extract(operation.options);\r\n break;\r\n\r\n case \"rotate\":\r\n image.rotate(operation.angle);\r\n break;\r\n\r\n case \"flip\":\r\n image.flip();\r\n break;\r\n\r\n case \"flop\":\r\n image.flop();\r\n break;\r\n\r\n case \"blur\":\r\n image.blur(operation.sigma);\r\n break;\r\n\r\n case \"sharpen\":\r\n image.sharpen(operation.options);\r\n break;\r\n\r\n case \"blackAndWhite\":\r\n image.toColourspace(\"b-w\");\r\n break;\r\n\r\n case \"opacity\": {\r\n const alpha = Math.round((operation.value / 100) * 255);\r\n const alphaPixel = Buffer.from([255, 255, 255, alpha]);\r\n image.composite([\r\n {\r\n blend: \"dest-in\",\r\n input: alphaPixel,\r\n },\r\n ]);\r\n break;\r\n }\r\n\r\n case \"negate\":\r\n image.negate(operation.options);\r\n break;\r\n\r\n case \"tint\":\r\n image.tint(operation.color);\r\n break;\r\n\r\n case \"trim\":\r\n image.trim(operation.options);\r\n break;\r\n\r\n case \"watermark\": {\r\n const buffer = await this.resolveImageBuffer(operation.config.image);\r\n image.composite([\r\n {\r\n input: buffer,\r\n ...operation.config.options,\r\n },\r\n ]);\r\n break;\r\n }\r\n\r\n case \"watermarks\": {\r\n const buffers = await Promise.all(\r\n operation.configs.map((config) => this.resolveImageBuffer(config.image)),\r\n );\r\n image.composite(\r\n operation.configs.map((config, index) => ({\r\n input: buffers[index],\r\n ...config.options,\r\n })),\r\n );\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Resolve an image input to a buffer\r\n */\r\n protected async resolveImageBuffer(input: ImageInput | Image): Promise<Buffer> {\r\n if (input instanceof Image) {\r\n // For Image instances, get buffer without applying options (raw buffer)\r\n return input.image.toBuffer();\r\n }\r\n\r\n // For other inputs (path, buffer, etc.), create temp sharp instance\r\n const tempImage = sharpFn(input);\r\n\r\n return tempImage.toBuffer();\r\n }\r\n\r\n /**\r\n * Apply format and quality options.\r\n * If no format is explicitly set, preserves the original format and applies\r\n * quality appropriately based on the format type.\r\n */\r\n protected async applyFormatAndQuality(image: sharp.Sharp): Promise<void> {\r\n const { quality, format } = this.options;\r\n\r\n if (format) {\r\n // Explicit format specified\r\n const formatOptions = quality ? { quality } : undefined;\r\n image.toFormat(format, formatOptions);\r\n return;\r\n }\r\n\r\n if (quality === undefined) {\r\n // No quality or format set, nothing to apply\r\n return;\r\n }\r\n\r\n // Quality is set but no format specified - detect original format\r\n const metadata = await this.metadata();\r\n const originalFormat = metadata.format;\r\n\r\n if (!originalFormat) {\r\n // Cannot detect format, default to webp with quality\r\n image.webp({ quality });\r\n return;\r\n }\r\n\r\n // Apply quality based on original format\r\n if (Image.QUALITY_FORMATS.includes(originalFormat)) {\r\n // Format supports quality option\r\n image.toFormat(originalFormat as ImageFormat, { quality });\r\n } else if (originalFormat === \"png\") {\r\n // PNG uses compressionLevel (0-9) instead of quality\r\n // Map quality 1-100 to compressionLevel 9-0 (higher quality = lower compression)\r\n const compressionLevel = Math.round(9 - (quality / 100) * 9);\r\n image.png({ compressionLevel });\r\n } else if (originalFormat === \"gif\") {\r\n // GIF doesn't support quality, just preserve format\r\n image.gif();\r\n }\r\n // Unknown format: preserve as-is (no quality applied)\r\n }\r\n\r\n /**\r\n * Save to file\r\n */\r\n public async save(path: string): Promise<sharp.OutputInfo> {\r\n const image = await this.executePipeline();\r\n\r\n return image.toFile(path);\r\n }\r\n\r\n /**\r\n * Convert to webp and save to file\r\n */\r\n public async saveAsWebp(path: string): Promise<sharp.OutputInfo> {\r\n // Override format to webp\r\n this.options.format = \"webp\";\r\n const image = await this.executePipeline();\r\n\r\n return image.toFile(path);\r\n }\r\n\r\n /**\r\n * Change the file format\r\n */\r\n public format(format: ImageFormat): this {\r\n this.options.format = format;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Add watermark (deferred - executed at save time)\r\n */\r\n public watermark(image: ImageInput | Image, options: sharp.OverlayOptions = {}): this {\r\n return this.addOperation({\r\n type: \"watermark\",\r\n config: { image, options },\r\n });\r\n }\r\n\r\n /**\r\n * Add multiple watermarks (deferred - executed at save time)\r\n */\r\n public watermarks(configs: WatermarkConfig[]): this {\r\n return this.addOperation({\r\n type: \"watermarks\",\r\n configs,\r\n });\r\n }\r\n\r\n /**\r\n * Rotate image\r\n */\r\n public rotate(angle: number): this {\r\n return this.addOperation({ type: \"rotate\", angle });\r\n }\r\n\r\n /**\r\n * Flip image vertically (top to bottom)\r\n */\r\n public flip(): this {\r\n return this.addOperation({ type: \"flip\" });\r\n }\r\n\r\n /**\r\n * Flop image horizontally (left to right)\r\n */\r\n public flop(): this {\r\n return this.addOperation({ type: \"flop\" });\r\n }\r\n\r\n /**\r\n * Blur image\r\n */\r\n public blur(sigma: number): this {\r\n if (sigma < 0.3) {\r\n throw new Error(\"Blur sigma must be at least 0.3\");\r\n }\r\n\r\n return this.addOperation({ type: \"blur\", sigma });\r\n }\r\n\r\n /**\r\n * Convert to base64\r\n */\r\n public async toBase64(): Promise<string> {\r\n const image = await this.executePipeline();\r\n const buffer = await image.toBuffer();\r\n\r\n return buffer.toString(\"base64\");\r\n }\r\n\r\n /**\r\n * Convert to data URL (base64 with mime type prefix)\r\n */\r\n public async toDataUrl(): Promise<string> {\r\n const metadata = await this.metadata();\r\n const format = this.options.format || metadata.format || \"png\";\r\n const mimeType = `image/${format === \"jpg\" ? \"jpeg\" : format}`;\r\n const base64 = await this.toBase64();\r\n\r\n return `data:${mimeType};base64,${base64}`;\r\n }\r\n\r\n /**\r\n * Sharpen image\r\n */\r\n public sharpen(options?: sharp.SharpenOptions): this {\r\n return this.addOperation({ type: \"sharpen\", options });\r\n }\r\n\r\n /**\r\n * Negate/invert image colors\r\n */\r\n public negate(options?: sharp.NegateOptions): this {\r\n return this.addOperation({ type: \"negate\", options });\r\n }\r\n\r\n /**\r\n * Tint image with a color\r\n */\r\n public tint(color: sharp.Color): this {\r\n return this.addOperation({ type: \"tint\", color });\r\n }\r\n\r\n /**\r\n * Trim edges from the image\r\n */\r\n public trim(options?: sharp.TrimOptions): this {\r\n return this.addOperation({ type: \"trim\", options });\r\n }\r\n\r\n /**\r\n * Convert to buffer\r\n */\r\n public async toBuffer(): Promise<Buffer> {\r\n const image = await this.executePipeline();\r\n\r\n return image.toBuffer();\r\n }\r\n\r\n /**\r\n * Clone the image for separate transformations\r\n */\r\n public clone(): Image {\r\n const clonedImage = new Image(this.image.clone());\r\n clonedImage.options = { ...this.options };\r\n clonedImage.operations = [...this.operations];\r\n clonedImage.cachedMetadata = this.cachedMetadata ? { ...this.cachedMetadata } : null;\r\n\r\n return clonedImage;\r\n }\r\n\r\n /**\r\n * Get the current stored options\r\n */\r\n public getOptions(): Readonly<InternalOptions> {\r\n return { ...this.options };\r\n }\r\n\r\n /**\r\n * Get the pending operations count\r\n */\r\n public getPendingOperationsCount(): number {\r\n return this.operations.length;\r\n }\r\n\r\n /**\r\n * Reset all stored options\r\n */\r\n public resetOptions(): this {\r\n this.options = {};\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Clear all pending operations\r\n */\r\n public clearOperations(): this {\r\n this.operations = [];\r\n this.pipelineExecuted = false;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Reset the image to its initial state (clear operations and options)\r\n */\r\n public reset(): this {\r\n this.operations = [];\r\n this.options = {};\r\n this.pipelineExecuted = false;\r\n this.cachedMetadata = null;\r\n\r\n return this;\r\n }\r\n}\r\n"],"mappings":"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"}
package/esm/index.d.mts CHANGED
@@ -59,6 +59,7 @@ import { displayEnvironmentMode } from "./bootstrap/setup.mjs";
59
59
  import { DatabaseCacheDriver, DatabaseCacheOptions } from "./cache/database-cache-driver.mjs";
60
60
  import { Connector, ConnectorLifecyclePhase, ConnectorName, ConnectorPriority } from "./connectors/types.mjs";
61
61
  import { BaseConnector } from "./connectors/base-connector.mjs";
62
+ import { AccessConnector } from "./connectors/access-connector.mjs";
62
63
  import { CacheConnector } from "./connectors/cache-connector.mjs";
63
64
  import { HeraldConnector } from "./connectors/herald-connector.mjs";
64
65
  import { ConnectorsManager, connectorsManager } from "./connectors/connectors-manager.mjs";
@@ -66,6 +67,7 @@ import { DatabaseConnector } from "./connectors/database-connector.mjs";
66
67
  import { HttpConnector } from "./connectors/http-connector.mjs";
67
68
  import { LoggerConnector } from "./connectors/logger-connector.mjs";
68
69
  import { MailerConnector } from "./connectors/mail-connector.mjs";
70
+ import { NotificationsConnector } from "./connectors/notifications-connector.mjs";
69
71
  import { SocketConnector } from "./connectors/socket-connector.mjs";
70
72
  import { StorageConnector } from "./connectors/storage.connector.mjs";
71
73
  import { CLICommandAction, CLICommandOption, CLICommandOptions, CLICommandPreload, CLICommandSource, CommandActionData, ResolvedCLICommandOption } from "./cli/types.mjs";
@@ -136,13 +138,14 @@ import { uniqueExceptCurrentUserRule } from "./validation/database/unique-except
136
138
  import { FileValidator, uploadedFileMetadataSchema } from "./validation/validators/file-validator.mjs";
137
139
  import { ValidationConfiguration } from "./validation/types.mjs";
138
140
  import { fileExtensionRule, fileRule, fileTypeRule, imageRule } from "./validation/file/file.mjs";
141
+ import { DecoratorLoweringPlugin, lowerStage3Decorators } from "./vite/lower-stage3-decorators.mjs";
139
142
  import { WarlockConfig } from "./warlock-config/types.mjs";
140
143
  import { defineConfig } from "./warlock-config/define-config.mjs";
141
- import { WarlockConfigManager, warlockConfigManager } from "./warlock-config/warlock-config.manager.mjs";
144
+ import { WarlockConfigManager, isUnknownTsExtensionError, warlockConfigManager } from "./warlock-config/warlock-config.manager.mjs";
142
145
  import { env } from "@mongez/dotenv";
143
146
  import { colors } from "@mongez/copper";
144
147
  export * from "@mongez/localization";
145
- export { $registerUseCase, $unregisterUseCase, AllRepositoryOptions, AppConfigurations, Application, BadRequestError, BadSchemaUseCaseError, BaseConnector, BaseHealthChecker, type BenchmarkChannel, type BenchmarkConfigurations, type BenchmarkErrorResult, type BenchmarkOptions, BenchmarkProfiler, type BenchmarkProfilerOptions, type BenchmarkResult, BenchmarkSnapshots, type BenchmarkSnapshotsOptions, type BenchmarkStats, type BenchmarkSuccessResult, CLICommand, CLICommandAction, CLICommandOption, CLICommandOptions, CLICommandPreload, CLICommandSource, CacheConnector, type CacheMiddlewareOptions, CachedRepositoryOptions, type CapturedMail, CascadeAdapter, CascadeQueryBuilder, ChunkCallback, CloudDriver, CloudStorageDriverContract, CloudStorageDriverOptions, CloudStorageFileData, CommandActionData, type ConcurrencyLimitOptions, ConfigKey, ConfigKeyRegistry, ConfigName, ConfigRegistry, ConfigSpecialHandlers, ConflictError, Connector, ConnectorLifecyclePhase, ConnectorName, ConnectorPriority, ConnectorsManager, ConsoleChannel, ContainerTypes, CookieOptions, CursorPaginationOptions, CursorPaginationResult, DOSpacesDriver, DatabaseCacheDriver, type DatabaseCacheOptions, DatabaseConnector, DatabaseLog, DatabaseLogModel, DatabaseLogOptions, DefineResourceOptions, DeleteManyResult, EncryptionConfigurations, EncryptionPasswordConfigurations, Environment, EslintHealthChecker, EventSubscription, ExistsExceptCurrentIdRuleOptions, ExistsExceptCurrentUserRuleOptions, FastifyInstance, FileNamingStrategy, FileValidationOptions, FileValidator, FileVisibility, FilesOrchestrator, FilterFunction, FilterOperator, FilterOptions, FilterRule, FilterRules, ForbiddenError, GroupedRoutesOptions, HeraldConnector, HttpConfigurations, HttpConnector, HttpError, HttpErrorCodes, type IdempotencyOptions, Image, ImageFormat, ImageInput, ImageTransformCallback, ImageTransformConfig, ImageTransformOptions, type IpFilterOptions, ListOptions, LocalDriver, LocalStorageDriverOptions, LocalizedObject, LogConfigurations, LoggerConnector, MAIL_EVENTS, Mail, type MailAddress, type MailAttachment, type MailConfigurations, MailError, type MailErrorCode, type MailEvents, type MailMode, type MailOptions, type MailPriority, type MailResult, MailerConnector, type MailersConfig, type MaintenanceOptions, Middleware, MiddlewareResponse, MimeTypes, NoopChannel, type NormalizedMail, NotAcceptableError, NotAllowedError, PaginationMode, PaginationResult, PartialMiddleware, PartialPick, PipelineOptions, PrefixConfig, PrefixOptions, PresignedOptions, PresignedUploadOptions, PutDirectoryOptions, PutDirectoryResult, PutOptions, QueryBuilderContract, Queue, R2Driver, R2StorageDriverOptions, type RateLimitOptions, RegisterResource, RegisteredUseCase, RepositoryAdapterContract, RepositoryConfigurations, RepositoryEvent, RepositoryManager, RepositoryOptions, RepositoryOptionsWithCursor, RepositoryOptionsWithPages, Request, RequestContextStore, RequestController, RequestControllerContract, RequestEvent, RequestHandler, RequestHandlerType, RequestHandlerValidation, RequestLog, RequestMethod, ResolvedCLICommandOption, Resource, ResourceArraySchema, ResourceCastType, ResourceConstructor, ResourceContract, ResourceFieldBuilder, ResourceFieldBuilderDateOutputOptions, ResourceFieldConfig, ResourceMethod, ResourceNotFoundError, ResourceOutputValueCastType, ResourceSchema, ResourceSelfReference, Response, ResponseBodyValue, ResponseEvent, ResponseSSEController, ResponseSchema, ResponseStatus, ResponseStreamController, Restful, RestfulMiddleware, ReturnedResponse, Route, RouteOptions, RouteResource, Router, RouterGroupCallback, RouterStacks, S3Driver, type SESConfigurations, type SMTPConfigurations, SaveAsOptions, SaveMode, SaveOptions, ScopedStorage, ScopedStorageContract, SeedResult, Seeder, SeederMetadata, SendBufferOptions, SendFileOptions, ServerError, SocketConnector, SocketOptions, Storage, StorageConfigurations, StorageConnector, StorageCopyEventPayload, StorageDriverConfig, StorageDriverContextStore, StorageDriverContract, StorageDriverName, StorageDriverRegistry, StorageDriverType, StorageEventHandler, StorageEventPayload, StorageEventType, StorageFile, StorageFileData, StorageFileInfo, StorageManagerContract, StoragePutEventPayload, TemporaryTokenError, TemporaryTokenPayload, TemporaryTokenValidation, TypedAllRepositoryOptions, TypedRepositoryOptions, TypedRepositoryOptionsWithCursor, TypedRepositoryOptionsWithPages, TypescriptHealthChecker, UPLOADS_DEFAULTS, UnAuthorizedError, UniqueExceptCurrentIdRuleOptions, UniqueExceptCurrentUserRuleOptions, UploadedFile, UploadedFileImageOptions, UploadsConfigurations, UseCase, UseCaseAfterMiddleware, UseCaseBeforeMiddleware, UseCaseBroadcastChannel, UseCaseBroadcastEvent, UseCaseBroadcastOption, UseCaseConfigurations, UseCaseContext, UseCaseErrorResult, UseCaseEventsCallbacksMap, UseCaseGuard, UseCaseHandler, UseCaseOnExecutingContext, UseCaseResult, UseCaseRuntimeOptions, UseCaseWithSchema, ValidationConfiguration, WarlockConfig, WarlockConfigManager, WatermarkConfig, WhereOperator, addUseCaseHistory, anyMatch, app, appLog, appPath, assertMailCount, assertMailSent, assetsUrl, bootstrap, broadcastUseCaseResult, buildIdempotencyCacheKey, cachePath, captureMail, clearTestMailbox, closeAllMailers, closeMailer, colors, command, config, configPath, configSpecialHandlers, connectorsManager, container, createHttpApplication, createRequestStore, decrypt, defaultHttpConfigurations, defineConfig, defineResource, displayEnvironmentMode, encrypt, env, environment, existsExceptCurrentIdRule, existsExceptCurrentUserRule, expectJson, fileExtensionRule, fileRule, fileTypeRule, filesOrchestrator, findMailsBySubject, findMailsTo, fireLifecycleEvent, fromRequest, generateMailId, getDefaultMailConfig, getHttpServer, getLastMail, getLocalized, getMailEventName, getMailMode, getMailboxSize, getMailer, getMailerConfig, getMimeType, getPoolStats, getSocketServer, getTestMailbox, getTestServerUrl, getUseCase, getUseCaseHistory, getUseCases, globalEventsCallbacksMap, globalUseCasesEvents, hashBody, hashPassword, hmacHash, httpConfig, imageRule, increaseUseCaseFailedCalls, increaseUseCaseSuccessCalls, ipMatches, isDevelopmentMode, isProductionMode, isTestMode, isTestServerRunning, isValidIdempotencyKey, loadS3, logResponse, logsPath, mailEvents, measure, middleware, onCleanup, parseJsonResponse, parseSize, paths, promiseAllObject, publicPath, publicUrl, registerAppConfig, registerHttpPlugins, renderReact, renderReactMail, requestContext, resetMailConfig, resolveMailConfig, rootPath, router, runPipeline, sanitizePath, seeder, sendMail, setBaseUrl, setEnvironment, setLogConfigurations, setMailConfigurations, setMailMode, setupTest, sleep, sluggable, srcPath, startHttpServer, startHttpTestServer, stopHttpApplication, stopHttpTestServer, storage, storageConfig, storageConfigurations, storageDriverContext, storagePath, t, tempPath, testDelete, testGet, testPatch, testPost, testPut, testRequest, toJson, uniqueExceptCurrentIdRule, uniqueExceptCurrentUserRule, uploadedFileMetadataSchema, uploadsConfig, uploadsPath, uploadsUrl, url, useCase, useComputedModel, useComputedSlug, useCurrentUser, useHashedPassword, useRequest, useRequestStore, verifyMailer, verifyPassword, warlockConfigManager, warlockPath, wasMailSentTo, wasMailSentWithSubject, wrapResponseInDataKey };
148
+ export { $registerUseCase, $unregisterUseCase, AccessConnector, AllRepositoryOptions, AppConfigurations, Application, BadRequestError, BadSchemaUseCaseError, BaseConnector, BaseHealthChecker, type BenchmarkChannel, type BenchmarkConfigurations, type BenchmarkErrorResult, type BenchmarkOptions, BenchmarkProfiler, type BenchmarkProfilerOptions, type BenchmarkResult, BenchmarkSnapshots, type BenchmarkSnapshotsOptions, type BenchmarkStats, type BenchmarkSuccessResult, CLICommand, CLICommandAction, CLICommandOption, CLICommandOptions, CLICommandPreload, CLICommandSource, CacheConnector, type CacheMiddlewareOptions, CachedRepositoryOptions, type CapturedMail, CascadeAdapter, CascadeQueryBuilder, ChunkCallback, CloudDriver, CloudStorageDriverContract, CloudStorageDriverOptions, CloudStorageFileData, CommandActionData, type ConcurrencyLimitOptions, ConfigKey, ConfigKeyRegistry, ConfigName, ConfigRegistry, ConfigSpecialHandlers, ConflictError, Connector, ConnectorLifecyclePhase, ConnectorName, ConnectorPriority, ConnectorsManager, ConsoleChannel, ContainerTypes, CookieOptions, CursorPaginationOptions, CursorPaginationResult, DOSpacesDriver, DatabaseCacheDriver, type DatabaseCacheOptions, DatabaseConnector, DatabaseLog, DatabaseLogModel, DatabaseLogOptions, DecoratorLoweringPlugin, DefineResourceOptions, DeleteManyResult, EncryptionConfigurations, EncryptionPasswordConfigurations, Environment, EslintHealthChecker, EventSubscription, ExistsExceptCurrentIdRuleOptions, ExistsExceptCurrentUserRuleOptions, FastifyInstance, FileNamingStrategy, FileValidationOptions, FileValidator, FileVisibility, FilesOrchestrator, FilterFunction, FilterOperator, FilterOptions, FilterRule, FilterRules, ForbiddenError, GroupedRoutesOptions, HeraldConnector, HttpConfigurations, HttpConnector, HttpError, HttpErrorCodes, type IdempotencyOptions, Image, ImageFormat, ImageInput, ImageTransformCallback, ImageTransformConfig, ImageTransformOptions, type IpFilterOptions, ListOptions, LocalDriver, LocalStorageDriverOptions, LocalizedObject, LogConfigurations, LoggerConnector, MAIL_EVENTS, Mail, type MailAddress, type MailAttachment, type MailConfigurations, MailError, type MailErrorCode, type MailEvents, type MailMode, type MailOptions, type MailPriority, type MailResult, MailerConnector, type MailersConfig, type MaintenanceOptions, Middleware, MiddlewareResponse, MimeTypes, NoopChannel, type NormalizedMail, NotAcceptableError, NotAllowedError, NotificationsConnector, PaginationMode, PaginationResult, PartialMiddleware, PartialPick, PipelineOptions, PrefixConfig, PrefixOptions, PresignedOptions, PresignedUploadOptions, PutDirectoryOptions, PutDirectoryResult, PutOptions, QueryBuilderContract, Queue, R2Driver, R2StorageDriverOptions, type RateLimitOptions, RegisterResource, RegisteredUseCase, RepositoryAdapterContract, RepositoryConfigurations, RepositoryEvent, RepositoryManager, RepositoryOptions, RepositoryOptionsWithCursor, RepositoryOptionsWithPages, Request, RequestContextStore, RequestController, RequestControllerContract, RequestEvent, RequestHandler, RequestHandlerType, RequestHandlerValidation, RequestLog, RequestMethod, ResolvedCLICommandOption, Resource, ResourceArraySchema, ResourceCastType, ResourceConstructor, ResourceContract, ResourceFieldBuilder, ResourceFieldBuilderDateOutputOptions, ResourceFieldConfig, ResourceMethod, ResourceNotFoundError, ResourceOutputValueCastType, ResourceSchema, ResourceSelfReference, Response, ResponseBodyValue, ResponseEvent, ResponseSSEController, ResponseSchema, ResponseStatus, ResponseStreamController, Restful, RestfulMiddleware, ReturnedResponse, Route, RouteOptions, RouteResource, Router, RouterGroupCallback, RouterStacks, S3Driver, type SESConfigurations, type SMTPConfigurations, SaveAsOptions, SaveMode, SaveOptions, ScopedStorage, ScopedStorageContract, SeedResult, Seeder, SeederMetadata, SendBufferOptions, SendFileOptions, ServerError, SocketConnector, SocketOptions, Storage, StorageConfigurations, StorageConnector, StorageCopyEventPayload, StorageDriverConfig, StorageDriverContextStore, StorageDriverContract, StorageDriverName, StorageDriverRegistry, StorageDriverType, StorageEventHandler, StorageEventPayload, StorageEventType, StorageFile, StorageFileData, StorageFileInfo, StorageManagerContract, StoragePutEventPayload, TemporaryTokenError, TemporaryTokenPayload, TemporaryTokenValidation, TypedAllRepositoryOptions, TypedRepositoryOptions, TypedRepositoryOptionsWithCursor, TypedRepositoryOptionsWithPages, TypescriptHealthChecker, UPLOADS_DEFAULTS, UnAuthorizedError, UniqueExceptCurrentIdRuleOptions, UniqueExceptCurrentUserRuleOptions, UploadedFile, UploadedFileImageOptions, UploadsConfigurations, UseCase, UseCaseAfterMiddleware, UseCaseBeforeMiddleware, UseCaseBroadcastChannel, UseCaseBroadcastEvent, UseCaseBroadcastOption, UseCaseConfigurations, UseCaseContext, UseCaseErrorResult, UseCaseEventsCallbacksMap, UseCaseGuard, UseCaseHandler, UseCaseOnExecutingContext, UseCaseResult, UseCaseRuntimeOptions, UseCaseWithSchema, ValidationConfiguration, WarlockConfig, WarlockConfigManager, WatermarkConfig, WhereOperator, addUseCaseHistory, anyMatch, app, appLog, appPath, assertMailCount, assertMailSent, assetsUrl, bootstrap, broadcastUseCaseResult, buildIdempotencyCacheKey, cachePath, captureMail, clearTestMailbox, closeAllMailers, closeMailer, colors, command, config, configPath, configSpecialHandlers, connectorsManager, container, createHttpApplication, createRequestStore, decrypt, defaultHttpConfigurations, defineConfig, defineResource, displayEnvironmentMode, encrypt, env, environment, existsExceptCurrentIdRule, existsExceptCurrentUserRule, expectJson, fileExtensionRule, fileRule, fileTypeRule, filesOrchestrator, findMailsBySubject, findMailsTo, fireLifecycleEvent, fromRequest, generateMailId, getDefaultMailConfig, getHttpServer, getLastMail, getLocalized, getMailEventName, getMailMode, getMailboxSize, getMailer, getMailerConfig, getMimeType, getPoolStats, getSocketServer, getTestMailbox, getTestServerUrl, getUseCase, getUseCaseHistory, getUseCases, globalEventsCallbacksMap, globalUseCasesEvents, hashBody, hashPassword, hmacHash, httpConfig, imageRule, increaseUseCaseFailedCalls, increaseUseCaseSuccessCalls, ipMatches, isDevelopmentMode, isProductionMode, isTestMode, isTestServerRunning, isUnknownTsExtensionError, isValidIdempotencyKey, loadS3, logResponse, logsPath, lowerStage3Decorators, mailEvents, measure, middleware, onCleanup, parseJsonResponse, parseSize, paths, promiseAllObject, publicPath, publicUrl, registerAppConfig, registerHttpPlugins, renderReact, renderReactMail, requestContext, resetMailConfig, resolveMailConfig, rootPath, router, runPipeline, sanitizePath, seeder, sendMail, setBaseUrl, setEnvironment, setLogConfigurations, setMailConfigurations, setMailMode, setupTest, sleep, sluggable, srcPath, startHttpServer, startHttpTestServer, stopHttpApplication, stopHttpTestServer, storage, storageConfig, storageConfigurations, storageDriverContext, storagePath, t, tempPath, testDelete, testGet, testPatch, testPost, testPut, testRequest, toJson, uniqueExceptCurrentIdRule, uniqueExceptCurrentUserRule, uploadedFileMetadataSchema, uploadsConfig, uploadsPath, uploadsUrl, url, useCase, useComputedModel, useComputedSlug, useCurrentUser, useHashedPassword, useRequest, useRequestStore, verifyMailer, verifyPassword, warlockConfigManager, warlockPath, wasMailSentTo, wasMailSentWithSubject, wrapResponseInDataKey };
146
149
  import "./config/types.mjs";
147
150
  import "./storage/types.mjs";
148
151
  import "./validation/types.mjs";
package/esm/index.mjs CHANGED
@@ -76,6 +76,7 @@ import "./cache/index.mjs";
76
76
  import { CLICommand, command } from "./cli/cli-command.mjs";
77
77
  import { ConnectorLifecyclePhase, ConnectorPriority } from "./connectors/types.mjs";
78
78
  import { BaseConnector } from "./connectors/base-connector.mjs";
79
+ import { AccessConnector } from "./connectors/access-connector.mjs";
79
80
  import { CacheConnector } from "./connectors/cache-connector.mjs";
80
81
  import { HeraldConnector } from "./connectors/herald-connector.mjs";
81
82
  import { DatabaseConnector } from "./connectors/database-connector.mjs";
@@ -93,6 +94,7 @@ import { sendMail } from "./mail/send-mail.mjs";
93
94
  import { Mail } from "./mail/mail.mjs";
94
95
  import "./mail/index.mjs";
95
96
  import { MailerConnector } from "./connectors/mail-connector.mjs";
97
+ import { NotificationsConnector } from "./connectors/notifications-connector.mjs";
96
98
  import { SocketConnector } from "./connectors/socket-connector.mjs";
97
99
  import { StorageConnector } from "./connectors/storage.connector.mjs";
98
100
  import { ConnectorsManager, connectorsManager } from "./connectors/connectors-manager.mjs";
@@ -100,7 +102,7 @@ import "./connectors/index.mjs";
100
102
  import { seeder } from "./database/seeds/seeder.mjs";
101
103
  import { useComputedModel, useComputedSlug, useHashedPassword } from "./database/utils.mjs";
102
104
  import "./database/index.mjs";
103
- import { WarlockConfigManager, warlockConfigManager } from "./warlock-config/warlock-config.manager.mjs";
105
+ import { WarlockConfigManager, isUnknownTsExtensionError, warlockConfigManager } from "./warlock-config/warlock-config.manager.mjs";
104
106
  import { BaseHealthChecker } from "./dev-server/health-checker/checkers/base-health-checker.mjs";
105
107
  import { EslintHealthChecker } from "./dev-server/health-checker/checkers/eslint-health-checker.mjs";
106
108
  import { TypescriptHealthChecker } from "./dev-server/health-checker/checkers/typescript-health-checker.mjs";
@@ -135,6 +137,8 @@ import { $registerUseCase, $unregisterUseCase, addUseCaseHistory, getUseCase, ge
135
137
  import { useCase } from "./use-cases/use-case.mjs";
136
138
  import "./use-cases/index.mjs";
137
139
  import "./validation/index.mjs";
140
+ import { lowerStage3Decorators } from "./vite/lower-stage3-decorators.mjs";
141
+ import "./vite/index.mjs";
138
142
  import { defineConfig } from "./warlock-config/define-config.mjs";
139
143
  import "./warlock-config/index.mjs";
140
144
  import { env } from "@mongez/dotenv";
@@ -142,4 +146,4 @@ import { colors } from "@mongez/copper";
142
146
 
143
147
  export * from "@mongez/localization"
144
148
 
145
- export { $registerUseCase, $unregisterUseCase, Application, BadRequestError, BadSchemaUseCaseError, BaseConnector, BaseHealthChecker, BenchmarkProfiler, BenchmarkSnapshots, CLICommand, CacheConnector, CascadeAdapter, CascadeQueryBuilder, CloudDriver, ConfigSpecialHandlers, ConflictError, ConnectorLifecyclePhase, ConnectorPriority, ConnectorsManager, ConsoleChannel, DOSpacesDriver, DatabaseCacheDriver, DatabaseConnector, DatabaseLog, DatabaseLogModel, EslintHealthChecker, FileValidator, FilesOrchestrator, ForbiddenError, HeraldConnector, HttpConnector, HttpError, HttpErrorCodes, Image, LocalDriver, LoggerConnector, MAIL_EVENTS, Mail, MailError, MailerConnector, MimeTypes, NoopChannel, NotAcceptableError, NotAllowedError, Queue, R2Driver, RegisterResource, RepositoryManager, Request, RequestController, RequestLog, Resource, ResourceFieldBuilder, ResourceNotFoundError, Response, ResponseStatus, Restful, Router, S3Driver, ScopedStorage, ServerError, SocketConnector, Storage, StorageConnector, StorageFile, TypescriptHealthChecker, UPLOADS_DEFAULTS, UnAuthorizedError, UploadedFile, WarlockConfigManager, addUseCaseHistory, anyMatch, app, appLog, appPath, assertMailCount, assertMailSent, assetsUrl, bootstrap, broadcastUseCaseResult, buildIdempotencyCacheKey, cachePath, captureMail, clearTestMailbox, closeAllMailers, closeMailer, colors, command, config, configPath, configSpecialHandlers, connectorsManager, container, createHttpApplication, createRequestStore, decrypt, defaultHttpConfigurations, defineConfig, defineResource, displayEnvironmentMode, encrypt, env, environment, existsExceptCurrentIdRule, existsExceptCurrentUserRule, expectJson, fileExtensionRule, fileRule, fileTypeRule, filesOrchestrator, findMailsBySubject, findMailsTo, fireLifecycleEvent, fromRequest, generateMailId, getDefaultMailConfig, getHttpServer, getLastMail, getLocalized, getMailEventName, getMailMode, getMailboxSize, getMailer, getMailerConfig, getMimeType, getPoolStats, getSocketServer, getTestMailbox, getTestServerUrl, getUseCase, getUseCaseHistory, getUseCases, globalEventsCallbacksMap, globalUseCasesEvents, hashBody, hashPassword, hmacHash, httpConfig, imageRule, increaseUseCaseFailedCalls, increaseUseCaseSuccessCalls, ipMatches, isDevelopmentMode, isProductionMode, isTestMode, isTestServerRunning, isValidIdempotencyKey, loadS3, logResponse, logsPath, mailEvents, measure, middleware, onCleanup, parseJsonResponse, parseSize, paths, promiseAllObject, publicPath, publicUrl, registerAppConfig, registerHttpPlugins, renderReact, renderReactMail, requestContext, resetMailConfig, resolveMailConfig, rootPath, router, runPipeline, sanitizePath, seeder, sendMail, setBaseUrl, setEnvironment, setLogConfigurations, setMailConfigurations, setMailMode, setupTest, sleep, sluggable, srcPath, startHttpServer, startHttpTestServer, stopHttpApplication, stopHttpTestServer, storage, storageConfig, storageConfigurations, storageDriverContext, storagePath, t, tempPath, testDelete, testGet, testPatch, testPost, testPut, testRequest, toJson, uniqueExceptCurrentIdRule, uniqueExceptCurrentUserRule, uploadedFileMetadataSchema, uploadsConfig, uploadsPath, uploadsUrl, url, useCase, useComputedModel, useComputedSlug, useCurrentUser, useHashedPassword, useRequest, useRequestStore, verifyMailer, verifyPassword, warlockConfigManager, warlockPath, wasMailSentTo, wasMailSentWithSubject, wrapResponseInDataKey };
149
+ export { $registerUseCase, $unregisterUseCase, AccessConnector, Application, BadRequestError, BadSchemaUseCaseError, BaseConnector, BaseHealthChecker, BenchmarkProfiler, BenchmarkSnapshots, CLICommand, CacheConnector, CascadeAdapter, CascadeQueryBuilder, CloudDriver, ConfigSpecialHandlers, ConflictError, ConnectorLifecyclePhase, ConnectorPriority, ConnectorsManager, ConsoleChannel, DOSpacesDriver, DatabaseCacheDriver, DatabaseConnector, DatabaseLog, DatabaseLogModel, EslintHealthChecker, FileValidator, FilesOrchestrator, ForbiddenError, HeraldConnector, HttpConnector, HttpError, HttpErrorCodes, Image, LocalDriver, LoggerConnector, MAIL_EVENTS, Mail, MailError, MailerConnector, MimeTypes, NoopChannel, NotAcceptableError, NotAllowedError, NotificationsConnector, Queue, R2Driver, RegisterResource, RepositoryManager, Request, RequestController, RequestLog, Resource, ResourceFieldBuilder, ResourceNotFoundError, Response, ResponseStatus, Restful, Router, S3Driver, ScopedStorage, ServerError, SocketConnector, Storage, StorageConnector, StorageFile, TypescriptHealthChecker, UPLOADS_DEFAULTS, UnAuthorizedError, UploadedFile, WarlockConfigManager, addUseCaseHistory, anyMatch, app, appLog, appPath, assertMailCount, assertMailSent, assetsUrl, bootstrap, broadcastUseCaseResult, buildIdempotencyCacheKey, cachePath, captureMail, clearTestMailbox, closeAllMailers, closeMailer, colors, command, config, configPath, configSpecialHandlers, connectorsManager, container, createHttpApplication, createRequestStore, decrypt, defaultHttpConfigurations, defineConfig, defineResource, displayEnvironmentMode, encrypt, env, environment, existsExceptCurrentIdRule, existsExceptCurrentUserRule, expectJson, fileExtensionRule, fileRule, fileTypeRule, filesOrchestrator, findMailsBySubject, findMailsTo, fireLifecycleEvent, fromRequest, generateMailId, getDefaultMailConfig, getHttpServer, getLastMail, getLocalized, getMailEventName, getMailMode, getMailboxSize, getMailer, getMailerConfig, getMimeType, getPoolStats, getSocketServer, getTestMailbox, getTestServerUrl, getUseCase, getUseCaseHistory, getUseCases, globalEventsCallbacksMap, globalUseCasesEvents, hashBody, hashPassword, hmacHash, httpConfig, imageRule, increaseUseCaseFailedCalls, increaseUseCaseSuccessCalls, ipMatches, isDevelopmentMode, isProductionMode, isTestMode, isTestServerRunning, isUnknownTsExtensionError, isValidIdempotencyKey, loadS3, logResponse, logsPath, lowerStage3Decorators, mailEvents, measure, middleware, onCleanup, parseJsonResponse, parseSize, paths, promiseAllObject, publicPath, publicUrl, registerAppConfig, registerHttpPlugins, renderReact, renderReactMail, requestContext, resetMailConfig, resolveMailConfig, rootPath, router, runPipeline, sanitizePath, seeder, sendMail, setBaseUrl, setEnvironment, setLogConfigurations, setMailConfigurations, setMailMode, setupTest, sleep, sluggable, srcPath, startHttpServer, startHttpTestServer, stopHttpApplication, stopHttpTestServer, storage, storageConfig, storageConfigurations, storageDriverContext, storagePath, t, tempPath, testDelete, testGet, testPatch, testPost, testPut, testRequest, toJson, uniqueExceptCurrentIdRule, uniqueExceptCurrentUserRule, uploadedFileMetadataSchema, uploadsConfig, uploadsPath, uploadsUrl, url, useCase, useComputedModel, useComputedSlug, useCurrentUser, useHashedPassword, useRequest, useRequestStore, verifyMailer, verifyPassword, warlockConfigManager, warlockPath, wasMailSentTo, wasMailSentWithSubject, wrapResponseInDataKey };
@@ -1,6 +1,6 @@
1
1
  import { LogConfigurations } from "./types.mjs";
2
2
 
3
- //#region ../../@warlock.js/core/src/logger/logger.d.ts
3
+ //#region ../@warlock.js/core/src/logger/logger.d.ts
4
4
  declare function setLogConfigurations(options: LogConfigurations): void;
5
5
  //#endregion
6
6
  export { setLogConfigurations };
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.mts","names":[],"sources":["../../../../../../@warlock.js/core/src/logger/logger.ts"],"mappings":";;;iBAKgB,oBAAA,CAAqB,OAA0B,EAAjB,iBAAiB"}
1
+ {"version":3,"file":"logger.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/logger/logger.ts"],"mappings":";;;iBAKgB,oBAAA,CAAqB,OAA0B,EAAjB,iBAAiB"}
@@ -2,7 +2,7 @@ import { environment } from "../utils/environment.mjs";
2
2
  import "../utils/index.mjs";
3
3
  import { log } from "@warlock.js/logger";
4
4
 
5
- //#region ../../@warlock.js/core/src/logger/logger.ts
5
+ //#region ../@warlock.js/core/src/logger/logger.ts
6
6
  function setLogConfigurations(options) {
7
7
  const channels = [];
8
8
  const envChannels = options[environment()]?.channels;
@@ -1 +1 @@
1
- {"version":3,"file":"logger.mjs","names":[],"sources":["../../../../../../@warlock.js/core/src/logger/logger.ts"],"sourcesContent":["import type { LogChannel } from \"@warlock.js/logger\";\r\nimport { log } 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 log.configure({\r\n channels,\r\n });\r\n}\r\n"],"mappings":";;;;;AAKA,SAAgB,qBAAqB,SAA4B;CAE/D,MAAM,WAAyB,CAAC;CAIhC,MAAM,cAAc,QAFR,YAEkB,IAAoC;CAClE,MAAM,kBAAkB,QAAQ;CAEhC,IAAI,iBACF,SAAS,KAAK,GAAG,eAAe;CAGlC,IAAI,aACF,SAAS,KAAK,GAAG,WAAW;CAG9B,IAAI,UAAU,EACZ,SACF,CAAC;AACH"}
1
+ {"version":3,"file":"logger.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/logger/logger.ts"],"sourcesContent":["import type { LogChannel } from \"@warlock.js/logger\";\r\nimport { log } 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 log.configure({\r\n channels,\r\n });\r\n}\r\n"],"mappings":";;;;;AAKA,SAAgB,qBAAqB,SAA4B;CAE/D,MAAM,WAAyB,CAAC;CAIhC,MAAM,cAAc,QAFR,YAEkB,EAAkC,EAAE;CAClE,MAAM,kBAAkB,QAAQ;CAEhC,IAAI,iBACF,SAAS,KAAK,GAAG,eAAe;CAGlC,IAAI,aACF,SAAS,KAAK,GAAG,WAAW;CAG9B,IAAI,UAAU,EACZ,SACF,CAAC;AACH"}
@@ -1,6 +1,6 @@
1
1
  import { LogChannel } from "@warlock.js/logger";
2
2
 
3
- //#region ../../@warlock.js/core/src/logger/types.d.ts
3
+ //#region ../@warlock.js/core/src/logger/types.d.ts
4
4
  type EnvironmentConfigurations = {
5
5
  /**
6
6
  * List of logging channels
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../@warlock.js/core/src/logger/types.ts"],"mappings":";;;KAEK,yBAAA;;AAFgD;;EAMnD,QAAA,EAAU,UAAU;EAAA;;;;;EAMpB,OAAA;AAAA;AAAA,KAEU,iBAAA;;;;;EAKV,QAAA,GAAW,UAAA;EAiB2B;;;EAbtC,OAAA;EAAA;;;;EAKA,WAAA,GAAc,yBAAA;EAQd;;;EAJA,IAAA,GAAO,yBAAA;;;;EAIP,UAAA,GAAa,yBAAA;AAAA"}
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/logger/types.ts"],"mappings":";;;KAEK,yBAAA;;AAFgD;;EAMnD,QAAA,EAAU,UAAU;EAAA;;;;;EAMpB,OAAA;AAAA;AAAA,KAEU,iBAAA;;;;;EAKV,QAAA,GAAW,UAAA;EAiB2B;;;EAbtC,OAAA;EAAA;;;;EAKA,WAAA,GAAc,yBAAA;EAQd;;;EAJA,IAAA,GAAO,yBAAA;;;;EAIP,UAAA,GAAa,yBAAA;AAAA"}
@@ -1,6 +1,6 @@
1
1
  import { MailConfigurations, MailMode, MailersConfig } from "./types.mjs";
2
2
 
3
- //#region ../../@warlock.js/core/src/mail/config.d.ts
3
+ //#region ../@warlock.js/core/src/mail/config.d.ts
4
4
  /**
5
5
  * Set the mail mode
6
6
  *
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.mts","names":[],"sources":["../../../../../../@warlock.js/core/src/mail/config.ts"],"mappings":";;;;;AAuCA;;;;AAA0C;AAO1C;;;;AAAuC;AAOvC;;;;AAAgC;AAOhC;iBArBgB,WAAA,CAAY,IAAc,EAAR,QAAQ;;;AAqBT;iBAdjB,WAAA,CAAA,GAAe,QAAQ;;;;iBAOvB,gBAAA,CAAA;AA2ChB;;;AAAA,iBApCgB,iBAAA,CAAA;;;;iBAOA,UAAA,CAAA;AA6BgE;AAYhF;;;;AAA0D;AAc1D;;;;AAAiE;AAsBjE;;;;;;;;;;AAGsB;AA2BtB;;;AA9EgF,iBAAhE,qBAAA,CAAsB,MAAA,EAAQ,kBAAA,GAAqB,aAAa;AAAA,iBAYhE,oBAAA,CAAA,GAAwB,kBAAkB;;;;iBAc1C,eAAA,CAAgB,IAAA,WAAe,kBAAkB;;;;;iBAsBjD,iBAAA,CAAkB,OAAA;EAChC,MAAA,GAAS,kBAAA;EACT,MAAA;AAAA,IACE,kBAAkB;;;;iBA2BN,eAAA,CAAA"}
1
+ {"version":3,"file":"config.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/mail/config.ts"],"mappings":";;;;;AAuCA;;;;AAA0C;AAO1C;;;;AAAuC;AAOvC;;;;AAAgC;AAOhC;iBArBgB,WAAA,CAAY,IAAc,EAAR,QAAQ;;;AAqBT;iBAdjB,WAAA,IAAe,QAAQ;;;;iBAOvB,gBAAA;AA2ChB;;;AAAA,iBApCgB,iBAAA;;;;iBAOA,UAAA;AA6BgE;AAYhF;;;;AAA0D;AAc1D;;;;AAAiE;AAsBjE;;;;;;;;;;AAGsB;AA2BtB;;;AA9EgF,iBAAhE,qBAAA,CAAsB,MAAA,EAAQ,kBAAA,GAAqB,aAAa;AAAA,iBAYhE,oBAAA,IAAwB,kBAAkB;;;;iBAc1C,eAAA,CAAgB,IAAA,WAAe,kBAAkB;;;;;iBAsBjD,iBAAA,CAAkB,OAAA;EAChC,MAAA,GAAS,kBAAA;EACT,MAAA;AAAA,IACE,kBAAkB;;;;iBA2BN,eAAA"}
@@ -1,4 +1,4 @@
1
- //#region ../../@warlock.js/core/src/mail/config.ts
1
+ //#region ../@warlock.js/core/src/mail/config.ts
2
2
  /**
3
3
  * Default mail configurations
4
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"config.mjs","names":[],"sources":["../../../../../../@warlock.js/core/src/mail/config.ts"],"sourcesContent":["import type { MailConfigurations, MailersConfig, MailMode, SMTPConfigurations } from \"./types\";\n\n/**\n * Default mail configurations\n */\nconst defaultConfigurations: Partial<SMTPConfigurations> = {\n secure: true,\n tls: true,\n driver: \"smtp\",\n};\n\n/**\n * Current mail mode\n */\nlet currentMode: MailMode = \"production\";\n\n/**\n * Registered mailers configuration\n */\nlet mailersConfig: MailersConfig = {};\n\n/**\n * Set the mail mode\n *\n * @param mode \"production\" | \"development\" | \"test\"\n *\n * - **production**: Actually sends emails via SMTP\n * - **development**: Logs emails to console without sending\n * - **test**: Captures emails to test mailbox for assertions\n *\n * @example\n * ```typescript\n * // In test setup\n * setMailMode(\"test\");\n *\n * // In development\n * setMailMode(\"development\");\n * ```\n */\nexport function setMailMode(mode: MailMode): void {\n currentMode = mode;\n}\n\n/**\n * Get the current mail mode\n */\nexport function getMailMode(): MailMode {\n return currentMode;\n}\n\n/**\n * Check if in production mode\n */\nexport function isProductionMode(): boolean {\n return currentMode === \"production\";\n}\n\n/**\n * Check if in development mode\n */\nexport function isDevelopmentMode(): boolean {\n return currentMode === \"development\";\n}\n\n/**\n * Check if in test mode\n */\nexport function isTestMode(): boolean {\n return currentMode === \"test\";\n}\n\n/**\n * Set mail configurations\n *\n * Supports both simple config and named mailers.\n *\n * @example\n * ```typescript\n * // Simple config (sets as default)\n * setMailConfigurations({\n * host: \"smtp.gmail.com\",\n * port: 587,\n * username: \"...\",\n * password: \"...\",\n * });\n *\n * // Named mailers\n * setMailConfigurations({\n * default: { host: \"smtp.sendgrid.net\", ... },\n * mailers: {\n * marketing: { host: \"smtp.mailchimp.com\", ... },\n * transactional: { host: \"smtp.postmark.com\", ... },\n * },\n * });\n * ```\n */\nexport function setMailConfigurations(config: MailConfigurations | MailersConfig): void {\n // Check if it's a MailersConfig (has 'default' or 'mailers' key)\n if (\"default\" in config || \"mailers\" in config) {\n mailersConfig = config as MailersConfig;\n } else {\n // Simple config - set as default\n mailersConfig = {\n default: config as MailConfigurations,\n };\n }\n}\n\nexport function getDefaultMailConfig(): MailConfigurations {\n const config = mailersConfig.default;\n if (!config) return {} as MailConfigurations;\n if (\"driver\" in config && config.driver === \"ses\") return config;\n\n return {\n ...defaultConfigurations,\n ...config,\n } as SMTPConfigurations;\n}\n\n/**\n * Get a named mailer configuration\n */\nexport function getMailerConfig(name: string): MailConfigurations | undefined {\n if (name === \"default\") {\n return getDefaultMailConfig();\n }\n\n const config = mailersConfig.mailers?.[name];\n if (!config) {\n return undefined;\n }\n\n if (\"driver\" in config && config.driver === \"ses\") return config;\n\n return {\n ...defaultConfigurations,\n ...config,\n } as SMTPConfigurations;\n}\n\n/**\n * Resolve configuration from options\n * Priority: config > mailer > default\n */\nexport function resolveMailConfig(options: {\n config?: MailConfigurations;\n mailer?: string;\n}): MailConfigurations {\n if (options.config) {\n // SES config passes through as-is, no defaultConfigurations merge\n if (\"driver\" in options.config && options.config.driver === \"ses\") {\n return options.config;\n }\n\n return {\n ...defaultConfigurations,\n ...options.config,\n } as SMTPConfigurations;\n }\n\n if (options.mailer) {\n const config = getMailerConfig(options.mailer);\n if (!config) {\n throw new Error(`Mailer \"${options.mailer}\" not found in configuration`);\n }\n return config;\n }\n\n return getDefaultMailConfig();\n}\n\n/**\n * Reset all configurations (useful for testing)\n */\nexport function resetMailConfig(): void {\n currentMode = \"production\";\n mailersConfig = {};\n}\n"],"mappings":";;;;AAKA,MAAM,wBAAqD;CACzD,QAAQ;CACR,KAAK;CACL,QAAQ;AACV;;;;AAKA,IAAI,cAAwB;;;;AAK5B,IAAI,gBAA+B,CAAC;;;;;;;;;;;;;;;;;;;AAoBpC,SAAgB,YAAY,MAAsB;CAChD,cAAc;AAChB;;;;AAKA,SAAgB,cAAwB;CACtC,OAAO;AACT;;;;AAKA,SAAgB,mBAA4B;CAC1C,OAAO,gBAAgB;AACzB;;;;AAKA,SAAgB,oBAA6B;CAC3C,OAAO,gBAAgB;AACzB;;;;AAKA,SAAgB,aAAsB;CACpC,OAAO,gBAAgB;AACzB;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,SAAgB,sBAAsB,QAAkD;CAEtF,IAAI,aAAa,UAAU,aAAa,QACtC,gBAAgB;MAGhB,gBAAgB,EACd,SAAS,OACX;AAEJ;AAEA,SAAgB,uBAA2C;CACzD,MAAM,SAAS,cAAc;CAC7B,IAAI,CAAC,QAAQ,OAAO,CAAC;CACrB,IAAI,YAAY,UAAU,OAAO,WAAW,OAAO,OAAO;CAE1D,OAAO;EACL,GAAG;EACH,GAAG;CACL;AACF;;;;AAKA,SAAgB,gBAAgB,MAA8C;CAC5E,IAAI,SAAS,WACX,OAAO,qBAAqB;CAG9B,MAAM,SAAS,cAAc,UAAU;CACvC,IAAI,CAAC,QACH;CAGF,IAAI,YAAY,UAAU,OAAO,WAAW,OAAO,OAAO;CAE1D,OAAO;EACL,GAAG;EACH,GAAG;CACL;AACF;;;;;AAMA,SAAgB,kBAAkB,SAGX;CACrB,IAAI,QAAQ,QAAQ;EAElB,IAAI,YAAY,QAAQ,UAAU,QAAQ,OAAO,WAAW,OAC1D,OAAO,QAAQ;EAGjB,OAAO;GACL,GAAG;GACH,GAAG,QAAQ;EACb;CACF;CAEA,IAAI,QAAQ,QAAQ;EAClB,MAAM,SAAS,gBAAgB,QAAQ,MAAM;EAC7C,IAAI,CAAC,QACH,MAAM,IAAI,MAAM,WAAW,QAAQ,OAAO,6BAA6B;EAEzE,OAAO;CACT;CAEA,OAAO,qBAAqB;AAC9B;;;;AAKA,SAAgB,kBAAwB;CACtC,cAAc;CACd,gBAAgB,CAAC;AACnB"}
1
+ {"version":3,"file":"config.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/mail/config.ts"],"sourcesContent":["import type { MailConfigurations, MailersConfig, MailMode, SMTPConfigurations } from \"./types\";\n\n/**\n * Default mail configurations\n */\nconst defaultConfigurations: Partial<SMTPConfigurations> = {\n secure: true,\n tls: true,\n driver: \"smtp\",\n};\n\n/**\n * Current mail mode\n */\nlet currentMode: MailMode = \"production\";\n\n/**\n * Registered mailers configuration\n */\nlet mailersConfig: MailersConfig = {};\n\n/**\n * Set the mail mode\n *\n * @param mode \"production\" | \"development\" | \"test\"\n *\n * - **production**: Actually sends emails via SMTP\n * - **development**: Logs emails to console without sending\n * - **test**: Captures emails to test mailbox for assertions\n *\n * @example\n * ```typescript\n * // In test setup\n * setMailMode(\"test\");\n *\n * // In development\n * setMailMode(\"development\");\n * ```\n */\nexport function setMailMode(mode: MailMode): void {\n currentMode = mode;\n}\n\n/**\n * Get the current mail mode\n */\nexport function getMailMode(): MailMode {\n return currentMode;\n}\n\n/**\n * Check if in production mode\n */\nexport function isProductionMode(): boolean {\n return currentMode === \"production\";\n}\n\n/**\n * Check if in development mode\n */\nexport function isDevelopmentMode(): boolean {\n return currentMode === \"development\";\n}\n\n/**\n * Check if in test mode\n */\nexport function isTestMode(): boolean {\n return currentMode === \"test\";\n}\n\n/**\n * Set mail configurations\n *\n * Supports both simple config and named mailers.\n *\n * @example\n * ```typescript\n * // Simple config (sets as default)\n * setMailConfigurations({\n * host: \"smtp.gmail.com\",\n * port: 587,\n * username: \"...\",\n * password: \"...\",\n * });\n *\n * // Named mailers\n * setMailConfigurations({\n * default: { host: \"smtp.sendgrid.net\", ... },\n * mailers: {\n * marketing: { host: \"smtp.mailchimp.com\", ... },\n * transactional: { host: \"smtp.postmark.com\", ... },\n * },\n * });\n * ```\n */\nexport function setMailConfigurations(config: MailConfigurations | MailersConfig): void {\n // Check if it's a MailersConfig (has 'default' or 'mailers' key)\n if (\"default\" in config || \"mailers\" in config) {\n mailersConfig = config as MailersConfig;\n } else {\n // Simple config - set as default\n mailersConfig = {\n default: config as MailConfigurations,\n };\n }\n}\n\nexport function getDefaultMailConfig(): MailConfigurations {\n const config = mailersConfig.default;\n if (!config) return {} as MailConfigurations;\n if (\"driver\" in config && config.driver === \"ses\") return config;\n\n return {\n ...defaultConfigurations,\n ...config,\n } as SMTPConfigurations;\n}\n\n/**\n * Get a named mailer configuration\n */\nexport function getMailerConfig(name: string): MailConfigurations | undefined {\n if (name === \"default\") {\n return getDefaultMailConfig();\n }\n\n const config = mailersConfig.mailers?.[name];\n if (!config) {\n return undefined;\n }\n\n if (\"driver\" in config && config.driver === \"ses\") return config;\n\n return {\n ...defaultConfigurations,\n ...config,\n } as SMTPConfigurations;\n}\n\n/**\n * Resolve configuration from options\n * Priority: config > mailer > default\n */\nexport function resolveMailConfig(options: {\n config?: MailConfigurations;\n mailer?: string;\n}): MailConfigurations {\n if (options.config) {\n // SES config passes through as-is, no defaultConfigurations merge\n if (\"driver\" in options.config && options.config.driver === \"ses\") {\n return options.config;\n }\n\n return {\n ...defaultConfigurations,\n ...options.config,\n } as SMTPConfigurations;\n }\n\n if (options.mailer) {\n const config = getMailerConfig(options.mailer);\n if (!config) {\n throw new Error(`Mailer \"${options.mailer}\" not found in configuration`);\n }\n return config;\n }\n\n return getDefaultMailConfig();\n}\n\n/**\n * Reset all configurations (useful for testing)\n */\nexport function resetMailConfig(): void {\n currentMode = \"production\";\n mailersConfig = {};\n}\n"],"mappings":";;;;AAKA,MAAM,wBAAqD;CACzD,QAAQ;CACR,KAAK;CACL,QAAQ;AACV;;;;AAKA,IAAI,cAAwB;;;;AAK5B,IAAI,gBAA+B,CAAC;;;;;;;;;;;;;;;;;;;AAoBpC,SAAgB,YAAY,MAAsB;CAChD,cAAc;AAChB;;;;AAKA,SAAgB,cAAwB;CACtC,OAAO;AACT;;;;AAKA,SAAgB,mBAA4B;CAC1C,OAAO,gBAAgB;AACzB;;;;AAKA,SAAgB,oBAA6B;CAC3C,OAAO,gBAAgB;AACzB;;;;AAKA,SAAgB,aAAsB;CACpC,OAAO,gBAAgB;AACzB;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,SAAgB,sBAAsB,QAAkD;CAEtF,IAAI,aAAa,UAAU,aAAa,QACtC,gBAAgB;MAGhB,gBAAgB,EACd,SAAS,OACX;AAEJ;AAEA,SAAgB,uBAA2C;CACzD,MAAM,SAAS,cAAc;CAC7B,IAAI,CAAC,QAAQ,OAAO,CAAC;CACrB,IAAI,YAAY,UAAU,OAAO,WAAW,OAAO,OAAO;CAE1D,OAAO;EACL,GAAG;EACH,GAAG;CACL;AACF;;;;AAKA,SAAgB,gBAAgB,MAA8C;CAC5E,IAAI,SAAS,WACX,OAAO,qBAAqB;CAG9B,MAAM,SAAS,cAAc,UAAU;CACvC,IAAI,CAAC,QACH;CAGF,IAAI,YAAY,UAAU,OAAO,WAAW,OAAO,OAAO;CAE1D,OAAO;EACL,GAAG;EACH,GAAG;CACL;AACF;;;;;AAMA,SAAgB,kBAAkB,SAGX;CACrB,IAAI,QAAQ,QAAQ;EAElB,IAAI,YAAY,QAAQ,UAAU,QAAQ,OAAO,WAAW,OAC1D,OAAO,QAAQ;EAGjB,OAAO;GACL,GAAG;GACH,GAAG,QAAQ;EACb;CACF;CAEA,IAAI,QAAQ,QAAQ;EAClB,MAAM,SAAS,gBAAgB,QAAQ,MAAM;EAC7C,IAAI,CAAC,QACH,MAAM,IAAI,MAAM,WAAW,QAAQ,OAAO,6BAA6B;EAEzE,OAAO;CACT;CAEA,OAAO,qBAAqB;AAC9B;;;;AAKA,SAAgB,kBAAwB;CACtC,cAAc;CACd,gBAAgB,CAAC;AACnB"}
@@ -1,4 +1,4 @@
1
- //#region ../../@warlock.js/core/src/mail/events.d.ts
1
+ //#region ../@warlock.js/core/src/mail/events.d.ts
2
2
  /**
3
3
  * Generate a unique mail ID for event namespacing
4
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.mts","names":[],"sources":["../../../../../../@warlock.js/core/src/mail/events.ts"],"mappings":";;AAMA;;iBAAgB,cAAA,CAAA;;AAAc;AAO9B;cAAa,WAAA;EAAA;;;;;;;;AAab;;;iBAAgB,gBAAA,CACd,MAAA,UACA,KAAqD;AAAA;AAkCvD;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAlCuD,cAkC1C,UAAA;EAsB6B;;;oCAlBN,WAAA,KAAW,IAAA;EA2BK;;;mCAnBlC,KAAA,qDACuC,IAAA;;;;+BAS1B,WAAA,EAAW,QAAA,MAAgB,IAAA,8CAAoB,iBAAA;EAgBV;;;+BAPrC,IAAA,iBAAqB,OAAA,iBAAwB,OAAA,qCAAc,iBAAA;EAcjE;;;sBAPH,IAAA,OAAW,MAAA,OAAa,KAAA,iBAAsB,OAAA,oCAAa,iBAAA;EAOT;;;yBAA/C,IAAA,OAAW,MAAA,iBAAuB,OAAA,oCAAa,iBAAA;EAOhB;;;uBAAjC,IAAA,OAAW,KAAA,iBAAsB,OAAA,oCAAa,iBAAA;;;;wCAUnD,QAAA,GACH,IAAA,iBAAqB,OAAA,iBAAwB,OAAA,qCAAc,iBAAA;EADxD;;;+BAUA,QAAA,GACH,IAAA,OAAW,MAAA,OAAa,KAAA,iBAAsB,OAAA,oCAAa,iBAAA;EAA3D;;;kCAQiB,QAAA,GAAa,IAAA,OAAW,MAAA,iBAAuB,OAAA,oCAAa,iBAAA;EAT1E;;;gCAgBY,QAAA,GAAa,IAAA,OAAW,KAAA,iBAAsB,OAAA,oCAAa,iBAAA;AAAA"}
1
+ {"version":3,"file":"events.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/mail/events.ts"],"mappings":";;AAMA;;iBAAgB,cAAA;;AAAc;AAO9B;cAAa,WAAA;EAAA;;;;;;;;AAab;;;iBAAgB,gBAAA,CACd,MAAA,UACA,KAAqD;AAAA;AAkCvD;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAlCuD,cAkC1C,UAAA;EAsB6B;;;oCAlBN,WAAA,KAAW,IAAA;EA2BK;;;mCAnBlC,KAAA,qDACuC,IAAA;;;;+BAS1B,WAAA,EAAW,QAAA,MAAgB,IAAA,8CAAoB,iBAAA;EAgBV;;;+BAPrC,IAAA,iBAAqB,OAAA,iBAAwB,OAAA,qCAAc,iBAAA;EAcjE;;;sBAPH,IAAA,OAAW,MAAA,OAAa,KAAA,iBAAsB,OAAA,oCAAa,iBAAA;EAOT;;;yBAA/C,IAAA,OAAW,MAAA,iBAAuB,OAAA,oCAAa,iBAAA;EAOhB;;;uBAAjC,IAAA,OAAW,KAAA,iBAAsB,OAAA,oCAAa,iBAAA;;;;wCAUnD,QAAA,GACH,IAAA,iBAAqB,OAAA,iBAAwB,OAAA,qCAAc,iBAAA;EADxD;;;+BAUA,QAAA,GACH,IAAA,OAAW,MAAA,OAAa,KAAA,iBAAsB,OAAA,oCAAa,iBAAA;EAA3D;;;kCAQiB,QAAA,GAAa,IAAA,OAAW,MAAA,iBAAuB,OAAA,oCAAa,iBAAA;EAT1E;;;gCAgBY,QAAA,GAAa,IAAA,OAAW,KAAA,iBAAsB,OAAA,oCAAa,iBAAA;AAAA"}
@@ -1,7 +1,7 @@
1
1
  import { Random } from "@mongez/reinforcements";
2
2
  import events from "@mongez/events";
3
3
 
4
- //#region ../../@warlock.js/core/src/mail/events.ts
4
+ //#region ../@warlock.js/core/src/mail/events.ts
5
5
  /**
6
6
  * Generate a unique mail ID for event namespacing
7
7
  */
@@ -1 +1 @@
1
- {"version":3,"file":"events.mjs","names":[],"sources":["../../../../../../@warlock.js/core/src/mail/events.ts"],"sourcesContent":["import events from \"@mongez/events\";\nimport { Random } from \"@mongez/reinforcements\";\n\n/**\n * Generate a unique mail ID for event namespacing\n */\nexport function generateMailId(): string {\n return \"M\" + Random.int(32);\n}\n\n/**\n * Mail event names (global events)\n */\nexport const MAIL_EVENTS = {\n BEFORE_SENDING: \"mail.beforeSending\",\n SENT: \"mail.sent\",\n SUCCESS: \"mail.success\",\n ERROR: \"mail.error\",\n} as const;\n\n/**\n * Get namespaced event name for a specific mail\n * @param mailId Unique mail identifier\n * @param event Event type\n * @returns Namespaced event name (e.g., \"mail.abc123.success\")\n */\nexport function getMailEventName(\n mailId: string,\n event: \"beforeSending\" | \"sent\" | \"success\" | \"error\",\n): string {\n return `mail.${mailId}.${event}`;\n}\n\n/**\n * Mail events wrapper\n *\n * Supports two event patterns:\n * 1. Global events: `mail.success` - fires for ALL emails\n * 2. Specific events: `mail.$mailId.success` - fires for ONE email\n *\n * ## Usage\n *\n * ```typescript\n * // Global listener - all emails\n * mailEvents.onSuccess((mail, result) => {\n * console.log(\"Any mail sent:\", result.messageId);\n * });\n *\n * // Specific listener - one email by ID\n * const mailId = generateMailId();\n * mailEvents.onMailSuccess(mailId, (mail, result) => {\n * console.log(\"This specific mail sent:\", result.messageId);\n * });\n *\n * await sendMail({\n * id: mailId, // Use the same ID\n * to: \"user@example.com\",\n * subject: \"Hello\",\n * html: \"<p>World</p>\",\n * });\n * ```\n */\nexport const mailEvents = {\n /**\n * Trigger a global mail event\n */\n trigger: (eventName: keyof typeof MAIL_EVENTS, ...args: any[]) => {\n return events.trigger(MAIL_EVENTS[eventName], ...args);\n },\n\n /**\n * Trigger a specific mail event (by mail ID)\n */\n triggerForMail: (\n mailId: string,\n event: \"beforeSending\" | \"sent\" | \"success\" | \"error\",\n ...args: any[]\n ) => {\n return events.trigger(getMailEventName(mailId, event), ...args);\n },\n\n /**\n * Subscribe to global mail events\n */\n on: (eventName: keyof typeof MAIL_EVENTS, callback: (...args: any[]) => void) => {\n return events.subscribe(MAIL_EVENTS[eventName], callback);\n },\n\n // === GLOBAL EVENT HELPERS ===\n\n /**\n * Subscribe to beforeSending event (all mails)\n */\n onBeforeSending: (callback: (mail: any) => void | Promise<void> | false | Promise<false>) => {\n return events.subscribe(MAIL_EVENTS.BEFORE_SENDING, callback);\n },\n\n /**\n * Subscribe to sent event (all mails, after attempt)\n */\n onSent: (callback: (mail: any, result: any, error: any) => void | Promise<void>) => {\n return events.subscribe(MAIL_EVENTS.SENT, callback);\n },\n\n /**\n * Subscribe to success event (all mails)\n */\n onSuccess: (callback: (mail: any, result: any) => void | Promise<void>) => {\n return events.subscribe(MAIL_EVENTS.SUCCESS, callback);\n },\n\n /**\n * Subscribe to error event (all mails)\n */\n onError: (callback: (mail: any, error: any) => void | Promise<void>) => {\n return events.subscribe(MAIL_EVENTS.ERROR, callback);\n },\n\n // === SPECIFIC MAIL EVENT HELPERS ===\n\n /**\n * Subscribe to beforeSending event for a specific mail\n */\n onMailBeforeSending: (\n mailId: string,\n callback: (mail: any) => void | Promise<void> | false | Promise<false>,\n ) => {\n return events.subscribe(getMailEventName(mailId, \"beforeSending\"), callback);\n },\n\n /**\n * Subscribe to sent event for a specific mail\n */\n onMailSent: (\n mailId: string,\n callback: (mail: any, result: any, error: any) => void | Promise<void>,\n ) => {\n return events.subscribe(getMailEventName(mailId, \"sent\"), callback);\n },\n\n /**\n * Subscribe to success event for a specific mail\n */\n onMailSuccess: (mailId: string, callback: (mail: any, result: any) => void | Promise<void>) => {\n return events.subscribe(getMailEventName(mailId, \"success\"), callback);\n },\n\n /**\n * Subscribe to error event for a specific mail\n */\n onMailError: (mailId: string, callback: (mail: any, error: any) => void | Promise<void>) => {\n return events.subscribe(getMailEventName(mailId, \"error\"), callback);\n },\n};\n"],"mappings":";;;;;;;AAMA,SAAgB,iBAAyB;CACvC,OAAO,MAAM,OAAO,IAAI,EAAE;AAC5B;;;;AAKA,MAAa,cAAc;CACzB,gBAAgB;CAChB,MAAM;CACN,SAAS;CACT,OAAO;AACT;;;;;;;AAQA,SAAgB,iBACd,QACA,OACQ;CACR,OAAO,QAAQ,OAAO,GAAG;AAC3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,MAAa,aAAa;;;;CAIxB,UAAU,WAAqC,GAAG,SAAgB;EAChE,OAAO,OAAO,QAAQ,YAAY,YAAY,GAAG,IAAI;CACvD;;;;CAKA,iBACE,QACA,OACA,GAAG,SACA;EACH,OAAO,OAAO,QAAQ,iBAAiB,QAAQ,KAAK,GAAG,GAAG,IAAI;CAChE;;;;CAKA,KAAK,WAAqC,aAAuC;EAC/E,OAAO,OAAO,UAAU,YAAY,YAAY,QAAQ;CAC1D;;;;CAOA,kBAAkB,aAA2E;EAC3F,OAAO,OAAO,UAAU,YAAY,gBAAgB,QAAQ;CAC9D;;;;CAKA,SAAS,aAA2E;EAClF,OAAO,OAAO,UAAU,YAAY,MAAM,QAAQ;CACpD;;;;CAKA,YAAY,aAA+D;EACzE,OAAO,OAAO,UAAU,YAAY,SAAS,QAAQ;CACvD;;;;CAKA,UAAU,aAA8D;EACtE,OAAO,OAAO,UAAU,YAAY,OAAO,QAAQ;CACrD;;;;CAOA,sBACE,QACA,aACG;EACH,OAAO,OAAO,UAAU,iBAAiB,QAAQ,eAAe,GAAG,QAAQ;CAC7E;;;;CAKA,aACE,QACA,aACG;EACH,OAAO,OAAO,UAAU,iBAAiB,QAAQ,MAAM,GAAG,QAAQ;CACpE;;;;CAKA,gBAAgB,QAAgB,aAA+D;EAC7F,OAAO,OAAO,UAAU,iBAAiB,QAAQ,SAAS,GAAG,QAAQ;CACvE;;;;CAKA,cAAc,QAAgB,aAA8D;EAC1F,OAAO,OAAO,UAAU,iBAAiB,QAAQ,OAAO,GAAG,QAAQ;CACrE;AACF"}
1
+ {"version":3,"file":"events.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/mail/events.ts"],"sourcesContent":["import events from \"@mongez/events\";\nimport { Random } from \"@mongez/reinforcements\";\n\n/**\n * Generate a unique mail ID for event namespacing\n */\nexport function generateMailId(): string {\n return \"M\" + Random.int(32);\n}\n\n/**\n * Mail event names (global events)\n */\nexport const MAIL_EVENTS = {\n BEFORE_SENDING: \"mail.beforeSending\",\n SENT: \"mail.sent\",\n SUCCESS: \"mail.success\",\n ERROR: \"mail.error\",\n} as const;\n\n/**\n * Get namespaced event name for a specific mail\n * @param mailId Unique mail identifier\n * @param event Event type\n * @returns Namespaced event name (e.g., \"mail.abc123.success\")\n */\nexport function getMailEventName(\n mailId: string,\n event: \"beforeSending\" | \"sent\" | \"success\" | \"error\",\n): string {\n return `mail.${mailId}.${event}`;\n}\n\n/**\n * Mail events wrapper\n *\n * Supports two event patterns:\n * 1. Global events: `mail.success` - fires for ALL emails\n * 2. Specific events: `mail.$mailId.success` - fires for ONE email\n *\n * ## Usage\n *\n * ```typescript\n * // Global listener - all emails\n * mailEvents.onSuccess((mail, result) => {\n * console.log(\"Any mail sent:\", result.messageId);\n * });\n *\n * // Specific listener - one email by ID\n * const mailId = generateMailId();\n * mailEvents.onMailSuccess(mailId, (mail, result) => {\n * console.log(\"This specific mail sent:\", result.messageId);\n * });\n *\n * await sendMail({\n * id: mailId, // Use the same ID\n * to: \"user@example.com\",\n * subject: \"Hello\",\n * html: \"<p>World</p>\",\n * });\n * ```\n */\nexport const mailEvents = {\n /**\n * Trigger a global mail event\n */\n trigger: (eventName: keyof typeof MAIL_EVENTS, ...args: any[]) => {\n return events.trigger(MAIL_EVENTS[eventName], ...args);\n },\n\n /**\n * Trigger a specific mail event (by mail ID)\n */\n triggerForMail: (\n mailId: string,\n event: \"beforeSending\" | \"sent\" | \"success\" | \"error\",\n ...args: any[]\n ) => {\n return events.trigger(getMailEventName(mailId, event), ...args);\n },\n\n /**\n * Subscribe to global mail events\n */\n on: (eventName: keyof typeof MAIL_EVENTS, callback: (...args: any[]) => void) => {\n return events.subscribe(MAIL_EVENTS[eventName], callback);\n },\n\n // === GLOBAL EVENT HELPERS ===\n\n /**\n * Subscribe to beforeSending event (all mails)\n */\n onBeforeSending: (callback: (mail: any) => void | Promise<void> | false | Promise<false>) => {\n return events.subscribe(MAIL_EVENTS.BEFORE_SENDING, callback);\n },\n\n /**\n * Subscribe to sent event (all mails, after attempt)\n */\n onSent: (callback: (mail: any, result: any, error: any) => void | Promise<void>) => {\n return events.subscribe(MAIL_EVENTS.SENT, callback);\n },\n\n /**\n * Subscribe to success event (all mails)\n */\n onSuccess: (callback: (mail: any, result: any) => void | Promise<void>) => {\n return events.subscribe(MAIL_EVENTS.SUCCESS, callback);\n },\n\n /**\n * Subscribe to error event (all mails)\n */\n onError: (callback: (mail: any, error: any) => void | Promise<void>) => {\n return events.subscribe(MAIL_EVENTS.ERROR, callback);\n },\n\n // === SPECIFIC MAIL EVENT HELPERS ===\n\n /**\n * Subscribe to beforeSending event for a specific mail\n */\n onMailBeforeSending: (\n mailId: string,\n callback: (mail: any) => void | Promise<void> | false | Promise<false>,\n ) => {\n return events.subscribe(getMailEventName(mailId, \"beforeSending\"), callback);\n },\n\n /**\n * Subscribe to sent event for a specific mail\n */\n onMailSent: (\n mailId: string,\n callback: (mail: any, result: any, error: any) => void | Promise<void>,\n ) => {\n return events.subscribe(getMailEventName(mailId, \"sent\"), callback);\n },\n\n /**\n * Subscribe to success event for a specific mail\n */\n onMailSuccess: (mailId: string, callback: (mail: any, result: any) => void | Promise<void>) => {\n return events.subscribe(getMailEventName(mailId, \"success\"), callback);\n },\n\n /**\n * Subscribe to error event for a specific mail\n */\n onMailError: (mailId: string, callback: (mail: any, error: any) => void | Promise<void>) => {\n return events.subscribe(getMailEventName(mailId, \"error\"), callback);\n },\n};\n"],"mappings":";;;;;;;AAMA,SAAgB,iBAAyB;CACvC,OAAO,MAAM,OAAO,IAAI,EAAE;AAC5B;;;;AAKA,MAAa,cAAc;CACzB,gBAAgB;CAChB,MAAM;CACN,SAAS;CACT,OAAO;AACT;;;;;;;AAQA,SAAgB,iBACd,QACA,OACQ;CACR,OAAO,QAAQ,OAAO,GAAG;AAC3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,MAAa,aAAa;;;;CAIxB,UAAU,WAAqC,GAAG,SAAgB;EAChE,OAAO,OAAO,QAAQ,YAAY,YAAY,GAAG,IAAI;CACvD;;;;CAKA,iBACE,QACA,OACA,GAAG,SACA;EACH,OAAO,OAAO,QAAQ,iBAAiB,QAAQ,KAAK,GAAG,GAAG,IAAI;CAChE;;;;CAKA,KAAK,WAAqC,aAAuC;EAC/E,OAAO,OAAO,UAAU,YAAY,YAAY,QAAQ;CAC1D;;;;CAOA,kBAAkB,aAA2E;EAC3F,OAAO,OAAO,UAAU,YAAY,gBAAgB,QAAQ;CAC9D;;;;CAKA,SAAS,aAA2E;EAClF,OAAO,OAAO,UAAU,YAAY,MAAM,QAAQ;CACpD;;;;CAKA,YAAY,aAA+D;EACzE,OAAO,OAAO,UAAU,YAAY,SAAS,QAAQ;CACvD;;;;CAKA,UAAU,aAA8D;EACtE,OAAO,OAAO,UAAU,YAAY,OAAO,QAAQ;CACrD;;;;CAOA,sBACE,QACA,aACG;EACH,OAAO,OAAO,UAAU,iBAAiB,QAAQ,eAAe,GAAG,QAAQ;CAC7E;;;;CAKA,aACE,QACA,aACG;EACH,OAAO,OAAO,UAAU,iBAAiB,QAAQ,MAAM,GAAG,QAAQ;CACpE;;;;CAKA,gBAAgB,QAAgB,aAA+D;EAC7F,OAAO,OAAO,UAAU,iBAAiB,QAAQ,SAAS,GAAG,QAAQ;CACvE;;;;CAKA,cAAc,QAAgB,aAA8D;EAC1F,OAAO,OAAO,UAAU,iBAAiB,QAAQ,OAAO,GAAG,QAAQ;CACrE;AACF"}
@@ -1,7 +1,7 @@
1
1
  import { MailAddress, MailAttachment, MailConfigurations, MailEvents, MailOptions, MailPriority, MailResult } from "./types.mjs";
2
2
  import React from "react";
3
3
 
4
- //#region ../../@warlock.js/core/src/mail/mail.d.ts
4
+ //#region ../@warlock.js/core/src/mail/mail.d.ts
5
5
  /**
6
6
  * Fluent Mail Builder
7
7
  *
@@ -1 +1 @@
1
- {"version":3,"file":"mail.d.mts","names":[],"sources":["../../../../../../@warlock.js/core/src/mail/mail.ts"],"mappings":";;;;;;AAwCA;;;;;;;;;;;;;;;;;;;;;;;;;;cAAa,IAAA;EAAA,QACH,OAAA;EAUwC;;;EAAA,QALzC,WAAA,CAAA;EAe2C;;;EAAA,OAVpC,EAAA,CAAG,SAAA,sBAA+B,IAAA;EA8BzC;;;EAAA,OApBO,MAAA,CAAO,MAAA,EAAQ,kBAAA,GAAqB,IAAA;EAsC3C;;;EAAA,OA5BO,MAAA,CAAO,IAAA,WAAe,IAAA;EA8C7B;;;EApCA,EAAA,CAAG,SAAA;EA6CK;;;EApCR,EAAA,CAAG,SAAA;EAsDE;;;EA7CL,GAAA,CAAI,SAAA;EAsDM;;;EA7CV,OAAA,CAAQ,OAAA;EAsDyB;;;EA7CjC,IAAA,CAAK,OAAA,EAAS,WAAA;EA8DF;;;EArDZ,OAAA,CAAQ,OAAA;EA8EoC;;;EArE5C,IAAA,CAAK,OAAA;EAkGL;;;EAzFA,IAAA,CAAK,OAAA;EAkGE;;;EAzFP,SAAA,CAAU,OAAA,EAAS,KAAA,CAAM,YAAA;EA2GzB;;;EAlGA,MAAA,CAAO,OAAA,EAAS,MAAA,WAAiB,QAAA,UAAkB,WAAA;EAoHnD;;;EAnGA,WAAA,CAAY,WAAA,EAAa,cAAA;EA4Gd;;;;;;;;;;;;;;;;;;;EAnFX,UAAA,CAAW,IAAA,UAAc,QAAA,WAAmB,WAAA;EAwJZ;AAAA;;EApIhC,QAAA,CAAS,KAAA,EAAO,YAAA;;;;EAShB,OAAA,CAAQ,OAAA,EAAS,MAAA;;;;EASjB,MAAA,CAAO,IAAA,UAAc,KAAA;;;;EASrB,IAAA,CAAK,IAAA;;;;EASL,GAAA,CAAI,GAAA;;;;EASJ,aAAA,CAAc,EAAA;;;;EASd,UAAA,CAAW,MAAA,EAAQ,kBAAA;;;;EASnB,UAAA,CAAW,IAAA;;;;EASX,aAAA,CAAc,OAAA,EAAS,UAAA;;;;EASvB,MAAA,CAAO,OAAA,EAAS,UAAA;;;;EAShB,SAAA,CAAU,OAAA,EAAS,UAAA;;;;EASnB,OAAA,CAAQ,OAAA,EAAS,UAAA;;;;EASjB,UAAA,CAAA,GAAc,OAAA,CAAQ,WAAA;;;;UAOrB,QAAA;;;;EAiBK,IAAA,CAAA,GAAQ,OAAA,CAAQ,UAAA;AAAA"}
1
+ {"version":3,"file":"mail.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/mail/mail.ts"],"mappings":";;;;;;AAwCA;;;;;;;;;;;;;;;;;;;;;;;;;;cAAa,IAAA;EAAA,QACH,OAAA;EAUwC;;;EAAA,QALzC,WAAA;EAe2C;;;EAAA,OAVpC,EAAA,CAAG,SAAA,sBAA+B,IAAA;EA8BzC;;;EAAA,OApBO,MAAA,CAAO,MAAA,EAAQ,kBAAA,GAAqB,IAAA;EAsC3C;;;EAAA,OA5BO,MAAA,CAAO,IAAA,WAAe,IAAA;EA8C7B;;;EApCA,EAAA,CAAG,SAAA;EA6CK;;;EApCR,EAAA,CAAG,SAAA;EAsDE;;;EA7CL,GAAA,CAAI,SAAA;EAsDM;;;EA7CV,OAAA,CAAQ,OAAA;EAsDyB;;;EA7CjC,IAAA,CAAK,OAAA,EAAS,WAAA;EA8DF;;;EArDZ,OAAA,CAAQ,OAAA;EA8EoC;;;EArE5C,IAAA,CAAK,OAAA;EAkGL;;;EAzFA,IAAA,CAAK,OAAA;EAkGE;;;EAzFP,SAAA,CAAU,OAAA,EAAS,KAAA,CAAM,YAAA;EA2GzB;;;EAlGA,MAAA,CAAO,OAAA,EAAS,MAAA,WAAiB,QAAA,UAAkB,WAAA;EAoHnD;;;EAnGA,WAAA,CAAY,WAAA,EAAa,cAAA;EA4Gd;;;;;;;;;;;;;;;;;;;EAnFX,UAAA,CAAW,IAAA,UAAc,QAAA,WAAmB,WAAA;EAwJZ;AAAA;;EApIhC,QAAA,CAAS,KAAA,EAAO,YAAA;;;;EAShB,OAAA,CAAQ,OAAA,EAAS,MAAA;;;;EASjB,MAAA,CAAO,IAAA,UAAc,KAAA;;;;EASrB,IAAA,CAAK,IAAA;;;;EASL,GAAA,CAAI,GAAA;;;;EASJ,aAAA,CAAc,EAAA;;;;EASd,UAAA,CAAW,MAAA,EAAQ,kBAAA;;;;EASnB,UAAA,CAAW,IAAA;;;;EASX,aAAA,CAAc,OAAA,EAAS,UAAA;;;;EASvB,MAAA,CAAO,OAAA,EAAS,UAAA;;;;EAShB,SAAA,CAAU,OAAA,EAAS,UAAA;;;;EASnB,OAAA,CAAQ,OAAA,EAAS,UAAA;;;;EASjB,UAAA,IAAc,OAAA,CAAQ,WAAA;;;;UAOrB,QAAA;;;;EAiBK,IAAA,IAAQ,OAAA,CAAQ,UAAA;AAAA"}
package/esm/mail/mail.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import { sendMail } from "./send-mail.mjs";
2
2
 
3
- //#region ../../@warlock.js/core/src/mail/mail.ts
3
+ //#region ../@warlock.js/core/src/mail/mail.ts
4
4
  /**
5
5
  * Fluent Mail Builder
6
6
  *
@@ -1 +1 @@
1
- {"version":3,"file":"mail.mjs","names":[],"sources":["../../../../../../@warlock.js/core/src/mail/mail.ts"],"sourcesContent":["import type React from \"react\";\nimport { sendMail } from \"./send-mail\";\nimport type {\n MailAddress,\n MailAttachment,\n MailConfigurations,\n MailEvents,\n MailOptions,\n MailPriority,\n MailResult,\n} from \"./types\";\n\n/**\n * Fluent Mail Builder\n *\n * Provides a chainable API for building and sending emails.\n *\n * @example\n * ```typescript\n * await Mail.to(\"user@example.com\")\n * .subject(\"Welcome!\")\n * .component(<WelcomeEmail name=\"John\" />)\n * .send();\n *\n * // With attachments\n * await Mail.to(\"user@example.com\")\n * .cc(\"manager@example.com\")\n * .subject(\"Invoice\")\n * .component(<InvoiceEmail order={order} />)\n * .attach(pdfBuffer, \"invoice.pdf\")\n * .send();\n *\n * // Multi-tenant\n * await Mail.config(tenant.mailSettings)\n * .to(\"user@example.com\")\n * .subject(\"Hello\")\n * .html(\"<p>World</p>\")\n * .send();\n * ```\n */\nexport class Mail {\n private options: Partial<MailOptions> = {};\n\n /**\n * Private constructor - use static factory methods\n */\n private constructor() {}\n\n /**\n * Create a new mail with recipient\n */\n public static to(recipient: string | string[]): Mail {\n const mail = new Mail();\n mail.options.to = recipient;\n\n return mail;\n }\n\n /**\n * Create a new mail with custom configuration (multi-tenant)\n */\n public static config(config: MailConfigurations): Mail {\n const mail = new Mail();\n mail.options.config = config;\n\n return mail;\n }\n\n /**\n * Create a new mail with named mailer\n */\n public static mailer(name: string): Mail {\n const mail = new Mail();\n mail.options.mailer = name;\n\n return mail;\n }\n\n /**\n * Set recipient(s)\n */\n public to(recipient: string | string[]): this {\n this.options.to = recipient;\n\n return this;\n }\n\n /**\n * Set CC recipient(s)\n */\n public cc(recipient: string | string[]): this {\n this.options.cc = recipient;\n\n return this;\n }\n\n /**\n * Set BCC recipient(s)\n */\n public bcc(recipient: string | string[]): this {\n this.options.bcc = recipient;\n\n return this;\n }\n\n /**\n * Set reply-to address\n */\n public replyTo(address: string): this {\n this.options.replyTo = address;\n\n return this;\n }\n\n /**\n * Set from address\n */\n public from(address: MailAddress): this {\n this.options.from = address;\n\n return this;\n }\n\n /**\n * Set subject\n */\n public subject(subject: string): this {\n this.options.subject = subject;\n\n return this;\n }\n\n /**\n * Set HTML content\n */\n public html(content: string): this {\n this.options.html = content;\n\n return this;\n }\n\n /**\n * Set plain text content\n */\n public text(content: string): this {\n this.options.text = content;\n\n return this;\n }\n\n /**\n * Set React component as content\n */\n public component(element: React.ReactElement): this {\n this.options.component = element;\n\n return this;\n }\n\n /**\n * Add attachment\n */\n public attach(content: Buffer | string, filename: string, contentType?: string): this {\n if (!this.options.attachments) {\n this.options.attachments = [];\n }\n\n this.options.attachments.push({\n filename,\n content,\n contentType,\n });\n\n return this;\n }\n\n /**\n * Add multiple attachments\n */\n public attachments(attachments: MailAttachment[]): this {\n this.options.attachments = [...(this.options.attachments || []), ...attachments];\n\n return this;\n }\n\n /**\n * Attach a file by path\n *\n * The file will be read automatically when the email is sent.\n *\n * @param path Path to the file\n * @param filename Optional custom filename (defaults to basename of path)\n * @param contentType Optional MIME type\n *\n * @example\n * ```typescript\n * Mail.to(\"user@example.com\")\n * .subject(\"Invoice\")\n * .html(\"<p>Please see attached</p>\")\n * .attachFile(\"./invoices/2024-001.pdf\")\n * .attachFile(\"./terms.pdf\", \"terms-and-conditions.pdf\")\n * .send();\n * ```\n */\n public attachFile(path: string, filename?: string, contentType?: string): this {\n if (!this.options.attachments) {\n this.options.attachments = [];\n }\n\n // Extract filename from path if not provided\n const resolvedFilename = filename || path.split(/[/\\\\]/).pop() || \"attachment\";\n\n this.options.attachments.push({\n path,\n filename: resolvedFilename,\n contentType,\n });\n\n return this;\n }\n\n /**\n * Set priority\n */\n public priority(level: MailPriority): this {\n this.options.priority = level;\n\n return this;\n }\n\n /**\n * Set custom headers\n */\n public headers(headers: Record<string, string>): this {\n this.options.headers = { ...this.options.headers, ...headers };\n\n return this;\n }\n\n /**\n * Add a custom header\n */\n public header(name: string, value: string): this {\n this.options.headers = { ...this.options.headers, [name]: value };\n\n return this;\n }\n\n /**\n * Set tags for categorization\n */\n public tags(tags: string[]): this {\n this.options.tags = tags;\n\n return this;\n }\n\n /**\n * Add a tag\n */\n public tag(tag: string): this {\n this.options.tags = [...(this.options.tags || []), tag];\n\n return this;\n }\n\n /**\n * Set correlation ID for tracking\n */\n public correlationId(id: string): this {\n this.options.correlationId = id;\n\n return this;\n }\n\n /**\n * Set configuration (multi-tenant)\n */\n public withConfig(config: MailConfigurations): this {\n this.options.config = config;\n\n return this;\n }\n\n /**\n * Set named mailer\n */\n public withMailer(name: string): this {\n this.options.mailer = name;\n\n return this;\n }\n\n /**\n * Set beforeSending event handler\n */\n public beforeSending(handler: MailEvents[\"beforeSending\"]): this {\n this.options.beforeSending = handler;\n\n return this;\n }\n\n /**\n * Set onSent event handler\n */\n public onSent(handler: MailEvents[\"onSent\"]): this {\n this.options.onSent = handler;\n\n return this;\n }\n\n /**\n * Set onSuccess event handler\n */\n public onSuccess(handler: MailEvents[\"onSuccess\"]): this {\n this.options.onSuccess = handler;\n\n return this;\n }\n\n /**\n * Set onError event handler\n */\n public onError(handler: MailEvents[\"onError\"]): this {\n this.options.onError = handler;\n\n return this;\n }\n\n /**\n * Get the built options (for debugging)\n */\n public getOptions(): Partial<MailOptions> {\n return { ...this.options };\n }\n\n /**\n * Validate the mail before sending\n */\n private validate(): void {\n if (!this.options.to) {\n throw new Error(\"Mail recipient (to) is required\");\n }\n\n if (!this.options.subject) {\n throw new Error(\"Mail subject is required\");\n }\n\n if (!this.options.html && !this.options.text && !this.options.component) {\n throw new Error(\"Mail content (html, text, or component) is required\");\n }\n }\n\n /**\n * Send the email\n */\n public async send(): Promise<MailResult> {\n this.validate();\n\n return sendMail(this.options as MailOptions);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"mail.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/mail/mail.ts"],"sourcesContent":["import type React from \"react\";\nimport { sendMail } from \"./send-mail\";\nimport type {\n MailAddress,\n MailAttachment,\n MailConfigurations,\n MailEvents,\n MailOptions,\n MailPriority,\n MailResult,\n} from \"./types\";\n\n/**\n * Fluent Mail Builder\n *\n * Provides a chainable API for building and sending emails.\n *\n * @example\n * ```typescript\n * await Mail.to(\"user@example.com\")\n * .subject(\"Welcome!\")\n * .component(<WelcomeEmail name=\"John\" />)\n * .send();\n *\n * // With attachments\n * await Mail.to(\"user@example.com\")\n * .cc(\"manager@example.com\")\n * .subject(\"Invoice\")\n * .component(<InvoiceEmail order={order} />)\n * .attach(pdfBuffer, \"invoice.pdf\")\n * .send();\n *\n * // Multi-tenant\n * await Mail.config(tenant.mailSettings)\n * .to(\"user@example.com\")\n * .subject(\"Hello\")\n * .html(\"<p>World</p>\")\n * .send();\n * ```\n */\nexport class Mail {\n private options: Partial<MailOptions> = {};\n\n /**\n * Private constructor - use static factory methods\n */\n private constructor() {}\n\n /**\n * Create a new mail with recipient\n */\n public static to(recipient: string | string[]): Mail {\n const mail = new Mail();\n mail.options.to = recipient;\n\n return mail;\n }\n\n /**\n * Create a new mail with custom configuration (multi-tenant)\n */\n public static config(config: MailConfigurations): Mail {\n const mail = new Mail();\n mail.options.config = config;\n\n return mail;\n }\n\n /**\n * Create a new mail with named mailer\n */\n public static mailer(name: string): Mail {\n const mail = new Mail();\n mail.options.mailer = name;\n\n return mail;\n }\n\n /**\n * Set recipient(s)\n */\n public to(recipient: string | string[]): this {\n this.options.to = recipient;\n\n return this;\n }\n\n /**\n * Set CC recipient(s)\n */\n public cc(recipient: string | string[]): this {\n this.options.cc = recipient;\n\n return this;\n }\n\n /**\n * Set BCC recipient(s)\n */\n public bcc(recipient: string | string[]): this {\n this.options.bcc = recipient;\n\n return this;\n }\n\n /**\n * Set reply-to address\n */\n public replyTo(address: string): this {\n this.options.replyTo = address;\n\n return this;\n }\n\n /**\n * Set from address\n */\n public from(address: MailAddress): this {\n this.options.from = address;\n\n return this;\n }\n\n /**\n * Set subject\n */\n public subject(subject: string): this {\n this.options.subject = subject;\n\n return this;\n }\n\n /**\n * Set HTML content\n */\n public html(content: string): this {\n this.options.html = content;\n\n return this;\n }\n\n /**\n * Set plain text content\n */\n public text(content: string): this {\n this.options.text = content;\n\n return this;\n }\n\n /**\n * Set React component as content\n */\n public component(element: React.ReactElement): this {\n this.options.component = element;\n\n return this;\n }\n\n /**\n * Add attachment\n */\n public attach(content: Buffer | string, filename: string, contentType?: string): this {\n if (!this.options.attachments) {\n this.options.attachments = [];\n }\n\n this.options.attachments.push({\n filename,\n content,\n contentType,\n });\n\n return this;\n }\n\n /**\n * Add multiple attachments\n */\n public attachments(attachments: MailAttachment[]): this {\n this.options.attachments = [...(this.options.attachments || []), ...attachments];\n\n return this;\n }\n\n /**\n * Attach a file by path\n *\n * The file will be read automatically when the email is sent.\n *\n * @param path Path to the file\n * @param filename Optional custom filename (defaults to basename of path)\n * @param contentType Optional MIME type\n *\n * @example\n * ```typescript\n * Mail.to(\"user@example.com\")\n * .subject(\"Invoice\")\n * .html(\"<p>Please see attached</p>\")\n * .attachFile(\"./invoices/2024-001.pdf\")\n * .attachFile(\"./terms.pdf\", \"terms-and-conditions.pdf\")\n * .send();\n * ```\n */\n public attachFile(path: string, filename?: string, contentType?: string): this {\n if (!this.options.attachments) {\n this.options.attachments = [];\n }\n\n // Extract filename from path if not provided\n const resolvedFilename = filename || path.split(/[/\\\\]/).pop() || \"attachment\";\n\n this.options.attachments.push({\n path,\n filename: resolvedFilename,\n contentType,\n });\n\n return this;\n }\n\n /**\n * Set priority\n */\n public priority(level: MailPriority): this {\n this.options.priority = level;\n\n return this;\n }\n\n /**\n * Set custom headers\n */\n public headers(headers: Record<string, string>): this {\n this.options.headers = { ...this.options.headers, ...headers };\n\n return this;\n }\n\n /**\n * Add a custom header\n */\n public header(name: string, value: string): this {\n this.options.headers = { ...this.options.headers, [name]: value };\n\n return this;\n }\n\n /**\n * Set tags for categorization\n */\n public tags(tags: string[]): this {\n this.options.tags = tags;\n\n return this;\n }\n\n /**\n * Add a tag\n */\n public tag(tag: string): this {\n this.options.tags = [...(this.options.tags || []), tag];\n\n return this;\n }\n\n /**\n * Set correlation ID for tracking\n */\n public correlationId(id: string): this {\n this.options.correlationId = id;\n\n return this;\n }\n\n /**\n * Set configuration (multi-tenant)\n */\n public withConfig(config: MailConfigurations): this {\n this.options.config = config;\n\n return this;\n }\n\n /**\n * Set named mailer\n */\n public withMailer(name: string): this {\n this.options.mailer = name;\n\n return this;\n }\n\n /**\n * Set beforeSending event handler\n */\n public beforeSending(handler: MailEvents[\"beforeSending\"]): this {\n this.options.beforeSending = handler;\n\n return this;\n }\n\n /**\n * Set onSent event handler\n */\n public onSent(handler: MailEvents[\"onSent\"]): this {\n this.options.onSent = handler;\n\n return this;\n }\n\n /**\n * Set onSuccess event handler\n */\n public onSuccess(handler: MailEvents[\"onSuccess\"]): this {\n this.options.onSuccess = handler;\n\n return this;\n }\n\n /**\n * Set onError event handler\n */\n public onError(handler: MailEvents[\"onError\"]): this {\n this.options.onError = handler;\n\n return this;\n }\n\n /**\n * Get the built options (for debugging)\n */\n public getOptions(): Partial<MailOptions> {\n return { ...this.options };\n }\n\n /**\n * Validate the mail before sending\n */\n private validate(): void {\n if (!this.options.to) {\n throw new Error(\"Mail recipient (to) is required\");\n }\n\n if (!this.options.subject) {\n throw new Error(\"Mail subject is required\");\n }\n\n if (!this.options.html && !this.options.text && !this.options.component) {\n throw new Error(\"Mail content (html, text, or component) is required\");\n }\n }\n\n /**\n * Send the email\n */\n public async send(): Promise<MailResult> {\n this.validate();\n\n return sendMail(this.options as MailOptions);\n }\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { MailConfigurations } from "./types.mjs";
2
2
  import { Transporter } from "nodemailer";
3
3
 
4
- //#region ../../@warlock.js/core/src/mail/mailer-pool.d.ts
4
+ //#region ../@warlock.js/core/src/mail/mailer-pool.d.ts
5
5
  /**
6
6
  * Get or create a mailer transporter from the pool
7
7
  * Nodemailer is eagerly loaded at import time
@@ -1 +1 @@
1
- {"version":3,"file":"mailer-pool.d.mts","names":[],"sources":["../../../../../../@warlock.js/core/src/mail/mailer-pool.ts"],"mappings":";;;;;;AA4KA;;iBAAsB,SAAA,CAAU,MAAA,EAAQ,kBAAA,GAAqB,OAAA,CAAQ,WAAA;;;;iBA6C/C,YAAA,CAAa,MAAA,EAAQ,kBAAA,GAAqB,OAAO;;;;iBAcvD,WAAA,CAAY,MAA0B,EAAlB,kBAAkB;;;AA3D0B;iBAyEhE,eAAA,CAAA;;;;iBAYA,YAAA,CAAA;EAAkB,IAAA;EAAc,MAAM;AAAA"}
1
+ {"version":3,"file":"mailer-pool.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/mail/mailer-pool.ts"],"mappings":";;;;;;AA4KA;;iBAAsB,SAAA,CAAU,MAAA,EAAQ,kBAAA,GAAqB,OAAA,CAAQ,WAAA;;;;iBA6C/C,YAAA,CAAa,MAAA,EAAQ,kBAAA,GAAqB,OAAO;;;;iBAcvD,WAAA,CAAY,MAA0B,EAAlB,kBAAkB;;;AA3D0B;iBAyEhE,eAAA;;;;iBAYA,YAAA;EAAkB,IAAA;EAAc,MAAM;AAAA"}
@@ -1,6 +1,6 @@
1
1
  import { log } from "@warlock.js/logger";
2
2
 
3
- //#region ../../@warlock.js/core/src/mail/mailer-pool.ts
3
+ //#region ../@warlock.js/core/src/mail/mailer-pool.ts
4
4
  /**
5
5
  * Installation instructions for nodemailer
6
6
  */